20165322 第二周结队编程-四则运算

结对编程-四则运算 整体总结

  • 学习笔记

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

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

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

    • 随机生成题目

      • 生成题目数量根据用户需求输入
      • 自动生成小学四则运算题目(加、减、乘、除)
      • 支持整数和真分数
      • 支持多运算符(比如生成包含100个运算符的题目)
    • 统计正确率
    • 能多次生成题目
    • 扩展需求
      • 题目去重
      • 支持多语言
      • 处理生成题目并输出到文件
      • 完成题目后从文件读入并判题
  • 设计思路

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

uml图:

实现真分数计算代码及注释

import java.util.Random;
public class Fraction {
    private int numerator, denominator;  //定义分母、分子

    public  Fraction (int numer, int denom)
    {

        if(denom == 0 )        //分子为0
            denom = 1;
        if (denom < 0)           //若分母小于0,则取分母为正值,分子为负值
        {
            numer = numer * -1;
            denom = denom * -1;
        }
        numerator = numer;
        denominator = denom;

        reduce();
    }

    public int getNumerator()
    {
        return numerator;
    }

    public int getDenominator()
    {
        return denominator;
    }

    public Fraction add(Fraction op2)          //实现真分数加法运算
    {
        int commonDenominator = denominator * op2.getDenominator();   //两随机数a1、a2的分母相乘,进行通分
        int numerator1 = numerator * op2.getDenominator();            //a1的分子=a1的分子与a2的分母相乘
        int numerator2 = op2.getNumerator() * denominator;           //a2的分子=a2的分子与a1的分母相乘
        int sum = numerator1 + numerator2;                            //将通分过后的两个随机数相加
        System.out.print("("+this.toString()+")" + " + " + "("+op2.toString()+")" + "=");
        return new Fraction (sum, commonDenominator);
    }

    public Fraction subtract(Fraction op2)           //实现真分数减法运算
    {
        int commonDenominator = denominator * op2.getDenominator();
        int numerator1 = numerator * op2.getDenominator();
        int numerator2 = op2.getNumerator() * denominator;
        int difference = numerator1 - numerator2;
        System.out.print("("+this.toString()+")" + " - " + "("+op2.toString()+")" + "=");
        return new Fraction(difference,commonDenominator);
    }

    public Fraction multiply (Fraction op2)              //实现真分数乘法运算
    {
        int numer = numerator * op2.getNumerator();
        int denom = denominator * op2.getDenominator();
        System.out.print("("+this.toString()+")" + " * " + "("+op2.toString()+")" + "=");
        return new Fraction (numer, denom);
    }

    public Fraction divide (Fraction op2)              //实现真分数除法运算
    {

        int numer = numerator * op2.getDenominator();
        int denom = denominator * op2.getNumerator();
        System.out.print("("+this.toString()+")" + " / " + "("+op2.toString()+")" + "=");
        return new Fraction (numer, denom);
    }

    public String toString()      //输出格式及限定
    {
        String result;

        if (numerator == 0)               //分子为0,结果为0
            result = "0";
        else
        if(denominator == 0)              //分母不能为0
            return "错误!分母不能为0";
        else
        if (denominator == 1)             //分母为1,结果取分子值
            result = numerator + "";

        else
            result = numerator + "/" + denominator;  //按分数形式输出结果

        return result;
    }

    private void reduce()
    {
        if (numerator != 0)
        {
            int common = gcd (Math.abs(numerator), denominator);    //取分子分母最大公因子

            numerator = numerator / common;                        //约分
            denominator = denominator / common;
        }
    }

    private int gcd (int num1, int num2)                      //计算最大公因子
    {
        if(num2==0)
            return num1;
        else
            return gcd(num2,num1%num2);

    }
    public static Fraction obj(){                               //生成随机数
        Random ran = new Random();
        return new Fraction(ran.nextInt(100),ran.nextInt(100));
    }
}

测试代码

运行结果截图

码云链接

码云链接

实验过程

  • 上次关于真分数的算法我们没有弄明白。这次我们认真讨论并解决了问题。关于代码的批注在上面的代码里。
  • 首先是用java语言描述真分数里的加减乘除运算,然后将运算结果化简。
  • 化简过程需要用到求最大公因子,这时候我们需要分子分母均为正值,于是就有了public Fraction (int numer, int denom)方法,以及Math.abs(numerator)来保证算法不出现漏洞。
  • 除此之外还要注意分子分母计算的一些限定特性。我们同样加进代码里。
  • 代码里的去重功能没写出来,但是经过讨论有了思路:(1)记录之前生成的题目;(2)用遍历比较新生成题目与旧生成题目。如果重复,则删除此新生成题,并再生成一个题目,重新遍历检查。如果不重复,则进入下一环节。

评价我的结队小伙伴

她很美

是天边的火烧云

是日月星辰

但是

我更美

在本周学习中,在小伙伴的帮助下,我对代码有了更深的解读,她的认真及更高效的学习方法让我受益,在这周的磨合中我们的默契度也有了更大的提高,思考问题的时候,会有更多相同的思考,结对学习的过程也是我们相互促进的过程。

总结

  • 感受到了有所思路却写不出代码的痛苦,有时候甚至想,为啥不用C编...好吧我的思维还没有转变过来。
  • 但是还是很开心,比上周又进步了一点点。开始学着用伪代码,流程图来描述思路给自己的小伙伴看。也让整个算法在脑海里有更清晰的构造。

原文地址:https://www.cnblogs.com/wangyaojia/p/8910340.html

时间: 2024-08-29 16:08:49

20165322 第二周结队编程-四则运算的相关文章

20175325 第二周结对编程项目 四则运算

20175325 第二周结对编程项目 四则运算 一.需求分析: 实现一个命令行程序,要求: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计正确率 题目去重 能多次生成四则运算题目 能根据用户输入的数字生成四则运算的题目数量 多语言支持: 简体中文, 繁體中文, English 文件: 处理生成题目并输出到文件 完成题目后从文件读入并判题 用户能够选择是否开始答题 二. 设计思路: 产生随机数并且考虑符号的优先级. 能实现整

第二周结对编程-20165222

一题目要求 实现一个命令行程序,要求: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计正确率. 二需求分析 1.用随机数随机生成数字,能够随机生成符号加减乘除(除数不为0). 2.支持分数和整数的四则运算,同样是利用随机数分别生成分子与分母(分母不为0). 3.能够判断输入答案的对错并统计正确率,要将用户输入答案与式子答案进行比较. 三设计思路 1.通过随机数来实现整数以及分数. 2.通过随机数结合if条件语句实现加减乘除

第二次结对编程—四则运算自动生成程序

一.题目要求 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求: 能够自动生成四则运算练习题 可以定制题目数量 用户可以选择运算符 用户设置最大数(如十以内.百以内等) 用户选择是否有括号.是否有小数 用户选择输出方式(如输出到文件.打印机等) 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主) 二.任务分配 驾驶员:王旭 领航员:张昊辰 驾驶员负责写代码,浏览文件,还有基础实现方法. 领航员则着眼更长远的考虑并且检查错误.进行代码测试和检查错误. 三.

第一周 结对编程四则运算

项目需求:程序随机生成四则运算计算题,并在用户填写答案后判断答案正误. 结对成员:李峤 任务分配:算法思想及采用的主要函数由李峤负责. 部分代码输入及结果测试由本人负责. 大体分成两个模块 :1.随机生成四则运算计算题 2.判断录入答案正误 主要代码如下: 1 #include<stdio.h> 2 #include<string.h> 3 #include<time.h> 4 #include<stdlib.h> 5 int main() 6 { 7 ch

第二周-结对编程

结对成员:李俞寰,杜桥, 工作地点:冬华B622 电脑:李俞寰的电脑用来两个人共同写代码,杜桥的电脑在一旁用来查资料等; 心得体会: 在刚开始的时候,感觉身边有人看着完全写不出代码,好多很基础的知识甚至是常用的语法知识也要上网查,这样被人看着感觉有点尴尬.后来随着逐渐熟悉起来这种感觉逐渐变淡.两个人一起编程感觉像多了一个看问题的角度,犯错误时,偶尔会被立即指出.在给对方讲解时,有些自己感觉模糊的地方有时在讲解的过程中会变得更加清晰.当对方给讲解时,不同的思考方式和描述会让我理解的更好.可能是还处

第二周结对编程作业——词频统计

本周作业是结对编写一个词频统计的程序,我们组是我(欧阳思琪)和贺晋飞同学共同完成这项任务.在仔细阅读了要求之后,我们组对程序编程进行了讨论.由于语言可以不必局限于要求中的C.C++,我们便考虑JAVA或python,两者各有优缺点,JAVA写起来比较繁重,而基于以往用python处理NLP相关项目的经验觉得python较为简单,但觉得在简单要求下,使用JAVA的运行速度明显更快,所以我们选择使用JAVA来完成本次作业. 分工:欧阳思琪 代码编写与博客编写 贺晋飞   代码审查与代码测试 实际:由

第二周结对编程作业:词频统计

程序实现的功能是统计文件中出现的词和每个词的频数. 这里的词的规定和平时语言上的规定不太一样,但是更标准化,规定了长度.组成字符和分隔符,在实现中也从这几个方面来寻找词. /*判断字符是否是字母*/ bool isAlphabetic (char c) { return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); } /*判断字符是否是数字*/ bool isNumerical (char

软工概论第二周个人项目四则运算二(改进)

设计思想: 设计思想:输出表达式的个数n,利用随机数方法产生小于100的随机数,用for循环产生多个随机数,然后在进行判断,判断两个证书的和小于100,差大于0,乘积小于100,能够整除如果不符合要求则跳过本次循环,如果符合则赋值当总数到n时跳出循环,用字符串保存表达式,用double类型的数组保存正确结果,然后循环输出表达式,输入结果后跳转到判断结果界面,循环判断结果,如果相等flag[]为1,不等为0,最后给出正确的题目数量和错误的数量和未作的数量,在循环输出不正确的那些题目 改进的地方:表

20165322 结对编程-四则运算 阶段总结

结队编程-四则运算 阶段总结 学习笔记 中缀表达式转换为后缀表达式 如果遇到数字,我们就直接将其输出. 如果遇到非数字时,若栈为空或者该符号为左括号或者栈顶元素为括号,直接入栈. 如果遇到一个右括号,持续出栈并输出符号,直到栈顶元素为左括号,然后将左括号出栈(注意,左括号只出栈,不输出),右括号不入栈. 如果遇到运算符号且栈非空,查看栈顶元素,如果栈顶元素的运算优先级大于或者等于该运算符号,则持续出栈,直到栈顶元素优先级小于该运算符.最后将该元素入栈. 如果我们读到了输入的末尾,则将栈中所有元素