|
|
@@ -375,6 +375,198 @@ switch (x) {
|
|
|
|
|
|
> **穿透技巧**:当多个 case 需要执行相同的代码时,可以利用穿透特性,只在最后一个 case 写 `break`,减少重复代码。
|
|
|
|
|
|
+### 7. while 循环实战练习
|
|
|
+
|
|
|
+#### 练习 1:统计整数位数
|
|
|
+
|
|
|
+给定一个整数 `12345`,使用 `while` 循环统计它有多少位。
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @title Demo04
|
|
|
+ * @description 课堂练习:统计整数位数
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo04 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int n = 12345;
|
|
|
+ int t = 0; // 统计位数
|
|
|
+ while (n != 0) {
|
|
|
+ n /= 10; // 每次除以10,缩小10倍
|
|
|
+ t++; // 每缩小一次,位数累计1
|
|
|
+ }
|
|
|
+ System.out.println(t); // 输出:5
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> **核心思路**:一个整数不断除以 10,每除一次就去掉一位,直到变成 0。除的次数就是位数。
|
|
|
+>
|
|
|
+> **for vs while 选择原则**:知道循环次数用 `for`,不知道循环次数用 `while`。此处我们不知道 `12345` 是多少位(不确定除以多少次才到 0),所以适合用 `while`。
|
|
|
+
|
|
|
+#### 练习 2:求各位数字之和
|
|
|
+
|
|
|
+给定一个整数 `12345`,使用 `while` 循环求其各位数字之和(1 + 2 + 3 + 4 + 5 = 15)。
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @title Demo05
|
|
|
+ * @description 课堂练习:求各位数字之和
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo05 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int n = 12345;
|
|
|
+ int sum = 0; // 累加和
|
|
|
+ while (n != 0) {
|
|
|
+ sum += n % 10; // 获取个位数字,累加到 sum
|
|
|
+ n /= 10; // 去掉个位,缩小10倍
|
|
|
+ }
|
|
|
+ System.out.println(sum); // 输出:15
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> **核心思路**:
|
|
|
+> 1. `n % 10` — 每次取个位数字
|
|
|
+> 2. `n / 10` — 去掉个位,继续取下一个数字
|
|
|
+> 3. 循环直到 `n` 变成 0
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 8. 嵌套循环(Nested Loop)
|
|
|
+
|
|
|
+**嵌套循环**就是循环里面再放一个循环。
|
|
|
+
|
|
|
+```java
|
|
|
+for (int i = 0; i < 10; i++) { // 外层循环
|
|
|
+ System.out.println("i=" + i);
|
|
|
+ for (int j = 0; j < 10; j++) { // 内层循环
|
|
|
+ System.out.print("j=" + j);
|
|
|
+ }
|
|
|
+ System.out.println();
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**执行规律**:外层循环执行**一轮**,内层循环完整执行**一次**。
|
|
|
+
|
|
|
+> 内层循环总共执行的次数 = 外层循环次数 × 内层循环次数
|
|
|
+
|
|
|
+#### 练习 3:打印矩形星号图案(4 行 5 列)
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @title Demo06
|
|
|
+ * @description 课堂练习:打印4行5列矩形星号
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo06 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ for (int i = 0; i < 4; i++) { // 外层:控制行数
|
|
|
+ for (int j = 0; j < 5; j++) { // 内层:控制每行星号个数
|
|
|
+ System.out.print("*"); // 不换行
|
|
|
+ }
|
|
|
+ System.out.println(); // 一行结束,换行
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+// 输出:
|
|
|
+// *****
|
|
|
+// *****
|
|
|
+// *****
|
|
|
+// *****
|
|
|
+```
|
|
|
+
|
|
|
+#### 练习 4:打印空心矩形星号图案(5 行 5 列)
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @title Demo07
|
|
|
+ * @description 课堂练习:打印5行5列空心矩形星号
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo07 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ for (int i = 1; i <= 5; i++) { // 外层:控制行数
|
|
|
+ for (int j = 1; j <= 5; j++) { // 内层:控制列数
|
|
|
+ // 第1行、第5行:全部输出 *
|
|
|
+ // 第2~4行:第1列和第5列输出 *,其余输出空格
|
|
|
+ if (i == 1 || i == 5) {
|
|
|
+ System.out.print("*");
|
|
|
+ } else {
|
|
|
+ if (j == 1 || j == 5) {
|
|
|
+ System.out.print("*");
|
|
|
+ } else {
|
|
|
+ System.out.print(" ");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ System.out.println(); // 换行
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+// 输出:
|
|
|
+// *****
|
|
|
+// * *
|
|
|
+// * *
|
|
|
+// * *
|
|
|
+// *****
|
|
|
+```
|
|
|
+
|
|
|
+#### 练习 5:打印菱形星号图案(5 行)
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @title Demo08
|
|
|
+ * @description 课堂练习:打印5行菱形星号图案
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo08 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ for (int i = 1; i <= 5; i++) {
|
|
|
+ for (int j = 1; j <= 5; j++) {
|
|
|
+ if (i == 3) { // 第3行:全星号
|
|
|
+ System.out.print("*");
|
|
|
+ } else {
|
|
|
+ if (i == 1 || i == 5) { // 第1、5行:中间星号
|
|
|
+ if (j == 3) {
|
|
|
+ System.out.print("*");
|
|
|
+ } else {
|
|
|
+ System.out.print(" ");
|
|
|
+ }
|
|
|
+ } else if (i == 2 || i == 4) { // 第2、4行:两侧星号
|
|
|
+ if (j == 1 || j == 5) {
|
|
|
+ System.out.print(" ");
|
|
|
+ } else {
|
|
|
+ System.out.print("*");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ System.out.println();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+// 输出:
|
|
|
+// *
|
|
|
+// ***
|
|
|
+// *****
|
|
|
+// ***
|
|
|
+// *
|
|
|
+```
|
|
|
+
|
|
|
+> **嵌套循环 + 条件判断**是解决二维图形打印问题的核心思路:
|
|
|
+> - 外层循环控制**行数**
|
|
|
+> - 内层循环控制**列数**
|
|
|
+> - `if` 判断决定某个位置输出 `*` 还是空格
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
## 三、课后作业讲解(7月14日作业)
|
|
|
|
|
|
### 题目 1:判断闰年
|
|
|
@@ -870,6 +1062,142 @@ public class Demo03 {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
+### Demo04.java — while 循环实战:统计整数位数
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title Demo04
|
|
|
+ * @description 课堂练习:统计整数位数
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo04 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int n = 12345;
|
|
|
+ int t = 0; // 统计位数
|
|
|
+ while (n != 0) {
|
|
|
+ n /= 10; // 每次除以10,缩小10倍
|
|
|
+ t++; // 每缩小一次,位数累计1
|
|
|
+ }
|
|
|
+ System.out.println(t); // 输出:5
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### Demo05.java — while 循环实战:求各位数字之和
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title Demo05
|
|
|
+ * @description 课堂练习:求各位数字之和
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo05 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int n = 12345;
|
|
|
+ int sum = 0; // 累加和
|
|
|
+ while (n != 0) {
|
|
|
+ sum += n % 10; // 获取个位数字,累加到 sum
|
|
|
+ n /= 10; // 去掉个位,缩小10倍
|
|
|
+ }
|
|
|
+ System.out.println(sum); // 输出:15
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### Demo06.java — 嵌套循环:打印矩形星号图案
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title Demo06
|
|
|
+ * @description 课堂练习:打印4行5列矩形星号
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo06 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ for (int i = 0; i < 4; i++) { // 外层:控制行数
|
|
|
+ for (int j = 0; j < 5; j++) { // 内层:控制每行星号个数
|
|
|
+ System.out.print("*");
|
|
|
+ }
|
|
|
+ System.out.println(); // 换行
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### Demo07.java — 嵌套循环:打印空心矩形星号图案
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title Demo07
|
|
|
+ * @description 课堂练习:打印5行5列空心矩形星号
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo07 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ for (int i = 1; i <= 5; i++) { // 外层:控制行数
|
|
|
+ for (int j = 1; j <= 5; j++) { // 内层:控制列数
|
|
|
+ if (i == 1 || i == 5) {
|
|
|
+ System.out.print("*");
|
|
|
+ } else {
|
|
|
+ if (j == 1 || j == 5) {
|
|
|
+ System.out.print("*");
|
|
|
+ } else {
|
|
|
+ System.out.print(" ");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ System.out.println();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### Demo08.java — 嵌套循环:打印菱形星号图案
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title Demo08
|
|
|
+ * @description 课堂练习:打印5行菱形星号图案
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo08 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ for (int i = 1; i <= 5; i++) {
|
|
|
+ for (int j = 1; j <= 5; j++) {
|
|
|
+ if (i == 3) {
|
|
|
+ System.out.print("*");
|
|
|
+ } else {
|
|
|
+ if (i == 1 || i == 5) {
|
|
|
+ if (j == 3) {
|
|
|
+ System.out.print("*");
|
|
|
+ } else {
|
|
|
+ System.out.print(" ");
|
|
|
+ }
|
|
|
+ } else if (i == 2 || i == 4) {
|
|
|
+ if (j == 1 || j == 5) {
|
|
|
+ System.out.print(" ");
|
|
|
+ } else {
|
|
|
+ System.out.print("*");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ System.out.println();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
---
|
|
|
|
|
|
## 六、随堂练习要点
|
|
|
@@ -902,6 +1230,15 @@ public class Demo03 {
|
|
|
26. **`return`**:直接结束整个方法,方法内循环后的所有代码都不再执行
|
|
|
27. **浮点精度陷阱**:`0.1 + 0.2` 不等于 `0.3`,浮点数不能直接用 `==` 比较
|
|
|
28. **switch 穿透利用**:多个 case 执行相同代码时,可以利用穿透特性只在最后一个 case 写 `break`
|
|
|
+29. **while 实战-统计位数**:不断除以10直到0,除的次数就是位数
|
|
|
+30. **while 实战-数字求和**:`n % 10` 取个位,`n / 10` 去掉个位,循环累加
|
|
|
+31. **for vs while 选择**:知道次数用 `for`,不知道次数用 `while`
|
|
|
+32. **嵌套循环**:循环里面再放一个循环,外层循环执行一轮,内层循环完整执行一次
|
|
|
+33. **嵌套循环执行次数**:内层总次数 = 外层次数 × 内层次数
|
|
|
+34. **图形打印核心思路**:外层循环控制行数,内层循环控制列数,if 判断决定每个位置输出什么
|
|
|
+35. **打印矩形**:所有位置都输出 `*`
|
|
|
+36. **打印空心矩形**:首行/末行全 `*`,中间行首列/末列 `*`,其余空格
|
|
|
+37. **打印菱形**:根据行号决定每行星号的排列位置
|
|
|
|
|
|
---
|
|
|
|
|
|
@@ -926,3 +1263,6 @@ public class Demo03 {
|
|
|
| **`return`** | 结束当前方法,方法内所有剩余代码都不执行 |
|
|
|
| **浮点精度** | IEEE 754 标准导致 `0.1 + 0.2 ≠ 0.3`,避免用 `==` 直接比较浮点数 |
|
|
|
| **switch 穿透** | 不写 `break` 时 case 会穿透到下个 case,可利用此特性合并相同逻辑 |
|
|
|
+| **嵌套循环** | 循环中嵌套循环,外层每轮内层完整执行一次,总次数 = 外层 × 内层 |
|
|
|
+| **数字拆位** | `n % 10` 取个位,`n / 10` 去掉个位,`while` 循环可逐位取出所有数字 |
|
|
|
+| **图形打印** | 外层行、内层列、if 判断输出 `*` 或空格,是嵌套循环的经典二维应用 |
|