软件工程(2019)第二次结对作业
一、题目要求
-
题目1:
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
PS:以上要求基本全部实现,第七条图形化界面由于没有接触过,就没能实现。
二、分工
1、此次我担任的是驾驶员,下面附上代码地址:
cording代码地址:---------> 点此跳转
- 能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中(15分)
- 能够对导航员在本次编程工作中起到的作用给出客观评价,并完成500字以上的总结(5分)
2、张洪博同学担任的是领航员:
- 能够辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试(10分)
- 能够根据上次作业的代码检查表对驾驶员的本次工作进行评价(5分)
- 能够对本次工作完成500字以上的总结(5分)
三、代码过程图
四、功能实现
由于考虑到 是小学生的四则运算,就编写了生成相对简单的题目,没有运用过多的算法,所以程序也比较简单。
程序整体可以分为整数四则运算,小数四则运算,整数混合运算,小数混合运算(混合运算时可选择是否有括号)。
1、主函数。
int main()
{
printf("
*******************欢迎进入小学生四则运算程序*******************
");
printf(" - - - - - 本程序适用于小学,小数均保留两位数计算- -- - - - - -
");
printf(" - - - - - - - -- - - - - 版权:YMHBAE- - - - - - - - -- - - - -
");
printf("1.请定制题目数量:");
scanf("%d",&n);
printf("
2.请选择运算方法(1、加法 2、减法 3、乘法 4、除法 5、混合运算):");
scanf("%d",&fuhao);
printf("
3.请设置练习的最大数(如十以内、百以内等):");
scanf("%d",&max);
printf("
4.请设置是否有小数(1、无 2、有):");
scanf("%d",&fl);
printf("
5.请设置是否有括号(1、无 2、有)ps:此选项仅混合运算时选择,其他选项选1即可 :");
scanf("%d",&parenthese);
printf("
6.请设置输出方式(1、直接显示在屏幕上 2、输出到文件) :");
scanf("%d",&file);
if(file==2)
{
printf("
已生成四则运算.txt文件~");
}
r=fopen("四则运算.txt","w");
printf("
");
if(fuhao!=5)
{
if(fl==1)
{
integer(); //简单运算(无小数)
}
else
{
decimals(); //简单运算(有小数)
}
}
else
{
if(fl==1)
{
mixInteger(); //混合运算(无小数、有无括号)
}
else
{
mixDecimals(); //混合运算(有小数、有无括号)
}
}
fclose(r);
printf("
是否重新运行运行该程序? <1>是 <2>退出
");
scanf("%d",&res);
if(res==1)
{
system("cls"); //清屏,重新运行
main();
}
}
2、整数四则运算,小数的四则运算与之类似。
void integer() //简单运算,整数的四则运算
{
int i,a,b,x[1000];
char c;
for(i=1;i<n+1;i++)
{
a=rand()%max; //随机数获取
b=rand()%max;
if(fuhao==1)
{
c='+';
x[i]=a+b;
}
else if(fuhao==2)
{
c='-';
x[i]=a-b;
}
else if(fuhao==3)
{
c='*';
x[i]=a*b;
}
else if(fuhao==4)
{
c='/';
while(b==0)
{
b=rand()%max;
}
x[i]=a/b;
}
if(file==1)
{
printf("(%d) %d%c%d=
",i,a,c,b);
}
else
{
fprintf(r,"(%d) %d%c%d=
",i,a,c,b);
}
}
integerAnswer(x); //获取答案
}
3、整数的混合运算,小数的混合运算与之类似。
void mixInteger() //混合运算(整数)
{
int i,a,b,c;
int x[1000];
char d,e;
for(i=1;i<n+1;i++)
{
a=rand()%max;
b=rand()%max;
c=rand()%max;
if(i%4==0) // a-b*c,(a-b)*c
{
d='-';
e='*';
if(parenthese==1) //无括号
{
x[i]=a-b*c;
}
else //有括号
{
x[i]=(a-b)*c;
}
}
else if(i%3==0) //a+b/c,(a+b)/c
{
d='+';
e='/';
while(c==0)
{
c=rand()%max;
}
if(parenthese==1)
{
x[i]=a+b/c;
}
else
{
x[i]=(a+b)/c;
}
}
else if(i%2==0) //a-b/c,(a-b)/c
{
d='-';
e='/';
while(c==0)
{
c=rand()%max;
}
if(parenthese==1)
{
x[i]=a-b/c;
}
else
{
x[i]=(a-b)/c;
}
}
else //a+b*c,(a+b)*c
{
d='+';
e='*';
if(parenthese==1)
{
x[i]=a+b*c;
}
else
{
x[i]=(a+b)*c;
}
}
if(file==1) //输出到屏幕
{
if(parenthese==1)
{
printf("(%d) %d%c%d%c%d=
",i,a,d,b,e,c);
}
else
{
printf("(%d) (%d%c%d)%c%d=
",i,a,d,b,e,c);
}
}
else //输出到文件
{
if(parenthese==1)
{
fprintf(r,"(%d) %d%c%d%c%d=
",i,a,d,b,e,c);
}
else
{
fprintf(r,"(%d) (%d%c%d)%c%d=
",i,a,d,b,e,c);
}
}
}
integerAnswer(x); //获取答案
}
4、整数运算答案输出,小数运算与之类似
void integerAnswer(int y[]) //整数运算答案
{
int i;
if(file==1) //输出到文件
{
printf("
正确答案:
");
for(i=1;i<n+1;i++)
{
printf("(%d) %d
",i,y[i]);
}
}
else //输出到屏幕
{
fprintf(r,"
正确答案:
");
for(i=1;i<n+1;i++)
{
fprintf(r,"(%d) %d
",i,y[i]);
}
}
}
五、测试样例
由于有多种情况,以下就列举两种概括性例子。
1、乘法运算,整数,无括号,输出到屏幕。
2、混合运算,小数,带括号,输出到文件。
六、总结
这一次我选择的是驾驶员的角色,虽然代码比较看着比较简单,使用很简单的c语言,没有那么复杂的算法,但还是基本实现了要求的功能,不过如果跟其他人比起来就有一点low了。
最开始觉得题目还是有一定难度的,难点在于怎么随机取数,通过搜索了解到了rand()函数,很好地解决了这个问题,之后在输出方式上也遇到一点问题,需要重复编写输出代码,觉得有点繁琐,但是实践之后并没有想到很好的解决办法,只能老实地写上了。之后基本上整个代码写下来还是很顺畅的。但存在好多只有一点区别的重复内容,虽然改进了一点,但仍很繁琐。遗憾的是由于能力有限,没有接触过图形化界面,就没能实现,今后的学习中会尽量弥补这方面的不足。
虽然以我现在的能力做不到像一些编程很好的同学一样能够编写复杂的算法,程序功能那么强大,例如设置式子的项数,随机输出符号,输出到打印机,更甚者能够实现图形化界面,但我也在努力中~希望以后可以越来越好吧。
最后,张同学承担的是领航员的角色,主要负责辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试。由于五一回家,我很晚才能回到学校,所以编写程序任务是由我在家里完成的,之后再由张同学进行后期的测试。通过两个人之间的合作沟通,使得项目进展更加迅速,效率也得到了提升。通过这次的作业也使我意识到了编程方面的不足,在今后的学习中我也会向着自己前进的方向努力~
总的来讲两个人之间的合作还是很不错的。