结对编程——小学四则运算练习题小程序

程序要求如下:
小学老师要每周给同学出300道四则运算练习题。两个运算符,100 以内的数字,不需要写答案。
需要检查答案是否正确,并且保证答案在 0..1000 之间。

本程序有Java语言实现:

点击查看代码
import java.util.*;

public class Practice {
    private Random random = new Random();
    private static final int WEEKLY_QUESTIONS = 301;
    private static final int DAILY_QUESTIONS = WEEKLY_QUESTIONS / 7;

    public static void main(String[] args) {
        Practice quiz = new Practice();
        quiz.startQuiz();
    }

    public void startQuiz() {
        Calendar calendar = Calendar.getInstance();
        System.out.println("今天的日期是:" + calendar.get(Calendar.YEAR) + "年" + (calendar.get(Calendar.MONTH) + 1) + "月" + calendar.get(Calendar.DATE) + "日");

        System.out.println("今天需要练习的题数为:" + DAILY_QUESTIONS);

        int questionsToday = 0;
        while (questionsToday < DAILY_QUESTIONS) {
            String question = generateQuestion();
            double correctAnswer = evaluate(question);
            System.out.printf("题目:" + question.replace("/", "÷").replace("*", "×")+" = ");
            Scanner scanner = new Scanner(System.in);
            String userAnswer01 = scanner.nextLine();
            double userAnswer = parseDoubleSafely(userAnswer01 , 0.0);
            if (Math.abs(userAnswer - correctAnswer) < 0.001) {
                System.out.println("回答正确!");
            } else {
                System.out.println("回答错误,正确答案是:" + (int)correctAnswer);
            }
            questionsToday++;

        }
        System.out.println(calendar.get(Calendar.YEAR) + "年" + (calendar.get(Calendar.MONTH) + 1) + "月" + calendar.get(Calendar.DATE) + "日已经完成" + DAILY_QUESTIONS+ "道题目");
    }

    private String generateQuestion() {
        int a = random.nextInt(100) + 1;
        int b = random.nextInt(100) + 1;
        int c = random.nextInt(100) + 1;
        String[] operators = {"+", "-", "*", "/"};

        String op1 = operators[random.nextInt(4)];
        String op2 = operators[random.nextInt(4)];

        // 确保除法可以整除
        if (op1.equals("/")) {
            b = adjustForDivision(b);
        }
        if (op2.equals("/")) {
            c = adjustForDivision(c);
        }

        String question = String.format("%d %s %d %s %d", a, op1, b, op2, c);
        // 验证结果是否在 0-1000 之间
        if (evaluate(question) < 0 || evaluate(question) > 1000) {
            return generateQuestion(); // 重新生成
        }
        if(evaluate(question)%1!=0)
        {
            return generateQuestion(); // 重新生成
        }
        return question;
    }

    private int adjustForDivision(int number) {
        return number == 0 ? 1 : number;
    }

    private double evaluate(String question) {
        String[] tokens = question.split(" ");
        int a = Integer.parseInt(tokens[0]);
        String op1 = tokens[1];
        int b = Integer.parseInt(tokens[2]);
        String op2 = tokens[3];
        int c = Integer.parseInt(tokens[4]);

        // 根据运算符优先级进行计算
        double result = 0;
        if (op1.equals("*") || op1.equals("/")) {
            result = applyOperation(a, b, op1);
            result = applyOperation(result, c, op2);
        } else if (op2.equals("*") || op2.equals("/")) {
            double temp = applyOperation(b, c, op2);
            result = applyOperation(a, temp, op1);
        } else {
            result = applyOperation(applyOperation(a, b, op1), c, op2);
        }
        return result;
    }

    private double applyOperation(double x, double y, String operator) {
        switch (operator) {
            case "+": return x + y;
            case "-": return x - y;
            case "*": return x * y;
            case "/": return x / y; // 已保证 y 不为 0
        }
        return 0;
    }
    private static double parseDoubleSafely(String str) {
        return parseDoubleSafely(str, Double.NaN); // 如果发生错误,返回NaN
    }

    private static double parseDoubleSafely(String str, double defaultValue) {
        try {
            return Double.parseDouble(str);
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }
}


运行结果:


每次用户使用时,会显示实时日期以便记录,随机生成一定数量的练习题,每次回答会有提示,正确或错误,回答错误时会返回正确答案。

以下是对结对编程的见解:
本次结对编程的项目,是设计一个有关小学四则运算练习题的程序,我与2252229(学号)同学共同完成。
通过本次的程序编写,有了对结对编程的以下理解:

一、好处:
1.减少错误率: 由于两个人共同审查和编写代码,可以减少bug的产生。一个人可能会忽略一些潜在的问题,而结对编程可以让另一个人及时发现并解决。
2.知识共享: 结对编程有助于团队成员之间的知识共享。每个人都能从对方的经验中学习,并且在解决问题时可以共同思考和交流想法。
3.提高代码质量: 结对编程可以促进良好的编码实践,可以编写可维护性更强、逻辑更清晰的代码。
4.增强团队合作能力: 结对编程需要团队成员之间密切合作,这有助于提高团队的协作和沟通能力。
5.即时反馈: 由于两个人一起工作,可以立即给出反馈,这有助于快速解决问题和调整方向,如在2252229(学号)编程代码的过程中,忽略了生成的随机数要小于100这个条件,我及时发现并反馈。

二、缺点:
1.不适用于所有任务: 结对编程可能不适用于所有类型的任务,例如一些独立性较强的任务可能更适合个人完成。
2.潜在的意见分歧: 在结对编程过程中,可能会出现意见分歧或者沟通不畅的情况,这可能会影响开发效率,如我和2252229(学号)对运行结果实现的意见不同,题目要求一周为界限,一周300道练习题,我的解决办法是让用户每次使用时输入自己想要的题数来练习,而2252229(学号)的解决办法是每次用户使用时随机生成小于等于300道数目的练习题。
3.可能导致疲劳: 长时间的结对编程可能会导致开发者疲劳,因为持续的集中和合作需要较高的精力。

三、体会:
1.共同成长: 结对编程是一种共同成长的过程,通过和他人合作,我学会了倾听、解释和接受不同的观点,这对我的成长很有帮助。
2.提高效率: 在结对编程中,我发现两个人共同工作可以更快地解决问题,因为我们可以同时考虑多种解决方案并及时互相提出反馈。
3.更高的代码质量: 结对编程有助于确保代码质量,因为我们在编码过程中不仅仅是编写代码,还在不断审查和改进代码,这有助于减少bug的产生。
4.挑战与成就感: 结对编程也带来了挑战,但当我们共同克服困难并成功完成任务时,也会有一种成就感和团队凝聚力的增强。

posted @   天才二等兵  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示