Thank you for your time!

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

一、题目

  • 题目1:
    • 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
      • 能够自动生成四则运算练习题
      • 可以定制题目数量
      • 用户可以选择运算符
      • 用户设置最大数(如十以内、百以内等)
      • 用户选择是否有括号、是否有小数
      • 用户选择输出方式(如输出到文件、打印机等)
      • 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
  • 结对编程:

二、算法实现过程

  • 算法流程图

    • 运算函数选择算法流程图

  • 主要功能模块分析

    • 调用四则运算的入口,依次为加法运算、加法运算、乘法运算、除法运算以及混合运算;提供给用户一些选择,根据用户的输入,应用switch进入相应的函数。

      for(i=0;i<n;i++)
      		{ 
      		switch (choice)
      		{
      		case 1:add(a, typeif); break;
      		case 2:sub(a, typeif); break;
      		case 3:mul(a, typeif); break;
      		case 4:divis(a, typeif); break;
      		case 5:mix(a, typeif); break;
      		default:
      			printf("输入指令有误!\n");
      			break;
      		}
      		}
      
    • 随机生成整数以及小数的两个函数

      int typei(int a)
      {
      	int random;
      	random = rand() % a;
      	return random;
      }
      float typef(int a)
      {
      	float random;
      	random = (rand() % a) / 1.02;
      	return random;
      }
      
    • 整数运算实现过程(乘法为例)

      if (typeif == 1)
      	{
      		a0 = typei(a);
      		b0 = typei(a);
      		printf("%d * %d=__?__\n", a0, b0);
      		scanf_s("%d", &result0);
      		if (result0 == a0 *b0)
      		{
      			printf("恭喜你,回答正确!\n");
      			r++;
      		}
      		else
      		{
      			printf("真遗憾,回答错误!\n");
      			w++;
      		}
      
      	}
      
    • 小数运算实现过程(除法为例)

      if (typeif == 2)
      	{
      		a1 = typef(a);
      		b1 = typef(a)+1;
      		printf("%.2f / %.2f=__?__\n", a1, b1);
      		scanf_s("%f", &result1);
      		if ((int)result1 ==(int)( a1/b1))
      		{
      			printf("恭喜你,回答正确!\n");
      			r++;
      		}
      		else
      		{
      			printf("真遗憾,回答错误!\n");
      			w++;
      		}
      	}
      
    • 混合运算的小数运算实现过程

      else if (typeif == 2)
      		{
      			for (j = 0; j < 2*k; j++)
      			{
      				if (j % 2 == 0)
      				{
      					a1 = typef(a);
      					flag = rand() % 2;
      					if (flag == 0)
      					{
      						if (x == 0)
      						{
      							printf("(%.2f", a1);
      							x = 1;
      							break;
      						}
      						if (x == 1)
      						{
      							printf("%.2f)", a1);
      							x = 0;
      						}
      					}
      					else
      					{
      						printf("%.2f", a1);
      					}
      				}
      				else if (j % 2 != 0)
      				{
      					sign = rand() % 4;
      					printf("%c", B[sign]);
      				}
      			}
      			if (j % 2 == 0)
      			{
      				a1 = typef(a);
      				printf("%.2f", a1);
      			}
      			 if (x == 1)
      			{
      				printf(")");
      			}
      			printf("=\n");
      			scanf_s("%f", &result1);
      		}
      	}
      

三、编码过程中遇到的问题以及解决办法

  • 问题:在使用括号的过程中,因为算法分析的不到位,以至于在生成过程中不仅有数字结尾,也会有符号结尾的现象。
    • 解决办法:和领航员一起逐步调试代码,分析代码的不足,对运算式子生成的过程中,数字和符号的个数加以控制,来控制运算式的格式。

四、运算结果

  • 十以内的加法整数运算生成结果
  • 十以内的乘法小数运算生成结果
  • 百以内的减法小数运算生成结果
  • 百以内的混合整数运算无括号生成结果
  • 百以内的混合整数运算有括号生成结果

五、结对编程交流合作

  • 合作过程:在本次结对编程的过程中,我和肖乃俊同学合作完成,在完成过程中,我充当驾驶员的角色,肖乃俊同学充当领航员的角色。在编码实现的过程中,我们首先对四则运算算法进行了系统的分析,四则运算的五种情况有:加、减、乘、除和混合运算。其中加减乘除这四种运算规则单调,实现起来也较为简单,对于每一部分的完成过程也是较为相似的,在编写代码的过程中,肖乃俊同学在我身边一直监督我在代码编辑过程中有什么错误,这样一来,大大的减小了代码出现语法错误和编辑错误的几率。同时,两个人合作的过程中,对于代码也会提出来一些较为优化的编译方法,这为代码的美观性以及减小代码的冗余起到了很重要的作用。在编译混合运算的过程中,开始的时候是一筹莫展,通过对网上一些算法思想的阅读,慢慢梳理出来一个实现算法的清晰流程,相对于一个人来说,两个人共同完成一个代码,减小了工作量,同时对彼此也是一个很好的督促和鼓励。
  • 合作心得:在整体编写前,我做了一些基础的准备,先是查找了大量资料,对四则运算的实现过程有了基本的认识,然后又画了些流程图,想好了思路。然后我们一起讨论选择了最优的方案。在编写过程中,领航员对于我在编写代码的时候存在的一些语法错误及时的进行提示,同时也提出了一些优化代码的想法,这对我编程过程非常的有利,在领航员的积极领导之下,我在编程的过程当中,感觉自己的思路非常的清晰,这样状态下编辑出来的代码也具有很高的可读性,通过和领航员的配合,我自己也切身的感受到了结对编程带来的好处,在结对编程的过程当中,思路清晰,同时对方的一些想法也会改变自己的编程习惯,有很多好的建议不仅在这次编程中非常有用,在以后的编程过程中也会带来很好的编程体验。
  • 对领航员的评价:肖乃俊同学在这次结对编程作业的过程中,完成的很好,通过两个人的共同努力,顺利的完成了本次结对编程作业。领航员的学科基础非常好,这种良好的专业能力促使我们在编程之前的算法设计过程中非常的顺利,从而使得整个编程过程都很得心应手。同时,领航员的模块思想非常的好,我们在编程过程中,使用了很多的模块化内容,这种举措使得代码本身不再是牵一发而动全身。在结对编程的过程中,受领航员的影响,面对棘手的问题,我也不再是焦急,而是沉着分析,两个人一起配合结焦问题。总的来说,这次结对编程对彼此都是一个很好的提升,希望以后能有更多的合作机会。

六、合作留影

  • 希望以后多多合作。嗯呢?
posted @ 2019-05-06 16:54  YangLeJi  阅读(261)  评论(0编辑  收藏  举报