一.题目要求
我和小伙伴这一次选择的是题目一
本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题。
题目1:
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
能够自动生成四则运算练习题
可以定制题目数量
用户可以选择运算符
用户设置最大数(如十以内、百以内等)
用户选择是否有括号、是否有小数
用户选择输出方式(如输出到文件、打印机等)
最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
二.任务分配
我的角色:驾驶员
能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中
能够对导航员在本次编程工作中起到的作用给出客观评价,并完成500字以上的总结领航员:陈露
能够辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试
能够根据上次作业的代码检查表对驾驶员的本次工作进行评价
能够对本次工作完成500字以上的总结
三.开发环境及使用方法
集成开发环境(IDE):我这次使用的是eclipse软件开发,使用Java语言,但是本人代码能力很弱,一些功能没有按照老师的要求编写出来。
使用方法:需要老师懂一点计算机语言,并且只适合低年级小学生使用。
四.代码实现
五.功能分析
我这代码可以实现的功能按照老师的要求只有4种(自动生成题目,定义题目数量,定义最大数字,选择是否有小数),是否有括号和选择输出方式我这都没有实现,但是我这在写出来答案之后,能够给出正确答案,并且在最后能给出正确率,可以说又增加了两项功能。
代码主要功能分析:
1.主函数通过调用makeQuestion()函数来实现所有功能
public static void main(String[] args) {
// TODO Auto-generated method stub
makeQuestion();
}
2.用户选择功能函数
通过选择是否带小数,来调用不同的函数
public static void makeQuestion() {
Scanner in=new Scanner(System.in);
int operation=-1;
int MaxNum=-1;
int questionNum=-1;
System.out.println("请选择题目数量:");
questionNum=in.nextInt();
System.out.println("请选择运算符:");
operation=choseope();
System.out.println("请设置最大数:");
MaxNum=in.nextInt();
System.out.println("请选择是否带有小数:");
String Decimal=in.next();
char Dec=Decimal.charAt(0);
//in.close();
if(Dec=='是'){
DecimalAc(operation,questionNum,MaxNum);
}
else {
IntAc(operation,questionNum,MaxNum);
}
}
3.不带小数的四则运算函数
我这个四则运算可能和其他人的不太一样,我这个是随机生成一道题,用户回答完毕后,程序判断对错并给出正确答案,随后才会随机生成下一道题。用户可以选择只有加法,减法,乘法,除法的运算,但是除法的运算有些问题,我没解决出来,好菜。或者选择混合的四则运算,运算符是随机生成的。
public static void IntAc(int operation,int questionNum,int MaxNum) {
int inputResult = -1;// 输入的答案
int num = -1;// 标记运算符
int num1 = -1;// 运算数1
int num2 = -1;// 运算数2
int rightResult = -1;// 正确的运算结果
Random random = new Random();
for (int i = 1; i <= questionNum; i++) {
num1 = random.nextInt(MaxNum);// 随机生成在[0,MaxNum]范围内的运算数1
num2 = random.nextInt(MaxNum);// 随机生成在[0,MaxNum]范围内的运算数2
if(operation==4) {
num = random.nextInt(3);// 产生随机数,代表运算符0为+,1为-,2为*,3为/
switch (num) {
case 0: {
rightResult = num1 + num2;// 计算结果
System.out.print(num1 + "+" + num2 + "=");// 输出题目
break;
}
case 1: {
rightResult = num1 - num2;
System.out.print(num1 + "-" + num2 + "=");
break;
}
case 2: {
rightResult = num1 * num2;
System.out.print(num1 + "*" + num2 + "=");
break;
}
case 3: {
if (num2 == 0) {
num2 = num2 + 1;
}
rightResult = num1 / num2;
System.out.print(num1 + "/" + num2 + "=");
break;
}
}
}
else if(operation==0){
rightResult = num1 + num2;// 计算结果
System.out.print(num1 + "+" + num2 + "=");// 输出题目
}
else if(operation==1){
rightResult = num1 - num2;
System.out.print(num1 + "-" + num2 + "=");
}
else if(operation==2){
rightResult = num1 * num2;
System.out.print(num1 + "*" + num2 + "=");
}
else {
if (num2 == 0) {
num2 = num2 + 1;
}
rightResult = num1 / num2;
System.out.print(num1 + "/" + num2 + "=");
}
inputResult = inputResult();
if (rightResult == inputResult) {
rightNum += 1;
System.out.print("\t正确");
System.out.println();
} else {
System.out.print("\t错误,正确答案为:" + rightResult);
System.out.println();
}
}
showResult(questionNum);
}
4.带小数的四则运算函数
带小数的函数主要就是在小数点位数上面所困扰,我所使用的是double型,随机生成的小数我是这样写的
num1=random.nextDouble()*MaxNum;
num1= (double) Math.round(num1 * 100) / 100;
BigDecimal bnum1 = new BigDecimal(Double.toString(num1));
num2=random.nextDouble()*MaxNum;
num2= (double) Math.round(num2 * 100) / 100;
BigDecimal bnum2 = new BigDecimal(Double.toString(num2));
然后,在做运算时,比如用加法做运算,代码如下:
rightResult = bnum1.add(bnum2).doubleValue();;// 计算结果
System.out.print(bnum1 + "+" + bnum2 + "=");// 输出题目
这个函数的加法,减法,乘法,除法运算都没有问题,初步能满足用户需求。
public static void DecimalAc(int operation,int questionNum,int MaxNum) {
double inputResult=-1.11;
double num1=-1.11;
double num2=-1.11;
double rightResult=-1.11;
int num=-1;
Random random = new Random();
for (int i = 1; i <= questionNum; i++) {
num1=random.nextDouble()*MaxNum;
num1= (double) Math.round(num1 * 100) / 100;
BigDecimal bnum1 = new BigDecimal(Double.toString(num1));
num2=random.nextDouble()*MaxNum;
num2= (double) Math.round(num2 * 100) / 100;
BigDecimal bnum2 = new BigDecimal(Double.toString(num2));
if(operation==4) {
num = random.nextInt(3);// 产生随机数,代表运算符0为+,1为-,2为*,3为/
switch (num) {
case 0: {
rightResult = bnum1.add(bnum2).doubleValue();;// 计算结果
System.out.print(bnum1 + "+" + bnum2 + "=");// 输出题目
break;
}
case 1: {
rightResult = bnum1.subtract(bnum2).doubleValue();
System.out.print(bnum1 + "-" + bnum2 + "=");
break;
}
case 2: {
rightResult = bnum1.multiply(bnum2).doubleValue();
System.out.print(bnum1 + "*" + bnum2 + "=");
break;
}
case 3: {
if (num2 == 0) {
num2 = num2 + 1;
}
rightResult = num1 / num2;
System.out.print(num1 + "/" + num2 + "=");
break;
}
}
}
else if(operation==0){
rightResult = bnum1.add(bnum2).doubleValue();// 计算结果
System.out.print(bnum1 + "+" + bnum2 + "=");// 输出题目
}
else if(operation==1){
rightResult = bnum1.subtract(bnum2).doubleValue();
System.out.print(bnum1 + "-" + bnum2 + "=");
}
else if(operation==2){
rightResult = bnum1.multiply(bnum2).doubleValue();
System.out.print(bnum1 + "*" + bnum2 + "=");
}
else {
if (num2 == 0) {
num2 = num2 + 1;
}
rightResult = bnum1.divide(bnum2,2,BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.print(bnum1 + "/" + bnum2 + "=");
}
inputResult = inPutResult();
if (rightResult == inputResult) {
rightNum += 1;
System.out.print("\t正确");
System.out.println();
} else {
System.out.printf("\t错误,正确答案为:" +rightResult);
System.out.println();
}
}
showResult(questionNum);
}
ps:这两个函数有太多的重复性,导致代码量多,可以看出是菜鸟写的
5.用户选择运算符的函数choseope()
这个代码在最后的else中没有处理好,因为用户可以除上述运算符外,输入任何的符合,汉字,不太严谨和规范。
public static int choseope() { //用户输入运算符
int operation=-1;
Scanner in=new Scanner(System.in);
String opera=in.next();
char oper=opera.charAt(0);
if(oper=='+') {
operation=0;
}
else if(oper=='-') {
operation=1;
}
else if(oper=='*') {
operation=2;
}
else if(oper=='/'){
operation=3;
}
else {
operation=4;
}
return operation;
}
6.还有就是我参考上面链接的代码,增加的正确率函数showResult()
这个函数可以在用户回答完毕之后,算出用户所答题目的正确率,给予用户警示。
public static void showResult(int questionNum) {
if (rightNum == questionNum) {
System.out.println("非常 不错,全对!我已经没什么可以教你的了。");
} else {
DecimalFormat df = new DecimalFormat("0.00%");// 格式化输出
String rightRateStr;// 存储比率的字符串
double rightRate;// 正确率
rightRate = (double) rightNum / (double) questionNum;
rightRateStr = df.format(rightRate);
System.out.println("正确率为:" + rightRateStr);
System.out.println("革命尚未成功,同志仍需努力!");
}
}
六.结果分析
1.我们来看一下不带小数的四则运算
从这两张图可以清楚的看出我的程序所能实现的功能,没有用户界面,也没有输出到文件上,所以不是一个好的代码!
2.接下来看一下带小数的四则运算
在小数的四则运算里,除法这块做的还可以。
七.对领航员的评价
我的小伙伴,是一位可爱又美丽的女生,她的名字叫陈露。我们利用星期日一天的时间来设计,实现相关要求的功能。但是由于我们两位代码能力都很弱,从而导致最终的程序不够完整,她在整体设计这块给了我一些思路,再结合网上的一些资料,我着手准备编写,她在我编写过程中,发现了一些不足,比如在选择运算符这块,我一开始定义的是字符串型即string型,但在测试的过程中,发现运行出来的题目没有按照我们的要求来出,在一番寻找之后,她发现了我在判断用户所选择的运算符所定义的string型应该改为char型。我想了一会,确实如她所说,改完之后,就没有出现这种错误。
另外,我在编写代码的过程中,她自己已经把代码审查表列出来,我代码编写风格,习惯等等,她都认真记录下来,在代码审查表中有体现出来。因为自己能力原因,代码写的很慢,写了两天才写出了这个水平,可见一斑了!小伙伴在这块没有给我提出一些不错的想法,这是有些可惜的,可能是我们俩交流不太多,毕竟之前没有结对编程过,这是第一次,经验还是有所缺乏的。希望在团队作业中,能够常交流,常沟通,彼此提出一些好的想法,共同合作,才能完成一个好的作品。
最后,附上我们的结对编程工作照一张,嘿嘿:
八.个人总结
对于Java语言,了解的很少,并且这学期刚刚接触这门语言,在学习C/C++时,就有很多东西不会,自己也没努力学,所以学的也很差。自己刚开始天真的以为我C/C++语言学不会,那就学别的语言呗,肯定能学会。事实并不是这样的,好多语言都是有相同之处的,就好比Java和C/C++,你在C/C++没学会的东西,到了Java这一样还是不会,该懂的算法不懂,该会的函数不会,学任何语言都不可能学会。就像软件工程老师所说:研究生复试,老师问学生,你都会什么语言呀?然后学生吧啦吧啦说一通。老师又问了,你最擅长什么语言呀?学生不说话了......
所以说认真学会一门计算机语言并且精通与它,是很重要的!我在编写程序的过程中,如何生成带括号的四则运算表达式,想了半天没想起来。在网上搜索一下,发现自己没有完全看懂,一些算法不会,自己尝试编写,但是没有成功,最后不得已放弃了。在写生成小数表达式的函数时,也是遇到了各种错误,不过好在最终解决了。但是自己的代码重复的地方太多,没有想到好的办法解决,只能写成这个样子,还有这个代码有许多漏洞,比如说能生成重复的表达式,一些表达式结果不是很正确等等,要改进的地方还有很多。希望自己能多多写写代码,增强自己的代码能力,提高自己的算法思想。
in a word:I am a rookie!