实验二 结对编程

一、题目要求

1、能够自动生成四则运算练习题
2、可以定制题目数量
3、用户可以选择运算符
4、用户设置最大数(如十以内、百以内等)
5、用户选择是否有括号、是否有小数
6、用户选择输出方式

二、编译工具

visual stdio 2022

三、结对伙伴

姓名

班级

学号

角色

代码地址

李卓航

软件2222

223201062226

驾驶员

 

贾梦悦

软件2222

2232010622

领航员

 

 

四、需求分析

从题目可以大概了解到面向的服务群体是老师,小学生,和学生家长等,是一个自动生成小学四则运算的程序。考虑到小学生是为了课后练习,提高计算能力,所以还需要显示答案的功能。

五、编程过程

首先我们想从最简单的开始,就先生成类似 “a+b=” 的格式,只考虑整数,不考虑小数的情况,运行截图:

 

 此时并没有控制生成随机数的范围,因此我们再次基础上做出了修改,我们的思路是:rand()函数是生成0~32767之间随机数,显然当生成数字过大时并不满足我们的要求,因此我们需要对此进行限制,(rand() % (MaxNum * 10)) / 10,通过这条语句就可以根据MaxNum输入的值来限定rand()生成的值,最大值不超过MaxNum,运行截图:

 

 

 

 

 当然也不能只是整数,还得要生成小数,为此我们的办法是:(rand() % (MaxNum * 10)) / 10 使用此方法限制rand()后其实操作的一直是整数,我们可以对这个限制进行强制类型转换(double)(rand() % (MaxNum * 10)) / 10,这样就将(rand() % (MaxNum * 10)) 转换成了double类型,再/10的话就会生成小数,运行截图:

 

 

 

现在生成a+b类型的四则运算已经基本完成,但是还差生成带括号的四则运算,在这一步我和我的伙伴遇到了困难,我们决定先实现将结果写入文件中,运行截图:

 

 

接下来是对程序的完善的思考:小学的四则运算不能只局限于a+b这种形式,还应该要生成(a+b)+c、a+(b+c)、(a+b)+c+d、(a+b+c)+d、a+(b+c)+d、a+(b+c+d)、a+b+(c+d)等多种形式,值得注意的是a+b这种形式不需要生成括号,其他形式才有出现括号的意义。于是我创建了一个只有四个空间的字符型数组并初始化,如下:

char Arithmetic_brackets[4] = { '(', ' ',')',' ' };

在需要生成括号的时候只需要成对使用就可以实现都生成括号或者都不生成括号,代码如下:

int barcket1 = rand() % Arithmetic_bracket;
char cur_barckets1 = Arithmetic_brackets[barcket1];
char cur_barckets2 = Arithmetic_brackets[barcket1 + 2];

使用rand()函数生成一个四以内的随机数,每次成对调用且下标的差为2,这样就可以保证每次都生成一对括号或者一个括号都不生成。但是这种方法有缺点,只能在程序定义的位置生成固定的括号,并不是随机出现。

接下来就是对操作数的修改,我写了三个函数,分别代表两个操作数、三个操作数、四个操作数。这种方法虽然看起来很笨,但这是目前我能想到的还挺好用的方法,缺点也显而易见,只能生成程序固定的操作数,如果想生成更多,那么就得继续写函数。但是考虑到是小学四则运算,四个操作数应该够了。嘻嘻。函数声明如下:

void Arithmetic_Output_Screen2();//两个操作数
void Arithmetic_Output_Screen3();//三个操作数
void Arithmetic_Output_Screen4();//四个操作数

函数的具体实现(只列举一个):

复制代码
void Arithmetic_Output_Screen2()
{
    cout << "+----------------以下为*小学四则运算自动生成程序*所生成的四则运算练习题----------------+" << endl;
    fopen_s(&fp, FILE_PATH, "w");
    for (int i = 1; i < Arithmetic_number+1; ++i)
    {

        /*随机生成四个整数*/
        int number1 = rand() % Arithmetic_max;
        int number2 = rand() % Arithmetic_max;

        /*随机生成四个小数*/
        float number5 = (float)rand() / Arithmetic_max;
        float number6 = (float)rand() / Arithmetic_max;

        /*随机生成三个运算符*/
        int operation1 = rand() % Arithmetic_operation;
        char cur_operation1 = Arithmetic_operators[operation1];

        if (Arithmetic_ifdecimal)
        {
            if (Arithmetic_ifbrackets)
            {

                cout << "NO." << i << " : " << number5 << " " << cur_operation1 << " " << number6 << "=" << endl;
                fprintf(fp, "NO. %2d : %.2f %c %.2f = \n", i, number5, cur_operation1, number6);

            }
            else
            {

                cout << "NO." << i << " : " << number5 << " " << cur_operation1 << " " << number6 << "=" << endl;
                fprintf(fp, "NO. %2d : %.2f %c %.2f = \n", i, number5, cur_operation1, number6);

            }
        }
        else
        {
            if (Arithmetic_ifbrackets)
            {

                cout << "NO." << i << " : " << number1 << " " << cur_operation1 << " " << number2 << endl;
                fprintf(fp, "NO. %2d : %c %d %c = \n", i, number1, cur_operation1, number2);

            }
            else
            {

                cout << "NO." << i << " : " << number1 << " " << cur_operation1 << " " << number2 << " " << "=" << endl;
                fprintf(fp, "NO. %2d : %d %c %d = \n", i, number1, cur_operation1, number2);

            }
        }
    }
    fclose(fp);
    cout << "+------------------------------------已成功写入文件demo.txt--------------------------------------------------+" << endl;

}
复制代码

 

 其中我们还对符号的生成逻辑做出了更改,以前是只能选择固定的符号并且生成,修改后变为不需要选择符号,由系统自动生成,具体方法和括号的生成的逻辑差不多。代码如下:

复制代码
char Arithmetic_operators[4] = { '+','-','*','/' }; //运算符
/*
以下是如何使用
*/
int operation1 = rand() % Arithmetic_operation;
char cur_operation1 = Arithmetic_operators[operation1];
复制代码

最后战术代码的最终效果:

 

 

 文件部分:

 

 

 注:文件的生成路径和代码路径一样;

主程序流程图:

 

六、结对感受

 在结对中,我是和队友李卓航完成的,在整个过程中,我们碰到了一些实际的困难,由于是换专业,新接触到软件专业,对代码的编写方面还不太熟练,所以整个项目的许多功能没有完善,不过我们有努力去解决这些实际的困难。但我们也有相互学习,也看到了对方的优缺点。

七、对驾驶员的感受

 

   看过我搭档的代码过后,首先第一点,代码的界面会比我的整洁,敲写时会更加的规范,这不单只体现在代码的整体外观,也体现在各函数名、变量名的使用上,光是这两点就有很多我学习的地方。然后一开始我看他的代码其实是比较懵的,特别是看到双大小于号时,不清楚是什么,但他会给我讲解,我觉得这也是他很好的一个点,肯主动接触新的东西,充分利用软件所提供的东西,让他的代码更加简洁明了、更加方便,但是我觉得用到了这些东西的话应该多做点注释,否则看代码的人可能需要很长时间去查阅理解。

 

 

八、总结

  通常此次结对编程我意识到两个人在一个写代码一个在旁检查错误和观摩中度过,在这种模式下进行代码的编写对我来说是一种能够提高代码书写的规范性,对于代码的可读性有很大的提高,而且二人结对的过程不容易犯小错误,以及在遇到一些难题时,能过充分的进行讨论,对于解决问题有着不小的速度提升。同样在对于处理问题上,2人也容易出现一些思想上的不同,这些不一样的想法需要我们充分的辩论后进行抉择,所以也训练了我们同他人的交流,同样在不一样的思想交流时,2人也能在对方身上学习到很多的东西。

 

 

posted @ 2022-11-13 00:31  是夕木木呀  阅读(35)  评论(0编辑  收藏  举报