首页 > 代码库 > 个人作业1——四则运算题目生成程序(基于控制台)

个人作业1——四则运算题目生成程序(基于控制台)

coding : https://git.oschina.net/linjunp/project1-arithmetic

题目要求:

从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:

    1. 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
    2. 运算符为 +, ?, ×, ÷
    3. 并且要求能处理用户的输入,并判断对错,打分统计正确率。
    4. 要求能处理用户输入的真分数, 如 1/2, 5/12 等
    5. 使用 -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——四则运算题目生成程序(基于控制台)