结对第二次作业
题目要求
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
队伍
本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换。
驾驶员(我)
1.能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中。
2.能够对导航员在本次编程工作中起到的作用给出客观评价,并完成500字以上的总结。
领航员(霍超然)
1.能够辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试。
2.能够根据上次作业的代码检查表对驾驶员的本次工作进行评价。
3.能够对本次工作完成500字以上的总结。
程序实现
1.重要变量
int m;//数值范围[0,m]
int sl;//生成算式的数量
int zl; //算式种类
int xs;//是否有小数
int kh;//是否有括号
int gs;//输出形式
用户通过提示,输入这些变量的值,用来选择要输出什么形式的算式
2.无括号情况
在无括号情况下,我默认为算式为二元式,通过主函数提示用户输入数据来实现选择要进行什么操作。代码如下:
void scwukuohao()//无括号的二元式
{
double a, b, t = 0;
a = rand() % (m);
b = rand() % (m);
if (xs==0)//用户不需要小数时调用
{
while (sl)//生成的个数控制
{
a = rand() % (m);
b = rand() % (m);
if (zl == 4)//用于实现随机生成四种算式
{
t = 1;
zl = rand() % 4;//zl将在0123中随机取值
}
switch (zl)//通过zl的值输出不同的算式
{
case 0://输出加法
{
if (gs == 1) { printf("%.0lf+%.0lf\n", a, b); break; }
else { fprintf(f3, "%.0lf+%.0lf\n", a, b); break; }
}
case 1://输出减法
{
if (a > b)
{
if (gs == 1) { printf("%.0lf-%.0lf\n", a, b); break; }
else { fprintf(f3,"%.0lf-%.0lf\n", a, b); break; }
}
else
{
if (gs == 1) { printf("%.0lf-%.0lf\n", b, a); break; }
else { fprintf(f3, "%.0lf-%.0lf\n", b, a); break; }
}
}
case 2:if (gs == 1) { printf("%.0lf*%.0lf\n", a, b); break; }//输出乘法
else{ fprintf(f3,"%.0lf*%.0lf\n", a, b); break; }
case 3:if (gs == 1) { printf("%.0lf/%.0lf\n", a, b); break; }//输出除法
else{ fprintf(f3,"%.0lf/%.0lf\n", a, b); break; }
}
if (t == 1)
{
zl = 4;
}
sl--;
}
}
return;
}
在用户需要小数时,代码基本相同,只需要将随机出的数变成小数即可。代码如下:
a = rand() % (m*10)/10.0+1;
b = rand() % (m * 10) / 10.0 + 1;
2.有括号情况
在有括号时,我预设了8种算式格式,通过随机变量来随机输出这八种算式,代码如下:
void scyoukuohao()//有括号的多元式
{
double a, b, c, d;
int tt;
if (xs == 0)//没有小数时调用
{
while (sl)
{
a = rand() % (m);
b = rand() % (m);
c = rand() % (m);
d = rand() % (m);
tt = rand() % 8;//用于随机生成预设的8种算式格式
switch (tt)
{
case 0:if (gs == 1) { printf("(%.0lf+%.0lf)*%.0lf/%.0lf\n", a, b, c, d); break; }
else{ fprintf(f3,"(%.0lf+%.0lf)*%.0lf/%.0lf\n", a, b, c, d); break; }
case 1:
{
if (a > b)
{
if (gs == 1) { printf("(%.0lf-%.0lf)*%.0lf/%.0lf\n", a, b, c, d); break; }
else{ fprintf(f3,"(%.0lf-%.0lf)*%.0lf/%.0lf\n", a, b, c, d); break; }
}
else
{
if (gs == 1) { printf("(%.0lf-%.0lf)*%.0lf/%.0lf\n", b, a, c, d); break; }
else { fprintf(f3,"(%.0lf-%.0lf)*%.0lf/%.0lf\n", b, a, c, d); break; }
}
}
case 2:if (gs == 1) { printf("%.0lf*(%.0lf+%.0lf)/%.0lf\n", a, b, c, d); break; }
else { fprintf(f3,"%.0lf*(%.0lf+%.0lf)/%.0lf\n", a, b, c, d); break; }
case 3:if (gs == 1) { printf("%.0lf/(%.0lf+%.0lf)*%.0lf\n", a, b, c, d); break; }
else{ fprintf(f3,"%.0lf/(%.0lf+%.0lf)*%.0lf\n", a, b, c, d); break; }
case 4:
{
if (c > d)
{
if (gs == 1) { printf("(%.0lf+%.0lf)*(%.0lf-%.0lf)\n", a, b, c, d); break; }
else{ fprintf(f3,"(%.0lf+%.0lf)*(%.0lf-%.0lf)\n", a, b, c, d); break; }
}
else
{
if (gs == 1) { printf("(%.0lf+%.0lf)*(%.0lf-%.0lf)\n", a, b, d, c); break; }
else { fprintf(f3,"(%.0lf+%.0lf)*(%.0lf-%.0lf)\n", a, b, d, c); break; }
}
}
case 5:
{
if (a > b)
{
if (gs == 1) { printf("(%.0lf-%.0lf)/(%.0lf+%.0lf)\n", a, b, c, d); break; }
else{ fprintf(f3,"(%.0lf-%.0lf)/(%.0lf+%.0lf)\n", a, b, c, d); break; }
}
else
{
if (gs == 1) { printf("(%.0lf-%.0lf)/(%.0lf+%.0lf)\n", b, a, d, c); break; }
else { printf("(%.0lf-%.0lf)/(%.0lf+%.0lf)\n", b, a, d, c); break; }
}
}
case 6:if (gs == 1) { printf("(%.0lf+%.0lf)*(%.0lf+%.0lf)\n", a, b, c, d); break; }
else { fprintf(f3,"(%.0lf+%.0lf)*(%.0lf+%.0lf)\n", a, b, c, d); break; }
case 7:
{
if (a > b&&c>d)
{
if (gs == 1) { printf("(%.0lf-%.0lf)/(%.0lf-%.0lf)\n", a, b, c, d); break; }
else { fprintf(f3,"(%.0lf-%.0lf)/(%.0lf-%.0lf)\n", a, b, c, d); break; }
}
if(a<b&&c>d)
{
if (gs == 1) { printf("(%.0lf-%.0lf)/(%.0lf-%.0lf)\n", b, a, c, d); break; }
else { fprintf(f3,"(%.0lf-%.0lf)/(%.0lf-%.0lf)\n", b, a, c, d); break; }
}
if (a>b&&c < d)
{
if (gs == 1) { printf("(%.0lf-%.0lf)/(%.0lf-%.0lf)\n", a, b, d, c); break; }
else { fprintf(f3,"(%.0lf-%.0lf)/(%.0lf-%.0lf)\n", a, b, d, c); break; }
}
if(a<b&&c<d)
{
if (gs == 1) { printf("(%.0lf-%.0lf)/(%.0lf-%.0lf)\n", b, a, d, c); break; }
else{ fprintf(f3,"(%.0lf-%.0lf)/(%.0lf-%.0lf)\n", b, a, d, c); break; }
}
}
}
sl--;
}
}
在用户需要小数时,代码基本相同,只需要将随机出的数变成小数即可。代码如下:
a = rand() % (m*10)/10.0+1;
b = rand() % (m * 10) / 10.0 + 1;
c = rand() % (m * 10) / 10.0 + 1;
d = rand() % (m * 10) / 10.0 + 1;
样例测试
1.测试一
输出全是加法的有小数的20以内的10个算式,直接输出:
输出到文件:
2.测试二
输出随机法则的有小数的20以内的10个算式,直接输出:
输出到文件:
3.测试三
输出有括号的无小数的20以内的10个算式。直接输出:
输出到文件:
总结
- 个人总结:
这次结对作业,我作为驾驶员参与了完成,在领航员的辅助下,独立完成了所有代码的编写工作。这次作业,我没有像之前在网上搜索现成的算法,而是自己思考。这是我的一次提升。但遗憾的是有关于程序的图形化方面,我并没有吃透,许多东西都是一知半解,并且因为开始作业的时间较晚,没有精力学习完这方面的知识,于是就没有实现程序的图形化。这是一大遗憾,但我会继续学习,争取在下次作业完全吃透这方面的知识。 - 对领航员的评价
这次作业是由霍超然同学作为领航员的。霍同学的思维很开阔,在思路上给予了我很大的帮助。我们在一起进行代码的设计时,霍同学提出的预设算式格式的方法,为我节省了很多工作量,之前我一直在苦思冥想如何随机的在算式中加入括号,霍同学的思路虽然导致程序少了些变通,但胜在实现简单,很容易实现。同时在进行测试时,霍同学很严谨认真,为我找出了很多bug。在于他的合作中我在他的身上学到了很多,以后我们的合作一定会更加默契。 - 对作业总结
我认为结对编程主要有不少好处:首先起到督促的作用。这主要是因为如果我一个人编程,可能会出现消极的情绪,而两个人共同编程会起到促进作用。其次对函数的语句能进一步优化,在自己敲代码时,另一个人可以反思代码有什么问题、哪里可以优化,这些都够使代码质量得到很大的提升。最后是更有效的找错,我要找出自己写的bug是一件很困难的事情。但是有伙伴在一个不同的视角寻找问题,就能很快地找到一些我不易发现的bug。
代码地址:
点我(ง •_•)ง