软件工程第二次结对作业
软件工程第二次组作业
一.题目要求
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
二.队伍配置
驾驶员:郭靖
- 能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中
- 能够对导航员在本次编程工作中起到的作用给出客观评价,并完成500字以上的总结(5分)
领航员:常远
- 能够辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试
- 能够根据上次作业的代码检查表对驾驶员的本次工作进行评价
- 能够对本次工作完成500字以上的总结
三.程序实现
在写程序之前,我们两人稍微对题目的要求进行了一些分析,以确定我们要做出哪些功能,以及是否需要额外加上功能(可能算是简单的需求分析吧)。以下是我们的想法:
1.题目不要太难,对象是小学,所以题目控制在3元以内
2.题目中没有要求我们算出式子的结果,但是考虑到用户的需求,我们决定加上
3.小数部分控制在小数点后一位即可
之后再是编程了,程序方面我选择性挑出一些我觉得比较重要的部分介绍。
1.
int kind[]=new int [4];
System.out.println("请输入运算符种类 0.+ 1.- 2.x 3.÷ 以5键结束");
for(i=0;i<4;i++)
{
choose=scan3.nextInt();
if(choose==5) {
break;
}
else {
kind[i]=choose;
num++;
}
}
在这里我用一个kind数组将四个运算符的标签存入,并记录数组的长度,之后利用这个来实现选择运算符的功能。
double a=(double)(Math.random()*B);//随机生成一个小数
double b=(double)(Math.random()*B);//随机生成一个小数
double c=(double)(Math.random()*B);//随机生成一个小数
int d=(int)(Math.random()*num);
int flag3=kind[d];//随机生成一个0-3的整数,0表示加法,1表示减法,2表示乘法,3表示除法
这个是正数部分的5个随机数生成部分。a,b,c用于列式,d和flag用于根据用户的输入,控制所需的运算符。
3.
if(flag==0&&flag0==0)//无括号加法
{
d1=a+b;
System.out.print(a+"+"+b+"= ");
daan[i]=d1;
}
if(flag==0&&flag0==1)//有括号加法
{
d1=a+b+c;
System.out.print("("+a+"+"+b+")"+"+"+c+"= ");
daan[i]=d1;
}
if(flag==1&&flag0==0)//无括号减法
{
d1=a-b;
System.out.print(a+"-"+b+"= ");
daan[i]=d1;
}
if(flag==1&&flag0==1)//无括号减法
{
d1=a-(b-c);
System.out.print(a+"-"+"("+b+"-"+c+")"+"= ");
daan[i]=d1;
}
if(flag==2&&flag0==0)//无括号乘法
{
d1=a*b;
System.out.print(a+"*"+b+"= ");
daan[i]=d1;
}
if(flag==2&&flag0==1)//无括号乘法
{
d1=a*b*c;
System.out.print("("+a+"*"+b+")"+"*"+c+"= ");
daan[i]=d1;
}
if(flag==3)//除法
{
d1=a/b;
System.out.print(a+"÷"+b+"= ");
daan[i]=d1;
}
if((i+1)%3==0)
{
System.out.println();
}
}
flag为0时有括号,为1时无括号。 根据不同的flag,flag0值,随机输出所需要的算式。
以上部分为正数部分代码,小数部分代码与正数部分大致一样,只是变量类型与输出有些不一样,在此就不做详细的描述了
四.样例测试
1.测试样例1:整体运行测试
2.测试样例2:
整数题目测试1,选择题目数量20,10以内,有括号,运算符种类为 + - ÷
整数题目测试2,选择题目数量10,8以内,无括号,运算符种类为 - x
3.测试样例3:
小数题目测试1,选择题目数量7,9以内,无括号,运算符种类为+ x
小数题目测试2,选择题目数量6,40以内,有括号,运算符种类为-
五.总结
哇,真的是对于我这种实际编程题小白来讲,是件很困难的题了。以往做的题目都是那些老师给定的知识点相关题目,而且大部分编程时间来讲我都是编写一般的算法,很多时候没去考虑过具体的问题情况。也难怪每次的课设都是卡卡卡的,我自己的综合能力还是有待于很大的提高啊!如果不是结对编程,有一个队友的话,我自己一个人在这短短几天的时间内能不能完成可能都是个问题。
有个队友真的是重要,尤其是做题的时候来说。对于我自己而言,有时候想某一块的问题时,会陷入自己的误区,总是卡住,而且一卡就是卡很久。或许是技巧和知识储备不够的问题。如果进入这种状态的话,我就会变得有些浮躁,导致心里更乱,进入一个死循环中,无法走出,耗费大量时间和精力。这次有了一个结对的队友之后,双方会交流,这样一来,我的问题有时候在他的思路里是十分轻松就可以破解的,比如程序中,我对于如何控制随机输出的小数位很迷茫,我一直都在找,能够在随机部分就将小数控制在一位小数,然而我找了好久好久,也没有找到办法,而且自己也束手无策了。这时候队友跟我说,为什么不在最后输出式子时转换一下呢?真实值不变,只在print时输出小数点后一位就好了,毕竟是出题啊!这样一来,我一下就有了思路,整理了几波之后,顺利的通过了。其实很简单的一个操作,但是对于我来讲,有时候就是这么小小的一个误区,就令我十分困扰,真的是当局者迷旁观者清。不仅如此,在分析这个题的需求时,队友跟我的想法经常会补全我,我没有想到的他会提出来并讨论是否需要,比如这个输出结果的环节,如果不是他提出,我可能就舍弃了这个步骤,他的想法补充了我的不足!
另外我的程序的缺点还是有许多缺点,比如代码冗长,变量定义不规范之类的。当时还是以做出来这个题目为前提的,所以对于细节的把控还是差了很多,没有那么精细。在写的时候能感受到,还有许多的代码部分能够简化,或者以一种更为高效的方式写。但是。。我们两个的实力不是很强啊。在某些时候如果想不出什么好的函数或者方式去写时,我们两个还是决定笨人用笨办法,可能繁琐,但是能够完成目标的方式解决。希望以后能够提高自己的编程水平吧,两个人的技巧能够更高效一些。
总的来说,这次的结对编程还是给了我挺多的新鲜感,因为以往都是各人做各人的。结对来讲,对我的感触还是很深的,这只是两个人的结对,如果人数多起来的话,这个程序的质量就会变得很高了,尤其是多人再进行审查的时候,更是考验代码的质量。本次实验对于我来说,真的是一次很有益的经历!
六.附录
代码链接:https://coding.net/u/q842774912/p/Groupwork_2/git/blob/master/Lab2.java?public=true