前言
按照结对编程的原则,我(2252627)和我的合作伙伴(2252616)两人进行了结对编程,我们共同完成的项目的是小学的四则运算,通过随机生成四则运算题目,供学生答题,并在学生提交答案后进行自动评定,返回正误。经过讨论,我们采用了C++语言作为开发语言,并选取Dev C++5.11作为开发环境。
功能要求
小学老师要每周给同学出300道四则运算练习题。
–这个程序有很多种实现方式:
C/C++
C#/VB.net/Java
Excel
Unix Shell
Emacs/Powershell/Vbscript
Perl
Python
–两个运算符,100 以内的数字,不需要写答案。
–需要检查答案是否正确,并且保证答案在 0..100 之间
–尽可能地多设置一些条件
创新性:
在算式中如果出现除法运算,算式能保证不出现小数;
程序保证每一个算式的结果都是0到100之间的整数;
程序对非法输入有处理,提高了程序的健壮性;
程序对回答者的正确率进行了计算,并进行针对性的评价;
设计思路
实现我们讨论了程序应该实现的功能和程序框架,然后由我负责编程,2252616同学建设性的提出了具体的实现框架,决定了要实现的功能以及如何实现。随后,我正式开始了编程,我们在编程过程中始终保持无障碍沟通,最终实现了四则运算的题目。
具体代码如下:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
char fuhao[2];//选择的运算符
char jjcc[4]={'+','-','*','/'};//用于随机运算符时选择
int num[3];//随机选择的数字
int yes=0;//所选择的算式正确计算时的结果
string ANT;//输入的内容,用字符串存储,防止非法输入
int ant=0;//由ANT转换成的数字
int getRand(int min, int max) //返回min到max之间的随机数,左闭右闭区间
{
return ( rand() % (max - min + 1) ) + min ;
}
bool ooo(int a1,char b1,int a2,char b2,int a3)//判断生成的表达式结果在不在0到100之间
{//yes为该算式的结果
if(fuhao[0]=='+'&&fuhao[1]=='+')
{yes=a1+a2+a3;return a1+a2+a3>=0&&a1+a2+a3<=100;}
if(fuhao[0]=='+'&&fuhao[1]=='-')
{yes=a1+a2-a3;return a1+a2-a3>=0&&a1+a2-a3<=100;}
if(fuhao[0]=='+'&&fuhao[1]=='*')
{yes=a1+a2*a3;return a1+a2*a3>=0&&a1+a2*a3<=100;}
if(fuhao[0]=='+'&&fuhao[1]=='/')
{yes=a1+a2/a3;return a1+a2/a3>=0&&a1+a2/a3<=100;}
if(fuhao[0]=='-'&&fuhao[1]=='+')
{yes=a1-a2+a3;return a1-a2+a3>=0&&a1-a2+a3<=100;}
if(fuhao[0]=='-'&&fuhao[1]=='-')
{yes=a1-a2-a3;return a1-a2-a3>=0&&a1-a2-a3<=100;}
if(fuhao[0]=='-'&&fuhao[1]=='*')
{yes=a1-a2*a3;return a1-a2*a3>=0&&a1-a2*a3<=100;}
if(fuhao[0]=='-'&&fuhao[1]=='/')
{yes=a1-a2/a3;return a1-a2/a3>=0&&a1-a2/a3<=100;}
if(fuhao[0]=='*'&&fuhao[1]=='+')
{yes=a1*a2+a3;return a1*a2+a3>=0&&a1*a2+a3<=100;}
if(fuhao[0]=='*'&&fuhao[1]=='-')
{yes=a1*a2-a3;return a1*a2-a3>=0&&a1*a2-a3<=100;}
if(fuhao[0]=='*'&&fuhao[1]=='*')
{yes=a1*a2*a3;return a1*a2*a3>=0&&a1*a2*a3<=100;}
if(fuhao[0]=='*'&&fuhao[1]=='/')
{yes=a1*a2/a3;return a1*a2/a3>=0&&a1*a2/a3<=100;}
if(fuhao[0]=='/'&&fuhao[1]=='+')
{yes=a1/a2+a3;return a1/a2+a3>=0&&a1/a2+a3<=100;}
if(fuhao[0]=='/'&&fuhao[1]=='-')
{yes=a1/a2-a3;return a1/a2-a3>=0&&a1/a2-a3<=100;}
if(fuhao[0]=='/'&&fuhao[1]=='*')
{yes=a1/a2*a3;return a1/a2*a3>=0&&a1/a2*a3<=100;}
if(fuhao[0]=='/'&&fuhao[1]=='/')
{yes=a1/a2/a3;return a1/a2/a3>=0&&a1/a2/a3<=100;}
}
void qwer()//初始化算式,并保证算式符合题目要求
{
fuhao[0]=jjcc[getRand(0,3)];
fuhao[1]=jjcc[getRand(0,3)];//随机生成两个运算符
if(fuhao[0]!='/'&&fuhao[1]!='/')//这两个运算符里面没有除法
{
ddd:
num[0]=getRand(1,100);
num[1]=getRand(1,100);
num[2]=getRand(1,100);//随机弄三个整数
if(!ooo(num[0],fuhao[0],num[1],fuhao[1],num[2])) goto ddd;
//检查这个算式的结果符不符合要求 ,不符合则重新生成随机数
}
else//算式有除法,需要保证每一步的结果均为整数
{
if(fuhao[0]=='/'&&fuhao[1]=='/')//a/b/c
{
fff:
num[0]=getRand(1,100);
num[1]=getRand(1,100);
num[2]=getRand(1,100);
if(num[0]%num[1]!=0||(num[0]/num[1])%num[2]!=0) goto fff;
//检查这个算式的每一步的结果是否均为整数 ,不符合则重新生成随机数
if(!ooo(num[0],fuhao[0],num[1],fuhao[1],num[2])) goto fff;
//检查这个算式的结果符不符合要求 ,不符合则重新生成随机数
}
if(fuhao[0]=='/'&&fuhao[1]!='/')//a/b?c
{
ggg:
num[0]=getRand(1,100);
num[1]=getRand(1,100);
num[2]=getRand(1,100);
if(num[0]%num[1]!=0) goto ggg;
//检查这个算式的每一步的结果是否均为整数 ,不符合则重新生成随机数
if(!ooo(num[0],fuhao[0],num[1],fuhao[1],num[2])) goto ggg;
//检查这个算式的结果符不符合要求 ,不符合则重新生成随机数
}
if(fuhao[0]!='/'&&fuhao[1]=='/')//a?b/c
{
hhh:
num[0]=getRand(1,100);
num[1]=getRand(1,100);
num[2]=getRand(1,100);
if(fuhao[0]=='+'&&num[1]%num[2]!=0) goto hhh;
if(fuhao[0]=='-'&&num[1]%num[2]!=0) goto hhh;
if(fuhao[0]=='*'&&(num[0]*num[1])%num[2]!=0) goto hhh;
//检查这个算式的每一步的结果是否均为整数 ,不符合则重新生成随机数
if(!ooo(num[0],fuhao[0],num[1],fuhao[1],num[2])) goto hhh;
//检查这个算式的结果符不符合要求 ,不符合则重新生成随机数
}
}
}
bool BBB(string s)//将输入的字符串转换为数字放如ant里,并判断是否有非法输入
{
int q=1;
for(int i=s.size()-1;i>=0;i--)
{
if(s[i]-'0'>=0&&s[i]-'0'<=9)
{
ant=ant+(s[i]-'0')*q;
q=q*10;
}
else
return false;
}
return true;
}
int main()
{
srand(time(0));
int t=300;//最大答题数目
float YES=0;//正确的个数
cout<<"**************欢迎来到100内加减乘除程序**************\n";
cout<<"输入n或者N退出程序\n\n";
while(t--)//循环300次
{
qwer();//qwer函数初始化算式并保证生成的算式符合要求
cout<<"问题:"<<num[0]<<fuhao[0]<<num[1]<<fuhao[1]<<num[2]<<endl;
ttt:
cout<<"在这里写出你的答案:";
getline(cin,ANT);//获取输入
if(ANT=="N"||ANT=="n")break;//提前结束
if(!BBB(ANT))//是否正确输入?
{
cout<<"非法输入,请重新输入正确的值!\n";
goto ttt;//回答上一步重新输入
}
if(ant==yes)//回答正确
{
cout<<"恭喜你!回答正确。"<<endl;YES++;
}
else//回答错误
{
cout<<"很遗憾,回答错误。该算式的正确答案为:"<<yes<<endl;
cout<<"按Eenter键继续回答……";
getchar(); //“暂停”效果
}
cout<<endl<<endl;
ant=0;
}
YES=YES/(300-t);//计算正确率
printf("\n正确率为:%.2f",YES*100);
if(YES>=0.9)cout<< "%,你真棒!";
if(YES>=0.6&&YES<0.9)cout<<"%,继续努力!";
if(YES<0.6)cout<<"%,要加油了";
return 0;
}
程序运行截图:
感悟
结对编程让我们明白了合作的重要性。在编程过程中,有时候一个人可能很难快速找到解决方案。但是,当两个人一起思考时,我们可以互相启发,共同找到问题的症结所在,从而更快地解决问题。这种合作不仅提高了我们的工作效率,还让我们在解决问题的过程中更加深入地理解了编程知识。
在本次结对编程过程中,也出现了一些问题。例如,有时候两个人的想法可能不一致,导致在解决问题上产生分歧。但是,我认为这正是结对编程的意义和价值所在。通过沟通和讨论,我们可以学会尊重对方的意见,学会在团队中寻求共识,这对于我们未来的职业发展是非常有益的。
在我们看了,这种相互交流,共勉共进的方式可以促进双方的的共同进步,不仅仅提高了我们的编程效率和技能,还促进我们之间的沟通和合作。