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

  • 相关阅读:
    June. 26th 2018, Week 26th. Tuesday
    June. 25th 2018, Week 26th. Monday
    June. 24th 2018, Week 26th. Sunday
    June. 23rd 2018, Week 25th. Saturday
    June. 22 2018, Week 25th. Friday
    June. 21 2018, Week 25th. Thursday
    June. 20 2018, Week 25th. Wednesday
    【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)
    June.19 2018, Week 25th Tuesday
    June 18. 2018, Week 25th. Monday
  • 原文地址:https://www.cnblogs.com/wangyaojia/p/8849649.html
Copyright © 2011-2022 走看看