|
|
@@ -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)为选做**,鼓励学有余力的同学尝试
|