結對程式設計——小學四則運算練習題小程式

天才二等兵發表於2024-04-21

程式要求如下:
小學老師要每週給同學出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;
        }
    }
}


執行結果:


每次使用者使用時,會顯示實時日期以便記錄,隨機生成一定數量的練習題,每次回答會有提示,正確或錯誤,回答錯誤時會返回正確答案。

以下是對結對程式設計的見解:
本次結對程式設計的專案,是設計一個有關小學四則運算練習題的程式,我與XXXXXXX(學號)同學共同完成。
透過本次的程式編寫,有了對結對程式設計的以下理解:

一、好處:
1.減少錯誤率: 由於兩個人共同審查和編寫程式碼,可以減少bug的產生。一個人可能會忽略一些潛在的問題,而結對程式設計可以讓另一個人及時發現並解決。
2.知識共享: 結對程式設計有助於團隊成員之間的知識共享。每個人都能從對方的經驗中學習,並且在解決問題時可以共同思考和交流想法。
3.提高程式碼質量: 結對程式設計可以促進良好的編碼實踐,可以編寫可維護性更強、邏輯更清晰的程式碼。
4.增強團隊合作能力: 結對程式設計需要團隊成員之間密切合作,這有助於提高團隊的協作和溝通能力。
5.即時反饋: 由於兩個人一起工作,可以立即給出反饋,這有助於快速解決問題和調整方向,如在XXXXXXX(學號)程式設計程式碼的過程中,忽略了生成的隨機數要小於100這個條件,我及時發現並反饋。

二、缺點:
1.不適用於所有任務: 結對程式設計可能不適用於所有型別的任務,例如一些獨立性較強的任務可能更適合個人完成。
2.潛在的意見分歧: 在結對程式設計過程中,可能會出現意見分歧或者溝通不暢的情況,這可能會影響開發效率,如我和XXXXXXX(學號)對執行結果實現的意見不同,題目要求一週為界限,一週300道練習題,我的解決辦法是讓使用者每次使用時輸入自己想要的題數來練習,而XXXXXXX(學號)的解決辦法是每次使用者使用時隨機生成小於等於300道數目的練習題。
3.可能導致疲勞: 長時間的結對程式設計可能會導致開發者疲勞,因為持續的集中和合作需要較高的精力。

三、體會:
1.共同成長: 結對程式設計是一種共同成長的過程,透過和他人合作,我學會了傾聽、解釋和接受不同的觀點,這對我的成長很有幫助。
2.提高效率: 在結對程式設計中,我發現兩個人共同工作可以更快地解決問題,因為我們可以同時考慮多種解決方案並及時互相提出反饋。
3.更高的程式碼質量: 結對程式設計有助於確保程式碼質量,因為我們在編碼過程中不僅僅是編寫程式碼,還在不斷審查和改進程式碼,這有助於減少bug的產生。
4.挑戰與成就感: 結對程式設計也帶來了挑戰,但當我們共同克服困難併成功完成任務時,也會有一種成就感和團隊凝聚力的增強。

相關文章