簡單的數學練習程式,展示 Random、Scanner、流程控制、方法封裝等基礎語法。
import java.util.Random;
import java.util.Scanner;
public class MathTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
double right = 0, wrong = 0;
char[] ops = {'+', '-', '*', '/'};
for (int i = 1; i <= 10; i++) {
int x = random.nextInt(10) + 1;
int y = random.nextInt(10) + 1;
char op = ops[random.nextInt(4)];
System.out.printf("第 %d 題:%d %c %d = ", i, x, op, y);
boolean correct = false;
switch (op) {
case '+': correct = checkAnswer(scanner, x + y); break;
case '-': correct = checkAnswer(scanner, x - y); break;
case '*': correct = checkAnswer(scanner, x * y); break;
case '/': correct = checkDivide(scanner, (float)x / y); break;
}
if (correct) { right++; System.out.println("Bingo!"); }
else { wrong++; System.out.println("Oh no~"); }
System.out.println("正確答案:" + getAnswer(x, y, op));
System.out.println("-------------------------------");
}
System.out.printf("共做對 %.0f 題,做錯 %.0f 題%n", right, wrong);
if (wrong > 0) {
System.out.printf("正確率:%.2f%%%n", right / (right + wrong) * 100);
}
}
static boolean checkAnswer(Scanner sc, int expected) {
return sc.nextInt() == expected;
}
static boolean checkDivide(Scanner sc, float expected) {
return Math.abs(sc.nextFloat() - expected) < 0.0000001f;
}
static String getAnswer(int x, int y, char op) {
switch (op) {
case '+': return String.valueOf(x + y);
case '-': return String.valueOf(x - y);
case '*': return String.valueOf(x * y);
case '/': return String.format("%.7f", (float)x / y);
default: return "";
}
}
}
問題:int / int 為整數除法,截斷小數部分。
解決:強制轉型 (float)x / (float)y,比較時允許微小誤差(Math.abs(a-b) < 1e-7)。
第 1 題:3 + 5 = 8 Bingo! 正確答案:8 ------------------------------- 第 2 題:7 ÷ 2 = 3.5 Bingo! 正確答案:3.5000000 ------------------------------- ... 共做對 8 題,做錯 2 題 正確率:80.00%