个人项目——四则运算题目的随机生成
任务:实现一个自动生成小学四则运算题目的命令行程序。
一、时间预估及实际花费时间
PSP2.1 |
Personal Software Process Stages |
Time |
Planning |
计划 |
|
· Estimate |
· 估计这个任务需要多少时间 |
15h |
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
2h |
· Design Spec |
· 生成设计文档 |
0.5h |
· Design Review |
· 设计复审 (和同事审核设计文档) |
0.5h |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
1h |
· Design |
· 具体设计 |
3h |
· Coding |
· 具体编码 |
3h |
· Code Review |
· 代码复审 |
1h |
· Test |
· 测试(自我测试,修改代码,提交修改) |
3h |
Reporting |
报告 |
|
· Test Report |
· 测试报告 |
1h |
· Size Measurement |
· 计算工作量 |
1h |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
0.5h |
|
合计 |
16.5h |
二、项目分析与设计
这项任务要求我们能够随机,不重复的生成小学四则运算表达式。在生成的同时能够计算出这些表达式的标准答案,并能对已有的作答文件进行对错判断。
从项目的需求进行如下分析:
1.既然是随机生成表达式,必然会用到随机型变量。
2.对标准答案有需求,所以计算表达式是一个重要的模块。
3.对错评判涉及到两个文件内容的比较。
由项目需求及分析可作出如下大致的设计方案:
1.可构造一个表达式类,类中主要有随机生成表达式的方法。
2.需要一个计算表达式的函数。而中缀表达式通常需要转换为后缀表达式然后再进行计算,这就设计到了两个函数。
3.项目需要进行文件的读写,每次运行时要检查文件的状态,在进行新的生成时要清空上一次数据。
使用较多的中缀表达式转后缀表达式函数:
public static ArrayList toBehind(string mid) { ArrayList arr=new ArrayList(); int top=-1; char p=' '; char[] a=new char[10]; int math = 0; Boolean sign = false; for(int i=0;i<mid.Length;i++) { Boolean continuesign = false; p=mid[i]; //取表达式中一个元素 while(p>='0'&&p<='9') //如果是运算数则直接输出 { if (sign) { math = math * 10 + (p - '0'); continuesign = true; break; } else { math = p - '0'; sign = true; continuesign = true; break; } } if (continuesign) continue; if (sign) { arr.Add(math); math = 0; sign = false; } switch(p) { case '#' : while(top>=0) arr.Add(a[top--]); return arr; case ')' : while (a[top]!='(') { arr.Add(a[top]); top--; } top--; //放弃读到的')',并且栈顶‘(’退栈 break; default : if(top==-1) { a[++top]=p; break; } if(Program.adv(a[top],p)==1) // 若当前运算符优先级低则取代栈顶运算符,原运算符出栈 { arr.Add(a[top]); a[top]=p; } else //若当前运算符优先级高于栈顶运算符,进栈 a[++top]=p; break; } } return null; }
三、性能分析图
为了了解这个程序的性能,使用了VS的性能分析工具,得到了以下两张性能分析图。
四、测试实例
1/4 ÷ 3/9
4/7 × 1/3
2/5 ÷ 4/6
4 + 8 + 2
5/6 + 5/8
(5 × 4) × 1 × 8
2 × 9 + (4 × 3)
2/4 + 5/7
8/9 × 1/3
3 + (2 × 5)
在Answers.txt能够准确得出答案:
3/4
4/21
3/5
14
11/24
160
30
1'3/14
8/27
13
五、个人项目总结
通过这次个人项目,我学到了很多经验和教训:
- 简单的题目往深处去探讨往往并不简单。这次个人项目的生成四则运算表达式看似很简单,实际上蕴含着查重,分数等诸多复杂的问题,需要我们做好充分的设计。
- 设计对于一个项目十分重要。以前经常喜欢拿到题目,构思好算法就直接码代码。结果在过程中才发现自己写的代码逻辑不尽人意。
- 麻雀虽小,五脏俱全。这虽然仅是一个为期一周的个人项目,却包含了项目的各个要素。诸如设计,测试等步骤必不可少,否则便会遇到难以预料的问题。