一、题目要求
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
(1)能够自动生成四则运算练习题
(2)可以定制题目数量
(3)用户可以选择运算符
(4)用户设置最大数(如十以内、百以内等)
(5)用户选择是否有括号、是否有小数
(6)用户选择输出方式(如输出到文件、打印机等)
(7)最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
二、角色分配
驾驶员——王越——
博客地址
(1)能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中
(2)能够对导航员在本次编程工作中起到的作用给出客观评价,并完成500字以上的总结,并且上传和队友工作时的照片
领航员——张雨蝶——
博客地址
(1)能够辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试
(2)能够根据上次作业的代码检查表对驾驶员的本次工作进行评价
(3)能够对本次工作完成500字以上的总结
三、功能函数
coding地址
##1、运算符函数
小学四则运算包含四钟运算符——加减乘除,从优先级考虑,加减的优先级相同,乘除的优先级相同,乘除的优先级高于加减,所以在运行时尽量避免全是乘除或加减时有括号的存在,加减可以适当的存在。所以进行了以下的优化。在写入运算符时判断此时括号的存在,若出现左括号,下一个运算符赋予加或减;若出现右括号,下一个运算符赋予乘或除。保证出题的规范性。代码如下显示:
```
void CC::Operator(FILE* fp)
{
if (bl == 1)
{
for (int i = 0; i < 4; i++)
{
if (op[i] == '+' || op[i] == '-')
{
if(print==1) fprintf(fp, "%c", op[i]);
cout << op[i];
bl = 0;
break;
}
}
}
else if (br == 1)
{
for (int i = 0; i < 4; i++)
{
if (op[i] == '*' || op[i] == '/')
{
if(print==1) fprintf(fp, "%c", op[i]);
cout << op[1];
br = 0;
break;
}
}
}
else
{
while(1)
{
opp = rand() % (strlen(op)-1);
if(op[opp]!=' ') break;
}
if(print==1) fprintf(fp, "%c", op[opp]);
cout << op[opp];
}
}
```
##2、括号函数
为了保证计算的个数存在随机性,增加了用户随机输入计算个数的功能。个数的多少对括号产生影响.编写代码时括号要注意以下几个问题:
(1)允许出现嵌套括号
(2)左右括号需互相匹配,并数目相同
(3)第一个数之前出现左括号与最后一个数后出现的右括号不相互匹配。
(4)在倒数第一位数与倒数第二位数前不出现左括号
(5)避免乘除运算出现括号
问题(2)解决方法:在最后一个数输入完,输出未输出的右括号
问题(3)解决方法:若第一个数之前出现左括号,规定与它相匹配的右括号出现的位置
代码如下显示:
```
void CC::rbcalculate(FILE* fp) //分有括号和无括号
{
int i;
if (sign == 1)
{
br = 1;
sign = 0;
if(print==1) fprintf(fp, ")");
cout << ")";
}
else
{
brnum = rand() % 2;//随机生成1或0,1代表有括号,0代表无括号
if (brnum == 1)
{
for (i = 0; i < 10; i++)
{
if (blnum[i] == 1)
{
br = 1;
blnum[i] = 0;
if(print==1) fprintf(fp, ")");
cout << ")";
break;
}
}
}
//保证在计算个数输出之前输出右括号
if (Cnum == Cnumber)
{
for (i = 0; i < 10; i++)
{
if (blnum[i] == 1)
{
blnum[i] = 0;
if(print==1) fprintf(fp, ")");
cout << ")";
}
}
}
}
}
```
##3、运算代码
整体的输出算数题的过程如下代码所示:
```
void CC::calculate(FILE* fp)
{
for (Cnum = 1; Cnum <= Cnumber; Cnum++)//计算个数
{
if (Cnum != 1)//运算符
{
Operator(fp);//输出运算符
}
if (bracket == 1 && Cnum != Cnumber)//左括号
{
if (sign == 0)
{
lbcalculate(fp);//输出左括号
}
}
//数字的输出
int num = rand() % 2; //0代表整数四则运算,1代表小数四则运算,2代表有括号四则运算。
if (num == 1 && point == 1)//小数四则运算
{
pcalculate(fp);
}
else //整数四则运算
{
icalculate(fp);
}
bright = Cnum;
if (bracket == 1 && bright > bleft)//右括号//直接判断是否有左括号的产生
{
rbcalculate(fp);
}
}
if(print==1) fprintf(fp,"=");
if(print==1) fprintf(fp, "\n");
cout << "=" << endl;
}
```
四、运行结果
加减乘除混合运算运行结果如下图所示:
五、队友点评
本次结对作业是我和队友(张雨蝶)第一次合作完成这次的项目,我负责编写代码,她负责测试工作。虽说两个人的职责各不相同,但我们会互相帮助来取得更好的成果。
在合作的过程中我的队友给与我了巨大的帮助,当我遇到难点时,我会向她寻求帮助,而她也会给我一些建设性的建议。在检查的阶段及时发现错误,指出问题的所在,更加方便了我修改代码中的错误。在整个编写代码的过程中,我们一同讨论功能的需求与实现的方法,并上网查阅各种各样的资料,让项目的功能更加全面、更加完善。
做每个项目时我们都需要有自己的队友,有了队友就相当于有了支持你的后盾,有人帮助你向前走,有人在后方帮你勘查情况。在这种团队的氛围之中,你能成长的更快,学会如何与别人共同合作做一件事情,如何处理好人际关系的,对你有莫大的帮助。
优化代码,功能全面是驾驶员与领航员共同要做的事情,互帮互助,合作共进。
六、结对照片