Explorar o código

feat: 新增Demo04~Demo08嵌套循环与while实战,更新课堂笔记

- 新增 Demo04.java(while循环统计整数位数)
- 新增 Demo05.java(while循环求各位数字之和)
- 新增 Demo06.java(嵌套循环打印矩形星号图案)
- 新增 Demo07.java(嵌套循环打印空心矩形星号图案)
- 新增 Demo08.java(嵌套循环打印菱形星号图案)
- 更新笔记:新增while循环实战练习章节
- 更新笔记:新增嵌套循环章节(含矩形/空心矩形/菱形)
- 更新笔记:完整代码汇总追加Demo04~Demo08
- 更新笔记:随堂练习要点和拓展阅读更新
WanJL hai 2 días
pai
achega
7f979d24e3

+ 25 - 0
授课代码/c260715/src/Demo04.java

@@ -0,0 +1,25 @@
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Demo04
+ * @description 课堂练习: 给定整数 12345,使用 while 循环统计它有多少位并输出。
+ * @create 2026/7/15
+ */
+public class Demo04 {
+    /*
+        for 一般来讲,是知道要循环多少次,所以使用for循环
+        for(int i=0;i<100;i++)
+        while 一般来讲,是不知道要循环多少次,所以使用while循环
+        比如 给定一个数,一直除以2,直到等于0为止,不知道要除多少次。
+        while(a!=0)
+     */
+    public static void main(String[] args) {
+        int n=12345;
+        int t=0; //统计除的个数,也就是位数,每次除以10,统计1位
+        while (n!=0){
+            n/=10;  //每次都除以10,缩小10倍
+            t++;   //每次缩小10,累计1
+        }
+        System.out.println(t);
+    }
+}

+ 22 - 0
授课代码/c260715/src/Demo05.java

@@ -0,0 +1,22 @@
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Demo05
+ * @description 课堂练习: 给定整数 12345,使用 while 循环求其各位数字之和并输出(1+2+3+4+5)
+ * @create 2026/7/15
+ */
+public class Demo05 {
+    public static void main(String[] args) {
+        int n=12345;
+        //先尝试获取 个位的数字
+        //System.out.println(n%10);   //就是 n%10
+        int sum=0;  //用来记录累加和
+        while (n!=0){
+            //1、获取个位的值,然后累计到sum
+            sum+=n%10;  //n%10 得到个位的值,然后累加到sum
+            //2、缩小10倍
+            n/=10;  //每次都除以10,缩小10倍
+        }
+        System.out.println(sum);
+    }
+}

+ 30 - 0
授课代码/c260715/src/Demo06.java

@@ -0,0 +1,30 @@
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Demo06
+ * @description  课堂练习: 使用嵌套 for 循环打印一个 4 行 5 列的矩形星号图案。
+ * @create 2026/7/15
+ */
+public class Demo06 {
+    /*
+        嵌套循环就是 循环里面再放一个循环:
+        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();
+        }
+        外层循环执行一轮,内层循环完成执行一次。
+        最终内层循环一共执行 外层的次数*内层次数 i*j
+     */
+    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();
+        }
+    }
+}

+ 27 - 0
授课代码/c260715/src/Demo07.java

@@ -0,0 +1,27 @@
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Demo07
+ * @description   课堂练习: 使用嵌套 for 循环和 if 语句打印一个 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行
+                if (i==1||i==5){
+                    System.out.print("*");
+                }else { //第2、3、4行
+                    if (j==1||j==5){    // j 第1列,或第5列 输出星号*
+                        System.out.print("*");
+                    }else { //第2、3、4列,输出空格
+                        System.out.print(" ");
+                    }
+                }
+            }
+            //内层循环和外层循环之间输出一个换行符
+            System.out.println();
+        }
+    }
+}

+ 33 - 0
授课代码/c260715/src/Demo08.java

@@ -0,0 +1,33 @@
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Demo08
+ * @description 课堂练习:使用嵌套 for 循环打印一个 5 行的菱形星号图案(上下对称,第 3 行最多)
+ * @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{  //有空格的  1、2、4、5行
+                    if (i==1||i==5){  //第1行 第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();
+        }
+    }
+}

+ 340 - 0
课堂笔记/01-JavaSE基础-笔记/20260715-笔记.md

@@ -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 判断输出 `*` 或空格,是嵌套循环的经典二维应用 |