队伍:阙定1757127,李铮达1759118
这次是软件工程综合实践的第二次实验,本次任务是结对编程,就是找一个小伙伴一起写代码,一人写代码一人复审代码,这样可以更快的找出代码的错误,然后立即更改,提高开发效率。
下面是老师发布的任务截图
讨论分析
拿到任务后,我们先考虑用哪种编程语言来写,直接用较为基础的C或C++编写即可,因为逻辑较为简单,且不需要涉及面向对象的问题。然后开始分析用什么方法来实现,以及如何实现。讨论持续了一整天,因为白天有课,所以我们都是用零星的时间来讨论的。
下面是周二中午我们两人在网上讨论的部分截图
大体思路确定了之后,我们俩抽了个空余的时间,然后开始我们的结对编程。开始时是我做敲代码的“驾驶员”,李铮达他做复审代码的“导航员”。然后我们俩再进行角色互换。
结对编程
我刚开始最基础的想法是设计四个函数,分别对应为加减乘除,然后根据用户的选择,调用各个函数,输出不同的算式。我采用了以时间作为随机种子来产生随机数的方法,用for循环来输出整个算式。
下图是我的第一次试验,先弄好一个运算符,随后再增加一个运算符即可
加减乘的算式已经打印出来了,然后我们开始遇到第一个难题,就是除法要考虑除零除余问题。
由于除法的特殊性,一个重要条件就是要做到除数不为0,我们俩商讨出两种解决方法:1、设置随机数的范围为1-99,直接不包括0即可;2、在除法函数中增加一个判断,如果除数为0,则重新取一个随机数。李铮达认为0包含在算式中会降低难度,而且代码编写也会复杂,所以更赞成第一点,但阙定认为小学数学会有关于0的算数问题,综合考虑还是选择了第二点的解决方法。至于是否能整除的问题也很容易解决,添加一个求余是否为0的条件判断即可,是0,则可以整除,不是0则重新取数。
阙定想出解决无法整除的方法有些不同,就是无限递归。由于除法操作用函数来实现的,所以可以加一个if条件判断语句,如果不能整除则调用自己,再次运算,直到算式能整除即可结束,这样的话得到的算式就是能整除的了。这样写代码比较简洁。所以采用了这种。
至此,我们已基本完成老师中的任务要求了,随机数,两个运算符,组合成一个随机算式。
添加一个运算符的方法也比较简单,加减乘除,就是4x4的思路,共有16种组合,这16种组合也是由随机数随机出的,这种想法有些笨拙,但是目前我们没有想出更好的方法
实现代码
#include <iostream>
#include <ctime>
using namespace std;
void f(int a,int b)
{
cout << rand() % (b-a+1)+a << " + " << rand() % (b-a+1)+a ;//a到b
}
void g(int a, int b)
{
// cout << rand() % 51 << " - " << rand() % 31 ;//0-30
cout << rand() % (b-a+1)+a << " - " << rand() % (b-a+1)+a ;//a到b
}
void h(int a, int b)
{
// cout << rand() % 11 << " * " << rand() % 11 ;//0-10
cout << rand() % (b-a+1)+a << " * " << rand() % (b-a+1)+a ;//a到b
}
void y(int a, int b)
{//只除一次
int p,q;
p = rand() % (b-a + 1) + a;// a到b
if(a==0)q = rand() % b + 1;// 1到b
else q = rand() % (b-a + 1) + a;// a到b
if(p%q == 0) cout <<p<< " / " << q ;
else y(a,b);//只有整除才能输出,否则无限递归
}
void yy(int p, int q)
{//连除两次
int a, b, c;
// a = rand() % 101;//0-100
a = rand() % (q-p + 1) + p;// p到q
// b = rand() % 39 + 2;//2-40
if (p == 0)b = rand() % (q-1) + 2;// 2到q
else b = rand() % (q-p + 1) + p;// p到q
// c = rand() % 20 + 1;//1-20
if (p == 0)c = rand() % q + 1;// 1到q
else c = rand() % (q-p + 1) + p;// p到q
if (a%b == 0 && (a/b)%c == 0) cout << a << " / " << b << " / " << c;
else yy(p,q);//只有整除才能输出,否则无限递归
}
int main()
{
int i,a,b,n,ss;
srand(unsigned(time(NULL)));//随机时间种子
cout << "请输入随机整数范围(0 <= a < b): ";
cin >> a; cin >> b;
cout << "请选择随机题目类型:"<<endl;
cout << "1、a + b + c\t2、a + b - c\t3、a + b * c\t4、a + b / c"<<endl;
cout << "5、a - b + c\t6、a - b - c\t7、a - b * c\t8、a - b / c"<<endl;
cout << "9、a * b + c\t10、a * b - c\t11、a * b * c\t12、a * b / c"<<endl;
cout << "13、a / b + c\t14、a / b - c\t15、a / b * c\t16、a / b / c"<<endl;
cout <<" 0、全部随机";
loop:
cout <<endl<< "请选择序号:";
while (!(cin >> ss)) {
cin.clear(); cin.sync(); cout << "不是数字!" << endl; cin.ignore(1024, ‘\n‘);cout << "请选择序号:";}
if (ss<0||ss>16){cout <<"不存在此序号。";goto loop;}
cout <<endl<< "请输入生成数量:";
while (!(cin >> n)) {
cin.clear(); cin.sync(); cout << "不是数字!" << endl; cin.ignore(1024, ‘\n‘); cout << "请再次输入:";
}
cout << endl;
switch (ss)
{
case 1:for (i = 1; i <= n; i++) {
cout << rand() % (b - a + 1) + a << " + "; f(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//+ +
if (i % 4 == 0)cout << endl;}break;
case 2:for (i = 1; i <= n; i++) {
cout << rand() % (b - a + 1) + a << " + "; g(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//+ -
if (i % 4 == 0)cout << endl;}break;
case 3:for (i = 1; i <= n; i++) {
cout << rand() % (b - a + 1) + a << " + "; h(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//+ *
if (i % 4 == 0)cout << endl;}break;
case 4:for (i = 1; i <= n; i++) {
cout << rand() % (b - a + 1) + a << " + "; y(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//+ /
if (i % 4 == 0)cout << endl;}break;
case 5:for (i = 1; i <= n; i++) {
cout << rand() % (b - a + 1) + a << " - "; f(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//- +
if (i % 4 == 0)cout << endl;}break;
case 6:for (i = 1; i <= n; i++) {
cout << rand() % (b - a + 1) + a << " - "; g(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//- -
if (i % 4 == 0)cout << endl;}break;
case 7:for (i = 1; i <= n; i++) {
cout << rand() % (b - a + 1) + a << " - "; h(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//- *
if (i % 4 == 0)cout << endl;}break;
case 8:for (i = 1; i <= n; i++) {
cout << rand() % (b - a + 1) + a << " - "; y(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//- /
if (i % 4 == 0)cout << endl;}break;
case 9:for (i = 1; i <= n; i++) {
cout << rand() % (b - a + 1) + a << " * "; f(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//* +
if (i % 4 == 0)cout << endl;}break;
case 10:for (i = 1; i <= n; i++) {
cout << rand() % (b - a + 1) + a << " * "; g(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//* -
if (i % 4 == 0)cout << endl;}break;
case 11:for (i = 1; i <= n; i++) {
cout << rand() % (b - a + 1) + a << " * "; h(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//* *
if (i % 4 == 0)cout << endl;}break;
case 12:for (i = 1; i <= n; i++) {
cout << rand() % (b - a + 1) + a << " * "; y(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//* /
if (i % 4 == 0)cout << endl;}break;
case 13:for (i = 1; i <= n; i++) {
y(a, b); cout << " + " << rand() % (b - a + 1) + a; cout << " = " << ‘\t‘ << ‘\t‘;// / +
if (i % 4 == 0)cout << endl;}break;
case 14:for (i = 1; i <= n; i++) {
y(a, b); cout << " - " << rand() % (b - a + 1) + a; cout << " = " << ‘\t‘ << ‘\t‘;// / -
if (i % 4 == 0)cout << endl;}break;
case 15:for (i = 1; i <= n; i++) {
y(a, b); cout << " * " << rand() % (b - a + 1) + a; cout << " = " << ‘\t‘ << ‘\t‘;// / *
if (i % 4 == 0)cout << endl;}break;
case 16:for (i = 1; i <= n; i++) {
yy(a, b); cout << " = " << ‘\t‘ << ‘\t‘;//+ +
if (i % 4 == 0)cout << endl;}break;
case 0:
for (i = 0; i <n/16 +1; i++) {
cout << rand() % (b-a + 1) + a << " + "; f(a, b);cout << " = " << ‘\t‘ << ‘\t‘;//+ +
cout << rand() % (b-a + 1) + a << " + "; g(a, b);cout << " = " << ‘\t‘ << ‘\t‘;//+ -
cout << rand() % (b-a + 1) + a << " + "; h(a, b);cout << " = " << ‘\t‘ << ‘\t‘;//+ *
cout << rand() % (b-a + 1) + a << " + "; y(a, b);cout << " = " << endl; //+ /
cout << rand() % (b-a + 1) + a << " - "; f(a, b);cout << " = " << ‘\t‘ << ‘\t‘;//- +
cout << rand() % (b-a + 1) + a << " - "; g(a, b);cout << " = " << ‘\t‘ << ‘\t‘;//- -
cout << rand() % (b-a + 1) + a << " - "; h(a, b);cout << " = " << ‘\t‘ << ‘\t‘;//- *
cout << rand() % (b-a + 1) + a << " - "; y(a, b);cout << " = " << endl; //- /
cout << rand() % (b-a + 1) + a << " * "; f(a, b);cout << " = " << ‘\t‘ << ‘\t‘;// * +
cout << rand() % (b-a + 1) + a << " * "; g(a, b);cout << " = " << ‘\t‘ << ‘\t‘;// * -
cout << rand() % (b-a + 1) + a << " * "; h(a, b);cout << " = " << ‘\t‘ << ‘\t‘;// * *
cout << rand() % (b-a + 1) + a << " * "; y(a, b);cout << " = " << endl; // * /
y(a, b); cout << " + " << rand() % (b-a + 1) + a;cout << " = " << ‘\t‘ << ‘\t‘;// / +
y(a, b); cout << " - " << rand() % (b-a + 1) + a;cout << " = " << ‘\t‘ << ‘\t‘;// / -
y(a, b); cout << " * " << rand() % (b-a + 1) + a;cout << " = " << ‘\t‘ << ‘\t‘;// / *
yy(a,b);cout << " = " << endl; // / /
}break;
}
return 0;
}
扩展功能
考虑到小学老师可能会重复训练以及选择训练,我给它加上了一些功能选择。
可以输入随机数生成的范围,如图,生成的随机数在2~99之间
可以选择算式的类型,共有16种情况可以选择,以及一个全部随机运算符的选择
可以输入生成题目的数量
全部随机的截图
不足之处(Bug)
在输入时若是错误的输入可能会导致程序崩溃或者进入死循环
改进方法:加上一个if条件判断,若不为数字则循环重新输入,若输入正确则跳出循环
心得体会
体验了一次结对编程,感觉效果挺不错的,尤其是自己敲代码时有人在旁边提醒,省去了我自己去检查出错的地方,提高了我的效率。但毕竟是第一次合作,我们俩也不是完全磨合的很好,有时会因为一些小bug而产生一些不同的意见,解决方案也是各有千秋。最后我们通过不断融合改进,解决了大部分的bug,程序已经可以完美的运行了。
结对编程确实比个人编程效率高了不少,它能有效的提高编代码的准确率,同时也可以轮流转换角色,避免产生个人单调的敲代码的烦躁感。我们也觉得各自都有了一些小小的收获,通过对比不同的方法,分析出利弊,想法相互交流,可以达到1+1>2的效果,体验到团队合作的高效,在这个较为基础的项目中,就有这么多思想的汇聚,等将来做大一点的项目,应该会有更多的问题需要配合解决,相互讨论出较为合理高效的解决方法。
原文地址:https://www.cnblogs.com/kiky000/p/10549818.html