20165322 第一周结队编程

Wesley13
• 阅读 453

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

  • 学习笔记

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

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

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

    • 随机生成题目

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

    • 能多次生成题目

    • 扩展需求

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

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

uml图: 20165322 第一周结队编程

核心代码及注释

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;
                    }
                }
            }

测试代码

20165322 第一周结队编程

20165322 第一周结队编程

运行结果截图

20165322 第一周结队编程

码云链接

码云链接

实验过程

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

评价我的结队小伙伴

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

总结

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

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java内存结构笔记
此篇仅作笔记,详情参考:https://my.oschina.net/uwith/blog/3110227(https://my.oschina.net/uwith/blog/3110227)栈帧内部的结构:局部变量表、操作数栈(比如我们去赋值或者计算都会操作操作数栈)、动态链接、返回链接。jvm为对象开辟空间的两种方式:1、指针碰撞:如果
Wesley13 Wesley13
2年前
ES6
JavaScript定义对象的属性,有两种方法。varobj{foo:true,abc:123};上面代码的方法一是直接用标识符作为属性名,方法二是用表达式作为属性名,这时要将表达式放在方括号之内。但是,如果使用字面量方式定义对象(使用大括号),在ES5中只能使用方法
Stella981 Stella981
2年前
JVM 字节码指令表
字节码助记符指令含义0x00nop什么都不做0x01aconst\_null将null推送至栈顶0x02iconst\_m1将int型1推送至栈顶0x03iconst\_0将int型0推送至栈顶0x04iconst\_1将int型1推送至栈顶0x05ic
Wesley13 Wesley13
2年前
Java解决括号匹配算法问题
有效字符串需满足:左括号必须用相同类型的右括号闭合。包括:“()”,“\\”,“{}”。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。思路:在这里我们使用栈来实现。遍历字符串时判断:如果是左括号,那么我们将其入栈;如果为右括号,我们先判断栈是否为空(有可能字符串刚开始就是一个右括号呢),为空的话直接返回false,不为空
Wesley13 Wesley13
2年前
C++栈和队列
使用标准库的栈和队列时,先包含相关的头文件include<stackinclude<queue定义栈如下:stack<intstk;定义队列如下:queue<intq;栈提供了如下的操作s.empty()如果栈为空返回true,否则返回fals
Wesley13 Wesley13
2年前
Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗?以及数据结构与本篇博客的主题前缀、中缀、后缀表达式有什么关系呢?1、人如何解析算术表达式  如何解析算术表达式?或者换种说法,遇到某个算术表达
Wesley13 Wesley13
2年前
%5B0%5D表示什么意思
students%5B0%5D表示:students\0\%5B为左中括号\%5D为右中括号\这样就明白了varqsrequire('qs');varobj{name:'Tom',description:'hello',hobbies:'basketball
Wesley13 Wesley13
2年前
ACM_括号匹配
括号匹配(栈)TimeLimit:2000/1000ms(Java/Others)ProblemDescription:给一组包含()两种括号的序列,检查是否是合法的。如:(),(
Wesley13 Wesley13
2年前
Java基础入门(三)之条件分支结构以及键盘录入
一、if语句1、if条件语句的表达式无论简单还是复杂,结果必须是布尔类型。2、if语句的三种形式第一种:if(比较表达式)                {语句体1:}如果if语句控制的语句体是一条,大括号可以省略,若为多条,必须加大括号。要求:统一加大括号第二种:if(比较表达式){语句体1
菜园前端 菜园前端
11个月前
什么是栈?
原文链接:栈是基础数据结构,栈是一种遵循后进先出原则的有序集合,添加新元素的一端称为栈顶,另一端称为栈底。操作栈的元素时,只能从栈顶操作(添加、移除、取值)。实现功能在JavaScript中没有栈,但是可以通过Array实现栈的所有功能push()入栈po