2018软件工程第五次作业(结对二)

##结对作业:小学计算题生成程序 ###一、题目要求 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求: 能够自动生成四则运算练习题

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

###二、角色选择

  • 驾驶员:何涛 完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中;对导航员在本次编程工作中起到的作用给出客观评价,并完成500字以上的总结。
  • 领航员:刘子君 辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试;根据上次作业的代码检查表对驾驶员的本次工作进行评价;对本次工作完成500字以上的总结。

###三、需求分析 小学计算题有什么?我们都做过。无非就是整数、分数、小数这些题型。老师每天都要出大量的题给学生做,老师很苦恼啊。 这次作业就是解决老师的苦恼——一个小可以自动生成小学计算的程序,可以按照老师的需求生成不同题型(可选择整数、分数、小数、复合运算)并且可以将题目和答案保存到文件中。

###四、过程分析

<font color=red>注:框里的功能是重复的。</font> ###五、关键代码实现

  • 1、整数运算

    1for (i =0;i < total;i++) 2{ 3 a = rand() % mmax + 1;//生成随机整数 4 b = rand() % mmax + 1;//生成随机整数 5 char cha = ch[rand () % cnum];//生成随机符号 6 printf("%d %c %d =\n",a,cha,b);//打印表达式 7 fprintf(fp,"%d %c %d =\n",a,cha,b);//写入文件 8 if(cha == '+')//计算结果 9 { 10 s1[i] = a + b; 11 s2[i] = 0; 12 } 13 if(cha == '-') 14 { 15 s1[i] = a - b; 16 s2[i] = 0; 17 } 18 if(cha == '*') 19 { 20 s1[i] = a * b; 21 s2[i] = 0; 22 } 23 if(cha == '/') 24 { 25 s1[i] = a / b;//商 26 s2[i] = a % b;//余数 27 } 28} 29for(int i = 0;i < total;i++)//输出结果,写入文件 30{ 31 if(s2[i] == 0)//余数是否为零 32 { 33 printf("%d\t",s1[i]); 34 fprintf(fp,"%d \n",s1[i]); 35 } 36 else 37 { 38 printf("%d......%d\t",s1[i],s2[i]); 39 fprintf(fp,"%d......%d\n",s1[i],s2[i]); 40 } 41}
  • 2、分数运算

    for (int i = 0;i < total;i++) { a =rand() % mmax + 1;//第一个分数的分子 b =rand() % mmax + a;//第一个分数的分母 c =rand() % mmax + 1;//第二个分数的分子 d =rand() % mmax + c;//第二个分数的分母 char cha = ch[rand () % cnum]; printf("(%d/%d) %c (%d/%d)=\n",a, b,cha,c,d); fprintf(fp,"(%d/%d) %c (%d/%d)=\n",a, b,cha,c,d); if(cha == '+')//分数运算 { s1[i] = a * d + c * b; s2[i] = b * d; } if(cha == '-') { s1[i]= a * d - c * b; s2[i] = b * d; } if(cha == '*') { s1[i] = a * c; s2[i] = b * d; } if(cha == '/') { s1[i] = a * d; s2[i] = b * c; } } for(i = 0;i < total;i++) { printf("(%d/%d)\t",s1[i],s2[i]); fprintf(fp,"(%d/%d)\n",s1[i],s2[i]); }

<font color=red>注:结果没有约分,不是最简分数</font>

  • 3、小数运算

    for (i = 0;i < total;i++) { e = rand() /(double)(RAND_MAX/mmax);//随机小数 f = rand() /(double)(RAND_MAX/mmax);//随机小数 char cha = ch[rand () % cnum]; printf("%.2f %c %.2f=\n", e,cha,f);//只保留小数点后两位 fprintf(fp,"%.2f %c %.2f=\n", e,cha,f); if(cha == '+')//小树运算 s3[i]= e+f; if(cha == '-') s3[i] = e-f; if(cha == '*') s3[i] = e-f; if(cha == '/') s3[i] = e/f; } for(int i = 0;i < total;i++) { printf("%.2f\t",s3[i]); fprintf(fp,"%.2f\n",s3[i]); }

<font color=red>注:小数在输出表达式时为两位小数,但是计算结果时却是六位小数运算。由于舍入问题,部分输出结果与表达式运算结果会有0.01的误差,暂时没想出好的办法来解决。</font>

  • 4、复合运算

    for (i = 0;i < total;i++) { a = rand() % mmax + 1; b = rand() % mmax + 1; c = rand() % mmax + 1; char cha1 = ch[rand () % cnum]; char cha2 = ch[rand () % cnum]; int n = rand() % 2 + 1;//固定两种格式,随机出现一种 switch (n) { case 1: printf("(%d %c %d) %c %d=\n", a, cha1,b,cha2,c); fprintf(fp,"(%d %c %d) %c %d=\n", a, cha1,b,cha2,c); if(cha1 == '+') p = a + b;//p为临时变量,暂存括号内的结果 else if(cha1 == '-') p = a - b; else if(cha1 == '*') p = a * b; else if(cha1 == '/') p = a / b;

    1 if(cha2 == '+') 2 s1[i] = p + c; 3 else if(cha2 == '-') 4 s1[i] = p - c; 5 else if(cha2 == '*') 6 s1[i] = p * c; 7 else if(cha2 == '/') 8 s1[i] = p / c; 9 break; 10 case 2: 11 printf("%d %c (%d %c %d)=\n", a, cha1,b,cha2,c); 12 fprintf(fp,"%d %c (%d %c %d)=\n", a, cha1,b,cha2,c); 13 if(cha1 == '+') 14 p = b + c; 15 else if(cha1 == '-') 16 p = b - c; 17 else if(cha1 == '*') 18 p = b * c; 19 else if(cha1 == '/') 20 p = b / c; 21 22 if(cha2 == '+') 23 s1[i] = a + p; 24 else if(cha2 == '-') 25 s1[i] = a - p; 26 else if(cha2 == '*') 27 s1[i] = a * p; 28 else if(cha2 == '/') 29 s1[i] = a / p; 30 break; 31 } 32} 33for(int i = 0;i < total;i++) 34{ 35 printf("%d\t",s1[i]); 36 fprintf(fp,"%d\n",s1[i]); 37}

<font color=red>注:在进行除法运算时,带着余数进行运算很不方便,所以只求出商进行运算就可以。</font>

###六、感想 在刚看到这个题目的时候,我以为不就是循环语句吗,很简单。但是等真正开始做的时候才发现没有那么简单。首先随机数怎么产生,其次随机符号怎么产生,结果怎么运算等等一大堆问题都出现了。没办法只能去翻书找了,但是在书里没有找到,只能上网找了。这个时候我才知道自己的基础究竟多差。在课上学的那些都是基础的基础,在课外还要找些书来给提升自己,不多看书还是不行的。同时要是想掌握更多的知识,还要多编程,我认为在做中学比只看书不练习在实际编程应方面要强很多。 我的结对伙伴是我班的刘子君同学。我们两个人沟通起来很好,编程能力差不多,编程氛围也很好,一起分析程序一起找bug。我们两个人对作业的态度也比较认真的,还算是比较顺利的完成了作业。 我认为结对编程主要有不少好处:首先起到督促的作用。这主要是因为如果我一个人编程,可能会出现消极的情绪,而两个人共同编程会起到促进作用。其次对函数的语句能进一步优化,在自己敲代码时,另一个人可以反思代码有什么问题、哪里可以优化,这些都够使代码质量得到很大的提升。最后是更有效的找错,我要找出自己写的bug是一件很困难的事情。但是有伙伴在一个不同的视角寻找问题,就能很快地找到一些我不易发现的bug。最后能够互相学习,共同提高。在结对编程中,可以发现队友在编程中的很多好习惯以及心得,如果能够吸收这些东西为己用,便能够显著提高自己的编程水平。

###七、链接 <font color=blue>查看代码请点这里</font> <font color=blue>运行结果、单元测试、代码审查表,请点这里</font> ###八、照片

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap

java中比较两个时间的差值

项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat

Twitter的分布式自增ID算法snowflake (Java版)

概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移