20194667+自动生成四则运算题第一版报告

一、需求分析 

  (1)自动生成10道100以内的2个操作数的四则运算算式(+ - *  /),要求运算结果也在100以内

  (2)剔除重复算式。  2 + 3 =    和  2 + 3 =     是重复算式      2 + 3 =   和   3 + 2 =  不属于重复算式

  (3)题目数量可定制

  (4)相关参数可控制

            是否包含乘法和除法

            操作数数值范围可控(如操作数 在100以内   还是1000以内)

            操作数是否含负数    

   (5)生成的运算题存储到外部文件result.txt中

二、功能设计

  基本功能:  1.题目数量可定制

                           2.二则和四则运算可选

                           3.操作数数值范围可控

                           4.操作数是否含负数 

                           5.重复算式可过滤

三、设计实现

本次设计只用到一个主类,其中包含了主方法和其他方法共同实现程序的相关功能    

  。判断是否需要负数的方法   

  。判断是否需要包含乘除的方法  

  。获取算式得数的方法

  。主方法   

四、测试运行    

 

 

 

 

 

  

 

 

 

  五、代码片段

  • package math;

  • import java.io.BufferedWriter;

  • import java.io.File;

  • import java.io.FileOutputStream;

  • import java.io.IOException;

  • import java.io.OutputStreamWriter;

  • import java.util.ArrayList;

  • import java.util.List;

  • import java.util.Random;

  • import java.util.Scanner;

    public class SuanShi {  

  •  public static void main(String[] args) {    

  •   try {       Scanner sc = new Scanner(System.in);    

  •    System.out.println("这是一个自动生成四则运算试题的程序。接下来请选择相关的参数。");    

  •    System.out.println("请输入要生成题目的数量(数量>1)");     

  •  int num = sc.nextInt();    

  •    System.out.println("请选择是否包含乘除法(包含请输入1,不包含请输入0)");    

  •    int LevelFlg = sc.nextInt();     

  •  System.out.println("请选择结果是否包含负数(包含请输入1,不包含请输入0)");   

  •     int MinusFlg = sc.nextInt();     

  •  System.out.println("请选择结果的最大范围(比如100,200,1000)");    

  •    int maxNumFlg = sc.nextInt();              //生成对象,然后调用它的方法     

  •  SuanShi SuanShi=new SuanShi();    

  •    List<Equation> from = new ArrayList<Equation>();       //调用生成算式的程序,参数分别为 题目数量,是否含有乘除法,是否含有负数,最大的结果范围     

  •  from = SuanShi.createEquation(num,LevelFlg,MinusFlg,maxNumFlg);       //在控制台上展示算式    

  •    SuanShi.showEquation(from);       //将算式保存到文件中     

  •  SuanShi.saveEquation(from);

         } catch (Exception e){      

  •     System.out.println("Error!" + e);        

  •   System.exit(0);      }  }   // 生成算式  

  •    public List<Equation> createEquation(int num , int LevelFlg,int MinusFlg,int maxNumFlg) {

         List<Equation> from = new ArrayList<Equation>();      //通过一个死循环来循环生成算式,然后检查是否符合条件,将满足条件的算式添加到list中,满足数量后跳出循环      

  •    while(true) {             Random rand = new Random();        

  •      int operator = rand.nextInt(LevelFlg == 1 ? 4 : 2) + 1;// 是否乘除可控       

  •       int numA = rand.nextInt(maxNumFlg) + 1;        

  •      int numB = rand.nextInt(maxNumFlg) + 1;             //将生成的算式放入对象中       

  •       Equation equation = new Equation(numA,numB,operator);             //检查生成的竖式符合条件吗        

  •      if(check(from,equation,MinusFlg,maxNumFlg)) {             // 将产生的并且通过检查的算式添加到List集合中     

  •         from.add(equation);             };             //满足最大数量num后跳出循环         

  •     if(from.size()>=num) break;              

  •        }       

  •   return from;  

  •    }

        // 在控制台上展示算式

  •     public  void showEquation(List<Equation> from) {         

  •    System.out.println("结果如下:");    

  •      for(int i=0;i<from.size();i++) {    

  •   System.out.println(from.get(i).printAnswer());  

  •     }    

  • }

        // 保存算式  

  •    public  void saveEquation(List<Equation> from) {   

  •    BufferedWriter bufferedWriter = null;   

  •    String path = "D:\\homework\\result.txt" ;   

  •    try{       File file = new File(path);    

  •   if (!file.getParentFile().exists()) {  

  •      file.getParentFile().mkdirs();    

  •   }       file.createNewFile();             // 获取该文件的缓冲输出流        

  •      bufferedWriter = new BufferedWriter               (new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));             // 写入信息     

  •         bufferedWriter.write("以下为本次程序生成的试题,共有"+from.size()+"道题\r\n");      

  •  for (int i=0;i<from.size();i++) {        //依次写入本地文件中           bufferedWriter.write(i+1+". "+from.get(i).printAnswer()+"\r\n");   

  •     }       bufferedWriter.flush();// 清空缓冲区       bufferedWriter.close();// 关闭输出流       

  •       System.out.println("文件保存完毕!");    

  •  }catch (IOException e) {      e.printStackTrace();   

  •    }finally {             }     }         //检查生成的算式是否正确。   

  •   public  boolean check(List<Equation> from, Equation equation,int MinusFlg,int maxNumFlg) {    

  •  boolean result = true;      //判断新生成的算式是否超过最大范围   

  •    if(equation.getResult()>maxNumFlg) result = false;      //判断新生成的算式是否有负数    

  •  if(MinusFlg==0       &&equation.getResult()<0) result = false;      //判断新生成的算式是否和以前的重复    

  •  for(int i=0;i<from.size()-1;i++) {    

  •   if(from.get(i).getNumA()==equation.getNumA()    

  •    &&from.get(i).getNumB()==equation.getNumB()    

  •    &&from.get(i).getOperator()==equation.getOperator()) result = false;}      //输出通过检查的算式  

  •  return result;    

  •       } }

六、总结

 通过本次练习,学到了许多知识。经过一步步需求分析到功能的一步步实现,虽然编写过程中有很多地方不清楚,但通过网上查找和询问他人慢慢的弄明白了,收获颇多。

七、PSP

 

  

PSP2.1

任务内容

计划共完成需要的时间(min)

实际完成需要的时间(min)

Planning

计划

20

25

·       Estimate

·  估计这个任务需要多少时间,并规划大致工作步骤

10

20

Development

开发

300

480

··       Analysis

  需求分析 (包括学习新技术)

10

20

·       Design Spec

·  生成设计文档

0

0

·       Design Review

·  设计复审 (和同事审核设计文档)

0

0

·       Coding Standard

  代码规范 (为目前的开发制定合适的规范)

10

15

·       Design

  具体设计

15

20

·       Coding

  具体编码

300

420

·       Code Review

·  代码复审

10

10

·       Test

·  测试(自我测试,修改代码,提交修改)

10

20

Reporting

报告

10

15

··       Test Report

·  测试报告

15

20

·       Size Measurement

  计算工作量

0

0

·       Postmortem & Process Improvement Plan

·  事后总结 ,并提出过程改进计划

10

20

 

  

posted @ 2019-09-16 18:33  顾雪婷  阅读(209)  评论(1编辑  收藏  举报