首页 > 代码库 > 个人作业1——四则运算题目生成程序(基于控制台)
个人作业1——四则运算题目生成程序(基于控制台)
coding : https://git.oschina.net/linjunp/project1-arithmetic
题目要求:
从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:
- 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
- 运算符为 +, ?, ×, ÷
- 并且要求能处理用户的输入,并判断对错,打分统计正确率。
- 要求能处理用户输入的真分数, 如 1/2, 5/12 等
- 使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10
a.需求分析:
这个题目的难点在于分数的运算,分数与分数,分数和整数的运算需要对结果进行约分,而且分数中的“/”的存在决定了对分数的类型为string。
b.功能设计:
程序中,用户可以自己选择题目的数量,若用户输入的答案错误,程序会显示正确答案;
c.设计实现:
在这个程序中,程序需要自己随机生成一个式子,运算符有“+,-,&,/”,运算数有分数和整数,而整数和整数,整数和分数,分数和分数的计算的步骤不相同;
所以针对整数和整数,整数和分数,分数和分数的运算类型设计了三种函数:oper1,oper2,oper3;函数的返回类型都为string类型的rst(计算结果);
在main()中使用rand()随机生成一个operation(运算符号),一种operand(若operand=1,2为整数和整数运算,若operand=3,为整数和分数运算,若operand=4,为分数和分数运算);
在while 循环中,针对每次的operand的情况,可以为oper函数传递参数,通过函数的返回值和用户输入的比较,若相同则正确,输出正确率;不相同则错误,同时输出正确答案和正确率;
d.代码说明:
string oper1(char op,int integer,int numerator,int denominator)//整数和分数的运算 { string rst; int temp1; if(op==‘+‘) { return rst=to_string(integer*denominator+numerator)+‘/‘+to_string(denominator); } if(op==‘-‘) { return rst=to_string(integer*denominator-numerator)+‘/‘+to_string(denominator); } if(op==‘*‘) { for(int i=2;(integer*numerator)>=i;i++) if((integer*numerator)%i==0 && denominator%i==0) { temp1=(integer*numerator); temp1/=i; denominator/=i; i--; } return rst=to_string(temp1)+‘/‘+to_string(denominator); } if(op==‘/‘) { for(int i=2;(integer*denominator)>=i;i++) if((integer*denominator)%i==0 && numerator%i==0) { temp1= integer*denominator; temp1/=i; numerator/=i; i--; } return rst=to_string(temp1)+‘/‘+to_string(numerator); } }
string oper2(char op,int integer1,int integer2)//整数和整数的运算 { string rst; if(op==‘+‘) { return rst = to_string(integer1 + integer2); } if(op==‘-‘) { return rst = to_string(integer1 - integer2); } if(op==‘*‘) { return rst = to_string(integer1 * integer2); } if(op==‘/‘) { for(int i=2;integer1>=i;i++) if(integer1%i==0 && integer2%i==0) { integer1/=i; integer2/=i; i--; } return rst = to_string(integer1) + ‘/‘ + to_string(integer2); } }
string oper3(char op,int numerator1,int denominator1,int numerator2,int denominator2)//分数和分数的运算 { string rst; int temp1,temp2; if(op==‘+‘) { temp1 = numerator1 * denominator2 + numerator2 * denominator1; temp2 = denominator1 * denominator2; for(int i=2;temp1>=i;i++) if(temp1%i==0 && temp2%i==0) { temp1/=i; temp2/=i; i--; } return rst=to_string(temp1)+‘/‘+to_string(temp2); } if(op==‘-‘) { temp1 = numerator1 * denominator2 - numerator2 * denominator1; temp2 = denominator1 * denominator2; for(int i=2;temp1>=i;i++) if(temp1%i==0 && temp2%i==0) { temp1/=i; temp2/=i; i--; } return rst=to_string(temp1)+‘/‘+to_string(temp2); } if(op==‘*‘) { temp1 = numerator1 * numerator2; temp2 = denominator1 * denominator2; for(int i=2;temp1>=i;i++) if(temp1%i==0 && temp2%i==0) { temp1/=i; temp2/=i; i--; } return rst=to_string(temp1)+‘/‘+to_string(temp2); } if(op==‘/‘) { temp1 = numerator1 * denominator2; temp2 = denominator1 * numerator2; for(int i=2;temp1>=i;i++) if(temp1%i==0 && temp2%i==0) { temp1/=i; temp2/=i; i--; } return rst=to_string(temp1)+‘/‘+to_string(temp2); } }
e.测试运行:
2.展示PSP
PSP2.1 |
Personal Software Process Stages |
Time (%) Senior Student |
Time (%) |
Planning |
计划 |
3 |
2 |
Development |
开发 |
50 |
40 |
Analysis |
需求分析 (包括学习新技术) |
5 |
10 |
Coding Standard |
代码规范 |
3 |
3 |
Design |
具体设计 |
5 |
15 |
Coding |
具体编码 |
30 |
25 |
Test |
测试(自我测试,修改代码,提交修改) |
2 |
2 |
Reporting |
报告 |
2 |
3 |
3.总结
编程过程遇到最大的困难就是:一开始,使用if()对四种运算符和4种运算情况进行判断,但是这样将有4*4=16种情况进行判断,而且每种情况都还要判断正确,显得非常臃肿和不美观。
所以写了oper1,oper2,oper3函数,不仅结构明朗,而且代码量少了很多。
虽然问题解决了,但是还是浪费了半天的时间,最主要的问题是在设计阶段没有明确想到细节上,以为思路差不多就可以成功。
所以,编程虽然重要,但是其他环节也不容忽视。
个人作业1——四则运算题目生成程序(基于控制台)