柚子快报激活码778899分享:结对编程-四则运算
本次结对编程作业由我和2130713一起完成
一 需求分析
(1)两个运算符,100 以内的数字,不需要写答案。(2)需要检查答案是否正确,并且保证答案在 0-100之间。 (3)尽可能地多设置一些条件。
二 题目分析
语言和工作的选择:
经过协商,我们在操作时,选择使用C++语言和Dev C++工具。
分析过程:
1、对于操作数范围,我们考虑使用随机函数操作,并用随机函数生成的结果对100取余,即可得到一百内的随机数
2、对于四则运算的操作符号,我们仍使用随机函数,,因为只涉及加减乘除,所以类似操作数取余操作,我们对4取余,对应的0-3分别对应四个运算符。
3、对于展示模式的选择,我们在一次性输出全部题目和逐题输出中,选择了后者,一方面由于Dev运行小黑框的限制,一次输出300题,可能不便于小学生作答,另一方面逐题显示模式下,我们可以在小学生输入答案后立即给予反馈。
4、对于需求中的“尽可能地多设置一些条件”,我们讨论后决定加入两个功能,一是对当前提号的计数,便于小学生知道当前题号及后续剩下的题数;二是设置分数系统,每题1分,共计300分。
三 第一版代码及其结果
代码:
#include
#include
int main(){
int x=0,y=0;//操作数
int z=0;//记录小学生答案
int op=0;//操作符
int count=1;//题数计数器
int score=0;//记录得分
int i,j;
for( i=0;i<300;i++){
x=rand()%100;
y=rand()%100;
op=rand()%4;
for(j=0;j!=-1;j++){
if(op==0&&x+y<=100){
printf("\n%d、",count++);
printf("%d + %d = \n",x,y);
printf("请输入第%d题答案: ",count-1);
scanf("%d",&z);
if(z==x+y){ printf("\n 答案正确~\n\n"); score++;}
else printf("\n 答案不对哦,小朋友~\n\n");
j=-2;
}
if(op==1&&x>y){
printf("%d、",count++);
printf("%d - %d = \n",x,y);
printf("请输入第%d题答案: ",count-1);
scanf("%d",&z);
if(z==x-y) { printf("\n 答案正确~\n\n"); score++;}
else printf("\n 答案不对哦,小朋友~\n\n");
j=-2;
}
if(op==2&&x*y<=100){
printf("%d、",count++);
printf("%d * %d = \n",x,y);
printf("请输入第%d题答案: ",count-1);
scanf("%d",&z);
if(z==x*y) { printf("\n 答案正确~\n\n"); score++;}
else printf("\n 答案不对哦,小朋友~\n\n");
j=-2;
}
if(op==3&&x/y<=100){
printf("%d、",count++);
printf("%d / %d = \n",x,y);
printf("请输入第%d题答案: ",count-1);
scanf("%d",&z);
if(z==x/y) { printf("\n 答案正确~\n\n"); score++;}
else printf("\n 答案不对哦,小朋友~\n\n");
j=-2;
}
}
}
printf("\n恭喜完成全部题目您的得分是 %d",score);
return 0;
}
结果:
四 问题分析和解决
(1) 题目有序问题
从前两张截图我们俩人发现一个问题,就是说rand函数输出的随机数是有顺序的,它的输出结果是一成不变的,第一题永远是0+16,第二题永远是64-5,很明显这不是我们需要的随机数。
通过学习,我们知道了rand函数的本质:它里面采用了线性同余法计算出随机数,该方法有个最大周期M,也就是说该方法实在一定的范围内生成一串数字,不过这个M一般来说比较大,所以正常使用时一般看起来就是产生了随机的数,不过这个函数由于默认种子是1,所以每次产生的随机数都是相同的。
因此我们需要做的是改变这个默认种子值,我们考虑使用srand函数,它为rand函数提供随机数种子,但是我们不可能每次都通过手动修改的方式去改变这个种子值,因此我们以系统时间作为参数加入srand函数,即以当前时间为种子,产生随意数。
对代码作出如下修改:
结果如下:
到此为止,问题1已经得到解决。
(2) 针对除法运算问题
由于int类型的限制,无法对除法进行正确计算,这直接导致了结果只能为整数,因此我们需要对运算变量类型作出改变,由int转为float,这样可以使得除法运算得出正确结果。
五 第二版代码
#include
#include
#include
int main(){
srand(time(0));
float x=0.0,y=0.0;//操作数
float z=0;//记录小学生答案
int op=0;//操作符
int count=1;//题数计数器
int score=0;//记录得分
int i,j;
for(i=0;i<300;i++){
x=rand()%100;
y=rand()%100;
op=rand()%4;
for(j=0;j!=-1;j++){
if(op==0&&x+y<=100.0){
printf("\n%d、",count++);
printf("%.1f + %.1f = \n",x,y);
printf("请输入第%d题答案: ",count-1);
scanf("%f",&z);
if(z==x+y){ printf("\n 答案正确~\n\n"); score++;}
else printf("\n 答案不对哦,小朋友~\n\n");
j=-2;
}
if(op==1&&x>y){
printf("%d、",count++);
printf("%.1f - %.1f = \n",x,y);
printf("请输入第%d题答案: ",count-1);
scanf("%f",&z);
if(z==x-y) { printf("\n 答案正确~\n\n"); score++;}
else printf("\n 答案不对哦,小朋友~\n\n");
j=-2;
}
if(op==2&&x*y<=100.0){
printf("%d、",count++);
printf("%.1f * %.1f = \n",x,y);
printf("请输入第%d题答案: ",count-1);
scanf("%d",&z);
if(z==x*y) { printf("\n 答案正确~\n\n"); score++;}
else printf("\n 答案不对哦,小朋友~\n\n");
j=-2;
}
if(op==3&&x/y<=100){
printf("%d、",count++);
printf("%.1f / %.1f = \n",x,y);
printf("请输入第%d题答案: ",count-1);
scanf("%f",&z);
if(z==x/y) { printf("\n 答案正确~\n\n"); score++;}
else printf("\n 答案不对哦,小朋友~\n\n");
j=-2;
}
}
}
printf("\n恭喜完成全部题目您的得分是 %d",score);
return 0;
}
六 博客体会
由于之前都一个人编程习惯了,经过这次结对测试的经历,让我们意识到了结对编程会极大地加快编程效率,能达到事半功倍的工作效果,此外还能改正之前编程的坏习惯,比如我和他为了使对方易于理解自己的代码就会注意到格式的重要性,使代码简洁整洁规范了。但是人与人之间的合作不是一件简单的事情,因为我们都习惯了独自编程,其次还需要看两个人之间的默契,通过两个人缜密的思考和计划可以极大的缩短代码长度、减少语法错误的发生、减少思考的时间,从而做出更加完美的产品。而另一方面,两个有经验的人可能会发现配对编程里没有什么技能的转移,但是让他们在不同的抽象层次解决同一个问题会让他们更快地找到解决方案,而且错误更少。两个程序员具有相同的缺点和盲点的可能性小,所以采用结对编程时候会获得更好的解决方案,这个解决方案恰恰是其它软件工程方法学中所没有的。在我们平时的编程当中,如果遇到一个非常难解决的问题,这时可能会对问题产生厌烦,那么你势必会希望录求帮助,无论是从信息量庞大的网上,还是从身边的技术大师那里,你都会努力去解决。这个时候不妨采用结对编程试一下,会有不同的感觉,会体会到两个人思想的碰撞、语法知识的互补以及增强两人的默契。
柚子快报激活码778899分享:结对编程-四则运算
发表评论