一、题目描述
此次结对编程,我们选择的是题目一
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
(1)能够自动生成四则运算练习题;
(2)可以定制题目数量;
(3)用户可以选择运算符;
(4)用户设置最大数(如十以内、百以内等);
(5)用户选择是否有括号、是否有小数;
(6)用户选择输出方式(如输出到文件、打印机等);
最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主);
二、角色分工
此次结对编程,我承担的是驾驶员的角色,我的伙伴庚洋洋承担领航员的角色,在我俩默契配合下,基本实现了此次作业的基本要求功能。
三、功能实现
1、子函数模块设计
(1)输出界面函数Interface()函数
void Interface()
{
printf("=============================产生随机四则运算软件===============================
");
printf("欢迎使用自动生成四则运算软件!
");
}
(2)输入函数Input()
void Input()
{
printf("选择运算符('+','-','*','/'):");
while(1)
{
scanf("%c",&ch);
if(ch=='
')
break;
zf[sum++]=ch;
}
printf("题目数量:");
while(1)
{
scanf("%d",&tishu);//输入题数
if(tishu<=0)
{
printf("题数有错误,请重新输入!
");
printf("题目数量:");
}
else
break;
}
printf("选择n元运算(几个数进行运算):");
scanf("%d",&yuan);//输入几元运算
printf("输入最大数:");
scanf("%d",&max);
printf("是否有小数(1:是,0:否):");
scanf("%d",&f);
printf("是否有括号(1:是,0:否):");
scanf("%d",&g);
printf("是否写入文件(1:是,0:否):");
scanf("%d",&m);
fp=fopen("d:\1.txt","w");
}
(3)产生随机运算符函数ran()
void ran()
{
while(1)
{
a=rand()%4+0;
if(a==0)
{
ch='+';
}
if(a==1)
{
ch='-';
}
if(a==2)
{
ch='*';
}
if(a==3)
{
ch='/';
}
t=0;
for(int k=0;k<sum;k++)
{
if(ch==zf[k])
{
if(m==1)
fprintf(fp,"%c",ch);
if(m==0)
printf("%c",ch);
t=1;
break;
}
}
if(t==1)
break;
}
}
(4)四则运算函数Arithmetic()
void Arithmetic()
{
for(i=0;i<tishu;i++)//随机产生100以内的整数
{
if(yuan<3)
{
for(j=0;j<yuan;j++)
{
if(f==0)
{
x[j]=rand()%(max)+1;
if(m==1)
fprintf(fp,"%d",x[j]);
if(m==0)
printf("%d",x[j]);
if(j==yuan-1)
{
break;
}
ran();
}
if(f==1)
{
y[j]=rand()/(double)(RAND_MAX/(max)+1);//产生100内小数
if(m==1)
fprintf(fp,"%.3lf",y[j]);
if(m==0)
printf("%.3lf",y[j]);
if(j==yuan-1)
{
break;
}
ran();
}
}
txt();
}
else
{
c=rand()%(yuan-1)+0;
d=rand()%(yuan-c)+2;
e=c+d;
if(e<yuan&&g==1)
{
for(j=0;j<yuan;j++)
{
if(f==0)
{
x[j]=rand()%(max)+1;
if(j==c)
{
if(m==1)
fprintf(fp,"(");
if(m==0)
printf("(");
}
if(m==1)
fprintf(fp,"%d",x[j]);
if(m==0)
printf("%d",x[j]);
if(j==e)
{
if(m==1)
fprintf(fp,")");
if(m==0)
printf(")");
}
if(j==yuan-1)
{
break;
}
ran();
}
if(f==1)
{
y[j]=rand()/(double)(RAND_MAX/(max)+1);//产生100内小数
if(j==c)
{
if(m==1)
fprintf(fp,"(");
if(m==0)
printf("(");
}
if(m==1)
fprintf(fp,"%.3lf",y[j]);
if(m==0)
printf("%.3lf",y[j]);
if(j==e)
{
if(m==1)
fprintf(fp,")");
if(m==0)
printf(")");
}
if(j==yuan-1)
{
break;
}
ran();
}
}
txt();
}
else if(e>=yuan&&g==1)
{
tishu++;
}
if(e<yuan&&g==0)
{
for(j=0;j<yuan;j++)
{
if(f==0)
{
x[j]=rand()%(max)+1;
if(m==1)
fprintf(fp,"%d",x[j]);
if(m==0)
printf("%d",x[j]);
if(j==yuan-1)
{
break;
}
ran();
}
if(f==1)
{
y[j]=rand()/(double)(RAND_MAX/(max)+1);//产生100内小数
if(m==1)
fprintf(fp,"%.3lf",y[j]);
if(m==0)
printf("%.3lf",y[j]);
if(j==yuan-1)
{
break;
}
ran();
}
}
txt();
}
if(e>=yuan&&g==0)
{
tishu++;
}
}
}
}
(5)写入文件函数txt()
void txt()
{
fp=fopen("d:\1.txt","w");
if(m==1)
{
fprintf(fp,"=");
fprintf(fp,"
");
}
if(m==0)
{
printf("=");
printf("
");
}
}
2、主函数模块设计main()
int main()
{
Interface();
Input();
Arithmetic();
return 0;
}
四、功能展示
1.判错处理
2.不带括号的整数
(1)输出界面
(2)写入文件运行结果
3带括号的整数
(1)输出界面
(2)写入文件运行结果
4.不带括号的小数
(1)输出界面
(2)写入文件运行结果
5.带括号的小数
(1)输出界面
(2)不写入文件运行结果
五、结对编程风采
六、领航员评价
此次结对编程中,我的伙伴庚洋洋同学承担领航员角色。这个过程中,虽然是领航员,但他给我提供了很多非常宝贵的思路。例如在如何产生随机的运算符这个问题上,困扰了我很久,我们都知道,产生一个随机数可以直接调用 c语言中的库函数rand()%(max)+1,其中max代表产生从1开始到所限定数max之间的随机数。但对于随机运算符不能直接定义,但可以通过定义一些所产生的特殊随机数,如0,1,2,3分别定义运算符“+、-、*、/”这样就可以很轻松的解决这个如何产生随机运算符的问题。由于他给我提供的这个思路,我解决了这个问题。除了在很多地方给我提供了宝贵的编程思路之外,他还设计出了合理的测试用例,将此次编写的代码进行了合理的测试,同时指出了我在编写代码时存在的一些问题,改进了我的编程方法,为以后编程积累了宝贵的经验。总的来说,在我俩的默契配合下,我们较好的完成了此次的作业。
七、总结
在这学期,自选修软件工程这门课以来,老师给我们介绍了软件开发过程中各种开发流程。特别是此次结对编程,从设计编程思路到函数编写,从功能实现到单元测试真真实实让我们体会了一次在以后工作中要经历的过程,高度模拟了以后要从事工作的工作流程。此次我们所选择的问题虽然看似不难,只是生成随机四则运算的式子,但是里面蕴含的算法的思路确实不易。例如,如何随机产生运算符和随机数搭配,核心是如何完成随机数和随机运算符的搭配。如何产生随机运算符在前面所以及提到,在这里不做赘述;而如何搭配随机数和随机运算符,我们知道第一个字符必定为数字,只需要在产生一个随机数后,用rand()%4+0产生0~3的随机数各自代表运算符,插在每一个随机数后,由于所参加的数不一定是一个,可能是i=2,3,4.....n个,所以在外面加一个循环即可以实现。同时在功能模块,根据学习软件工程相关理论,对于一个成熟的软件要有判错处理。我们在功能模块加入了判错处理,在用户选择题目数量功能模块进行了判错处理并提示用户重新输入,这些都是在以前编程过程不进行考虑的,而在这次结对编程中考虑了模拟用户的各种需求,可以说将我们从以前的测试代码通过的初级程序编写阶段慢慢培养成可以面向半成品化的软件开发阶段,切切实实提高了我们的专业技能。此外,对于一个较为复杂但不需要团队来完成的问题,可以通过结对编程来实现。而且结对编程可以大大提高工作效率,在我们此次结对编程过程中得以体现。我和伙伴用了两个下午的时间实现了该程序的功能。而一个人的能力完成这么一个问题还是相对困难的,但结对编程不仅可以使两个人在编程过程中进行变编程思路交流、提高工作效率,而且可以培养我们和他人交流协作的团队精神、团队意识,这对我们以后从事计算机行业是非常重要的。总体来说,我们较好的完成了结对编程的任务,实现了基本的功能,但还是有一些不足。由于时间以及两人个人能力的原因,界面没能实现。另外在编程过程中设计思路的不清晰等原因使我们走了不少弯路,这些出现的问题将是我们一笔宝贵的财富,这将使我们在今后的学习中积极改进,切实提高自身的专业技能,为以后从事职业打好坚实的基础,培养良好的职业素养。