从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:
除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
运算符为 +, −, ×, ÷
并且要求能处理用户的输入,并判断对错,打分统计正确率。
要求能处理用户输入的真分数, 如 1/2, 5/12 等
使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10
需求分析:
1、能分别支持整数、真分数的四则运算;
2、判断用户的回答是否正确,并显示正确率;
3、能够使用参数控制生成题目的个数;
4、能够把分数运算结果转化为最简结果。
功能设计:
基本功能:整数、真分数的四则运算,显示正确率
扩展功能:能控制生成题目的数量,对结果进行约分
高级功能:能分数和整数混合运算,多运算符运算(暂未实现)
设计实现:
1.用c++面向过程方法编写
2.编写了三个函数:
f():求2个数的最大公约数,为结果做约分提供方便;
integer():整数四则运算
fraction():分数四则运算
代码演示:
void fraction(){ int a,b,c,d,up,down,temp;//a,b,c,d表示一个数,up表示结果分子,down表示结果的分母 char strre[10],stran[10],dow[10];//strre表示最后结果转化的字符,stran表示输入的答案 srand(unsigned(time(NULL))); a=rand()%100+1; b=rand()%100+1; temp=f(a,b); a=a/temp; b=b/temp; c=rand()%100+1; d=rand()%100+1; temp=f(c,d); c=c/temp; d=d/temp; char sign,s[4]={'+','-','*','/'}; sign=s[rand()%4]; switch(sign){ case '+':cout<<a<<"/"<<b<<" +"<<c<<"/"<<d<<"="<<endl; up=(a*d)+(b*c); down=b*d; break; case '-':cout<<a<<"/"<<b<<" -"<<c<<"/"<<d<<"="<<endl; up=(a*d)-(b*c); down=b*d; break; case '*':cout<<a<<"/"<<b<<" × "<<c<<"/"<<d<<"="<<endl; up=a*c; down=b*d; break; case '/':cout<<a<<"/"<<b<<" ÷"<<c<<"/"<<d<<"="<<endl; up=a*d; down=b*c; break; } temp=f(up,down); up=up/temp; down=down/temp; itoa(up,strre,10); itoa(down,dow,10); strcat(strre,"/"); strcat(strre,dow); cin>>stran; if(strcmp(stran,strre)==0){ cout<<"true"<<endl; right1++; } else cout<<"false"<<endl; }
展示PSP:
PSP2.1 |
Personal Software Process Stages |
Time (%) Senior Student(/hour) |
Time (%)(/hour) |
· Planning |
计划 |
3 |
3.5 |
· Estimate |
估计这个任务需要多少时间 |
40 |
45 |
· Analysis |
需求分析 (包括学习新技术) |
1 |
1 |
· Coding Standard |
代码规范 |
0.5 |
0.5 |
· Design |
具体设计 |
1.5 |
2 |
· Coding |
具体编码 |
32 |
37 |
· Test |
测试(自我测试,修改代码,提交修改) |
1 |
1 |
Reporting |
报告 |
1 |
1 |
小结:编写程序的过程中,遇到的一个问题,就是分数怎么化简,当时有去参考网上的代码,发现把别人的代码拿来用也不是件简单的事,最终还是看懂代码,然后自己去写的。整体而言,程序能满足题目的大部分要求,但在仍不具备处理类似分数整数混合运算、多运算符等问题。