第一次结对编程
本次实验是第一次结对编程,基于Window 10 x64,Dev C++的实验环境来进行编程。
本次实验的主要内容如下:
·小学老师要每周给同学出300道四则运算练习题。·这个程序有很多种实现方式:
- C/C++
- C#/VB.net/Java- Excel
- Unix Shell
- Emacs/Powershell/Vbscript- Perl
- Python
·两个运算符,100以内的数字,不需要写答案。【估计时间1】
·现在估计写这个程序需要的时间
·马上把代码写出来
·需要写答案,并且保证答案在 0..100之间【估计时间2 】
实验步骤如下:
我们先写了最简单的方法:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int x1,x2,x3,flag1,flag2;
srand((unsigned)time(NULL));
x1=rand()%100;
x2=rand()%100;
x3=rand()%100;
flag1=rand()%3;
flag2=rand()%3;
if(flag1==0){
if(flag2==0)
printf("%d+%d+%d=",x1,x2,x3);
else if(flag2==1)
printf("%d+%d-%d=",x1,x2,x3);
else if(flag2==2)
printf("%d+%d*%d=",x1,x2,x3);
else if(flag2==3)
printf("%d+%d/%d=",x1,x2,x3);}
else if(flag1==1){
if(flag2==0)
printf("%d-%d+%d=",x1,x2,x3);
else if(flag2==1)
printf("%d-%d-%d=",x1,x2,x3);
else if(flag2==2)
printf("%d-%d*%d=",x1,x2,x3);
else if(flag2==3)
printf("%d-%d/%d=",x1,x2,x3);
}
else if(flag1==2){
if(flag2==0)
printf("%d*%d+%d=",x1,x2,x3);
else if(flag2==1)
printf("%d*%d-%d=",x1,x2,x3);
else if(flag2==2)
printf("%d*%d*%d=",x1,x2,x3);
else if(flag2==3)
printf("%d*%d/%d=",x1,x2,x3);
}
else if(flag1==3){
if(flag2==0)
printf("%d/%d+%d=",x1,x2,x3);
else if(flag2==1)
printf("%d/%d-%d=",x1,x2,x3);
else if(flag2==2)
printf("%d/%d*%d=",x1,x2,x3);
else if(flag2==3)
printf("%d/%d/%d=",x1,x2,x3);
}
return 0;
}
接下来我们对这个代码进行了简化:将符号设置为一个字符数组,再使用两个随机数来确定运算符,这样可以大量减少代码数量,具体代码为:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int x1,x2,x3;//随机数字
char a[]={'+','-','*','/'};//运算符数组
int flag1,flag2,i;
srand((unsigned)time(NULL));
for(i=1;i<=300;i++){
x1=rand()%100;
x2=rand()%100;
x3=rand()%100;
flag1=rand()%3;
flag2=rand()%3;
printf("%d%c%d%c%d=\n",x1,a[flag1],x2,a[flag2],x3);
}
return 0;
}
以上是对于第一个问题的解决步骤。
以下是对于第一个问题的解决步骤:
因为要输出答案并要在范围内,首先我们想到了一种算法,这种算法
比直接写少了不少的代码,但是测试过几次后发现,这个代码有bug,某些情况下会违背算术的优先顺序,于是我们干脆直接写,不适用特殊的算法,具体代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int x1,x2,x3,flag1,flag2;
int i,j;
double answer;
i=1;
j=0;
answer=0;
srand((unsigned)time(NULL));
while(i!=-1&&j<=300){
x1=rand()%100;
x2=rand()%100;
x3=rand()%100;
flag1=rand()%3;
flag2=rand()%3;
if(flag1==0){
if(flag2==0)
answer=x1+x2+x3;
else if(flag2==1)
answer=x1+x2-x3;
else if(flag2==2)
answer=x1+x2*x3;
else if(flag2==3)
answer=x1+x2/x3;
}
else if(flag1==1){
if(flag2==0)
answer=x1-x2+x3;
else if(flag2==1)
answer=x1-x2-x3;
else if(flag2==2)
answer=x1-x2*x3;
else if(flag2==3)
answer=x1-x2/x3;
}
else if(flag1==2){
if(flag2==0)
answer=x1*x2+x3;
else if(flag2==1)
answer=x1*x2-x3;
else if(flag2==2)
answer=x1*x2*x3;
else if(flag2==3)
answer=x1*x2/x3;
}
else if(flag1==3){
if(flag2==0)
answer=x1/x2+x3;
else if(flag2==1)
answer=x1/x2-x3;
else if(flag2==2)
answer=x1/x2*x3;
else if(flag2==3)
answer=x1/x2/x3;
}
if(answer>=0&&answer<=100){
if(flag1==0){
if(flag2==0){
j++;
printf("%d+%d+%d=%.2f\n",x1,x2,x3,answer);
}
else if(flag2==1){
j++;
printf("%d+%d-%d=%.2f\n",x1,x2,x3,answer);
}
else if(flag2==2){
j++;
printf("%d+%d*%d=%.2f\n",x1,x2,x3,answer);
}
else if(flag2==3){
j++;
printf("%d+%d/%d=%.2f\n",x1,x2,x3,answer);
}
}
else if(flag1==1){
if(flag2==0){
j++;
printf("%d-%d+%d=%.2f\n",x1,x2,x3,answer);
}
else if(flag2==1){
j++;
printf("%d-%d-%d=%.2f\n",x1,x2,x3,answer);
}
else if(flag2==2){
j++;
printf("%d-%d*%d=%.2f\n",x1,x2,x3,answer);
}
else if(flag2==3){
j++;
printf("%d-%d/%d=%.2f\n",x1,x2,x3,answer);
}
}
else if(flag1==2){
if(flag2==0){
j++;
printf("%d*%d+%d=%.2f\n",x1,x2,x3,answer);
}
else if(flag2==1){
j++;
printf("%d*%d-%d=%.2f\n",x1,x2,x3,answer);
}
else if(flag2==2){
j++;
printf("%d*%d*%d=%.2f\n",x1,x2,x3,answer);
}
else if(flag2==3){
j++;
printf("%d*%d/%d=%.2f\n",x1,x2,x3,answer);
}
}
else if(flag1==3){
if(flag2==0){
j++;
printf("%d/%d+%d=%.2f\n",x1,x2,x3,answer);
}
else if(flag2==1){
j++;
printf("%d/%d-%d=%.2f\n",x1,x2,x3,answer);
}
else if(flag2==2){
j++;
printf("%d/%d*%d=%.2f\n",x1,x2,x3,answer);
}
else if(flag2==3){
j++;
printf("%d/%d/%d=%.2f\n",x1,x2,x3,answer);
}
}
}
}
return 0;
}
对应的问题实验结果和分析如下:
问题一:

在刚开始编写代码的时候,我们运用了最简单的方法,马上解决了问题,但是代码太长,在经过后面在查阅相关资料之后,了解到了另一种比较简便的方法,即将运算符放入字符数组中,于是我们对我们的代码进行了优化。
问题二:

我们第一次写的代码的算法是先将前两个数字算出来,得到一个数字记录下来,让其运算第三个数字。这样的代码虽然比较短,但是当第二个运算符为乘或除时,最后答案就会出现问题,所以我们放弃了这种算法,直接在第一题代码的基础上加上答案参数,然后选择输出,虽然这样的代码比较长,但算法是正确的。
实验体会:
结对编程是一种比较有趣的编程方式,两个人使用同一台电脑一个人编另一个人看,同时两个人还有语言,信息上的交流,这样看似浪费了一个程序员的时间,但实际上提高了编程的效率,即看的那个人可以及时的发现代码中出现的潜在问题,不需要等到代码写完后才调试修改。
本次的项目是一个比较简单的项目,三个数字进行四则运算的算法并不难,只是判断答案并输出的时候会使代码变的冗长,这时候就要进行算法的优化,比如第一问我们最终代码比第一版代码长度少了一半多。我们切实体会到了代码优化的问题。

浙公网安备 33010602011771号