个人作业——四则运算

需求分析:

  • 自然数:0, 1, 2, …。
  • 真分数:1/2, 1/3, 2/3, 1/4, 1’1/2, …。
  • 运算符:+, −, ×, ÷。
  • 括号:(, )。
  • 等号:=。
  • 分隔符:空格(用于四则运算符和等号前后)。
  • 算术表达式:
  • e := n | e1 + e2 | e1 − e2 | e1 × e2 | e1 ÷ e2 | (e),
    其中e, e1和e2为表达式,n为自然数或真分数。
  • 四则运算题目:e = ,其中e为算术表达式。

功能设计

功能:
    1.生成随机数n
    2.生成随机运算符
    3.组成算数表达式
    4.计算题目结果并输出文档
    5.比较答案并给出错误题号
要求:
    1.表达式不重复
    2.结果无负数
    3.结果最简,
    4.算符不超过三个

程序设计

    随机数表示,统一使用分数形式
    类名:Num,参数类型:int,参数名:numerator(分子),denominator(分母)
  • 功能点1:生成随机数
    随机数生成方法:
        //range为参数范围
        public Num createNum(int range)
    随机数约分方法:
        public Num reduction(Num num)     
  • 功能点2:生成随机运算符
    随机运算符生成方法:
        public String createpOerator()
  • 功能点3:组成算数表达式
    表达式表示:
        类型:ArrayList
    组成方法:
        public ArrayList<Object> createArithmetic(int range)
  • 功能点4:计算表达式结果并输出文档
    逆波兰式转换:
            //list为生成的算数表达式
        public ArrayList<Object> toRPN(ArrayList<Object> list)
    逆波兰式计算
            //right为逆波兰式
        public Num countRPN(ArrayList<Object> right)
            //计算两个数
            private Num twoResult(String is, Num op1, Num op2)
    文档输出:
            //list1为题目集合,list2为答案集合
        public void output(List<Object> list1, List<Object> list2)
  • 功能点5:比较答案并记录错误题号
        public void compare()
  • 要求:
    表达式不重复:
            //list为刚生成的表达式
        public boolean checkRPN(String list)
    结果无负数:
            //result为生成表达式的答案
        public boolean checkAnswer(Num result)

工具类:

    栈类:
    类名:Stacks
    参数:LinkedList list = new LinkedList();
          int top = -1;
    方法:
        public void push(Object value)
        public Object pop()
        public Object top()

代码说明

    //递归寻找最大公约数
    public int getMaxDivisor(int numerator, int denominator) {
        if (denominator == 0) {
            return numerator;
        } else {
            return getMaxDivisor(denominator, numerator % denominator);
        }
    }
    //三个运算符带括号生成方式
    case 3:
        // 括号开始位置
        bracket_s = rand.nextInt(4);
        // 括号结束位置
        bracket_e = 0;
        // 没有括号
        if (bracket_s == 0) {
            bracket_e = 0;
        }
        // 有括号
        else {
            bracket_e = bracket_s + rand.nextInt(2) + 1;
            if (bracket_e >= 4) {
                bracket_e = 4;
            }
        }
        for (int i = 1; i <= 4; i++) {
            //list为算数表达式
            if (i == bracket_s) {
                list.add("(");
            }
            list.add(f1.createNum(range));
            if (i == bracket_e) {
                list.add(")");
            }
            list.add(f2.createoperator());
        }
        list.remove(list.size() - 1);
        break;

源代码已上传至Coding.net
codingd地址
https://coding.net/u/w2197525161/p/jisuan

测试运行

  • 程序运行
    1211702-20170916163416641-819993042.png
  • 选择操作数1
    1211702-20170916163435157-1764850149.png
  • 输入题目条件
    1211702-20170916163447875-843700162.png
  • 文档位置
    1211702-20170916163507141-288938243.png
  • 题目,答案与答题
    1211702-20170916163528500-332240713.png1211702-20170916163549172-1240021707.png1211702-20170916163553157-505820237.png
  • 测试答题
    1211702-20170916163610532-1585362479.png
  • 答案对照
    1211702-20170916163620438-194589220.png

PSP表格

1211702-20170916163634375-1533690156.png

    因为是第一次使用PSP的方式统计程序开发时间,所以在估计时间与实际使用时间的统计上还有许多不清楚的地方。在没有刻意去计算时间的时候,常常忘记已经过了多久。
    多数时间花费在程序实际上,虽然有参考部分思路,但还是采用了自己的设计思路,所以没有附上引用的博客链接。主要引用的是求最大公约数的递归算法,手机UC浏览器查到的,只是一张图片,具体链接不明。

心得

    这个程序是在比较完善的设计思路下完成的,从数字的存储方式,到表达式的存储类型,到每一个功能点的设计,函数的构建有比较清晰的思路。较为困难的地方是具体方法的实现,可能是由于都是自己拍脑袋设计的方法,没有很好的去借鉴别人的经验,所以费了不少时间。
    最后程序在表达式查重方面仅仅是使用了最简单的方法,由于是在想不出,在网上也找不到我认可的方式,所以暂时搁置。先发表一个版本以期后期完善。

转载于:https://www.cnblogs.com/blogWU/p/7531726.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值