软件工程综合实践专题第二次作业———结对编程
学习了软件工程综合实践专题这门课程,懂得了结对编程是指两个人一起,用一台电脑,鼠标,键盘的一种编程方式。
王文娟老师在课后留下了一道随机出三百道四则运算的题目并要求采用结对编程的方式和搭档共同完成
在这次的编程过程中,我和我的搭档第一次接触并采用结对编程的这种编程模式,也就是两个人同时在一台电脑上进行编程,下面是我们写出的代码以及一些在这个过程中体会到的对结对编程的心得体会:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
char operatorarry[4]={'+','-','*','/'};//运算符数组
void NoAnswertitle();//随机出三百道无不重复答案的题目
void InAnswertitle();//随机出三百道不重复有答案的题目,且答案在0-100之间
void AddSubtitle();//仅有加减号的运算
void MulDivtitle();//仅有乘除号的运算
void NoAnswertitle(){//实现无答案出题功能
int n=0;
srand((unsigned)time(NULL));//设置一个随机数种子,以防止伪随机数的不变化
for(int i=0;i<300;i++){//循环三百次,出三百个题 (用while来控制题目不重复)
printf("%d%c%d%c%d\n",rand()%100,operatorarry[rand()%4],rand()%100,operatorarry[rand()%4],rand()%100);//用rand()%100随机生成100以内的数字
}
}
void InAnswertitle(){//实现有答案出题功能
int k,n=0;//k用来放计算结果;n用来计算答案在0到100之间的个数,判断是否到了300条
srand((unsigned)time(NULL));//设置一个随机数种子,以防止伪随机数的不变化
while(n<300){//循环三百次,出三百个题
int a=rand()%100;
char b=operatorarry[rand()%4];
int c=rand()%100;
char d=operatorarry[rand()%4];
int e=rand()%100;
//下面开始穷举两个运算符的16种组合情况
if((b==operatorarry[0])&&(d==operatorarry[0])){
k=a+c+e;
}
if((b==operatorarry[0])&&(d==operatorarry[1])){
k=a+c-e;
}
if((b==operatorarry[0])&&(d==operatorarry[2])){
k=a+c*e;
}
if((b==operatorarry[0])&&(d==operatorarry[3])){
k=a+c/e;
}
if((b==operatorarry[1])&&(d==operatorarry[3])){
k=a-c+e;
}
if((b==operatorarry[1])&&(d==operatorarry[3])){
k=a-c-e;
}
if((b==operatorarry[1])&&(d==operatorarry[3])){
k=a-c*e;
}
if((b==operatorarry[1])&&(d==operatorarry[3])){
k=a-c/e;
}
if((b==operatorarry[2])&&(d==operatorarry[3])){
k=a*c+e;
}
if((b==operatorarry[2])&&(d==operatorarry[3])){
k=a*c-e;
}
if((b==operatorarry[2])&&(d==operatorarry[3])){
k=a*c*e;
}
if((b==operatorarry[2])&&(d==operatorarry[3])){
k=a*c/e;
}
if((b==operatorarry[3])&&(d==operatorarry[3])){
k=a/c+e;
}
if((b==operatorarry[3])&&(d==operatorarry[3])){
k=a/c-e;
}
if((b==operatorarry[3])&&(d==operatorarry[3])){
k=a/c*e;
}
if((b==operatorarry[3])&&(d==operatorarry[3])){
k=a/c/e;
}
if(k<0||k>100)//如果算出结果不在0到100之间,就舍取这一条运算
continue;
else{
printf("%d%c%d%c%d=%d\n",a,b,c,d,e,k);//用rand()%100随机生成100以内的数字
n++;
}
}
}
void AddSubtitle(){
int n=0;
srand((unsigned)time(NULL));
for(int i=0;i<300;i++){
printf("%d%c%d%c%d\n",rand()%100,operatorarry[rand()%2],rand()%100,operatorarry[rand()%2],rand()%100);
}
}
void MulDivtitle(){
int n=0;
srand((unsigned)time(NULL));
for(int i=0;i<300;i++){
printf("%d%c%d%c%d\n",rand()%100,operatorarry[rand()%2+2],rand()%100,operatorarry[rand()%2+2],rand()%100);
}
}
int main(){
printf("*****四则运算练习随机出题程序*****\n");
printf("1、无答案出题\n");
printf("2、有答案出题\n");
printf("3、仅有加减号的题\n");
printf("4、仅有乘除号的题\n");
printf("请选择:");
int n;//用来存放选择的数字
scanf("%d",&n);
switch(n){
case 1:NoAnswertitle();
break;
case 2:InAnswertitle();
break;
case 3:AddSubtitle();
break;
case 4:MulDivtitle();
break;
}
}
运行结果:
①时间方面:我们在初步阶段预估的时间是一个小时写出最基本的随机出三百道题和可选择有无答案的出题方式两个功能,但实际我们花了超过一个小时,结对编程中由于思维冲突会消耗比预期结果多的时间,肯定没有一个人写的时候那么顺利。在第二个阶段我们编写可选这运算符号的时候,也比预期结果超了快20分钟,整个代码写下来共耗时2个小时左右。
②分工合作:这次得结对编程主要由我(1759115岑拓望)负责主要代码得编写,例如整体框架得设计(先声明出所有要用到得成员函数,再经行实现,以及整体结构得编排),具体函数得实现编写,成员变量得定义。而我的搭档(1759117何昌霖)主要负责在我写的同时考虑代码优化得问题,比如占用内存空间得大小问题,代码执行效率得问题,以及逻辑得严密性考虑。整个代码编写过程为:我一边打代码,他一边做记录,分析整个代码得优化问题以及在我写不出来得时候进行帮助。
例如:在经行设置运算符数组这个问题上,我的初始想法是直接穷举两两组合得16中运算符得结合经行使用,而我的搭档则提出了使用运算符数组得标识与rand函数得结合可以有效得减少代码量以及提高代码得运行效率
③出现的问题:结对编程虽然是两个人的工作,看似会比一个人轻松许多,但实际会有很多问题的出现,比如双方意见不合,在各自提出后,很难进行统一,就上面的代码而言:我们两一直在为如何对生成的题目进行答案的自动运算这个问题有着激烈的争论,我想的是直接用许多个if语句实现对运算符的判断,总而达到计算答案的目的,而他则希望可以用switch case语句取代if。此外还有许多问题,比如局部变量和全局变量的定义,一个变量到底是放在全局好,还是局部好,等等...
④结对编程得利与弊:之前的时候我从没在其他地方练习过这种模式,一直以为编程大概就是一个人的游戏,但现在在学习了这门课程后,感受很深,想谈谈这种合作模式的利和弊,以及我对它的理解。
结对编程的利:
最大的好处就是,两个人在一起写代码的时候由于思维的碰撞,写出的代码能够融合两种不同的思路,相比于一个人写的代码,不管是逻辑还是效率各方面都有明显的提高,一个人写的时候另一个人可以浏览,这样也能够让代码准确性更高。
两个人一起写代码,便于两个人之间的相互学习,对其中的每个人来说,写出的代码都是一种新风格的尝试,毕竟两个人在一起写,写出的代码不会完全偏向与一个人的风格
能使得两人之间工作量平均。结对编程中两人的工作同时贯穿整个工程,不会出现分配工作多与少,难与易的问题
结对编程的弊:
首先结对编程两个人同时写一份代码,但是写的速度并不会快出两倍,反而还可能会有些影响编程速度,因为要将两个人的思维拼接磨合成同一种思维,难免会耗费大量的时间,这样看起来可能会有些降低了开发效率
组员之间开发习惯不同容易引起冲突。比如在上面的代码行中,在出题的同时显示答案的代码段,我的想法是直接穷举两个运算符的十六种两两组合是最简单的方式,但我的搭档就不同意,他认为这样写代码量大,所以争吵和隔阂就会慢慢凸显出来
不便于进行明确的分工,在某行代码上他比较懂,而在另一段代码上,可能你比较会写,这样就导致了一个问题,不能明确的定好两个人的工作范围,因为编出来的具体代码是怎样的谁也不能提前预知,细节方面只能走一步看一步。
⑤心得体会:综上所述,我个人认为,结对编程并不是在所有情况下都适用,当开发的东西需要答题的框架结构设计、或者事当需要写高精度的代码时就适合使用结对编程。
当需要细致的分工开发,大规模开发的时候,是不适用结对编程的。但就其本身而言,还是能比单人写出来的代码更具优良性,毕竟一份代码是经过了两次思考的