实现一个命令行程序,要求自动生成小学四则运算题目(加减乘除)javascript
支持多运算符html
测试结果的正确性,用户输入错误时给出正解java
统计题目正确率git
首先要可以按照按人的通常习惯,生成自左向右计算的加减乘除算式。编程
随机生成多运算符,并随机生成相对应个数的整数数组
利用eval
方法直接计算随机生成的算式的值,并和用户的输入做比较微信
判断正确率dom
设计测试类,利用JUnit测试整数的四则运算函数
for (i = 0; i < n; i++) { int a = random.nextInt(5) + 1;//1-5个运算符 int[] number = new int[a + 1];//建立一个number数组 String ex = new String(); for (int j = 0; j <= a; j++) {//生产a+1个数字,即2-6个数字 number[j] = random.nextInt(100) + 1;//生成1-100的整数 } for (int j = 0; j < a; j++) { int s = random.nextInt(4);//随机生成运算符下标 ex += String.valueOf(number[j]) + String.valueOf(op[s]);//添加一对数字和运算符 } ex += String.valueOf(number[a]);//在尾端补上一个数字 System.out.println(ex + "=");
int ua = reader.nextInt();//用户输入答案 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine se1 = manager.getEngineByName("js"); ScriptEngine se2 = manager.getEngineByName("js"); String str=ex+"="+"="+ua;//将用户答案逻辑式放在字符串str中 Boolean result =(Boolean)se1.eval(str);//用eval方法计算用户答案逻辑式 String ca="="+se2.eval(ex);//生成correct_answer字符串存正确答案 jud.judgeFormula(result,ca);
https://gitee.com/thz666/20175212_tong_haozhen/blob/master/src/四则运算练习器.java单元测试
首先,对于计算正确答案,咱们想使用参考博客中的将中缀式转化为后缀式的方法。但通过思考发现实际操做太过冗长,编写代码时容易出错
考虑到JavaScript中有eval
方法,尝试学习使用eval
方法直接计算算式的值。
在初学eval
方法时得知,此方法用于链表中,网上的参考程序很难看懂并实际应用于本身的程序里。
依葫芦画瓢,按照网上的参考程序引入新的包
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException;
以及使用
try { result = ( Boolean)se.eval(str); } catch (ScriptException e) { e.printStackTrace(); }
相似这种格式下使用eval
方法,但因为不了解其真正的含义,修改代码每每会出现未知的错误。
然后咱们选择,让不在链表中的对象使用eval
方法进行计算,以此抛弃上述格式。
使用eval
不能输直接出算式的值,而且会提示空指针错误或是数据类型错误。
不让eval
直接输出算式值,而是经过
String str=ex+"="+"="+ua;//将用户答案逻辑式放在字符串str中 Boolean result =(Boolean)se1.eval(str);//用eval方法计算用户答案逻辑式
用eval方法来计算“用户答案和正确答案是否相等”这样一个 逻辑式 ,以此来避免输出eval
结果致使的数据类型错误。
统计正确题目数count
时,没法将count
从judgeFormula
中返回,count
值仍为0
在参考学姐博客后,选择加入以下包:
import java.text.NumberFormat;
调用该类中方法getPercentInstance
来返回当前默认语言环境的百分比格式,以下:
NumberFormat num = NumberFormat.getPercentInstance();//调用getPercentInstance方法 …… double T = (double) jud.getTrues()/n; System.out.println("正确率为:"+num.format(T));
对于计算算式的正确答案这一问题,老师提供的参考博客中给的提示是将中缀转化为后缀运算,而咱们仍嫌复杂选择了投机的eval方法,本觉得能得到方便,但在使用的规范性上遇到了极大的阻力,以致于咱们甚至花费了更多的时间学习更深的内容,有一点 杀鸡用牛刀 的感受。所在以以后的学习生活中,不能被眼前的利益和甜头冲昏头脑,而是应该顾全大局,在谨慎评估后再作出选择。
结对学习对于编而言的确是一个很好的方法。因特殊方法的缘由,咱们的程序编写过程当中遇到了许多各式各样的问题,大部分仍是超出了知识能力范围,须要咱们摸索研究。很难想象没有这样一个好的结对伙伴,这个程序的实现将会有多大的难度!
最后,我但愿而且有信心,经过两我的的结对将Java学习的热情和储备提高一个新的台阶。