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

码市地址:https://coding.net/u/xmwj/p/rg/git/commit/b4ac9aeead9ba9c66a936667b348ea931fe7c62e

a.需求分析:

 自动生成小学四则运算题目的命令行 “软件”,满足以下需求:   

  1. 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
  2. 运算符为 +, −, ×, ÷
  3. 并且要求能处理用户的输入,并判断对错,打分统计正确率。
  4. 要求能处理用户输入的真分数, 如 1/2, 5/12 等
  5. 使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
    Myapp.exe -n 10

b.功能设计:

  基本满足上述的功能

 

c.设计实现:

 

  本程序是通过c++来实现的,一共有三个函数和一个主函数。function(int n)函数用于生成1到n的随机数,fraction(int temp1,int temp2)生成真分数,float sum(int ch1,float a,float b)四则运算 ,主函数中三种类型的随机算式。

 

d.代码说明:

 

 function(int n)函数用于生成1到n的随机数,fraction(int temp1,int temp2)生成真分数,float sum(int ch1,float a,float b)四则运算 ,主函数中题目数的输入,三种类型的随机算式(整数与整数,整数与真分数,真分数与真分数),随机四种运算符(加减乘除),用户输入计算准确答案比对计算正确率。

 

具体代码:

function(int n)函数用于生成1到n的随机数

```

int flag = 1;//全局变量,通过此来解决因为循环运行时间非常短,time(NULL)每次都返回相同的值
int function(int n)//随机生成1至n的整数
{
int random;
int low = 1, high = n;
if (flag)
{
flag = 0;
srand((unsigned)time(NULL));
}
random = rand()% (high - low+1) + low;//生成随机数
return random;

}

```

 

fraction(int temp1,int temp2)生成真分数表达式

```

string fraction(int temp1,int temp2)//生成真分数
{

string fra;
string str1,str2;
stringstream ss1,ss2;
ss1<<temp1;
ss1>>str1;
ss2<<temp2;
ss2>>str2;
temp1 !=temp2 ? fra=str1+"/"+str2 : fra=1;
return fra;
}

```

float sum(int ch1,float a,float b)四则运算

```

float sum(int ch1,float a,float b){
float sum;
switch (ch1)
{
case 1:sum=(a)+(b);break;
case 2:sum=(a)-(b);break;
case 3:sum=(a)*(b);break;
case 4:sum=(a)/(b);break;
default:cout << "有错误!" << endl;break;
}
return sum;
}

```

main函数主要部分

```int main()
{
int integer1, integer2;
float a[10],b[10],yes=0;
float first1,second1;
stringstream ss1,ss2;
string first, second;//四则运算的第一个运算数和第二个运算数
int ch1, ch2, ch3;//switch语句的选项
string sign;//运算符号
int times ;//题目数
cout<<"【四则运算练习题】"<<endl;
cout<<"请输入练习题数量:"<<endl;
cin>>times;
for (int i = 0;i < times;i++)
{
int temp1 = function(10);//调用function函数随机生成两个随机整数
int temp2 = function(10);
if(temp1>temp2)swap(temp1,temp2);
int temp3 = function(10);
int temp4 = function(10);
if(temp3>temp4)swap(temp3,temp4);
ch1 = function(4);//随机生成运算符号
switch (ch1)
{
case 1:sign = "+";break;
case 2:sign = "-";break;
case 3:sign = "×";break;
case 4:sign = "÷";break;
default:cout << "有错误!" << endl;break;
}
ch2 = function(3);//四则运算题目的三种情况
switch (ch2)
{
case 1://整数和整数
{
strstream ss, cc;
integer1 = function(10);
ss << integer1;
ss >> first;
integer2 = function(10);
cc << integer2;
cc >> second;
a[i]=sum(ch1,(float)integer1,(float)integer2);

}break;
case 2://整数和真分数
{
strstream kk;
integer1 = function(10);
kk << integer1;
kk >> first;
second = fraction(temp1,temp2);
a[i]=sum(ch1,(float)integer1,temp1/(float)temp2);

}break;
case 3://真分数和真分数
{
first = fraction(temp1,temp2);
second = fraction(temp3,temp4);
a[i]=sum(ch1,temp1/(float)temp2,temp3/(float)temp4);
}break;
default:cout << "有错误!" << endl;break;
}
cout <<"("<< first <<")"<< sign << "("<<second<<")" << "=" << endl;
}
float ch;
for(int j=0;j<times;j++)
{
do{
cin>>ch;
}while(cin.get()!='\n');
b[j]=ch;
if(fabs(b[j]-a[j])<=1e-6)
{
cout<<"√"<<" 正确答案为:"<<a[j]<<endl;
yes++;
}
else cout<<"×"<<" 正确答案为:"<<a[j]<<endl;
}
cout<<"正确率为"<<yes/times*100<<"%"<<endl;



system("pause");
return 0;
}```

e.测试运行:

PSP表:

PSP2.1 Personal Software Process Stages Time (%) Senior Student Time (%)
Planning 计划 8 10
· Estimate 估计这个任务需要多少时间 2 4
Development 开发 3 4
· Analysis 需求分析 (包括学习新技术) 3 4
· Design Spec 生成设计文档 4 5
· Design Review 设计复审 10 15
· Coding Standard 代码规范 1 2
· Design 具体设计 15 20
· Coding 具体编码 20 30
· Code Review 代码复审 15 20
· Test 测试(自我测试,修改代码,提交修改) 13 21
Reporting 报告 5 6
· 测试报告 5 5
· 计算工作量 10 8
· 并提出过程改进计划 5 5

 

小结:

1.事先没有一个流程规划。初略的看了一下需求分析,觉得这个小程序应该可以写完,但是在写的过程中却发现了很多的问题,因为没有先做了一个大概的规划,导致边写边想,写一段又觉得之前用的结构不大方便之后的使用,又往回改了,这样反反复复浪费的许多时间。比如在写输入数据类型的时候,在考虑用string还是float型的,这将导致之前写的存放数组与比较方法的改变。在处理真分数时对代码的修改导致了计算错误,之后发现是一个表示函数,一个计算函数没有同步。。。

2.发现随机数尽量不要用在循环里,因为电脑运行速度快,将导致出现的随机数一样这样的问题。time(NULL)每次都返回相同的值,可以使用全局变量来解决。

3.代码过于长,其实可以用指针函数等来简化,不过这次的编写思路还是清晰的,这也源于c++比较简单易懂,不过命令行界面确实是不美观,打算下次编写使用java。

4.不知道那个格式发生的什么,```不起作用,老师求指导。是因为C++ 的问题吗?

5.还有很多不足,希望老师多多指点迷津,希望在今后的学习实践中可以逐步的提高编写的效率与成果。谢谢o(∩_∩)o 

posted @ 2017-03-06 15:33  xmwj  阅读(251)  评论(3编辑  收藏  举报