天天看点

个人作业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;

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;

kk << integer1;

kk >> first;

second = fraction(temp1,temp2);

a[i]=sum(ch1,(float)integer1,temp1/(float)temp2);

case 3://真分数和真分数

first = fraction(temp1,temp2);

second = fraction(temp3,temp4);

a[i]=sum(ch1,temp1/(float)temp2,temp3/(float)temp4);

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.测试运行:

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

PSP表:

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

小结:

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

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

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

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

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