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

1.需求分析

使用C或Java语言完成一个自动生成四则运算试题的程序。软件基本功能如下。

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

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

(3)题目数量可定制

(4)相关参数可控制

          是否包含乘法和除法

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

          操作数是否含负数    

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

 

分析:需求之中,可分析出,要求程序在开始出题之前显示提示,提示用户习题的类型,是否包含乘除法,负数,题目数量,数值控制范围等,这些均由用户输入,程序作出判断执行相应功能。同时得到的题目中,将得到的数据存储至文件result.Txt中,完成操作。

 

2.功能设计

  • 基本功能:程序的基本功能是生成两个操作数的运算公式,其中包含四则运算。同时还有最终答案,并且最终答案控制在一定范围内,超出范围的运算并不符合标准,程序会忽略这个公式。不仅以上这些,还有查重功能,同样是被忽略的结果,但是要注意一点,2+3与3+2并不重复,算作是不同的问题。将符合要求的程序全部按顺序输入到result.txt文档中,才算最终完成目标。
  • 扩展功能:生成的题目中要求更多自由度,正负数,乘除法,操作数范围等,这些都是需要用户输入的条件,程序根据要求执行基本功能,完成用户的需求。

 

3.设计实现

程序中一共有以下类或方法:

  • Main类,主方法,程序入口,主要开始执行的位置。
  • Choose类,一个方法类,被main类调用,负责提示用户输入问题控制范围,并将关键数值传输给全局变量,负责之后其他类方法的使用。
  • Control类,一个方法类,当choose类运行完成,用户输入了正确且完整的限制数据之后,被choose类调用使用,这也是程序的主要核心方法,读取全局变量的限制条件,执行声称四则运算的放法并显示在显示屏上,最终将获得的结果写入到result.txt文档中。
  • Checking类,一个方法类,程序需求中,要求获得的四则运算不能重复,这个是要一个判断,如果符合条件,方法会返回一个true值,如果不符合就false值,程序收到返回值之后判断是否跳过这个生成的结果。
  • Sign类,一个方法类,程序需求中,要求操作数是否为负数的条件,这个方法会根据用户输入的操作数范围为前提条件,随机出现负数或正数。

 

4.测试运行

程序代码

 

  1 package jichu;
  2 
  3 import java.io.File;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 import java.io.OutputStreamWriter;
  7 import java.util.Scanner;
  8 
  9 public class operationn {
 10 
 11     public static int negative;//负数
 12     public static int multiplication;//乘除
 13     public static int range;//数值范围
 14     public static int questions;//问题数量
 15     
 16     
 17     public static int sign(int x){//随机负数
 18         if (negative==1){
 19             int a=(int)(Math.random()>0.5?1:0);
 20             if (a==0){
 21                 x = 0-x;
 22             }
 23         }
 24         return (x);    
 25     }
 26     
 27     
 28     public static boolean checking(int []numbers1,int[] numbers2,int a,int b){//查重功能
 29         boolean y=false;
 30         for (int j=0;j<numbers1.length;j++){
 31             if (a==numbers1[j]&&b==numbers2[j]) break;
 32             else y=true;
 33         }
 34         return y;
 35     }
 36     
 37     public static void control ()throws IOException{
 38         File f = new File(".//src//result.txt");
 39         FileOutputStream fop = new FileOutputStream(f);
 40         OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
 41         int k=0,i=0,add=0,sum=0,a,b,zero=0;
 42         if (negative==1) zero = 0-range;
 43         int[] numbers1 = new int[questions+5];
 44         int[] numbers2 = new int[questions+5];
 45         
 46         while (k<questions){
 47             a=sign((int)(1+Math.random()*range));
 48             b=sign((int)(1+Math.random()*range));
 49             i=0;
 50             while (i<2){
 51                 if (multiplication==0){
 52                     add = (int)(Math.random()*2);
 53                 }
 54                 else{
 55                     add = (int)(Math.random()*4);
 56 
 57                 }
 58                 
 59                 i++;
 60             }
 61             sum = 0;
 62             switch (add){
 63             case 0:
 64                 sum=a+b;
 65                 if (sum<=range&&checking(numbers1,numbers2,a,b)&&sum!=0){
 66                 numbers1[k]=a;
 67                 numbers2[k]=b;
 68                 k++;
 69                 System.out.println(a+"+"+b+"="+sum);
 70                 writer.append("第"+k+"题"+a+"+"+b+"="+sum+"\r\n");
 71                 }else break; 
 72             case 1:
 73                 sum=a-b;
 74                 if (sum>zero&&sum<=range&&checking(numbers1,numbers2,a,b)&&sum!=0){
 75                 numbers1[k]=a;
 76                 numbers2[k]=b;
 77                 k++;
 78                 System.out.println(a+"-"+b+"="+sum);
 79                 writer.append("第"+k+"题"+a+"-"+b+"="+sum+"\r\n");
 80                 } 
 81                 else break;
 82             case 2:
 83                 sum=a*b;
 84                 if (sum>zero&&sum<=range&&sum<=100&&checking(numbers1,numbers2,a,b)&&sum!=0){
 85                     
 86                     numbers1[k]=a;
 87                     numbers2[k]=b;
 88                     k++;
 89                     System.out.println(a+"-"+b+"="+sum);
 90                     writer.append("第"+k+"题"+a+"*"+b+"="+sum+"\r\n");
 91                     }
 92                 else break;
 93             case 3:sum=a/b;
 94                 if (sum>zero&&sum<=range&&checking(numbers1,numbers2,a,b)&&sum!=0){
 95                 
 96                 numbers1[k]=a;
 97                 numbers2[k]=b;
 98                 k++;
 99                 System.out.println(a+"/"+b+"="+sum);
100                 writer.append("第"+k+"题"+a+"/"+b+"="+sum+"\r\n");
101                 }
102             else break;
103             }
104             
105             
106             
107         }
108         writer.close();
109         fop.close();
110     }
111     
112     public static void choose () throws IOException{
113         Scanner scan = new Scanner(System.in);
114         System.out.println("是否包含负数:0.否 1.是:");
115         negative = scan.nextInt();
116         System.out.println("是否包含乘除法:0.否 1.是:");
117         multiplication = scan.nextInt();
118         System.out.println("输入操作数数值范围:");
119         range = scan.nextInt();
120         System.out.println("输入问题数量:");
121         questions = scan.nextInt();        
122         if ((negative==0||negative==1)&&(multiplication==0||multiplication==1)&&range>0&&questions>0){
123             control();
124             }
125         else{
126             System.out.println("请重新选择!");
127             choose();
128         }
129     }
130     
131     public static void main(String[] args) throws IOException {
132         choose();
133     }
134 
135 }

 

 

执行结果

 

5.比较特殊的代码

 1 public static void choose () throws IOException{
 2         Scanner scan = new Scanner(System.in);
 3         System.out.println("是否包含负数:0.否 1.是:");
 4         negative = scan.nextInt();
 5         System.out.println("是否包含乘除法:0.否 1.是:");
 6         multiplication = scan.nextInt();
 7         System.out.println("输入操作数数值范围:");
 8         range = scan.nextInt();
 9         System.out.println("输入问题数量:");
10         questions = scan.nextInt();        
11         if ((negative==0||negative==1)&&(multiplication==0||multiplication==1)&&range>0&&questions>0){
12             control();
13             }
14         else{
15             System.out.println("请重新选择!");
16             choose();
17         }
18     }

这里提示用户输入生成题目的限制条件,主要以0和1为主,如果用户没有在相应提示下输入正确的数字,那么程序会提示输入错误,请重新输入,并且重新开始这段程序。

 

File f = new File(".//src//result.txt");
        FileOutputStream fop = new FileOutputStream(f);
        OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");

文件写入,其中写入文档的均为UTF-8文字标准,可对文件输入中文。

 

6.总结:

一定要全面分析用户需求,既不能没有实现用户的功能,更不能做出多余的冗余功能。在开始写代码前,要确定代码中执行过程流程图,分析每个过程。最终才是开始写代码的步骤。

 

7.PSP

 

PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 50 60
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 30 50
Development 开发 120 500
Analysis 需求分析 (包括学习新技术) 10 8
Design Spec 生成设计文档 10 9
Design Review 设计复审 (和同事审核设计文档) 5 10
Coding Standard 代码规范 (为目前的开发制定合适的规范) 60 70
Design 具体设计 20 22
Coding 具体编码 30 40
Code Review 代码复审 10 8
Test 测试(自我测试,修改代码,提交修改) 10 15
Reporting 报告 30 25
 Test Report 测试报告 10 8
Size Measurement 计算工作量 8 5

Postmortem & Process

Improvement Plan

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

 

posted on 2019-09-17 14:11  人生玩家  阅读(166)  评论(2编辑  收藏  举报

导航