✍️ 30 道基础练习题
从易到难,覆盖入门全部知识点。每道题:先自己写 → 运行 → 再对答案。代码要亲手敲,不要复制!
第 1 组 · 变量与运算(1~10)
- 声明变量并交换:a=5, b=10,用临时变量交换它们的值,打印交换后结果
- 温度转换:摄氏 25 度 = 华氏多少度?公式 F = C × 9/5 + 32
- 取整运算:打印 17/5、17%5、17.0/5 的结果,并解释差别
- 数字反转:给一个三位数 789,输出 987(用 % 和 / 拆出各位)
- 自增陷阱:int i=3; 打印 i++、++i、i 的值分别是什么?
- 字符运算:char c='A'; 打印 c 和 (char)(c+1),解释结果
- boolean 逻辑:判断 year=2024 是否为闰年,打印 true/false
- 强制转换:double 99.99 转 int 是多少?再转回来会损失什么?
- 字符串拼接:用变量拼出 "小明今年18岁,身高1.75米"
- 数字字符串互转:把 "42" 转成 int,把 3.14 转成字符串
参考答案(第 1 组)
// 1. 交换
int a = 5, b = 10, t = a; a = b; b = t;
// a=10, b=5
// 2. 温度:25×9/5+32 → 注意先算 25×9/5=45 再 +32=77
// 3. 17/5=3(整数除法);17%5=2(余数);17.0/5=3.4
// 4. 789: 个位=789%10=9, 十位=789/10%10=8, 百位=789/100=7 → 987
int n = 789;
int rev = n % 10 * 100 + n / 10 % 10 * 10 + n / 100;
// 5. int i=3; i++ 输出 3(i 变 4);++i 输出 5(i 变 5);i 现在是 5
// 6. 'A' 是 65;c+1=66;转回 char 是 'B'
// 7. 闰年:y%4==0 && y%100!=0 || y%400==0
// 8. (int)99.99 = 99(截断);转回 99.0,0.99 丢了
// 9. 字符串拼接:+ 会把两边都变成字符串
String name = "小明"; int age = 18; double h = 1.75;
System.out.println(name + "今年" + age + "岁,身高" + h + "米");
// 输出:小明今年18岁,身高1.75米
// 想固定两位小数:String.format("%.2f", h) → "1.75"
// 10. 数字 ↔ 字符串互转
int num = Integer.parseInt("42"); // 字符串 → int
double d = Double.parseDouble("3.14"); // 字符串 → double
String s1 = String.valueOf(3.14); // 数字 → 字符串(推荐)
String s2 = "" + 3.14; // 也可以,但不如上面明确
// 注意:parseInt("abc") 会抛 NumberFormatException
第 2 组 · 流程控制(11~18)
- 成绩分级:90+ 优秀,60-89 及格,否则不及格(if-else if)
- 打印 1~50 的奇数(用 for + continue 跳过偶数)
- 求和:1+2+...+100,用循环和公式两种方式
- 倒序输出:for 循环从 10 到 1 打印
- 阶乘:计算 10!(用循环,不用递归)
- 水仙花数:打印所有三位水仙花数(abc = a³+b³+c³,如 153)
- switch 菜单:模拟点餐,输入 1-3 输出对应菜品,其他提示"没有这个菜"
- break 练习:1~100 中第一个能被 7 整除的两位数是多少?用 break 提前结束
参考答案(第 2 组)
// 11. 注意 else if 顺序:从高分到低分
// 12. for (int i=1;i<=50;i++){ if(i%2==0) continue; print(i); }
// 13. 公式:100×101/2 = 5050
// 14. 倒序输出:注意是 i-- 且条件 i>=1
for (int i = 10; i >= 1; i--) System.out.println(i);
// 反向写 for (int i=1;i<=10;i++) 打印 11-i 也可以
// 15. 10! = 3628800,int 装得下(Integer.MAX_VALUE ≈ 21.4 亿);13! 起才需要 long
// 16. 水仙花数:
for (int n = 100; n < 1000; n++) {
int a = n/100, b = n/10%10, c = n%10;
if (a*a*a + b*b*b + c*c*c == n) System.out.println(n);
}
// 输出:153 370 371 407
// 17. switch 菜单:需要 Scanner 读入(见「流程控制」页的 Scanner 一节)
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
switch (choice) {
case 1 -> System.out.println("红烧肉");
case 2 -> System.out.println("清蒸鱼");
case 3 -> System.out.println("炒青菜");
default -> System.out.println("没有这个菜");
}
// 18. 第一个能被 7 整除的两位数:for (int i=10;;i++) { if(i%7==0){print;break;} } → 14
第 3 组 · 数组与字符串(19~24)
- 数组遍历求和:{12, 45, 78, 3, 99} 求和与平均值
- 最大值下标:找出数组中最大元素的位置(下标)
- 数组反转:{1,2,3,4,5} 原地反转(不能新建数组)
- 字符串统计:统计 "Hello World" 中字母 o 出现几次
- 字符串反转:把 "abcdef" 反转(方法不限)
- 回文判断:判断 "上海自来水来自海上" 是否回文(提示:循环比较首尾字符)
参考答案(第 3 组)
// 19. 数组遍历求和与平均值
int[] a = {12, 45, 78, 3, 99};
int sum = 0;
for (int v : a) sum += v; // 增强 for,累加
double avg = (double) sum / a.length; // 必须先转 double!
System.out.println("和=" + sum + ",平均=" + avg); // 和=237,平均=47.4
// 常见坑:sum / a.length 是整数除法,结果会变成 47(丢小数)
// 20. 最大值的下标:
int maxIdx = 0;
for (int i = 1; i < arr.length; i++)
if (arr[i] > arr[maxIdx]) maxIdx = i;
// 21. 反转:双指针 left/right 交换(见数组页)
// 22. 统计:循环 charAt(i) == 'o' 计数
// 23. 反转字符串:StringBuilder sb = new StringBuilder(s); sb.reverse().toString()
// 24. 回文:
boolean pal = true;
for (int i = 0; i < s.length()/2; i++)
if (s.charAt(i) != s.charAt(s.length()-1-i)) { pal = false; break; }
第 4 组 · 综合挑战(25~30)
- 猜数字:程序随机生成 1~100,用户输入猜,大了提示"大了"、小了提示"小了",猜对结束并显示次数(用 Scanner 和 while)
- 素数判断:判断 97 是不是素数(试除 2~√n)
- 斐波那契:打印斐波那契数列前 20 项(1,1,2,3,5,8...)
- 学生类:定义 Student 类(姓名/年龄/成绩,构造器+getter/setter),创建 3 个学生放进 List,找出成绩最高的并打印
- 单词计数:用 Map 统计句子 "the cat and the dog and the bird" 中每个单词出现次数
- 简易计算器:方法版——写 add/sub/mul/div 四个方法,main 里调用并打印结果;div 中除数为 0 时抛异常并用 try-catch 捕获提示
参考答案(第 4 组,关键思路)
// 25. Scanner sc = new Scanner(System.in); 循环读取 sc.nextInt()
// Math.random()*100+1 生成 1~100 随机数
// 26. 素数:for (int i=2; i*i<=n; i++) if(n%i==0) 不是素数
// 27. 斐波那契:a=1,b=1; 每次打印 a,然后 c=a+b; a=b; b=c;
// 28. 最高分:
Student best = students.get(0);
for (Student s : students)
if (s.getScore() > best.getScore()) best = s;
// 29. 单词计数:split(" ") 后循环 count.put(w, count.getOrDefault(w,0)+1)
// 30. 计算器 div:if (b==0) throw new IllegalArgumentException("除数不能为0");
// main 里 try { div(10,0) } catch (IllegalArgumentException e) { print(e.getMessage()) }
🎯 做完 30 题之后
- 全部独立完成(不看答案)→ 恭喜,基础语法过关!进入 java-basics 模块 深入
- 卡在第 25 题以后的 → 回头复习流程控制 + 数组 + 面向对象,再战
- 做完题记得:把每道题的报错都读一遍——"看懂报错"才是这 30 题最大的收获