1. 题目要求
- 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
2.任务分配
- 在这次结对编程作业中,我担任驾驶员的职责,承担全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中,
最后对领航员在本次编程工作中起到的作用给出客观评价,并完成500字以上的总结。
- 我的领航员是雷建同学。
- 下图是我俩在寝室时一起讨论一起编代码
3.代码实现
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<iostream>
#include <fstream>
#include <iomanip>
#include<ctime>
using namespace std;
FILE *f3;
void SiZeYS( int NumS, int SuanF, int MaxS, int KuoH, int XiaoS,int WJ);
int main()
{
int NumS;//题目数量
int SuanF;//算法
int MaxS;//最大数
int KuoH;//是否有括号
int XiaoS;//是否有小数
int WJ;//输出到文件
f3 = fopen("stud.txt", "w");
cout<<"请输入生成题目数量:
";
cin >> NumS;
while (1)
{
if (NumS> 100 || NumS <=0)
{
cout<<"输入错误
";
system("pause");
cin >> NumS;
}
else
break;
}
cout << "请输入生成题目类型:
";
cout << "1.加法 2.减法 3.加减混合法 4.乘法 5.除法 6乘除混合法 7加减乘除法
";
cin >> SuanF;
while (1)
{
if ((SuanF != 1)&&(SuanF!= 2)&&(SuanF != 3)&&(SuanF != 4)&&(SuanF != 5)&&(SuanF != 6)&&(SuanF != 7))
{
cout << "输入错误
";
system("pause");
cin >> SuanF;
}
else
break;
}
cout << "请输入生成最大数:
";
cin >> MaxS;
while (1)
{
if (MaxS<0||MaxS>10000)
{
cout << "输入错误
";
system("pause");
cin >>MaxS;
}
else
break;
}
if(SuanF==7)
{
cout << "请输入是否有括号:
";
cout << "1.没有 2.有
";
cin >> KuoH;
while (1)
{
if (KuoH!=1 && KuoH!=2)
{
cout << "输入错误
";
system("pause");
cin >> KuoH;
}
else
break;
}
}
cout << "请输入是否有小数:
";
cout << "1.没有 2.有
";
cin >> XiaoS;
while (1)
{
if (XiaoS != 1 && XiaoS != 2)
{
cout << "输入错误
";
system("pause");
cin >> XiaoS;
}
else
break;
}
//SiZeYS(NumS,SuanF,MaxS,KuoH,XiaoS);//四则运算调用函数
cout<<"是否要输出文件:
";
cout << "1.不需要 2.需要
";
cin >> WJ;
while (1)
{
if (WJ> 2 || WJ <1)
{
cout<<"输入错误
";
system("pause");
cin >> NumS;
}
else
break;
}
SiZeYS(NumS,SuanF,MaxS,KuoH,XiaoS,WJ);//四则运算调用函数
system("pause");
return 0;
}
void SiZeYS(int NumS, int SuanF, int MaxS, int KuoH, int XiaoS,int WJ)
{
//f3 = fopen("stud.txt", "w");
int i;
srand((unsigned int)time(0));
double A[1000];
double B[1000];
double C[1000];
double D[1000];
for(i=0;i<NumS;i++)
{
A[i] = rand()%MaxS+1;
B[i] = rand()%MaxS+1;
C[i] = rand()%MaxS+1;
D[i] = rand()%MaxS+1;
//fout<<A[i]<<"+"<<B[i]<<"="<<endl;
//cout<<A[i]<<C[i]<<B[i]<< D[i]<<endl;
}
if(XiaoS==2)
{
for(i=0;i<NumS;i++)
{
A[i] = A[i]*0.01;
B[i] = B[i]*0.01;
C[i] = C[i]*0.01;
D[i] = D[i]*0.01;
}
}
if(SuanF==1)//加法运算
{
for(i=0;i<NumS;i++)
{
if(WJ==1)
cout<<A[i]<<"+"<<B[i]<<"+"<<C[i]<<"+"<< D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf+%.4lf+%.4lf+%.4lf=
",A[i],B[i],C[i],D[i]);
}
}
if(SuanF== 2)//减法运算
{
for(i=0;i<NumS;i++)
{
if(WJ==1)
cout<<A[i]<<"-"<<B[i]<<"-"<<C[i]<<"-"<< D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf-%.4lf-%.4lf-%.4lf=
",A[i],B[i],C[i],D[i]);
}
}
if(SuanF==3)//加减运算
{
for(i=0;i<NumS;i++)
{
if(i%2==0)
{
if(WJ==1)
cout<<A[i]<<"+"<<B[i]<<"+"<<C[i]<<"-"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf+%.4lf+%.4lf-%.4lf=
",A[i],B[i],C[i],D[i]);
}
else if(i%3==0)
{
if(WJ==1)
cout<<A[i]<<"+"<<B[i]<<"-"<<C[i]<<"+"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf+%.4lf-%.4lf+%.4lf=
",A[i],B[i],C[i],D[i]);
}
else if(i%5==0)
{
if(WJ==1)
cout<<A[i]<<"+"<<B[i]<<"-"<<C[i]<<"-"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf+%.4lf-%.4lf-%.4lf=
",A[i],B[i],C[i],D[i]);
}
else if(i%7==0)
{
if(WJ==1)
cout<<A[i]<<"-"<<B[i]<<"+"<<C[i]<<"+"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf-%.4lf+%.4lf+%.4lf=
",A[i],B[i],C[i],D[i]);
}
else
{
if(WJ==1)
cout<<A[i]<<"-"<<B[i]<<"+"<<C[i]<<"-"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf-%.4lf+%.4lf-%.4lf=
",A[i],B[i],C[i],D[i]);
}
}
}
if(SuanF==4)//乘法运算
{
for(i=0;i<NumS;i++)
{
if(WJ==1)
cout<<A[i]<<"*"<<B[i]<<"*"<<C[i]<<"*"<< D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf*%.4lf*%.4lf*%.4lf=
",A[i],B[i],C[i],D[i]);
}
}
if(SuanF==5)//除法运算
{
for(i=0;i<NumS;i++)
{
if(WJ==1)
cout<<A[i]<<"/"<<B[i]<<"/"<<C[i]<<"/"<< D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf/%.4lf/%.4lf/%.4lf=
",A[i],B[i],C[i],D[i]);
}
}
if(SuanF==6)//乘除运算
{
for(i=0;i<NumS;i++)
{
if(i%2==0)
{
if(WJ==1)
cout<<A[i]<<"*"<<B[i]<<"*"<<C[i]<<"/"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf*%.4lf*%.4lf/%.4lf=
",A[i],B[i],C[i],D[i]);
}
else if(i%3==0)
{
if(WJ==1)
cout<<A[i]<<"*"<<B[i]<<"/"<<C[i]<<"*"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf*%.4lf/%.4lf*%.4lf=
",A[i],B[i],C[i],D[i]);
}
else if(i%5==0)
{
if(WJ==1)
cout<<A[i]<<"/"<<B[i]<<"*"<<C[i]<<"*"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf/%.4lf*%.4lf*%.4lf=
",A[i],B[i],C[i],D[i]);
}
else if(i%7==0)
{
if(WJ==1)
cout<<A[i]<<"/"<<B[i]<<"*"<<C[i]<<"*"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf/%.4lf*%.4lf*%.4lf=
",A[i],B[i],C[i],D[i]);
}
else
{
if(WJ==1)
cout<<A[i]<<"/"<<B[i]<<"*"<<C[i]<<"/"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf/%.4lf*%.4lf/%.4lf=
",A[i],B[i],C[i],D[i]);
}
}
}
if(SuanF==7)//四则混合运算
{
if(KuoH==2)//四则运算中有括号
{
for(i=0;i<NumS;i++)
{
if(i%2==0)
{
if(WJ==1)
cout<<A[i]<<"*"<<B[i]<<"-"<<C[i]<<"+"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf*%.4lf-%.4lf+%.4lf=
",A[i],B[i],C[i],D[i]);
}
else if(i%3==0)
{
if(WJ==1)
cout<<A[i]<<"+"<<B[i]<<"*"<<"("<<C[i]<<"-"<<D[i]<<")"<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf+%.4lf*(%.4lf-%.4lf)=
",A[i],B[i],C[i],D[i]);
}
else if(i%5==0)
{
if(WJ==1)
cout<<A[i]<<"+"<<B[i]<<"*"<<C[i]<<"-"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf+%.4lf*%.4lf-%.4lf=
",A[i],B[i],C[i],D[i]);
}
else if(i%7==0)
{
if(WJ==1)
cout<<A[i]<<"+"<<"("<<B[i]<<"-"<<C[i]<<")"<<"*"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf+(%.4lf-%.4lf)*%.4lf=
",A[i],B[i],C[i],D[i]);
}
else
{
if(WJ==1)
cout<<A[i]<<"/"<<"("<<B[i]<<"+"<<C[i]<<")"<<"-"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf/(%.4lf+%.4lf)-%.4lf=
",A[i],B[i],C[i],D[i]);
}
}
}
if(KuoH==1)//四则运算中没有括号
{
for(i=0;i<NumS;i++)
{
if(i%2==0)
{
if(WJ==1)
cout<<A[i]<<"*"<<B[i]<<"-"<<C[i]<<"+"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf*%.4lf-%.4lf+%.4lf=
",A[i],B[i],C[i],D[i]);
}
else if(i%3==0)
{
if(WJ==1)
cout<<A[i]<<"+"<<B[i]<<"*"<<C[i]<<"-"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf+%.4lf*%.4lf-%.4lf=
",A[i],B[i],C[i],D[i]);
}
else if(i%5==0)
{
if(WJ==1)
cout<<A[i]<<"+"<<B[i]<<"*"<<C[i]<<"+"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf+%.4lf*%.4lf+%.4lf=
",A[i],B[i],C[i],D[i]);
}
else if(i%7==0)
{
if(WJ==1)
cout<<A[i]<<"+"<<B[i]<<"-"<<C[i]<<"/"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf+%.4lf-%.4lf/%.4lf=
",A[i],B[i],C[i],D[i]);
}
else
{
if(WJ==1)
cout<<A[i]<<"/"<<B[i]<<"-"<<C[i]<<"*"<<D[i]<<"="<<endl;
if(WJ==2)
fprintf(f3,"%.4lf/%.4lf-%.4lf*%.4lf=
",A[i],B[i],C[i],D[i]);
}
}
}
}
}
- 代码地址: GitHub
- 由于个人能力有限,不能提供用户图形界面。
- 运行结果示例
示例1.题目量为10,加法,随机数范围为1-101,没有小数参与运算,需要输出文件
示例2.题目量为50,加减法混合运算,随机数范围为1-101,有小数参与运算,需要输出文件
!
示例3.题目量为25,加减乘除混合运算,随机数范围为1-101,有括号参与运算,没有小数参与运算,需要输出文件
4.对领航员的评价
在这次编程任务中,领航员雷建同学的表现可以说是十分积极。任务刚刚布置下来的时候,他就自告奋勇想要担任领航员的角色,在编程过程中,他帮助了我很多,给我提供了很多思路。在我编写代码工作时,他总是能找出我的bug,这点让我十分的佩服。如果角色互换的话,面对这种题目,我免不了要对队友和其他同学进行求助的。当然啦,也不是说自己一个人在那里闷着代码就会自己弄懂。虽然我的编程能力还行,但是他这种慧眼独具,能及时想到各种会出现的bug的能力值得我学习。这就是他有信心去做领航员这个角色的原因吧。优点固然很多,但是代码对我来说还是有缺点的,最主要的就是没有细致的函数划分,对各种会出现的情况没有更全面的处理。如果有细致的函数划分的话,可能测试方面还会容易一些。当然啦,领航员的的确确是完成了自己的任务,这次作业还是我的不足多一些。
5.心得体会
在此次的结对编程中,我担任的是驾驶员,负责完成代码工作,使程序能满足题目中的各项要求。在此次结对编程在我和雷建同学的合作努力下完成了四则运算自动生成程序的设计和编写。在编程过程中,雷建同学全程辅导我的代码编写,在一些功能的实现上也为我出谋划策,同时在我编写的过程中,雷建同学在一旁观看督促我,为我检查代码中的bug,为我整理设计了代码的整体布局,使我能够在编写的过程中思路更清晰,代码中出现bug时也能快速定位,我感觉这样代码编写效率有了很大的提升。同时,雷建同学也及时找出了程序中的漏洞和被我忽视的bug,使我代码的质量得到了保证。雷建同学作为此次的领航者,对我的代码的整体思路以及实现方法提出了很好的建议。在结对编程过程中发挥着不可忽视的作用。
对于这次结对编程作业,我知道自己的程序不是最好的,各种情况也没有全面考虑,例如,在四则运算中,若除数为0的情况就应该舍去,但是我为了方便领航员测试,在编写程序时这种情况直接舍去了。尽管在编写过程中,和雷建同学一起商量排除了许多bug,但是还是存在许多bug,这让我明白了这次结对作业的意义了-------驾驶员编写程序不容易,但是领航员的代码测试更不容易