Эх сурвалжийг харах

feat: 新增2026年7月20日课后作业,共4题(基础2题+进阶2题),覆盖面向对象基础、封装、方法综合、排序工具类

WanJL 1 өдөр өмнө
parent
commit
4eb013cd87

+ 341 - 0
课后作业/2026年7月20日-作业.md

@@ -0,0 +1,341 @@
+# 2026-07-20 JavaSE 课后作业
+
+> **课程内容**:面向对象基础(类与对象、成员变量与成员方法)、封装(private / setter / getter / this)、成员变量 vs 局部变量、对象数组、包(Package)
+>
+> **涉及前序知识**:方法 4 种声明方式、数组作为方法参数、三种排序算法(冒泡/选择/插入)、Random 随机数
+>
+> **提交方式**:在 `提交\姓名\` 目录下创建对应的 Java 源文件
+>
+> **截止时间**:下次上课前
+
+---
+
+## 一、基础题(必做)
+
+### 题目 1:学生类定义与对象创建
+
+**难度**:⭐  
+**知识点**:类与对象、成员变量、成员方法
+
+定义一个 `Student` 类,包含以下成员:
+
+| 成员类型 | 名称 | 说明 |
+|---------|------|------|
+| 成员变量 | `name`(String) | 学生姓名 |
+| 成员变量 | `age`(int) | 学生年龄 |
+| 成员变量 | `className`(String) | 班级名称 |
+| 成员方法 | `showInfo()` | 输出学生所有信息,格式见下方 |
+| 成员方法 | `study(String course)` | 输出"xxx 正在学习 xxx",例如"张三 正在学习 Java" |
+
+**输出格式要求**:
+```
+调用 showInfo() 输出:
+姓名:张三
+年龄:25
+班级:J260713
+
+调用 study("Java") 输出:
+张三 正在学习 Java
+```
+
+**要求**:
+- 在 `main` 方法中创建 **2 个** `Student` 对象
+- 为每个对象的属性赋值
+- 依次调用 `showInfo()` 和 `study()` 方法
+
+**示例代码框架**:
+```java
+/**
+ * @author 你的姓名
+ * @title 题目1:学生类定义与对象创建
+ * @create 2026/7/20
+ */
+public class Demo_01_姓名 {
+    public static void main(String[] args) {
+        // 创建第一个学生对象
+        // 为属性赋值
+        // 调用方法
+    }
+}
+
+// 将 Student 类定义在同一个文件中
+class Student {
+    String name;
+    int age;
+    String className;
+
+    public void showInfo() {
+        // 输出学生信息
+    }
+
+    public void study(String course) {
+        // 输出学习信息
+    }
+}
+```
+
+> 💡 **提示**:同一个 `.java` 文件中可以定义多个类,但只能有一个 `public class`。
+
+---
+
+### 题目 2:员工信息封装(Emp 类)
+
+**难度**:⭐⭐  
+**知识点**:封装(private、setter/getter)、this 关键字、合法性校验
+
+定义一个 `Emp`(员工)类,要求对属性进行**封装**:
+
+**私有属性**:
+
+| 属性 | 类型 | 说明 |
+|------|------|------|
+| `id` | String | 员工编号 |
+| `name` | String | 员工姓名 |
+| `salary` | double | 薪资(元) |
+
+**公有方法要求**:
+1. **setter/getter**:为每个属性提供标准的 setter 和 getter 方法(参数名与成员变量同名时使用 `this` 区分)
+2. **合法性校验**:`setSalary(double salary)` 中,如果薪资小于 0,输出"薪资不能为负数!",否则正常赋值
+3. **业务方法**:`work()` —— 输出"工号 xxx 的员工 xxx 正在工作……"
+
+**测试要求**:
+- 在 `main` 方法中创建 `Emp` 对象
+- 通过 setter 赋值(包含合法的薪资和一次非法的负薪资测试)
+- 调用 `work()` 方法
+- 通过 getter 输出所有属性
+
+**示例代码框架**:
+```java
+/**
+ * @author 你的姓名
+ * @title 题目2:员工信息封装
+ * @create 2026/7/20
+ */
+public class Demo_02_姓名 {
+    public static void main(String[] args) {
+        Emp emp = new Emp();
+        // 通过 setter 赋值
+        // 测试非法薪资
+        // 调用 work 方法
+        // 通过 getter 输出信息
+    }
+}
+
+class Emp {
+    private String id;
+    private String name;
+    private double salary;
+
+    // 请补全 getter/setter 方法(使用 this 区分同名参数)
+    // 补全 work() 方法
+}
+```
+
+> 💡 **提示**:当 setter 参数名与成员变量同名时,`this.成员变量 = 参数;` 是标准写法,不能省略 `this`。
+
+---
+
+## 二、进阶题(必做)
+
+### 题目 3:方法重用的综合计算 — MathTools 工具类
+
+**难度**:⭐⭐⭐  
+**知识点**:方法 4 种声明方式综合、质数算法、回文数算法、Random 随机数
+
+定义一个 `MathTools` 工具类,利用方法的 4 种声明方式完成以下功能:
+
+| 方法 | 类型 | 说明 |
+|------|------|------|
+| `printPrime()` | 无参无返回值 | 输出 1~100 之间的所有质数,每行输出 5 个数 |
+| `printSum(int n, int m)` | 有参无返回值 | 计算并输出 n~m 之间所有整数的累加和 |
+| `isPalindrome(int num)` | 有参有返回值 | 判断一个整数是否为回文数(正着读反着读一样),返回 true/false |
+| `getLuckyNumber()` | 无参有返回值 | 使用 `Random` 生成一个 1~100 之间的幸运数字并返回 |
+
+**要求**:
+- 在 `main` 方法中调用上述 **全部 4 个方法**,验证功能
+- `isPalindrome()` 需测试至少 3 个数(如 12321、12345、1221)
+- 输出格式清晰
+
+**示例运行效果**:
+```
+1~100 之间的质数:
+2    3    5    7    11
+13   17   19   23   29
+...(省略)
+97
+
+n~m 累加和:1 + 2 + ... + 100 = 5050
+
+12321 是回文数:true
+12345 是回文数:false
+1221 是回文数:true
+
+您的幸运数字是:88
+```
+
+**示例代码框架**:
+```java
+/**
+ * @author 你的姓名
+ * @title 题目3:方法重用的综合计算
+ * @create 2026/7/20
+ */
+public class Demo_03_姓名 {
+    public static void main(String[] args) {
+        // 调用 printPrime() 输出质数
+        // 调用 printSum(1, 100) 计算累加和
+        // 调用 isPalindrome() 测试回文数
+        // 调用 getLuckyNumber() 获取幸运数字
+    }
+
+    // 1. 无参无返回值:输出 1~100 质数
+    public static void printPrime() {
+        // 补全代码
+    }
+
+    // 2. 有参无返回值:计算 n~m 累加和
+    public static void printSum(int n, int m) {
+        // 补全代码
+    }
+
+    // 3. 有参有返回值:判断回文数
+    public static boolean isPalindrome(int num) {
+        return false; // 补全代码
+    }
+
+    // 4. 无参有返回值:获取幸运数字
+    public static int getLuckyNumber() {
+        return 0; // 补全代码
+    }
+}
+```
+
+> 💡 **提示**:
+> - **质数**:大于 1 且只能被 1 和自身整除的数
+> - **回文数**:将数字转为字符串,用 `charAt()` 从两端比较;或用数学方法反转数字后与原数比较
+> - **质数优化**:只需要检查到 `Math.sqrt(n)` 即可
+
+---
+
+### 题目 4:数组排序工具类 — SortUtils
+
+**难度**:⭐⭐⭐  
+**知识点**:数组作为方法参数、冒泡排序、选择排序、插入排序、Arrays.toString()
+
+定义一个 `SortUtils` 排序工具类,将三种排序算法分别封装为**有参无返回值**的方法:
+
+| 方法 | 说明 |
+|------|------|
+| `bubbleSort(int[] arr)` | 冒泡排序(升序),带提前结束优化 |
+| `selectionSort(int[] arr)` | 选择排序(降序),每轮选最大值 |
+| `insertionSort(int[] arr)` | 插入排序(升序),分为已排序和未排序两部分 |
+
+**要求**:
+1. 每个方法中先输出 `"排序前:" + Arrays.toString(arr)`,排序后再输出 `"排序后:" + Arrays.toString(arr)`
+2. 在 `main` 方法中创建一个测试数组,分别调用三种排序方法
+3. 三种方法使用 **同一个原始数组** 测试(每次排序前需要重置数组,或使用副本)
+
+**示例运行效果**:
+```
+======= 冒泡排序(升序) =======
+排序前:[29, 10, 14, 37, 13, 33, 48, 22]
+排序后:[10, 13, 14, 22, 29, 33, 37, 48]
+
+======= 选择排序(降序) =======
+排序前:[29, 10, 14, 37, 13, 33, 48, 22]
+排序后:[48, 37, 33, 29, 22, 14, 13, 10]
+
+======= 插入排序(升序) =======
+排序前:[29, 10, 14, 37, 13, 33, 48, 22]
+排序后:[10, 13, 14, 22, 29, 33, 37, 48]
+```
+
+**示例代码框架**:
+```java
+import java.util.Arrays;
+
+/**
+ * @author 你的姓名
+ * @title 题目4:数组排序工具类
+ * @create 2026/7/20
+ */
+public class Demo_04_姓名 {
+    public static void main(String[] args) {
+        int[] arr = {29, 10, 14, 37, 13, 33, 48, 22};
+
+        // 调用冒泡排序(每次用原数组副本)
+        System.out.println("======= 冒泡排序(升序) =======");
+        bubbleSort(Arrays.copyOf(arr, arr.length));
+
+        // 调用选择排序
+        System.out.println("======= 选择排序(降序) =======");
+        selectionSort(Arrays.copyOf(arr, arr.length));
+
+        // 调用插入排序
+        System.out.println("======= 插入排序(升序) =======");
+        insertionSort(Arrays.copyOf(arr, arr.length));
+    }
+
+    // 1. 冒泡排序(升序 + 提前结束优化)
+    public static void bubbleSort(int[] arr) {
+        System.out.println("排序前:" + Arrays.toString(arr));
+        // 补全冒泡排序代码(使用 boolean 标记优化)
+        System.out.println("排序后:" + Arrays.toString(arr));
+    }
+
+    // 2. 选择排序(降序:每轮选最大值放前面)
+    public static void selectionSort(int[] arr) {
+        System.out.println("排序前:" + Arrays.toString(arr));
+        // 补全选择排序代码(降序)
+        System.out.println("排序后:" + Arrays.toString(arr));
+    }
+
+    // 3. 插入排序(升序)
+    public static void insertionSort(int[] arr) {
+        System.out.println("排序前:" + Arrays.toString(arr));
+        // 补全插入排序代码
+        System.out.println("排序后:" + Arrays.toString(arr));
+    }
+}
+```
+
+> 💡 **提示**:
+> - 使用 `Arrays.copyOf(原数组, 长度)` 创建数组副本,避免改变原数组
+> - 冒泡排序的提前结束优化:用一个 `boolean` 标记本轮是否有交换
+> - 选择排序降序:每轮选出**最大值**放到未排序部分的**最前面**
+
+---
+
+## 三、提交要求
+
+### 文件命名规范
+
+| 题目 | 文件名 | 示例 |
+|------|--------|------|
+| 题目 1 | `Demo_01_姓名.java` | `Demo_01_张三.java` |
+| 题目 2 | `Demo_02_姓名.java` | `Demo_02_张三.java` |
+| 题目 3 | `Demo_03_姓名.java` | `Demo_03_张三.java` |
+| 题目 4 | `Demo_04_姓名.java` | `Demo_04_张三.java` |
+
+### 文件头注释要求
+
+每个 Java 源文件顶部必须包含以下注释模板:
+
+```java
+/**
+ * @author 你的姓名
+ * @title 题目X:题目名称
+ * @create 2026/7/20
+ */
+```
+
+### 提交目录结构
+
+```
+提交\
+└─ 姓名\
+    ├─ Demo_01_姓名.java
+    ├─ Demo_02_姓名.java
+    ├─ Demo_03_姓名.java
+    └─ Demo_04_姓名.java
+```