软件工程第四次作业 结对作业第二次

软件工程第四次作业

博客信息
沈阳航空航天大学计算机学院2020软件工程作业
作业要求
https://edu.cnblogs.com/campus/sau/Computer1701-1705/homework/10685
课程目标
熟悉一个“高质量”软件的开发过程
作业目标
结对编程练习

一. 任务分工

我的同伴是姜皓南
我担任驾驶员的位置,姜皓南担任领航员的位置

二. 题目要求

我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:

  • 能够自动生成四则运算练习题
  • 可以定制题目数量
  • 用户可以选择运算符
  • 用户设置最大数(如十以内、百以内等)
  • 用户选择是否有括号、是否有小数
  • 用户选择输出方式(如输出到文件、打印机等)
  • 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)

三. 代码功能

代码如下四则运算.cpp

  • 用户有开始的图形界面
  • 用户可以定制题目数量
  • 用户可以选择运算符
  • 用户随意设置最大数
  • 用户选择是否有括号
  • 用户可以选择是否有小数
  • 用户可以选择输出到文件

四. 主要代码部分

用来判断括号的前端,在最后一个数前不能放括号,如果需要进行文件输出,变量wenjian=1,就会进行fprintf。

        for (j = 0; j < qnum + 1; j++)
        {
            if (kuohao == 1 && flag2 == 0 && rand() % 2 == 1 && j != qnum)
            {
                printf(" ( ");
                if (wenjian == 1)
                {
                    fprintf(fp, " ( ");
                }
                flag2 = 1;
                flag1 = 1;
            }

用来判断需要整数还是小数,由rand%max生成数,max是用户需要题目的最大值。

            if (zorx == 1)
            {
                yinzi = rand() % max + 1;
                cout << yinzi;
                if (wenjian == 1)
                {
                    fprintf(fp, "%d", yinzi);
                }
            }
            if (zorx == 2)
            {
                yinzif = rand() / (double)(RAND_MAX / max);
                printf("%.1f", yinzif);
                if (wenjian == 1)
                {
                    fprintf(fp, "%.1f", yinzif);
                }
            }

用来判断括号的后端,由于在前括号设置完的数后不能放后括号,所以设置了一个flag用来判断是不是同一个数

            if (kuohao == 1 && flag2 == 1 && rand() % 2 == 1 && flag1 != 1)
            {
                printf(" ) ");
                if (wenjian == 1)
                {
                    fprintf(fp, " ) ");
                }
                flag2 = 0;
            }
            flag1 = 0;

用来选择符号,在最后一个数后不能放符号,由于功能需要选择需要的符号,先用rand随机生成,再用switch进行选择,
在每个符号前都有变量,如果题里不需要这个符号,就会重新进行随机生成,选择其他符号

            if (j != qnum)
            {
                flag3 = 0;
                while (flag3 != 1)
                {
                    yunsuanfuxz = rand() % 4;
                    switch (yunsuanfuxz)
                    {
                    case 0:
                        if (yunsuanfu[0] == 1)
                        {
                            flag3 = 1;
                            printf(" + ");
                            if (wenjian == 1)
                            {
                                fprintf(fp, " + ");
                            }
                            break;
                        }                       
                    case 1:
                        if (yunsuanfu[1] == 1)
                        {
                            flag3 = 1;
                            printf(" - ");
                            if (wenjian == 1)
                            {
                                fprintf(fp, " - ");
                            }
                            break;
                        }
                        
                    case 2:
                        if (yunsuanfu[2] == 1)
                        {
                            flag3 = 1;
                            printf(" * ");
                            if (wenjian == 1)
                            {
                                fprintf(fp, " * ");
                            }
                            break;
                        }
                        
                    case 3:
                        if (yunsuanfu[3] == 1)
                        {
                            flag3 = 1;
                            printf(" / ");
                            if (wenjian == 1)
                            {
                                fprintf(fp, " / ");
                            }
                            break;
                        }
                        
                    }
                }
            }
        }

在最后一个数后如果前面有前括号的话,在最后补上括号,并在最后输出“=?”

        if (flag2 == 1)
        {
            printf(" ) ");
            if (wenjian == 1)
            {
                fprintf(fp, " ) ");
            }
            flag2 = 0;
        }
        cout << "= ? " << endl;
        if (wenjian == 1)
        {
            fprintf(fp, " = ? \n");
        }

五. 运行截图

开始界面。

可以输入需要的题目的数量,可以输入最大数,输入是否需要打印文件,下面是生成整数的四则运算。

打印文件。

生成小数的四则运算,设置了生成一位小数。

生成带括号的四则运算。

选择同一种符号。

都是加号的情况

都是减号的情况

都是乘号的情况

都是除号的情况

不按要求输入错误的情况下

六. 工作记录

由于疫情原因,不能在一起工作,只能通过QQ进行交流,没有在一起的照片
采用VS2019进行编译如下图

七. 合作总结

在这次结对作业中,我和姜皓南互相配合,我负责写代码,他负责看着我写,帮我纠正我的错误,我每次写代码会出现一点点的小错误,他能及时发现并告诉我哪里出错率,在最开始时我是准备采用不种情况在不同的循环里,他感觉不太行,最后我俩一起讨论出,在一个大循环中把输出的单个字符按不同情况输出,这样就很方便。之后在写代码遇到选择单一符号算法上的困难时,如果只用前面得符号,后面的符号不用,那么随机生成后面的符号时就会输出空白,而不输出符号,我一开始想的是用if else来进行判断,判断那个如果不采用加号以外的号就全部变成加号,不采用加号则变成减号,后来发现,在+号和-号一起不用的时候就会出现bug,不太行,最后我俩一起想出了解决方法,在选择符号的外面放一个大循环,当这个符号不采用的时候,重新再随机生成出一个符号,这样就不会产生空白的情况。在我写代码的同时,他也没有闲着,而是在帮我收集材料,帮我考虑下一步的算法,最后在我俩的一起努力下,最后完成了代码。在我写完代码以后,他开始进行测试数据,进行单元评测,来指出我的代码哪里有问题,最后完成修改,对我的帮助很大,如果是我一个人工作的话,会花费很多时间,而且还不一定能想出这个算法,让我受益匪浅,姜皓南是很不错的合作伙伴。

八. 个人心得

我以前都比较喜欢单干,通过这次结对作业,让我感受到了一起合作的好处,一起合作会互相监督,效率变高,比一个人写轻松了许多,当出现错误时也是两个人一起找,比一个人找快速了许多,一个人干的话可能灯下黑,一个以为不可能错地方错了,就得改半天,两个人一起工作,改代码就很迅速。在想算法方面两个人的思路不一样可以互相弥补,很有帮助。

猜你喜欢

转载自www.cnblogs.com/jinpaichushi/p/12767287.html