王鑫君1759105和程雯丽1759104一起结对完成的代码编写
做100以内的四则运算是相比较而言比较基础的代码编写,但是较为新奇的是两人结对的代码编写过程。之前就听说过两人合作编写代码能够更高效,一人敲代码,一人做代码测试;一人缺失灵感,一人提供建议,两两合作听起来真的给敲代码这个较为枯燥的事注入了新活力。但是,我们在尝试结对编程过程中还是有许多问题和争议的。
结对敲代码过程1:选编程语言的争议
结对敲代码观点1:和我自己编代码区别有点大
一般而言,自己敲代码不会有争议,我自己习惯哪个或者擅长哪个就用哪个敲代码,但是是两人结对,所以我们在一开始选择哪种编程语言上就有了歧义。我觉得想用C++,她想用C语言,尽管在我概念里这两个相当“兼容”,但相比而言我觉得C++比C简单很多。
C语言是面向过程的编程,它最重要的特点是函数,通过main函数来调用各个子函数。
C++是面向对象的编程,类是它的主要特点,在程序执行过程中,先由主main函数进入,定义一些类,根据需要执行类的成员函数,过程的概念被淡化了,以类驱动程序运行,类就是对象,所以我们称之为面向对象程序设计。面向对象在分析和解决问题的时候,将涉及到的数据和数据的操作封装在类中,通过类可以创建对象,以事件或消息来驱动对象执行处理。
所以本质上还是有区别的,最后我们还是决定用C语言来敲这个小程序。
结对敲代码过程2:编程变量的命名争议
结对敲代码观点2:我觉得变量命名可以长一些,但是最好能好识别
不知道是不是因为没有过结对敲代码的经验,所以许多小的问题上都有些争议,对于她的变量命名上,我总是会不认同她,我觉得她常常在变量上的命名让我看不懂,我觉得如果是较长的代码量,这个变量是什么?那个变量是什么?我总是认不出来,记不住的,我觉得一点也不方便代码的阅读,是个不太好的习惯呀。
结对敲代码过程3:与平时遇代码bug的习惯不同
结对敲代码观点3:我好像还是习惯一个人啃bug,专注力不太集中得起来
其次,在平常的时候我们也会遇到别人问我们“这段代码哪里有错啊,帮忙找找呀。”之类的问题,我习惯是把代码发给我看看,然后自己调试修改,改完了后再发回去给他,所以在结对这个代码编写时,就不自主地会“发给我我看看”这样,觉得两个人挤在一个电脑前纠错不习惯,脖子也不太舒服,而且可能也是因为不习惯吧,所以感觉没有一个人调试的时候的那种专注感,感觉注意力集中不起来。
结对敲代码过程4:与平时遇代码bug后的小偷懒不同
结对敲代码观点4:这个效率提高得好多啊,棒!
平时我在敲了大段代码,满怀期待地运行后,发现出了一些难以看出的错误,就会“啊!累死了,先玩会儿吧。”这样,然后看似一直坐在桌前面对着电脑,但是只是无用功,效率极低。但是结对编程就不一样了,当连续一两个小时一直面对着电脑时,就已经觉得累了,想歇会儿,但是作为观察员,驾驶员还在勤勤恳恳地敲代码,我一个在旁边提意见,看看是否有错的喊累,似乎太说不过去了,于是继续坚持,很快错误就解决了,代码也敲得很快。我觉得百度百科说的就是我这类的“懒人”,嘿嘿~
“结对编程使得程序员被迫提高了工作效率。如果单独工作,在遇到困难的时候,并不是所有人都立刻积极地去解决问题,这时或许会上网和网友聊聊天,看看无关的网站等等。有可能因为工作的打断,大半天的时间都浪费了。看起来,程序员每天都在加班,实际有效工作时间往往还达不到6个小时。而结对编程有一种相互督促的作用,在一边工作疲惫状态不好时,另一边会起一个鼓励和激发斗志的作用。
而且两个人共用一台电脑,略带私人性质的聊天活动都会很自觉地不去进行了。结果一天下来,新实验结对编程的程序员都会喊累,神经紧绷8个小时的工作不累才怪。” ——来自百度百科“结对编程”
结对敲代码过程5:一些新的编程技巧
结对敲代码观点5:三个臭皮匠顶个诸葛亮
这个是个我一开始就知道的事了,确实在编程过程中,我自己的想法有些绕路了,她提出自己的想法,我觉得不足的地方加以改进,加入自己的想法,竟比我当初的想法更方便,当然这也在我的意料之中。我在这个结对编程的尝试中,确实学到了一些新的编程技巧,受益良多。
结对敲代码过程6:习惯队友的习惯
结对敲代码观点6:结对编程一定会有歧义,但站在别人的习惯上分析也会发现这很正常
在一开始的代码学习上,每个人的理解代码都是不一样的,那么在敲代码时一定也会有着与自己理解相近的敲代码习惯方式。我们分享关于代码细节上的知识,并且互相学习队友的编程技巧,同时也渐渐地理解了队友的习惯。
这是最初的代码,能够随机出四则运算的题目,总共10题。
代码1:计算考查【估计时间30分钟】
#include"stdio.h"
#include<stdlib.h>
#include<time.h>
#include<ctype.h>
int sy[10],sr[10],jd[10],jg[10];
int fs=0;
char fh[10];
void chufa(int *s1,int *s2,int *s3)
{
int i,b=1,c,jg;
int cs[20]={0},sy,sr;
srand((unsigned)time(NULL));
FA:sy=rand()%100;
if(sy==0) goto FA;
for(i=1;i<=sy;i++)
{
if(sy%i==0) { cs[b]=i; b++;}
else continue;
}
c=rand()%b;
if(c==0) c=c+1;
sr=cs[c];
jg=sy/sr;
*s1=sy;
*s2=sr;
*s3=jg;
}
void jisuan()
{
int p;
int i,gh;
printf("将进行100以内数字的四则运算! ");
srand((unsigned)time(NULL));
for(i=0;i<10;i++)
{
sy[i]=rand()%100;
sr[i]=rand()%100;
p=rand()%4;
if(p==0)
{
fh[i]='+';jg[i]=sy[i]+sr[i];}
else if(p==1)
{
fh[i]='-';
if(sy[i]<sr[i])
{ gh=sy[i];
sy[i]=sr[i];
sr[i]=gh;
}
jg[i]=sy[i]-sr[i];
}
else if(p==2)
{
fh[i]='*';
jg[i]=sy[i]*sr[i];
}
else if(p==3)
{
fh[i]='/';
chufa(&sy[i],&sr[i],&jg[i]);
}
printf("第%2d题:%2d %c %2d=?",i+1,sy[i],fh[i],sr[i]);
scanf("%d",&jd[i]);
if(jd[i]==jg[i]) fs+=10;
}
printf(" 测试结束 ");
}
int main()
{
jisuan();
return 0;
}
运算结果:
之后,我们希望能够进行计算考查之后,给出正确答案能让我们知道自己是否计算正确。
代码2:计算考查+正确答案显示【估计时间15分钟】
#include"stdio.h"
#include<stdlib.h>
#include<time.h>
#include<ctype.h>
int sy[10],sr[10],jd[10],jg[10];
int fs=0;
char fh[10];
void chufa(int *s1,int *s2,int *s3)
{
int i,b=1,c,jg;
int cs[20]={0},sy,sr;
srand((unsigned)time(NULL));
FA:sy=rand()%100;
if(sy==0) goto FA;
for(i=1;i<=sy;i++)
{
if(sy%i==0) { cs[b]=i; b++;}
else continue;
}
c=rand()%b;
if(c==0) c=c+1;
sr=cs[c];
jg=sy/sr;
*s1=sy;
*s2=sr;
*s3=jg;
}
void jisuan()
{
int p;
int i,gh;
printf("将进行100以内数字的四则运算! ");
srand((unsigned)time(NULL));
for(i=0;i<10;i++)
{
sy[i]=rand()%100;
sr[i]=rand()%100;
p=rand()%4;
if(p==0)
{
fh[i]='+';jg[i]=sy[i]+sr[i];}
else if(p==1)
{
fh[i]='-';
if(sy[i]<sr[i])
{ gh=sy[i];
sy[i]=sr[i];
sr[i]=gh;
}
jg[i]=sy[i]-sr[i];
}
else if(p==2)
{
fh[i]='*';
jg[i]=sy[i]*sr[i];
}
else if(p==3)
{
fh[i]='/';
chufa(&sy[i],&sr[i],&jg[i]);
}
printf("第%2d题:%2d %c %2d=?",i+1,sy[i],fh[i],sr[i]);
scanf("%d",&jd[i]);
if(jd[i]==jg[i]) fs+=10;
}
printf(" 测试结束 ");
}
void dajuan()
{
int j;
printf("你的答卷为: ");
for(j=0;j<10;j++)
printf("%2d %c %2d=%2d ",sy[j],fh[j],sr[j],jd[j]);
printf(" ");
}
int main()
{
jisuan();
dajuan();
return 0;
}
运行结果:
最后,我们希望能够更直观得告诉我们对了哪些,错了哪些,不需要自己与正确答案一一对比
代码3:我们提出了菜单式,有一二三四的选项供选择【估计时间60分钟】
#include"stdio.h"
#include<stdlib.h>
#include<time.h>
#include<ctype.h>//字符操作函数
//定义全局变量
int sy[10],sr[10],jd[10],jg[10];//sy,sr,jd,jg分别为第一运算数,第二运算数,输入结果,正确结果
int fs=0;
char fh[10];//fh保存运算符号
void chufa(int *s1,int *s2,int *s3)
{
int i,b=1,c,jg;//i为控制循环变量
int cs[20]={0},sy,sr;//cs为除数数组,sy保存被除数,sr为从cs中抽取的除数
srand((unsigned)time(NULL));
FA:sy=rand()%100;
if(sy==0) goto FA;
for(i=1;i<=sy;i++)//产生除数数组的循环
{
if(sy%i==0) { cs[b]=i; b++;}
else continue;
}//循环结束
c=rand()%b;//随机抽取除数
if(c==0) c=c+1;
sr=cs[c];
jg=sy/sr;
*s1=sy;//指针变量
*s2=sr;
*s3=jg;
}
/* 自动生成10道运算题,数值在0-99之间
每出一道题后等待操作者输入运算结果
判断输入的结果是否正确,正确加10分
给出最终得分
*/
/* 算法:用随机函数rand()产生0-32767之间的整数,与100取余数后得到0-99之间的整数
运算符也由随机数产生,rand%4得到0-3之间的随机数,约定0:减法,1:加法
2:乘法,3:除法。for循环控制题目数量,每次循环先产生题目并显示出来,将计算结果保存在jg中再等到做题的人从键盘输入计算结果保存在s中,将jg与s进行比较判定正确性
做完十道题后(循环结束),显示测试结果并进行评价
*/
void jisuan()
{
int p;//p为随机产生的运算符号,规定0为加法,1为减法,2为乘法,3为除法
int i,gh;//i为循环控制变量,gh用于临时交换数据
printf("将进行100以内数字的四则运算! ");
srand((unsigned)time(NULL));//随机数由系统时间函数产生
//循环产生10道100之内的加减乘除法运算题目
for(i=0;i<10;i++)
{
sy[i]=rand()%100;//随机产生第一个操作数(1-99)
sr[i]=rand()%100;//随机产生第二个操作数(1-99)
p=rand()%4;//随机产生运算符(0-3)
if(p==0)//转换成运算符号,p为0表示做加法
{
fh[i]='+';jg[i]=sy[i]+sr[i];}//fh为‘+’,jg为sy[i]+sr[i]
else if(p==1)//p为1表示做减法
{
fh[i]='-';
if(sy[i]<sr[i])
{ gh=sy[i];
sy[i]=sr[i];
sr[i]=gh;
}//如果sy<sr,则交换sy,sr,以保证结果为正数
jg[i]=sy[i]-sr[i];
}
else if(p==2)//p为2表示做乘法
{
fh[i]='*';
jg[i]=sy[i]*sr[i];
}// fh为'*',jg为sy*sr
else if(p==3)//p为3表示做除法
{
fh[i]='/';
chufa(&sy[i],&sr[i],&jg[i]);
}
printf("第%2d题:%2d %c %2d=?",i+1,sy[i],fh[i],sr[i]);//显示题目
scanf("%d",&jd[i]);
if(jd[i]==jg[i]) fs+=10;
}//循环结束
printf(" 测试结束 ");
}
/*主菜单选项,分为显示答卷、错题正解、系统评估、系统退出
算法:使用printf()函数显示菜单项,用scanf()函数接受选项字符
while条件限定选项的合法性,非法字符则重新输入并返回主函数
*/
char caidan()
{
char c='0';//定义变量
printf(" *******数学四则运算******* ");
printf(" 1.显示答卷 2.错题正解 ");
printf(" 3. 系统评估 4.系统退出 ");
printf(" ***********************************");
printf(" 请输入选项(1-4):");//提示输入选项
do
{
scanf("%c",&c);//输入选项
}
while(!(c>='1'&&c<'5'));//检验选项是否合法,若否则重输
return c;//返回选择项
}
/*对成绩结果进行评价,便于做题了解自己的情况,按分数的不同层次进行评价
算法:用条件函数switch对成绩score进行分段并给出相应的评价,结果score的数据从主函数获得
*/
void pingjia()
{
printf("你的成绩是%d分. ",fs);
switch(fs)
{
case 100:printf("真棒! ");break;
case 90: printf("优秀! ");break;
case 80:
case 70: printf("良好!请继续努力~ "); break;
case 60: printf("及格!再接再励~! "); break;
case 50:
case 40:
case 30:
case 20:
case 10: printf("你可长点心吧~ "); break;
case 0: printf("太差劲了! "); break;
}
printf(" ");
}
/*显示答卷
各数据从主函数中获得
*/
void dajuan()
{
int j;
printf("你的答卷为: ");
for(j=0;j<10;j++)
printf("%2d %c %2d=%2d ",sy[j],fh[j],sr[j],jd[j]);
printf(" ");
}
/*对错题给出正确的答案
各数据从主函数中获得
*/
void zhengjie()
{
int k;
printf("你答错的题的正确答案为: ");
for(k=0;k<10;k++)
{
if(jd[k]==jg[k]) continue;
else
{
printf("%2d %c %2d = %2d ",sy[k],fh[k],sr[k],jg[k]);
}
}
printf(" ");
}
/*主函数*/
int main()
{
int key=1;
jisuan();
while(key)
{
switch(caidan())
{
case '1': { printf(" ");dajuan(); } break;
case '2': { printf(" ");zhengjie(); } break;
case '3': { printf(" ");pingjia(); } break;
case '4': key=0;
}
}
return 0;
}
运行结果:
总结:
总之,我觉得结对编程确实比自己编程好很多。在一开始,我确实不习惯结对编程,有许多地方的歧义和妥协,这个我在前面边结对编程边写的过程观点中有写。但是毋庸置疑,在效率上,代码的正确性和紧凑度上,结对编程的优点十分醒目。这也就是为什么结对编程能够成为一个较为流行的编程方式的原因。关于结对编程,还是有一些新的受益之处。首先,它可以促进参与项目的程序员自身的提高,一对程序员工作的时候,水平较低的一方会潜移默化地受水平略高的程序员影响,学到一些新的东西。而水平高的一方同样因为不断地把自己的想法说出来而整理了自己的思路。我觉得这个是我当初自己编程时所没有的大特点,我学到了很多,在这里感谢队友!