设计思想:出题的方法已经在上周实现,虽然感觉有些不完善,这周在好好的重写一次,又加上了控制有无乘除法、有无负数、范围、括号和分数的计算,感觉非常困难实现这些功能,括号的设计和分数的计算有难度。
package 四则运算; import java.util.*; public class suanshi { public static void main(String args[]){ System.out.println("请输入要生成的数学题的数目:" ); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); for(int i=0;i<n;i++) { //随机生成一个代表分数运算还是简单运算的数字 int temp = (int)(Math.random()*2)+1; //生成随机数 int firstNum = (int)(Math.random()*10); int secondNum = (int)(Math.random()*10); int thirdNum = (int)(Math.random()*10); int fourthNum = (int)(Math.random()*10); //生成随机的1-4来代表加减乘除 int index = 1+(int)(Math.random()*4); if(temp == 1) //编辑 {if(index == 1) { System.out.println((i+1)+"."+" "+firstNum+ "+" +secondNum+ "="); Scanner in1 = new Scanner(System.in); int a = in1.nextInt(); if(a==firstNum+secondNum) System.out.println("回答正确"); else System.out.println("回答错误,正确答案为:"+(firstNum+secondNum)); } if(index == 2) { System.out.println((i+1)+"."+" "+firstNum+ "-" +secondNum+ "="); Scanner in2 = new Scanner(System.in); int b = in2.nextInt(); if(b==firstNum-secondNum) System.out.println("回答正确"); else System.out.println("回答错误,正确答案为:"+(firstNum-secondNum)); } if(index == 3) { System.out.println((i+1)+"."+" "+firstNum+ "*" +secondNum+ "="); Scanner in3 = new Scanner(System.in); int a = in3.nextInt(); if(a==firstNum*secondNum) System.out.println("回答正确"); else System.out.println("回答错误,正确答案为:"+(firstNum*secondNum)); } if(index == 4) { if(secondNum!=0) System.out.println((i+1)+"."+" "+firstNum+ "/" +secondNum+ "="); Scanner in4 = new Scanner(System.in); double a = in4.nextDouble(); if(a==firstNum/secondNum) System.out.println("回答正确"); else System.out.println("回答错误,正确答案为:"+(firstNum/secondNum)); } } //分数的加减运算 if(temp==2) { if(index==1) { System.out.println((i+1)+". "+firstNum+"/"+secondNum+" + "+thirdNum+"/"+fourthNum); int a = min(secondNum,fourthNum);//分母的最小公倍数 int b = a/secondNum;//通分后第一个式子要乘的数 int c = a/fourthNum;//通分后第二个式子的要乘的数 int m = firstNum*b;//通分后第一个式子的分子 int d = thirdNum*c;//同分后第二个式子的分子 int w = m+d;//相加后的分子; int f = max(a,w); double g = (w/f)/(a/f); Scanner in5 = new Scanner(System.in); double h = in5.nextDouble(); if(h==g) System.out.println("回答完全正确"); else System.out.println("回答错误,正确答案为:"+(w/f)+"/"+(a/f)); } if(index == 2) { System.out.println((i+1)+". "+firstNum+"/"+secondNum+" - "+thirdNum+"/"+fourthNum); int a = min(secondNum,fourthNum); int b = a/secondNum;//通分后第一个式子要乘的数 int c = a/fourthNum;//通分后第二个式子的要乘的数 int m = firstNum*b;//通分后第一个式子的分子 int d = thirdNum*c;//同分后第二个式子的分子 int fenJian = m-d;//相减后的分子 int f = max(a,fenJian); double g = (fenJian/f)/(a/f); Scanner in6 = new Scanner(System.in); double h = in6.nextDouble(); if(h==g) System.out.println("回答完全正确"); else System.out.println("回答错误,正确答案为:"+(fenJian/f)+"/"+(a/f)); } if(index == 3) { System.out.println((i+1)+". "+firstNum+"/"+secondNum+" * "+thirdNum+"/"+fourthNum); int Sfenzi = firstNum*thirdNum;//相乘后的分子 int Sfenmu = secondNum*fourthNum;//相乘后的分子 int c = max(Sfenzi,Sfenmu);//分子和分母的最大公约数 int Efenzi = Sfenzi/c; int Efenmu = Sfenmu/c; double de = Efenzi/Efenmu;//约分后的得数 Scanner in7 = new Scanner(System.in); double h = in7.nextDouble(); if(h==de) System.out.println("回答正确"); else System.out.println("回答错误,正确答案为:"+Efenzi+"/"+Efenmu); } if(index == 4) { //分数的除法就是乘以第二个数的倒数 if(secondNum!=0&&fourthNum!=0&&thirdNum/fourthNum!=0) System.out.println((i+1)+"."+" "+firstNum+ "/" +secondNum+ " / "+thirdNum+"/"+fourthNum); else { System.out.println(30 + "/" + 15 + "=?"); } int Sfenzi = firstNum*fourthNum;//分子 int Sfenmu = secondNum*thirdNum;//分母 int c = max(Sfenzi,Sfenmu); int Efenzi = Sfenzi/c; int Efenmu = Sfenmu/c; double de = Efenzi/Efenmu; Scanner in8 = new Scanner(System.in); double h = in8.nextDouble(); if(h==de) System.out.println("回答正确"); else System.out.println("回答错误,正确答案为:"+Efenzi+"/"+Efenmu); } } } } //求最大公约数与最小公倍数 public static int max(int a ,int b) { //循环法求两个数的最大公约数 //保证第一个参数大于第二个参数 if(a<b) { int temp; temp=a; a=b; b=temp; } while(a%b!=0) //在余数不为零时循环 { int temp=a%b; a=b; b=temp; } return b; //返回最大公约数 } public static int min(int a,int b) { //求最小公倍数 return a*b/max(a,b); } }
程序截图:
程序总结:伴随着功能的增加,程序的编写变得更加的困难,这就需要更加的耐心去做这个东西,需要我更加清晰的思路来解决问题。采取一个一个的小模将程序分解开来,一个功能的来实现,会让自己的思路代码都显得更加的清晰。
项目计划日志:
日期 任务 |
听课 |
编写程序 |
阅读课本 |
准备考试 |
日总计 |
周一 |
60 |
60 |
|
|
120 |
周二 |
|
|
|
|
|
周三 |
|
180 |
|
|
180 |
周四 |
|
120 |
|
|
120 |
周五 |
|
|
|
|
|
周总计 |
60 |
360 |
|
|
420 |
时间记录日志:
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
C |
U |
3/6 |
14:00 |
16:00 |
|
120 |
听课 |
软件工程概论 |
|
|
|
22:00 |
22:40 |
|
40 |
写思路 |
把程序的思路写下来 |
|
|
3/8 |
15:00 |
18:00 |
|
180 |
编程序 |
四则运算2 |
|
|
3/9 |
20:00 |
22:00 |
|
120 |
编程序 |
四则运算2 |
|
|
3/10 |
16:00 |
18:00 |
|
120 |
写报告 |
四则运算2 的报告 |
|
缺陷记录日志:
日期
|
编号 |
类型 |
引入阶段 |
排出阶段 |
修复时间 |
缺陷 |
3.7 |
1 |
|
编码 |
编译 |
5min |
除法出现除数为0 |
3.8 |
2 |
|
编码 |
编译 |
10min |
分数的复合运算无法实现 |
3.9 |
3 |
|
编码 |
编译 |
5min |
优先级出现错误 |