程式要求如下:
小學老師要每週給同學出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.挑戰與成就感: 結對程式設計也帶來了挑戰,但當我們共同克服困難併成功完成任務時,也會有一種成就感和團隊凝聚力的增強。