题目要求:像《构建之法》的人物阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”, 分别满足下面的各种需求。
下面这些需求都可以用命令行参数的形式来指定:
a) 一次可以出一千道道题目,并且没有重复的,把题目写入一个文件中。我们大家都知道,(1+2) 和 (2+1) 是重复的题目。
b) 当你有多于一个运算符的时候,如何对一个表达式求值?逐步扩展功能和可以支持的表达式类型,最后希望能支持下面类型的题目 (最多 10 个运算符,括号的数量不限制):
25 - 3 * 4 - 2 / 2 + 89 = ?
1/2 + 1/3 - 1/4 = ?
(6 - 4 ) * (3 + 28) =?
c) 除了整数以外,还要支持真分数的四则运算。 (例如: 1/6 + 1/8 = 7/24 )
d) 让程序能接受用户输入答案,并判定对错。 最后给出总共 对/错 的数量。
e) 到目前为止,这个程序的界面都是中文的, 随着这个应用大受欢迎,别的国家的用户也要用,那么怎么能高效地让这个 App 支持不同文字界面互换呢?你是在程序里面不断插入 if ... else ... 来处理中英文,还是有高效率,可以扩展的办法?这个程序最终会扩展为支持10种语言,而且每个语言的用户需要符合他们文化的图标。请问你还是用 if/else 来解决么?
一.计划个人项目花费时间
PSP2.1 |
Personal Software Process Stages |
Time |
Planning |
计划 |
10min |
· Estimate |
· 估计这个任务需要多少时间 |
10min |
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
20min |
· Design Spec |
· 生成设计文档 |
10min |
· Design Review |
· 设计复审 (和同事审核设计文档) |
15min |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10min |
· Design |
· 具体设计 |
30min |
· Coding |
· 具体编码 |
1H |
· Code Review |
· 代码复审 |
10min |
· Test |
· 测试(自我测试,修改代码,提交修改) |
20min |
Reporting |
报告 |
|
· Test Report |
· 测试报告 |
20min |
· Size Measurement |
· 计算工作量 |
10min |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10min |
|
合计 |
215min |
二.实际个人项目花费时间
PSP2.1 |
Personal Software Process Stages |
Time |
Planning |
计划 |
20min |
· Estimate |
· 估计这个任务需要多少时间 |
20min |
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
60min |
· Design Spec |
· 生成设计文档 |
20min |
· Design Review |
· 设计复审 (和同事审核设计文档) |
15min |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10min |
· Design |
· 具体设计 |
40min |
· Coding |
· 具体编码 |
2H |
· Code Review |
· 代码复审 |
10min |
· Test |
· 测试(自我测试,修改代码,提交修改) |
20min |
Reporting |
报告 |
|
· Test Report |
· 测试报告 |
20min |
· Size Measurement |
· 计算工作量 |
15min |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
15min |
|
合计 |
380min |
三.程序改进
程序的改进主要为由算式得出答案改为由答案拆分成算式,避免了括号的插入与运算等难题,思路较为清晰简单。
程序性能分析:
四.测试用例
由程序生成的题目与答案文件如下:
整数:
分数:
由于由答案推出算式,测试用例全部正确。
五.个人心得体会
坦率的讲,这次真的小看了这个项目,原本以为就是一个类似于计算器的程序,准备写一个IOS程序,为此浪费了大半个上午的时间,后来还是因为晚上临时有事时间不充足和一些技术原因,还是暂时放弃,选择使用C++先完成任务,后期有时间完成这个程序。
简单的四则运算,实际上有很多值得思考的地方。
1. 如何优雅的插入括号?
2. 如何优雅的完成带括号的运算?
3. 如何完成真分数的运算?
4. 如何完成加减乘除的混合运算?
同学们虽然使用不同的语言,但是大致的思路一致,就是先完成随机算式的生产,接着完成算式的运算,然后判断运算结果与输入结果是否一致,整个过程清晰但需要解决的问题很多。
在前期做了大量的设计工作,花费了大量时间后,我决定采用逆推的方法,便是由随机答案生成随机算式。大致思路采用递归算法,以随机生产数ans为答案,再生成随机f,根据f的范围绝定以ans进行哪种运算操作,最后得出一个算式str。该方法难点在于分数的拆分,拆分算法还需要进一步优化。
总结:由于个人对项目的不重视,没有对项目的需求进行仔细的分析,在前期设计阶段花费了大量的时间,这是一个很严重的错误,此次在短时间内体验了一个完整的项目流程,自己的抗压能力还是不足,在设计阶段的失误导致在编码阶段错误连连,代码规范性差,可读性差,在以后的项目实践当中,必须吸取经验,特别是在项目设计阶段犯的错误必须要改正。
程序截图:
源码:点击打开链接