软件综合实践专题——第二次作业 结对编程

本次作业题目:

小学老师要每周给同学出300道四则运算练习题。
这个程序有很多种实现方式。
C/C++ C#
VB.net
java Excel Unix Shell Emacs
Powershell/Vbscnpt Python

两个运算符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之路也不会那么恐怖。

posted @ 2019-03-19 22:00  一斜夕阳  阅读(173)  评论(0编辑  收藏  举报