结对编程 2352111 2352133

结对编程分组(2352111、2352133)
https://www.cnblogs.com/zmy2352111
结对编程设计要求设计一个随机生成四则运算,并检查输入结果是否正确的程序。以下为我们的设计思路
设计思路:
首先分析题目要求,我们总结出了以下
一. 核心功能:
1.生成算术表达式:随机生成3个数字和两个运算符,组合成表达式。
2.计算正确结果:根据运算符优先级计算表达式的正确答案。
3.判断输入结果是否正确:接受用户输入的答案,判断是否正确,错误时显示正确答案。
二. 主要模块和流程

1.表达式生成

  • 随机数字生成:使用Random生成1-100的整数(num1,num2,num3)。
    while (questions.size() < questionNum){ int num1 = random.nextInt(100) + 1; int num2 = random.nextInt(100) + 1; int num3 = random.nextInt(100) + 1;
  • 随机运算符选择:通过GetRandomOpearator方法随机选择四则运算符号。
    private static String getRandomOperator(Random random) { int operatorNum = random.nextInt(4); switch (operatorNum){ case 0: return "+"; case 1: return "-"; case 2: return "*"; case 3: return "/"; default: return ""; } } }
  • 表达式拼接:将数字和运算符组合成字符串形式。
    String expression = num1 + " " + operator1 + " " + num2 + " " + operator2 + " " + num3;

2.结果计算

  • 运算符优先级处理:通过getOperatorPriority方法判断运算符优先级(乘除优先于加减)
    private static int getOperatorPriority(String op) { switch (op){ case "+": case "-": return 1; case "*": case "/": return 2; default: return 0; } }
  • 中间结果检查:若中间结果为负数或超出范围(0-1000),则丢弃该表达式。
    if(getOperatorPriority(op1) >= getOperatorPriority(op2)){ //先计算第一个运算符 double tempresult = calculate(num1,num2,op1); if(tempresult <0 || tempresult > 1000){ return -1; } result = calculate(tempresult,num3,op2); }else{ //先计算第二个运算符 double tempresult = calculate(num2,num3,op2); if(tempresult <0 || tempresult > 1000){ return -1; } result = calculate(num1,tempresult,op1); }
  • 最终结果保留两位小数:使用Math.round对结果进行四舍五入。

三.问题解决
在第一次完成代码的测试时,我们意识到了我们并没有考虑到四则运算法则的运算顺序,而是单一的按照了从左往右的顺序进行计算,这也导致了计算出来的答案不正确,我们重新调整的代码,添加了先检测运算符的优先级,再进行计算程序。
实现了基本的运算程序后,我们考虑使用输出一个表达式用户回答一个的形式进行输出,在此过程中,为了防止用户等待的时间过长,我们选择建立数组,在程序运行开始时将所有运算结果存入数组,但我们忘记考虑了,当最终结果不在0-1000时这个表达式会被删除,所以导致最后表达式的结果和存入数组的结果不同,这个我们的解决方式在判断了运算结果是否在0-1000之后才存入数组,这样可以保证表达式和运算结果能够保持一致。

四.程序代码

点击查看代码
package aec;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class acc {
    public static void main(String[] args) {
        int questionNum = 300;
        List<String> questions = new ArrayList<>();
        //创建答案集合
        List<Double> Result = new ArrayList<>();
        Random random = new Random();

	        while (questions.size() < questionNum){
	            int num1 = random.nextInt(100) + 1;
	            int num2 = random.nextInt(100) + 1;
	            int num3 = random.nextInt(100) + 1;

            String operator1 = getRandomOperator(random);
            String operator2 = getRandomOperator(random);

            String expression = num1 + " " + operator1 + " " + num2 + " " + operator2 + " " + num3;

            double result = calculateExpression(num1,num2,num3,operator1,operator2);
            if (result >=0 && result <= 1000){
                //将Result保留两位小数,四舍五入
                result = Math.round(result * 100.0) / 100.0;
                //存入Result集合
                Result.add(result);
                questions.add(expression + " = ?");
            }
        }
        //每次输出一道题,然后用户从键盘输入答案,系统判断答案是否正确,如果错误则输出正确答案
        for (String question : questions){
            System.out.println(question);
            Scanner scanner = new Scanner(System.in);
            String answer = scanner.nextLine();
            //判断答案是否与Result集合中相等
            if(Double.parseDouble(answer) == Result.get(questions.indexOf(question))){
                System.out.println("正确");
            }else{
                System.out.println("错误,正确答案为:" + Result.get(questions.indexOf(question)));
            }
            }

        }


    private static double calculateExpression(int num1, int num2, int num3, String op1, String op2) {
        double result = 0;
        //检查op1和op2的优先级
        if(getOperatorPriority(op1) >= getOperatorPriority(op2)){
            //先计算第一个运算符
            double tempresult = calculate(num1,num2,op1);
            if(tempresult <0 || tempresult > 1000){
                return -1;
            }
            result = calculate(tempresult,num3,op2);
        }else{
            //先计算第二个运算符
            double tempresult = calculate(num2,num3,op2);
            if(tempresult <0 || tempresult > 1000){
                return -1;
            }
            result = calculate(num1,tempresult,op1);
        }

        return result;
    }

    private static int getOperatorPriority(String op) {
        switch (op){
            case "+":
            case "-":
                return 1;
            case "*":
            case "/":
                return 2;
            default:
                return 0;
        }
    }


    private static double calculate(double a, double b, String operator) {
        switch (operator){
            case "+":
                return a + b;
            case "-":
                return a - b;
            case "*":
                return a * b;
            case "/":
                if(b==0){
                    return -1;
                }
                return a / b;
            default:
                return -1;
        }
    }

    private static String getRandomOperator(Random random) {
        int operatorNum = random.nextInt(4);
        switch (operatorNum){
            case 0:
                return "+";
            case 1:
                return "-";
            case 2:
                return "*";
            case 3:
                return "/";
            default:
                return "";
        }
    }
}


五.运算结果

六.结对编程体会

结对编程就是两个人一起写代码,感觉就像两个人一起搭积木,互相出主意,互相帮忙。刚开始可能会有点不习惯,两个人的想法不一样,有时候还会争来争去。但写着写着,就发现这样其实挺好的,一个人想不通的问题,另一个人可能会有办法。而且两个人一起写代码,代码更规范,错误也少很多。遇到特别难的问题时,两个人一起讨论,思路就打开了,问题也迎刃而解。虽然有时候会有点小摩擦,比如想法不一致,最后还是会找到一个大家都认可的办法。总的来说,结对编程让我觉得写代码不再是一个人的战斗,而是一个团队的合作。
结对编程是一起面对各种挑战。两个人的想法不可能完全一样,有时还会因为该怎么做而争得面红耳赤。但随着合作的深入,会发现这种模式其实很有趣。一个人卡住的难题,另一个人可能会有灵感,两个人一起讨论,思路就打开了,问题也迎刃而解。而且两个人一起写代码,感觉压力也没那么大了,就像有人在旁边帮你分担一样。

posted on 2025-04-16 11:15  imyiwen  阅读(28)  评论(0)    收藏  举报

导航