软件综合实践专题——第二次作业 结对编程
本次作业题目:
两个运算符100以内的数字,不需要写答案。【估计时间30min】
现在估计写这个程序需要的时间马上把代码写出来需要写答案,并且保证答案在0 ~100之【估计时间2h】
题目避免重复,可扩展性,可定制性
有条件的请马上把程序和运算结果的截屏发到博客上。
结对编程成员:
1759219+1759234
一、实验代码:
(1)随机出30道100以内的加减乘除的题(无答案):
#include <stdio.h> #include <stdlib.h> #include <time.h> void main() { int i, j, calc; double r; srand(time(NULL)); int flag=0; int a; for(a=1;a<=30;a++) i = rand()%100; j = rand()%100; calc = rand()%4; switch (calc) { case 0: r = i+j; printf("%d+%d=?\n", i, j); flag=1; break; case 1: r = i-j; printf("%d-%d=?\n", i, j); flag=1; break; case 2: r = i*j; printf("%d*%d=?\n", i, j); flag=1; break; case 3: if (j==0) { printf("%d/%d=?\n", i, j); printf("j=0,不能执行除法\n"); flag=1; break; } r = i/j; printf("%d/%d=?\n", i, j); flag=1; break; if(flag=1) { break; } } } }
(2)在(1)的基础上升级版(有答案,提示错误,有得分):
#include <iostream> #include <stdlib.h> #include <ctime> #include <conio.h> using namespace std;//计算式 数量 int const Num = 30; //计算式中 最大数 int const MaxNum = 100; //每题分数 int const PerMark = 1; //计算结果最大值 int const MaxResult = 100; //计算结果最小值 int const MinResult = 0; enum enOp{Add,Subtract,Multiply,Divide}; //将 枚举类型转换为字符类型,以便输出。 char enum2char(enOp op) { switch (op) { case Add: return '+'; case Subtract: return '-'; case Multiply: return 'x'; case Divide: return '/'; } return ' '; } //计算生成表达式的正确结果。 int myResult(int left,int right,enOp op) { switch (op) { case Add: return left+right; case Subtract: return left-right; case Multiply: return left *right; case Divide: return left/ right; } return 0; } //检查生成计算式的正确与否。其中 减法结果不能为负数,除法结果不能为小数。 bool checkFormula(int left,int right,enOp op) { switch (op) { case Add: { return true; } case Subtract: { if(left < right) return false; return true; } case Multiply: { return true; } case Divide: { if(right == 0) return false; if(double(left/right) != double(double(left)/double(right))) return false; return true; } } return false; } //依据给定操作符,生成符合条件的表达式。 void getFormula(int* left,int*right,enOp op) { //srand(time(NULL)); for(;;) { *left = 1 + rand() % MaxNum; *right = 1 + rand() % MaxNum; if(checkFormula(*left,*right,op) && myResult(*left,*right,op)<= MaxResult && myResult(*left,*right,op)>= MinResult) break; } } int main() { //操作符左值 int left[Num]; //操作符右值 int right[Num]; //用户输入计算结果 int result[Num]; //操作符 +-*/ enOp oper[Num]; //正确答案个数 int answerRight = 0; cout<<"正在生成,请稍等。"<<endl; //随机种子 srand(time(NULL)); //开始生成计算表达式。 for(int i = 0;i<Num;i++) { //srand( (unsigned)time(NULL)); //操作符 oper[i] = enOp(rand()%4); getFormula(&left[i],&right[i],oper[i]); } cout<<"生成计算式完成,开始答题!"<<endl; //输出表达式,让用户答题 for(int i = 0;i<Num;i++) { //输出表达式 cout<<"第 "<<i+1<<" 题: \n"; cout<<left[i]<<' '<<enum2char(oper[i])<<' '<<right[i]<< " = "; //获取用户答案 cin>>result[i]; //比对用户答案是否正确,正确输出 right,answerRigth加一,否则输出not correct。 if(result[i] == myResult(left[i],right[i],oper[i])) { cout<<"Right!\n"; answerRight++; } else { cout<<"Not correct!\n"; cout<<"正确答案是:"<<myResult(left[i],right[i],oper[i])<<endl; } } //全部答题完毕,输出正确答案个数及得分。 cout<<"终止答题,共 "<<Num<<" 题,每题 "<<PerMark<<" 分 ,答对 "<<answerRight<<" 题,得分 :" <<answerRight*PerMark<<" 分。"; //屏幕停止。 getch(); return 0; }
二、心得体会:
我们了解到了结对编程的好处:
1、我们能互相鼓励,不容易沮丧:团队工作能增加成员的工作积极性。因为在面对问题的时候,会有人一起分担,共同尝试新的策略。
2、我们能互相监督,一个人不想敲的时候,另一个人会督促他去学习。
3、互相学习编程技巧:在编程中,相互讨论,可以更快更有效地解决问题,互相请教对方,可以得到能力上的互补。
4、可以培养和训练新人。
5、会减少 bug的数量:两人互相监督工作,可以增强代码和产品质量,并有效的减少 BUG。
但它也有不好的地方:
1.我们在编程习惯上有很大的不同,所以常常会发生摩擦。
2.我们有一个人实在不想干的话,可能会打扰到另一个人,从而减低了效率。
3.两个人可能会对一个问题各执己见,甚至可能会产生矛盾。
感悟:
以前的编程基本上都是我们自己一个人去编写的,在第一次的结对编程合作中,我们还是有不少的感悟与收获的。
我们两个人来了一次思想上的碰撞,我们彼此都尊重对方的想法,并且会采纳对方的意见及建议。当然,我们学到了很多,对待事情的态度很认真,并且在代码有很多错误的情况下,依然很淡定。我们学习到了很多。
就我们本次实验二的编程而言,有了领航员的存在,我们在完成代码后,几乎没有花什么时间在debug上,甚至很多阶段性的代码都是一次通过,这大大提高了我们编程的效率,而且我们二人一起讨论出来的编程思路,也使得我们的代码功能更全面,效率更高。
我们认为,结对编程的优势主要就在于设计思路的共享,和我们互相为对方避免错误。总的来说,自己在编程时犯下的错误,有些尽管很简单,但却难以发现,而这些在另一个人眼中,却会十分明显。当然结对编程也有不适用的地方,比如其他课程的编程作业,需要我们每个人独立完成,就不能依赖同伴的帮助,还有就是一些十分传统的、规范的编程任务,比如写一段最常规的快排算法,此时如果有人在旁边,就纯粹是浪费时间,因为这些内容对我们而且太熟悉了,不需要有人在旁指导。
因为结对编程可以很大程度上提高编程效率,而且两人轮流编程,不会太过疲惫,因此十分适合敏捷开发。如果未来我们从事软件开发的工作,我们会十分乐于进行结对编程,因为这会极大的改善我们的编程体验,是编程不再那么枯燥,debug之路也不会那么恐怖。