20172315『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

相关过程截图

中缀转后缀及后缀计算测试截图

题目生成截图

计算正确率截图

关键代码解释

将中缀表达式转换为后缀表达式并对后缀表达式进行计算

import java.util.Stack;
import java.util.regex.Pattern;
public class StringToArithmetic {

    public StringToArithmetic() {

    }

    // 将中缀表达式字符串计算得到结果
    public static double stringToArithmetic(String string) {
        return suffixToArithmetic(infixToSuffix(string));
    }

    // 将中缀表达式转换为后缀表达式
    public static String infixToSuffix(String exp) {

        Stack<Character> s = new Stack<Character>();
        // 要输出的后缀表达式字符串
        String suffix = "";
        int length = exp.length(); // 输入的中缀表达式的长度
        for (int i = 0; i < length; i++) {
            char temp;

            char ch = exp.charAt(i);
            switch (ch) {

                case ‘ ‘:
                    break;

                case ‘(‘:
                    s.push(ch);
                    break;

                case ‘+‘:
                case ‘-‘:
                    while (s.size() != 0) {
                        temp = s.pop();
                        if (temp == ‘(‘) {

                            s.push(‘(‘);
                            break;
                        }
                        suffix += temp;
                    }

                    s.push(ch);
                    break;

                case ‘ב:
                case ‘÷‘:
                    while (s.size() != 0) {
                        temp = s.pop();

                        if (temp == ‘+‘ || temp == ‘-‘ || temp == ‘(‘) {
                            s.push(temp);
                            break;
                        } else {
                            suffix += temp;
                        }
                    }

                    s.push(ch);
                    break;

                case ‘)‘:

                    while (!s.isEmpty()) {
                        temp = s.pop();
                        if (temp == ‘(‘) {
                            break;
                        } else {
                            suffix += temp;
                        }
                    }
                    break;

                default:
                    suffix += ch;
                    break;
            }

        }
        while (s.size() != 0) {
            suffix += s.pop();
        }

        return suffix;
    }

    public static double suffixToArithmetic(String exp) {

        Pattern pattern = Pattern.compile("\\d+||(\\d+\\.\\d+)");

        String[] strings = exp.split("");
        Stack<Double> stack = new Stack<Double>();
        for (int i = 0; i < strings.length; i++) {

            if (strings[i].equals("")) {
                continue;
            }

            if (pattern.matcher(strings[i]).matches()) {
                stack.push(Double.parseDouble(strings[i]));
            }

            else {

                double y = stack.pop();
                double x = stack.pop();

                stack.push(calculate(x, y, strings[i]));
            }
        }

        return stack.pop();
    }

    private static Double calculate(double x, double y, String string) {
        // TODO Auto-generated method stub

        if (string.trim().equals("+")) {
            return x + y;
        }
        if (string.trim().equals("-")) {
            return x - y;
        }
        if (string.trim().equals("×")) {
            return x * y;
        }
        if (string.trim().equals("÷")) {
            return x / y;
        }
        return (double) 0;
    }

创建题目类

    public class createquestions {
    public static String create(int level){
        String add = "+", sub = "-", multi = "×", div = "÷";
        String result="";
        int r1=(int)(Math.random()*9+1);
        int r2=(int)(Math.random()*9+1);
        int r3=(int)(Math.random()*9+1);
        //三个整数
        int fenzi1=(int)(Math.random()*9+1);
        int fenmu1=(int)(Math.random()*9+1);
        String fenshu1=fenzi1+"/"+fenmu1;
        int fenzi2=(int)(Math.random()*9+1);
        int fenmu2=(int)(Math.random()*9+1);
        String fenshu2=fenzi2+"/"+fenmu2;
        int fenzi3=(int)(Math.random()*9+1);
        int fenmu3=(int)(Math.random()*9+1);
        String fenshu3=fenzi3+"/"+fenmu3;
        //三个分数
       int suiji1=(int)(Math.random()*4);
        //第一个运算符
        int suiji11=(int)(Math.random()*3);
        //生成括号
        int suiji2=(int)(Math.random()*4);
        //第二个运算符
        if (level>=1) {
            if(suiji11==0&&level==2&&suiji1!=0&&suiji1!=1)
                result+="(";
            if (level==3)
                result+=fenshu1;
            else
                result+=r1;
            if (suiji1 == 0)
                result+=add;
            if (suiji1 == 1)
                result+=sub;
            if (suiji1==2)
                result+=multi;
            if(suiji1==3)
                result+=div;
            if(suiji11==1&&level==2&&suiji2!=0&&suiji2!=1)
                result+="(";
            if (level==3)
                result+=fenshu2;
            else
                result+=r2;
            if(suiji11==0&&level==2&&suiji1!=0&&suiji1!=1)
                result+=")";
        }
        if (level>=2){
            if (suiji2==0)
                result+=add;
            if (suiji2 == 1)
                result+=sub;
            if (suiji2==2)
                result+=multi;
            if(suiji2==3)
                result+=div;
            if (level==3)
                result+=fenshu3;
            else
                result+=r3;
            if(suiji11==1&&suiji2!=0&&suiji2!=1)
                result+=")";
        }
        return result;
    }

main类

import java.util.Scanner;

public class calculate {
    public static void main(String[] args) {
        System.out.println("输入你要生成的题数");
        Scanner scan = new Scanner(System.in);
        int tishu = scan.nextInt();
        System.out.println("输入你要生成题目的等级(输入1或2或3)");
        int dengji = scan.nextInt();
        //调用一个循环
        double answer;
        int zhengquelv = 0;
        double[] daan = new double[tishu];
        switch (dengji) {
            case 1:
                for (int i = 0; i < tishu; i++) {
                    String a = createquestions.create(1);
                    String b = a + "=";
                    System.out.print(b);
                    answer = scan.nextDouble();
                    daan[i] = StringToArithmetic.stringToArithmetic(a);
                    if (answer == daan[i])
                        zhengquelv++;
                }break;
            case 2:
                for (int i = 0; i < tishu; i++) {
                    String a = createquestions.create(2);
                    String b = a + "=";
                    System.out.print(b);
                    answer = scan.nextInt();
                    daan[i] = StringToArithmetic.stringToArithmetic(a);
                    if (answer == daan[i])
                        zhengquelv++;
                }break;
            case 3:
                for (int i = 0; i < tishu; i++) {
                    String a = createquestions.create(3);
                    String b = a + "=";
                    System.out.print(b);
                    answer = scan.nextInt();
                    daan[i] = StringToArithmetic.stringToArithmetic(a);
                    if (answer == daan[i])
                        zhengquelv++;

                }break;

        }

        if(dengji<1||dengji>3)
            System.out.println("题目等级输入错误");
        if (dengji >= 1&&dengji <= 3) {
            System.out.println("答案为");
            for (
                    double daanwei : daan)
                System.out.print(daanwei + " ");
            System.out.println("正确率为" + zhengquelv + "/" + tishu);
        }
    }
}

遇到的困难及解决方法

关于判断题目的正确率出现了一些小问题

经过组内商讨,得出了解决办法

写出项目中自己负责的部分

对中缀转后缀和后缀的计算类的编写

个人贡献度划分(按百分比给小组各成员划分贡献度,各成员贡献之和为100%)

20172315胡智韬30%

20172312彭霖30%

20172318陆大岳40%

对结对的小伙伴做出评价给出小伙伴博客链接(重点指出需要改进的地方)

彭霖

陆大岳

给出项目的码云链接

给出小组结对编程照片

原文地址:https://www.cnblogs.com/huzhitao/p/9011407.html

时间: 2024-07-31 05:31:01

20172315『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结的相关文章

20172312『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

20172312『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号 :20172315 20172318 姓名 :胡智韬 陆大岳 伙伴第一周博客地址: 对结对伙伴的评价:这俩人一开始各编各的还好,到后面就开始吵,从头吵到尾,陆大胖,胡志汪,还好到最后是把代码敲出来了,不容易不容易. 小组结对编程的照片(QQ群截图) 项目中自己负责的部分 代码的综合整理,错误查找,合并以及博客的撰写. 个人贡献度划分 彭霖:胡智韬:陆大岳=3:3:4 相关过程的截图 生成题目类驱动类的

20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: 需求分析 功能要求 1.自动生成题目 可独立使用(能实现自己编写测试类单独生成题目的功能) 可生成不同等级题目,类似于: 1级题目:2 + 5 =: 10 - 5 = 之类的两个数,一个运算符的题目 2.题目运算(判题) 可独立使用 实现中缀表达式转为后缀表达式并计算 判断用户答题正误,并输出正确结果 3.支持真分数 可独立使用 实现分数算式的

20172320『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

结对伙伴 学号:20172317 20172327 姓名:蒋子行 马瑞蕃 伙伴第一周博客地址: 担任角色:驾驶员:蒋子行 副驾驶员:李闻洲 马瑞蕃 需求分析 自动生成四则运算题目 支持整数,真分数 支持多运算符和括号的使用 能判断正误并统计正确率 题目不能重复 设计思路 UML类图 生成3个不同难度的题目的类 创建一个生成真分数的类 实现中缀表达式转为后缀表达式 计算自动生成的题目用后缀表达式运算 创建测试类 部分代码截图 生成题目的类 难度一 难度二 难度三 生成分数的类 PSP时间统计: P

20172325『Java程序设计』课程 结对编程练习_四则运算第三周阶段总结

20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号:20172306 姓名:刘辰 结对伙伴博客链接 刘辰同学对编程的积极程度很高,并且在编程能力上很不错,有自己的想法并且能够把这个想法具体的实践出来,只是在编程的过程中和同学交流不够,总是在最后不行了才发现问题,很容易造成前功尽弃,希望在编程过程中多沟通,减少不必要的时间精力的浪费. 小组结对编程照片 项目中自己负责的部分 我负责的是两个部分,分别是: 1.利用栈将中缀表达式转后缀表达式: 2.对后缀表

2017-2018-2 20172315 『Java程序设计』课程 结对编程练习_四则运算

结对人员 胡智韬:中缀转后缀及对后缀表达式的计算 彭霖:分式相关的程序及解决细小问题 陆大岳:题目生成及驱动类的编译 需求分析 目标 1.自动生成题目 可独立使用(能实现自己编写测试类单独生成题目的功能) 可生成不同等级题目,类似于: 1级题目:2 + 5 =: 10 - 5 = 之类的两个数,一个运算符的题目 2.题目运算(判题) 可独立使用 实现中缀表达式转为后缀表达式并计算 判断用户答题正误,并输出正确结果 3.支持真分数 可独立使用 实现分数算式的计算 3.题目去重(扩展需求,加分项)

20172312『Java程序设计』课程 结对编程练习_四则运算第三周阶段总结

20172312『Java程序设计』课程 结对编程练习_四则运算第三周阶段总结 结对伙伴 学号 :20172315 20172318 姓名 :胡智韬 陆大岳 伙伴第一周博客地址: 对结对伙伴的评价:这俩人一开始各编各的还好,到后面就开始吵,从头吵到尾,陆大胖,胡志汪,还好到最后是把代码敲出来了,不容易不容易. 小组结对编程的照片(QQ群截图) 项目中自己负责的部分 代码的综合整理,错误查找,合并以及博客的撰写. 个人贡献度划分 彭霖:胡智韬:陆大岳=3:3:4 相关过程的截图 生成题目类驱动类的

2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算

2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算 组内成员 20172327 马瑞蕃 20172320 李闻洲 20172317 蒋子行 需求分析 自动生成题目 可独立使用(能实现自己编写测试类单独生成题目的功能) 可生成不同等级题目 不同等级的题目应该指的是不同难度的题目,意味着题目的复杂程度随着等级的上升而上升 题目运算(判题) 可独立使用 实现中缀表达式转为后缀表达式并计算 自动生成的题目要先转为后缀表达式,并计算这个后缀表达式 判断用户答题正误,并输出正

2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第二周

2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第二周 博客要求 组内同学需各自发表博客 博客中需包含以下内容: 相关过程截图 关键代码解释 遇到的困难及解决方法 写出项目中自己负责的部分 个人贡献度划分(按百分比给小组各成员划分贡献度,各成员贡献之和为100%) 对结对的小伙伴做出评价给出小伙伴博客链接(重点指出需要改进的地方) 给出项目的码云链接 给出小组结对编程照片 博客内容中如需展示团队的共同成果,请进行说明 如有参考或引用的设计.实现,请进行说

2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算第三周总结

相关测试过程截图 测试了由中缀表达式转后缀表达式的Junit测试,分别进行了整数的和分数的,测试成功截图 由于生成问题和计算问题中,问题都是随机产生的,暂时不会进行Junit测试,故没有进行,但应是正确的,我们使用了驱动类去进行测试,结果也产生的符合格式. 小组各个成员信息 20172302侯泽洋 20172308周亚杰 测试过程中遇到的困难及解决方法 测试过程中一开始我进行的测试是始终是失败: 后来才发现一个assertEquals其实是只能对应一个实例化的类的对象,一旦是指向两个就会抛出异常