• 20175212童皓桢 结对编程项目-四则运算 第一周


    20175212童皓桢 结对编程项目-四则运算 第一周

    需求分析

    • 实现一个命令行程序,要求自动生成小学四则运算题目(加减乘除)

    • 支持多运算符

    • 测试结果的正确性,用户输入错误时给出正解

    • 统计题目正确率

    设计思路

    • 首先要能够按照按人的一般习惯,生成自左向右计算的加减乘除算式。

    • 随机生成多运算符,并随机生成相对应个数的整数

    • 利用eval方法直接计算随机生成的算式的值,并和用户的输入作比较

    • 判断正确率

    • 设计测试类,利用JUnit测试整数的四则运算

    UML类图

    输入图片说明

    关键代码

    • 如何生成符合要求格式的运算式
    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);
    
    

    Junit测试

    输入图片说明

    运行过程截图

    输入图片说明

    代码托管地址

    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结果导致的数据类型错误。

    • 问题4

    统计正确题目数count时,无法将countjudgeFormula中返回,count值仍为0

    • 问题4及解决方法

    在参考学姐博客后,选择加入如下包:

    import java.text.NumberFormat;
    
    

    调用该类中方法getPercentInstance来返回当前默认语言环境的百分比格式,如下:

    NumberFormat num = NumberFormat.getPercentInstance();//调用getPercentInstance方法
    ……
    double T = (double) jud.getTrues()/n;
            System.out.println("正确率为:"+num.format(T));
    
    

    结对总结及评价

    • 对于计算算式的正确答案这一问题,老师提供的参考博客中给的提示是将中缀转化为后缀运算,而我们仍嫌复杂选择了投机的eval方法,本以为能获得方便,但在使用的规范性上遇到了极大的阻力,以至于我们甚至花费了更多的时间学习更深的内容,有一点 杀鸡用牛刀 的感觉。所在以之后的学习生活中,不能被眼前的利益和甜头冲昏头脑,而是应该顾全大局,在谨慎评估后再做出选择。

    • 结对学习对于编而言的确是一个很好的方法。因特殊方法的原因,我们的程序编写过程中遇到了许多各式各样的问题,大部分还是超出了知识能力范围,需要我们摸索研究。很难想象没有这样一个好的结对伙伴,这个程序的实现将会有多大的难度!

    • 最后,我希望并且有信心,通过两个人的结对将Java学习的热情和储备提升一个新的台阶。

    结对照片

    输入图片说明

    参考和引用

  • 相关阅读:
    [ 转载 ] Mysql 远程连接+开放80和3306端口 常用配置
    [ 转载 ] Mysql 数据库常用命令
    [ 转载 ] Centos 安装mysql后启动失败 出现 ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’
    [2020多校联考]手套
    [2020多校联考]糖果机器
    [2020多校联考]染色相邻的边
    [2020多校联考]四个质数的和
    [2020多校联考]简单题
    [2020多校联考]MC
    [2020多校联考]进化
  • 原文地址:https://www.cnblogs.com/thz666/p/10651578.html
Copyright © 2020-2023  润新知