个人作业1--基于控制台的小学四则运算程序
题目描述:
从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:
1.除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
2.运算符为 +, −, ×, ÷
3.并且要求能处理用户的输入,并判断对错,打分统计正确率。
4.要求能处理用户输入的真分数, 如 1/2, 5/12 等
5.使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10
需求分析:
1.对于真分数的四则运算,真分数的分子不能大于分母的数,且分母不能为0,并且要考虑随机产生的分子分母消去公约数的问题,还要考虑计算结果的化简和判断问题。
2.此程序自动生成的是小学生运算题目,因此不能出现负数运算。(实现中没有考虑到真分数与整数的混合运算)
3.让程序能够接受用户输入的答案,并判定对错,最后给出总共对的数量对其进行打分并给出正确率。
4.能够随机生成整数与真分数四则运算,能用参数控制生成题目个数。
设计实现:
1.提示用户生成的运算题数目,用户输入题目数后开始答题。
2.题目依次随机产生,第一道题目产生后,用户答完题,判断对错,错则给出正确答案,再继续产生下一道题。
3.答完所有题目后给出成绩及正确率。
代码说明
1.采用最大公因数来对分数题目以及答案进行化简,得出最简的答案。
int k=0;
int gcd(int x, int y)
{
int z;
if ((z = x % y) != 0)
{
gcd(y, z);
}
else
return y;
}
2.真分数产生随机数。
void fraction()
{
int i,j,x,y,z,temp,a,b,c,z1,z2;
srand(unsigned(time(NULL)));
char r1[10], r2[10];
memset(r1, 0, sizeof(r1));
memset(r2, 0, sizeof(r2));
i=rand()%10;//rand()返回一个随机数
j=rand()%10;
while(j==0||i>=j)
{
i=rand()%10;
j=rand()%10;
}
x=rand()%10;
y=rand()%10;
while(y==0||x>=y)
{
x=rand()%10;
y=rand()%10;
}
z=rand()%100/25;
z1=0;z2=0;
switch(z)
3.真分数除法运算。
case 3:
cout<<"("<<x<<"/"<<y<<")"<<"/"<<"("<<i<<"/"<<j<<")"<<"=";
a = x*j;
b = y*i;
c = gcd(a, b);
a = a / c;
b = b / c;
if (b != 1) {
sprintf(r1, "%d/%d", a, b);
cin >> r2;
if (strcmp(r1, r2) == 0)
{
cout << " " << "True" << endl;
k = k + 1;
}
else cout << " " << "False" << " " <<"正确答案是:"<<r1<<endl;
}
else {
cin >> z1;
if (z1 == a)
{
cout << " " << "True" << endl;
k = k + 1;
}
else cout << " " << "False" << " " << "正确答案是:"<<a<<endl;
}
break;
default:
cout << "wrong" << endl;
break;
}
4.主函数,能用参数控制生成题目个数。
int main(int argc,char *argv[])
{
int n,i;
float m;
n=atoi(argv[2]);
cout<<"生成运算题数目:"<<n<<endl;
for(i=0;i<n;i++)
{
int c=rand()%2;
switch(c)
{
case 0: integer();break;
case 1: fraction();break;
}
}
m=(float)k/(float)n;
cout<<"您答对的题数是:"<<k<<" "<<"正确率是:" <<m<<endl;
return 0;
}
运行结果:
实验总结:由于个人编码能力有限,这次作业做下来感觉非常吃力,花费了很多时间。虽然本次作业有参考同学的代码,但是通过自己理一遍思路,把各种情况列出来,一步步把各类情况的代码敲出来,并一步步改错,最后运行出了结果。在编码过程中遇到了很多的问题,如开始每次调用时,随机数发生器返回的随机数序列都是一样的,通过查阅资料,用当前时间(time(NULL))返回值作为种子对随机数发生器进行初始化,由于每次当前时间不一样,所以随机数发生器产生的随机数序列不一样,即rand()函数调用的返回值不一样,就达到了得真随机数而不是伪随机数的目的。很遗憾最后没能实现真分数与整数的混合运算。学习c++编程是一个漫长的过程,我会慢慢积累,多做练习,多敲代码!
码市地址:https://git.coding.net/zlj201421123101/zenglijun-The-first-assignment.git
PSP2.1 | Personal Software Process Stages | Time (%) Senior Student(/hour) | Time (%)(/hour) |
· Planning | 计划 | 40 | 40 |
· Estimate | 估计这个任务需要多少时间 | 31 | 39 |
· Analysis | 需求分析 (包括学习新技术) | 2 | 1.5 |
· Coding Standard | 代码规范 | 1 | 0.5 |
· Design | 具体设计 | 2 | 1.5 |
· Coding | 具体编码 | 16 | 24 |
· Test | 测试(自我测试,修改代码,提交修改) | 8 | 9 |
Reporting | 报告 | 2 | 2.5 |