zoukankan      html  css  js  c++  java
  • 20165322 第一周结队编程-四则运算

    结队编程-四则运算 阶段总结

    • 学习笔记

    • 中缀表达式转换为后缀表达式

      • 如果遇到数字,我们就直接将其输出。
      • 如果遇到非数字时,若栈为空或者该符号为左括号或者栈顶元素为括号,直接入栈。
      • 如果遇到一个右括号,持续出栈并输出符号,直到栈顶元素为左括号,然后将左括号出栈(注意,左括号只出栈,不输出),右括号不入栈。
      • 如果遇到运算符号且栈非空,查看栈顶元素,如果栈顶元素的运算优先级大于或者等于该运算符号,则持续出栈,直到栈顶元素优先级小于该运算符。最后将该元素入栈。
      • 如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
    • 生成随机数的运用

      • Random ran = new Random();随机数方法创建对象
      • int B = ran.nextInt(2);生成0—1之内的随机数
    • 需求分析

      • 随机生成题目

        • 生成题目数量根据用户需求输入
        • 自动生成小学四则运算题目(加、减、乘、除)
        • 支持整数和真分数
        • 支持多运算符(比如生成包含100个运算符的题目)
      • 统计正确率

      • 能多次生成题目

      • 扩展需求

        • 题目去重
        • 支持多语言
        • 处理生成题目并输出到文件
        • 完成题目后从文件读入并判题
    • 设计思路

      • 实验首先是完成一个计算器的功能,可以实现简单的+、-、*、/运算
      • 实现多运算符,编入四个类分别实现整数运算、真分数运算、判断结果正确并计算正确率
      • 利用JUnit检测非法输入
      • 设计一个主类生成随机数,生成题目,并判断正确率
      • 设计测试类,利用JUnit测试整数类与分数类的四则运算

    uml图:

    核心代码及注释

    public class Calculate {
        public static void main(String[] args) {
            NumberFormat number = NumberFormat.getPercentInstance();
            Random ran = new Random();
            Scanner scan = new Scanner(System.in);
            while (true) {
                System.out.print("请输入您所需要生成的题目数量:");
                int A = scan.nextInt();                        //A:题目数量
                for (int i = 0; i < A; i++) {
                    int B = ran.nextInt(2);                //生成随机数0/1,随机挑选整数或分数运算
                    int C = ran.nextInt(4);                //生成随机数0-3,随机挑选4种运算符
                    IntNumber in1 = IntNumber.obj();               //整数运算
                    IntNumber in2 = IntNumber.obj();
                    Fraction score1 = Fraction.obj();              //分数运算
                    Fraction score2 = Fraction.obj();
                    if (B == 0) {
                        switch (C) {                                //整数加减乘除运算
                            case 0:
                                int num = in1.add(in2);
                                String num1 = "" + num;
                                int n = scan.nextInt();
                                Judgement.judge(n == num, num1);
                                break;
                            case 1:
                                num = in1.subtract(in2);
                                num1 = "" + num;
                                n = scan.nextInt();
                                Judgement.judge(n == num, num1);
                                break;
                            case 2:
                                num = in1.multiply(in2);
                                num1 = "" + num;
                                n = scan.nextInt();
                                Judgement.judge(n == num, num1);
                                break;
                            case 3:
                                num1 = in1.divide(score1);
                                String Q = scan.next();
                                Judgement.judge(Q.equals(num1), num1);
                                break;
                        }
                    } else {
                        switch (C) {                                           //分数加减乘除运算
                            case 0:
                                Fraction num2 = score1.add(score2);
                                String num1 = num2.toString();
                                String s = scan.next();
                                Judgement.judge(s.equals(num1), num1);
                                break;
                            case 1:
                                num2 = score1.subtract(score2);
                                num1 = num2.toString();
                                s = scan.next();
                                Judgement.judge(s.equals(num1), num1);
                                break;
                            case 2:
                                num2 = score1.multiply(score2);
                                num1 = num2.toString();
                                s = scan.next();
                                Judgement.judge(s.equals(num1), num1);
                                break;
                            case 3:
                                num2 = score1.divide(score2);
                                num1 = num2.toString();
                                s = scan.next();
                                Judgement.judge(s.equals(num1), num1);
                                break;
                        }
                    }
                }
    

    测试代码

    运行结果截图

    码云链接

    码云链接

    实验过程

    • 实验要求生成随机四则运算,最难的在于真分数与多运算符的实现,以及分多个类来实现算法。
    • 我们参考了邹欣老师的学生编写的代码《编写一个能自动生成小学四则运算题目的程序》尝试写了生成随机数的代码。但是对后续代码依然不知从何下手。
    • 我们选择请教了其他同学,并且参考了他们的代码。其中在利用生成随机数和switch语句来实现随机四则运算的巧妙方法使我印象十分深刻。
    • 但是我在真分数类的部分代码我还不太明白。以及如何实现计算题随机的长度也没弄懂。
    • 我尝试了往代码里加入题目去重功能,但是还没有成功。其他几个扩展需求太难了怕是做不了QWQ...

    评价我的结队小伙伴

    • 这个其实我觉得没啥好评价的=-=本来就是好朋友兼舍友。睡前吧唧吧唧讨论几句,看到优秀的代码就分享给对方。虽然都还很菜编不出那么难的代码。但是一起学习带来了很大的快乐,讨论中交换了很多新鲜的思路。相信我们会一起慢慢学的很好的。
    • 结队学习照片(上次比较枯燥这次弄个有趣的> - <)

    总结

    这次结队学习任务虽然对我们来说难度大了点,但是锻炼了我们的思维。通过一个项目也更有利于积极主动地去查找学习一些知识。
    时间没有认真统计,代码我们没有自己编写出来。我感觉结对学习最大的好处就是可以随时随地讨论起来,利用零散的时间也能一起学习。等啥时候我们自己能编写一个项目了大概也能画出漂亮的时间表吧0-0

  • 相关阅读:
    common-pool2连接池详解与使用
    Nginx实现页面缓存
    Nginx实现动静分离
    lnmp环境下nginx配置‘负载均衡’
    用phpstudy搭建的lnmp环境下mysql授权远程连接
    新浪OAuth网络登录,请求access_token时遇到21323的错误
    使用curl进行模拟登录
    yii2.0分页
    yii2.0表单自带验证码
    yii2.0查询关联数据以及widgets小部件
  • 原文地址:https://www.cnblogs.com/wangyaojia/p/8849649.html
Copyright © 2011-2022 走看看