coding : https://git.oschina.net/linjunp/project1-arithmetic
题目要求:
从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:
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函数,不仅结构明朗,而且代码量少了很多。
虽然问题解决了,但是还是浪费了半天的时间,最主要的问题是在设计阶段没有明确想到细节上,以为思路差不多就可以成功。
所以,编程虽然重要,但是其他环节也不容忽视。
原文:http://www.cnblogs.com/linjunp/p/6508513.html