一、需求分析
-
将生成10个题目。Myapp.exe -r 10该参数必须给定,否则程序报错并给出帮助信息。。4. 每道题目中出现的运算符个数不超过3个。3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。生成的题目存入执行程序的当前目录下的Exercises.txt文件,格式如下:1. 四则运算题目12. 四则运算题目2……其中真分数在输入输出时采用如下格式,真分数五分之三表示为3/5,真分数二又八分之三表示为2’3/8。6. 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件,格式如下:1. 答案12. 答案2特别的,真分数的运算如下例所示:1/6 + 1/8 = 7/24。7. 程序应能支持一万道题目的生成。,输入参数如下:-o Grade.txt
二、功能设计
- 基本功能
- 每个数字定义为一个包含分子、分母、符号的结构体
- 随机生成数字
- 随机生成四则运算符号
- 随机生成括号
- 在重新定义的数字上实现通分、约分、以及加减乘除的基本操作
- 将生成的式子以及计算出的答案保存到txt文件
- 对提供的式子和答案进行打分校验,包括查重,并将统计结果保存到txt文件
- 通过命令行传递参数
三、设计实现
- 整体思路是根据范围随机生成参数,然后随机生成操作符和括号,然后用两个字符串数组分别存储txt中可让小学生看懂的表达式格式,另一个数组存储电脑计算的表达式格式,不太想用常规的中缀转后缀表达式进行计算,所以直接使用eval对表达式进行 计算,不过这部分有点问题,当结果是无限小数时由于变量长度导致不能转变为分数。
- 关于查重功能的实现。在表达式生成的时候直接按照数字的大小排序存入到字符串数组中,操作符也是类似,具体还得看代码,,在进行打分校验的时候,如果表达式的结果相同,就通过存储的表达式对比进行查重,不过这种查重有很小概率会有BUG。
四、代码说明
1 // 生成题目 2 public static String rubric(int m,int []num,int optn){ 3 char[] ch=new char[]{'+','-','*','/'}; 4 char[] ch2=new char[]{'+','-','×','÷'}; 5 char[] opt=new char[optn+1]; 6 int i=new Random().nextInt(5); 7 int fs=new Random().nextInt(10); 8 int a=0,b=0; 9 String rub; 10 // 随机生成括号 11 if(i==0&&optn!=0){ 12 a=new Random().nextInt(optn+1); 13 while(a>=b){ 14 b=new Random().nextInt(optn+1)+1; 15 } 16 if(a==0&&b!=optn+1){ 17 rub="("+Integer.toString( num[0]); 18 } 19 else{ 20 rub=Integer.toString( num[0]); 21 b=0; 22 } 23 } 24 else{ 25 rub=Integer.toString( num[0]); 26 } 27 rubs[m]=rub; 28 // 合成四则运算表达式 29 int[] temp=new int[optn+1]; 30 for(int j=0;j<=optn;j++){ 31 int t=new Random().nextInt(4); 32 temp[j]=t; 33 opt[j]=ch[t]; 34 if(b!=0){ 35 rub=rub+opt[j]; 36 rubs[m]=rubs[m]+ch2[t]; 37 if(a!=0&&j==a-1){ 38 rub=rub+"("; 39 rubs[m]=rubs[m]+"("; 40 } 41 rub=rub+num[j+1]; 42 rubs[m]=rubs[m]+num[j+1]; 43 if(b-1==j){ 44 rub=rub+")"; 45 rubs[m]=rubs[m]+")"; 46 } 47 } 48 else{ 49 rub=rub+opt[j]+num[j+1]; 50 rubs[m]=rubs[m]+ch2[t]+num[j+1]; 51 } 52 } 53 num=sort(num); 54 for(int j=0;j<num.length;j++){ 55 houzhui[m]=houzhui[m]+String.valueOf(num[j]); 56 } 57 temp=sort(temp); 58 for(int j=0;j<temp.length;j++){ 59 houzhui[m]=houzhui[m]+ch[temp[j]]; 60 } 61 rubs[m]=rubs[m]+" ="; 62 return rub; 63 }
五、测试运行
六、PSP展示(单位:天)
|
PSP2.1 |
Personal Software Process Stages |
Time Senior Student |
Time |
|
|
Planning |
计划 |
1.5 |
1 |
|
|
· Estimate |
估计这个任务需要多少时间 |
1.5 |
1 |
|
|
Development |
开发 |
1.2 |
0.8 |
|
|
· Analysis |
需求分析 (包括学习新技术) |
10分钟 |
10分钟 |
|
|
· Design Spec |
生成设计文档 |
5分钟 |
0分钟 |
|
|
· Design Review |
设计复审 |
5分钟 |
0分钟 |
|
|
· Coding Standard |
代码规范 |
5分钟 |
2分钟 |
|
|
· Design |
具体设计 |
20分钟 |
20分钟 |
|
|
· Coding |
具体编码 |
1天 |
0.8天 |
|
|
· Code Review |
代码复审 |
10分钟 |
5分钟 |
|
|
· Test |
测试(自我测试,修改代码,提交修改) |
20分钟 |
10分钟 |
|
|
Reporting |
报告 |
20分钟 |
20分钟 |
|
|
· |
测试报告 |
5分钟 |
0 |
|
|
· |
计算工作量 |
5分钟 |
0 |
|
|
· |
并提出过程改进计划 |
50分钟 |
0 |
|
|
|
|
|
|
|
七、小结
此外这次作业的内容看起来并不是很难,但是真正做起来的时候还是很花时间的,尤其是在一些细节的地方,因为不太想用老师上课分享的方法做,所以作业完成度不高。
最后附上代码地址:https://gitee.com/royal_cfp/arithmetic