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 |