Просмотр исходного кода

feat: 添加2026年7月17日课后作业(方法4种声明+数组参数+Random)

WanJL 1 день назад
Родитель
Сommit
d1bd468dc6
1 измененных файлов с 512 добавлено и 0 удалено
  1. 512 0
      课后作业/2026年7月17日-作业.md

+ 512 - 0
课后作业/2026年7月17日-作业.md

@@ -0,0 +1,512 @@
+# 2026-07-17 JavaSE 课后作业
+
+> **课程内容**:Java 方法 4 种声明方式(无参无返回值 / 有参无返回值 / 有参有返回值 / 无参有返回值)、方法中调用方法、数组作为方法参数、Random 随机数类  
+> **提交方式**:在 `提交\姓名\` 目录下创建对应的 Java 源文件  
+> **截止时间**:下次上课前
+
+---
+
+## 一、基础题(必做 · 方法声明与调用)
+
+### 题目 1:无参无返回值 — 打印个人信息卡片
+
+**难度**:⭐  
+**知识点**:第 1 种方法(无参无返回值)
+
+定义一个方法 `printInfoCard`,调用后在控制台打印如下格式的信息卡片(内容可自定义):
+
+```
+╔══════════════════════╗
+║      个人信息卡       ║
+╠══════════════════════╣
+║  姓名:张三           ║
+║  班级:J260713        ║
+║   motto:好好学习!    ║
+╚══════════════════════╝
+```
+
+**要求**:
+- 方法类型:**无参数、无返回值**
+- 在 `main` 方法中直接调用
+
+**示例代码框架**:
+```java
+/**
+ * @author 你的姓名
+ * @title 题目1:打印个人信息卡片
+ * @create 2026/7/17
+ */
+public class Demo_01_姓名 {
+    public static void printInfoCard() {
+        // 打印个人信息卡片
+    }
+
+    public static void main(String[] args) {
+        printInfoCard();
+    }
+}
+```
+
+> 💡 **提示**:`System.out.println()` 逐行打印,可以用特殊符号(╔ ╗ ║ ╚ ╝ ═ ╣)装饰边框。
+
+---
+
+### 题目 2:有参无返回值 — 打印 n 行倒直角三角形
+
+**难度**:⭐⭐  
+**知识点**:第 2 种方法(有参无返回值)、嵌套循环
+
+定义一个方法 `printInvertedTriangle`,接收一个整数参数 `n`,打印 n 行的**倒直角三角形**(由 `*` 组成)。
+
+**示例**:
+```
+调用:printInvertedTriangle(5)
+输出:
+*****
+****
+***
+**
+*
+```
+
+**要求**:
+- 方法类型:**有参数(int n)、无返回值**
+- 在 `main` 方法中分别调用 `printInvertedTriangle(5)` 和 `printInvertedTriangle(3)` 测试
+
+**示例代码框架**:
+```java
+/**
+ * @author 你的姓名
+ * @title 题目2:打印倒直角三角形
+ * @create 2026/7/17
+ */
+public class Demo_02_姓名 {
+    public static void printInvertedTriangle(int n) {
+        // 嵌套循环打印倒直角三角形
+    }
+
+    public static void main(String[] args) {
+        printInvertedTriangle(5);
+        System.out.println();  // 两图之间空一行
+        printInvertedTriangle(3);
+    }
+}
+```
+
+> 💡 **提示**:第 i 行打印 `n - i` 个 `*`,外层循环从 `n` 递减到 `1`。
+
+---
+
+### 题目 3:有参有返回值 — 计算平均数
+
+**难度**:⭐⭐  
+**知识点**:第 3 种方法(有参有返回值)、数组遍历
+
+定义一个方法 `average`,接收一个 `int[]` 数组参数,计算并返回数组中所有元素的平均值(`double` 类型)。
+
+**示例**:
+```
+调用:average({80, 90, 100, 70, 85})
+返回:85.0
+
+调用:average({60, 75, 80})
+返回:71.66666666666667
+```
+
+**要求**:
+- 方法类型:**有参数(int[] 数组)、有返回值(double)**
+- 在 `main` 方法中创建测试数组并调用 `average` 方法输出结果
+
+**示例代码框架**:
+```java
+/**
+ * @author 你的姓名
+ * @title 题目3:计算数组平均值
+ * @create 2026/7/17
+ */
+public class Demo_03_姓名 {
+    public static double average(int[] arr) {
+        // 计算平均值
+    }
+
+    public static void main(String[] args) {
+        int[] scores = {80, 90, 100, 70, 85};
+        double avg = average(scores);
+        System.out.println("平均分:" + avg);
+    }
+}
+```
+
+> 💡 **提示**:先求和再除以数组长度 `arr.length`,注意整数除法会丢失小数。
+
+---
+
+### 题目 4:无参有返回值 — 获取当前时间问候语
+
+**难度**:⭐⭐  
+**知识点**:第 4 种方法(无参有返回值)、条件判断
+
+定义一个方法 `getGreeting`,根据当前系统时间返回对应的问候语字符串:
+- 6:00 ~ 11:59 → `"上午好"`
+- 12:00 ~ 17:59 → `"下午好"`
+- 18:00 ~ 23:59 → `"晚上好"`
+- 0:00 ~ 5:59 → `"夜深了,注意休息"`
+
+**示例**(假设现在下午 3 点):
+```
+调用:getGreeting()
+返回:"下午好"
+```
+
+**要求**:
+- 方法类型:**无参数、有返回值(String)**
+- 使用 `java.time.LocalTime.now().getHour()` 获取当前小时数
+- 在 `main` 方法中调用并拼接输出完整语句
+
+**示例代码框架**:
+```java
+import java.time.LocalTime;
+
+/**
+ * @author 你的姓名
+ * @title 题目4:获取问候语
+ * @create 2026/7/17
+ */
+public class Demo_04_姓名 {
+    public static String getGreeting() {
+        int hour = LocalTime.now().getHour();
+        // 根据 hour 返回对应的问候语
+    }
+
+    public static void main(String[] args) {
+        String greeting = getGreeting();
+        System.out.println("亲爱的同学," + greeting + "!");
+    }
+}
+```
+
+---
+
+### 题目 5:方法中调用方法 — 摄氏温度转华氏温度
+
+**难度**:⭐⭐  
+**知识点**:方法中调用另一个方法
+
+现实生活中不同国家使用不同的温度单位,我国使用**摄氏度(℃)**,美国等国家使用**华氏度(℉)**。
+
+要求按如下层次定义方法:
+
+| 方法 | 类型 | 说明 |
+|------|------|------|
+| `celsiusToFahrenheit(double c)` | 有参有返回值 | 将摄氏度转为华氏度:`℉ = ℃ × 9/5 + 32` |
+| `fahrenheitToCelsius(double f)` | 有参有返回值 | 将华氏度转为摄氏度:`℃ = (℉ - 32) × 5/9` |
+| `printTemperature(double c)` | 有参无返回值 | 调用上面两个方法,输出摄氏度与华氏度的对照 |
+
+**示例**:
+```
+调用:printTemperature(25.0)
+输出:
+摄氏温度:25.00℃
+华氏温度:77.00℉
+```
+
+**示例代码框架**:
+```java
+/**
+ * @author 你的姓名
+ * @title 题目5:温度转换
+ * @create 2026/7/17
+ */
+public class Demo_05_姓名 {
+    public static double celsiusToFahrenheit(double c) {
+        return c * 9.0 / 5.0 + 32.0;
+    }
+
+    public static double fahrenheitToCelsius(double f) {
+        return (f - 32.0) * 5.0 / 9.0;
+    }
+
+    public static void printTemperature(double c) {
+        // 调用 celsiusToFahrenheit() 方法
+        // 格式化输出摄氏度和华氏度(保留2位小数)
+    }
+
+    public static void main(String[] args) {
+        printTemperature(25.0);
+        printTemperature(100.0);
+        printTemperature(0.0);
+    }
+}
+```
+
+> 💡 **提示**:可以使用 `System.out.printf("%.2f", 数值)` 保留两位小数;摄氏度符号用 `℃`、华氏度用 `℉`。
+
+---
+
+## 二、进阶题(必做 · 综合应用)
+
+### 题目 6:数组作为方法参数 — 冒泡排序方法封装
+
+**难度**:⭐⭐⭐  
+**知识点**:数组作为方法参数、冒泡排序、`Arrays.toString()`
+
+将冒泡排序封装为一个独立的方法 `bubbleSort`,接收 `int[]` 数组参数,在方法内部完成排序并打印结果。
+
+**要求**:
+- 定义一个方法 `bubbleSort(int[] arr)` — 按**升序**排序(从小到大)
+- 方法内部使用 `Arrays.toString()` 输出排序前和排序后的数组
+- 在 `main` 方法中测试以下两个数组:
+  - `{64, 34, 25, 12, 22, 11, 90}`
+  - `{5, 1, 4, 2, 8}`
+
+**示例输出**:
+```
+测试数组1:
+排序前:[64, 34, 25, 12, 22, 11, 90]
+排序后:[11, 12, 22, 25, 34, 64, 90]
+
+测试数组2:
+排序前:[5, 1, 4, 2, 8]
+排序后:[1, 2, 4, 5, 8]
+```
+
+**示例代码框架**:
+```java
+import java.util.Arrays;
+
+/**
+ * @author 你的姓名
+ * @title 题目6:冒泡排序方法封装
+ * @create 2026/7/17
+ */
+public class Demo_06_姓名 {
+    public static void bubbleSort(int[] arr) {
+        System.out.println("排序前:" + Arrays.toString(arr));
+        // 冒泡排序代码
+        System.out.println("排序后:" + Arrays.toString(arr));
+    }
+
+    public static void main(String[] args) {
+        int[] arr1 = {64, 34, 25, 12, 22, 11, 90};
+        bubbleSort(arr1);
+        System.out.println();
+        int[] arr2 = {5, 1, 4, 2, 8};
+        bubbleSort(arr2);
+    }
+}
+```
+
+---
+
+### 题目 7:Random + 方法 — 随机密码生成器
+
+**难度**:⭐⭐⭐  
+**知识点**:`Random` 类、第 4 种方法(无参有返回值)、字符串拼接
+
+定义一个方法 `generatePassword`,生成并返回一个 8 位随机密码,密码由**大写字母**和**数字**混合组成。
+
+> **规则**:
+> - 密码长度为 8 位
+> - 每一位随机是大写字母(A~Z)或数字(0~9)
+> - 使用 `Random` 类生成随机数
+
+**提示**:
+- 大写字母 `A~Z` 的 ASCII 码范围是 65~90
+- 数字 `0~9` 的 ASCII 码范围是 48~57
+- 可以先生成一个随机数决定当前位是字母还是数字,再生成具体字符
+- 用 `String` 拼接每一位(`str += ch`)
+
+**示例**(每次运行结果不同):
+```
+调用:generatePassword()
+返回:"A3K9Q7B2"
+
+调用:generatePassword()
+返回:"5X1P8M4J"
+```
+
+**示例代码框架**:
+```java
+import java.util.Random;
+
+/**
+ * @author 你的姓名
+ * @title 题目7:随机密码生成器
+ * @create 2026/7/17
+ */
+public class Demo_07_姓名 {
+    public static String generatePassword() {
+        Random ran = new Random();
+        String password = "";
+        // 循环8次,每次生成一个字符拼接
+        return password;
+    }
+
+    public static void main(String[] args) {
+        String pwd = generatePassword();
+        System.out.println("生成的密码:" + pwd);
+        System.out.println("密码长度:" + pwd.length() + " 位");
+    }
+}
+```
+
+> 💡 **提示**:`ran.nextInt(2)` 可以随机生成 0 或 1,用来决定当前位是字母还是数字;使用 `(char)(ran.nextInt(26) + 65)` 生成随机大写字母。
+
+---
+
+### 题目 8:Random + 方法 — 数组随机打乱(Fisher-Yates 洗牌算法)
+
+**难度**:⭐⭐⭐⭐  
+**知识点**:数组作为方法参数、`Random` 类、数组交换
+
+定义一个方法 `shuffleArray`,接收一个 `int[]` 数组,使用 Fisher-Yates 洗牌算法**随机打乱**数组元素的顺序(在原数组上操作,不创建新数组)。
+
+**要求**:
+- 方法类型:**有参数(int[])、无返回值**(直接修改原数组)
+- 使用 `Random` 类生成随机索引
+- 在 `main` 方法中测试 `{1, 2, 3, 4, 5, 6, 7}` 数组
+
+**算法思路**(Fisher-Yates):
+```
+从数组最后一个元素开始往前遍历(i 从 length-1 到 1):
+    1. 生成一个随机索引 j,范围 [0, i]
+    2. 交换 arr[i] 和 arr[j]
+```
+
+**示例**(每次运行结果不同):
+```
+打乱前:[1, 2, 3, 4, 5, 6, 7]
+打乱后:[4, 7, 2, 1, 6, 3, 5]
+
+再次运行:
+打乱前:[1, 2, 3, 4, 5, 6, 7]
+打乱后:[3, 1, 5, 7, 2, 6, 4]
+```
+
+**示例代码框架**:
+```java
+import java.util.Arrays;
+import java.util.Random;
+
+/**
+ * @author 你的姓名
+ * @title 题目8:数组随机打乱
+ * @create 2026/7/17
+ */
+public class Demo_08_姓名 {
+    public static void shuffleArray(int[] arr) {
+        Random ran = new Random();
+        // 从后往前遍历,实现 Fisher-Yates 洗牌
+    }
+
+    public static void main(String[] args) {
+        int[] arr = {1, 2, 3, 4, 5, 6, 7};
+        System.out.println("打乱前:" + Arrays.toString(arr));
+        shuffleArray(arr);
+        System.out.println("打乱后:" + Arrays.toString(arr));
+    }
+}
+```
+
+> 💡 **提示**:`ran.nextInt(i + 1)` 生成 0 ~ i 的随机索引;遍历时 `i` 从 `arr.length - 1` 递减到 `1`。
+
+---
+
+## 三、挑战题(选做)
+
+### 题目 9:综合大作业 — 随机抽奖系统
+
+**难度**:⭐⭐⭐⭐⭐  
+**知识点**:方法 4 种声明方式综合、数组作为方法参数、Random 类、方法中调用方法
+
+实现一个**随机抽奖系统**,将程序拆分为多个方法:
+
+| 方法 | 类型 | 说明 |
+|------|------|------|
+| `initParticipants()` | 无参有返回值 | 创建并返回一个包含 10 个参与者姓名的 `String[]` 数组(姓名自拟) |
+| `printParticipants(String[] names)` | 有参无返回值 | 遍历打印所有参与者的编号和姓名 |
+| `luckyDraw(String[] names)` | 有参无返回值 | 从参与者数组中随机抽取一个姓名并输出中奖信息 |
+| `shuffleArray(String[] arr)` | 有参无返回值 | 使用 Fisher-Yates 算法随机打乱数组(参考题目 8) |
+
+**要求**:
+- `luckyDraw` 方法内部调用 `shuffleArray` 打乱数组,然后取第 1 个元素作为中奖者
+- `main` 方法中调用以上方法完成完整的抽奖流程
+
+**示例输出**:
+```
+======== 随机抽奖系统 ========
+参与人员:
+1. 张三
+2. 李四
+3. 王五
+4. 赵六
+5. 钱七
+6. 孙八
+7. 周九
+8. 吴十
+9. 郑十一
+10. 陈十二
+==============================
+🎉 恭喜 王五 中奖!🎉
+```
+
+**示例代码框架**:
+```java
+import java.util.Arrays;
+import java.util.Random;
+
+/**
+ * @author 你的姓名
+ * @title 题目9:随机抽奖系统
+ * @create 2026/7/17
+ */
+public class Demo_09_姓名 {
+    public static String[] initParticipants() {
+        // 返回包含10个姓名的数组
+    }
+
+    public static void printParticipants(String[] names) {
+        // 遍历打印编号+姓名
+    }
+
+    public static void shuffleArray(String[] arr) {
+        // Fisher-Yates 洗牌算法
+    }
+
+    public static void luckyDraw(String[] names) {
+        // 1. 调用 shuffleArray 打乱数组
+        // 2. 取第1个元素作为中奖者输出
+    }
+
+    public static void main(String[] args) {
+        System.out.println("======== 随机抽奖系统 ========");
+        String[] participants = initParticipants();
+        System.out.println("参与人员:");
+        printParticipants(participants);
+        System.out.println("==============================");
+        luckyDraw(participants);
+    }
+}
+```
+
+> 💡 **提示**:`String[]` 数组的洗牌算法和 `int[]` 完全一样,只是元素类型不同。
+
+---
+
+## 四、提交要求
+
+1. 在 `提交` 文件夹下创建【以你名字命名】的文件夹,然后将 Java 源文件复制进去
+2. 每个题目一个文件,命名格式:`Demo_题目编号_姓名.java`
+   - 例如:`Demo_01_张三.java`
+3. 文件头部使用文档注释,包含:
+   ```java
+   /**
+    * @author 你的姓名
+    * @title 题目X:题目名称
+    * @create 2026/7/17
+    */
+   ```
+4. 代码整洁,有必要的注释
+5. **基础题(1~5)为必做**
+6. **进阶题(6~8)为必做**
+7. **挑战题(9)为选做**,鼓励学有余力的同学尝试