第一次作业——四则运算
GitHub 链接 https://github.com/wangzn32/-
PSP
|
项目要求
1.能自动生成小学四则运算。
2.题目或者结果必须都是正数。
3.除了正数之外还要支持真分数。
解题思路
1.先能随机产生一些四则运算的题目。
2.要能支持真分数和整数。
3.算式的结果要是正数。
4.要能支持用户输入结果并且判断结果的对错。
拿到这个题目我先在网上找例子,百度等等平台上,然后学习他们的解决方法、思路,尝试理解他们写的东西
代码实现
1 package four; 2 3 import java.util.Random; 4 import java.util.Scanner; 5 6 import javax.script.ScriptEngine; 7 import javax.script.ScriptEngineManager; 8 import javax.script.ScriptException; 9 10 public class tex{ 11 public static void main(String[] args) { 12 IntFourArithmeticOperations1(10, 10); 13 } 14 @SuppressWarnings("resource") 15 public static void IntFourArithmeticOperations1(int number, int bound) { 16 Random random = new Random(); 17 boolean tf = false; 18 Scanner sc = new Scanner(System.in); 19 String [] StrArray = {"+", "×", "-", "÷", "/"};//最后一个代表分数 20 String Str1 = new String(); 21 ScriptEngineManager manager = new ScriptEngineManager(); 22 ScriptEngine engine = manager.getEngineByName("js"); 23 for(int i = 0; i < number; i++) { 24 int n = random.nextInt(4)+1;//随机产生四则运算符的个数(1-4) 25 int [] num = new int[n+1]; 26 String Str = new String(); 27 for(int k = 0; k <= n; k++) { 28 num[k] = random.nextInt(bound)+1;//产生n+1 个随机的数 29 } 30 for(int j = 0; j < n; j++) { 31 //如果n == 1 就不让它产生分数 32 if(n == 1) { 33 Str1 = StrArray[random.nextInt(4)]; 34 }else if(Str.endsWith("/") || Str.endsWith("÷")){ 35 //不让它产生除号一起的情况或者除号后面有分数的情况 36 Str1 = StrArray[random.nextInt(3)]; 37 }else{ 38 Str1 = StrArray[random.nextInt(5)]; 39 //要求是只有真分数 所以每到分数符号做一次判断大小 40 if(Str1.equals("/")) { 41 while(num[j] == num[j+1]) { 42 num[j+1] = random.nextInt(bound); 43 } 44 int temp = Math.max(num[j], num[j+1]); 45 num[j] = Math.min(num[j], num[j+1]); 46 num[j+1] = temp; 47 } 48 } 49 Str = Str + String.valueOf(num[j]) + Str1; 50 } 51 Str = Str + num[n]; 52 try { 53 String s1 = Str.replace('÷', '/'); 54 String s2 = s1.replace('×', '*'); 55 Object obj = engine.eval(s2); 56 while( obj.toString().contains("-")) { 57 s2 = Str.replaceAll("-", StrArray[random.nextInt(3)]); 58 Str = s2; 59 s2 = s2.replace('×', '*'); 60 s2 = s2.replace('÷', '/'); 61 obj = engine.eval(s2); 62 } 63 64 System.out.print(Str + "="); 65 66 String obj1 = sc.next(); 67 Object obj2 = engine.eval(obj1); 68 if(obj.equals(obj2)) { 69 tf = true; 70 System.out.println(tf); 71 }else { 72 tf = false; 73 if(Double.valueOf(obj.toString()) % 1 != 0) { 74 System.out.println(tf + " 正确答案是:"+obj); 75 }else { 76 double f1 = Double.valueOf(obj.toString()); 77 int f2 = (int)f1; 78 System.out.println(tf + " 正确答案是:"+f2); 79 } 80 } 81 } catch (ScriptException e) { 82 e.printStackTrace(); 83 } 84 } 85 } 86 }
运行结果
性能分析
1.随机生成100万个四则运算式子(数字范围是1-10)
运行结果
用时7.513秒
2.生成10万个算式自动生成答案并且判断True/False
运行结果
用时52.386秒
总结与分析
这是我第一次写这样的作业,这次的作业对我来说有些困难,因为以前我并没有这样的经验,也没有对一门语言有很深的认识,所以这次的任务对我来说找资料的时间占了很多。我在找资料的时候学到了很多东西。在自己动手的时候,尽管遇到很多困难,很多错误,还是很耐心得去找解决的方案。综上,我觉得自己在这次作业中收获良多。