|
@@ -0,0 +1,246 @@
|
|
|
|
|
+# 2026-07-16 JavaSE 课后作业
|
|
|
|
|
+
|
|
|
|
|
+> **课程内容**:多维数组、增强 for 循环(foreach)、Arrays 数组工具类、冒泡排序、选择排序、插入排序、Scanner 键盘输入
|
|
|
|
|
+> **提交方式**:在 `提交\姓名\` 目录下创建对应的 Java 源文件
|
|
|
|
|
+> **截止时间**:下次上课前
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 一、基础题(必做)
|
|
|
|
|
+
|
|
|
|
|
+### 题目 1:冒泡排序 — 数组升序排列
|
|
|
|
|
+
|
|
|
|
|
+**难度**:⭐⭐⭐
|
|
|
|
|
+**知识点**:冒泡排序、嵌套循环、数组遍历、变量交换
|
|
|
|
|
+
|
|
|
|
|
+定义整数数组 `{29, 10, 14, 37, 13, 33, 48, 22}`,使用**冒泡排序**算法将数组按升序(从小到大)排列。
|
|
|
|
|
+
|
|
|
|
|
+**要求**:
|
|
|
|
|
+- 必须使用冒泡排序算法(相邻元素两两比较,大的往后冒)
|
|
|
|
|
+- 使用 `for` 循环嵌套实现
|
|
|
|
|
+- 排序后使用 `Arrays.toString()` 输出结果
|
|
|
|
|
+- 输出排序前和排序后的数组对比
|
|
|
|
|
+
|
|
|
|
|
+**示例输出**:
|
|
|
|
|
+```
|
|
|
|
|
+排序前:[29, 10, 14, 37, 13, 33, 48, 22]
|
|
|
|
|
+排序后:[10, 13, 14, 22, 29, 33, 37, 48]
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**示例代码框架**:
|
|
|
|
|
+```java
|
|
|
|
|
+import java.util.Arrays;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @author 你的姓名
|
|
|
|
|
+ * @title 题目1:冒泡排序
|
|
|
|
|
+ * @create 2026/7/16
|
|
|
|
|
+ */
|
|
|
|
|
+public class Demo_01_姓名 {
|
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
|
+ int[] arr = {29, 10, 14, 37, 13, 33, 48, 22};
|
|
|
|
|
+ System.out.println("排序前:" + Arrays.toString(arr));
|
|
|
|
|
+
|
|
|
|
|
+ // 冒泡排序代码写在这里
|
|
|
|
|
+
|
|
|
|
|
+ System.out.println("排序后:" + Arrays.toString(arr));
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> 💡 **提示**:
|
|
|
|
|
+> - 外层循环控制冒泡轮数,共 `arr.length - 1` 轮
|
|
|
|
|
+> - 内层循环在 `[0, arr.length-1-i]` 区间相邻比较
|
|
|
|
|
+> - 前一个比后一个大就交换
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+### 题目 2:选择排序 — 数组降序排列
|
|
|
|
|
+
|
|
|
|
|
+**难度**:⭐⭐⭐
|
|
|
|
|
+**知识点**:选择排序、嵌套循环、数组遍历
|
|
|
|
|
+
|
|
|
|
|
+定义整数数组 `{56, 23, 89, 12, 45, 67, 34, 78}`,使用**选择排序**算法将数组按**降序**(从大到小)排列。
|
|
|
|
|
+
|
|
|
|
|
+**要求**:
|
|
|
|
|
+- 必须使用选择排序算法(每轮选一个最值交换)
|
|
|
|
|
+- 要按**降序**排列,选择排序要找的是最大值还是最小值?
|
|
|
|
|
+- 排序后使用 `for` 循环遍历输出(不要用 `Arrays.toString()`)
|
|
|
|
|
+- 输出排序前和排序后的数组
|
|
|
|
|
+
|
|
|
|
|
+**示例输出**:
|
|
|
|
|
+```
|
|
|
|
|
+排序前:56 23 89 12 45 67 34 78
|
|
|
|
|
+排序后:89 78 67 56 45 34 23 12
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**示例代码框架**:
|
|
|
|
|
+```java
|
|
|
|
|
+import java.util.Arrays;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @author 你的姓名
|
|
|
|
|
+ * @title 题目2:选择排序(降序)
|
|
|
|
|
+ * @create 2026/7/16
|
|
|
|
|
+ */
|
|
|
|
|
+public class Demo_02_姓名 {
|
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
|
+ int[] arr = {56, 23, 89, 12, 45, 67, 34, 78};
|
|
|
|
|
+ System.out.print("排序前:");
|
|
|
|
|
+ // 用 for 循环遍历输出
|
|
|
|
|
+
|
|
|
|
|
+ // 选择排序代码写在这里(降序)
|
|
|
|
|
+
|
|
|
|
|
+ System.out.print("排序后:");
|
|
|
|
|
+ // 用 for 循环遍历输出
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> 💡 **提示**:
|
|
|
|
|
+> - 降序排列:每轮从剩余未排序元素中选出**最大值**,放到未排序部分的第 1 位
|
|
|
|
|
+> - 回忆课堂代码中的选择排序是升序(找最小值),降序只需要改成找最大值即可
|
|
|
|
|
+> - `minIndex` 改名为 `maxIndex`,比较条件从 `<` 改为 `>`
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+### 题目 3:插入排序 — 成绩排名
|
|
|
|
|
+
|
|
|
|
|
+**难度**:⭐⭐⭐
|
|
|
|
|
+**知识点**:插入排序、数组遍历、字符串拼接
|
|
|
|
|
+
|
|
|
|
|
+有一个整数数组 `{88, 72, 93, 65, 81, 97, 78, 85}` 表示 8 名学生的考试成绩。使用**插入排序**算法将成绩按**升序**(从低分到高分)排列。
|
|
|
|
|
+
|
|
|
|
|
+**要求**:
|
|
|
|
|
+- 必须使用插入排序算法
|
|
|
|
|
+- 每轮插入后,输出当前轮的排序中间结果(参考课堂代码)
|
|
|
|
|
+- 排序完成后,分别输出最低分和最高分
|
|
|
|
|
+
|
|
|
|
|
+**示例输出**:
|
|
|
|
|
+```
|
|
|
|
|
+第1轮插入后:[72, 88, 93, 65, 81, 97, 78, 85]
|
|
|
|
|
+第2轮插入后:[72, 88, 93, 65, 81, 97, 78, 85]
|
|
|
|
|
+第3轮插入后:[65, 72, 88, 93, 81, 97, 78, 85]
|
|
|
|
|
+第4轮插入后:[65, 72, 81, 88, 93, 97, 78, 85]
|
|
|
|
|
+第5轮插入后:[65, 72, 81, 88, 93, 97, 78, 85]
|
|
|
|
|
+第6轮插入后:[65, 72, 78, 81, 88, 93, 97, 85]
|
|
|
|
|
+第7轮插入后:[65, 72, 78, 81, 85, 88, 93, 97]
|
|
|
|
|
+排序完成!
|
|
|
|
|
+最低分:65
|
|
|
|
|
+最高分:97
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**示例代码框架**:
|
|
|
|
|
+```java
|
|
|
|
|
+import java.util.Arrays;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @author 你的姓名
|
|
|
|
|
+ * @title 题目3:插入排序-成绩排名
|
|
|
|
|
+ * @create 2026/7/16
|
|
|
|
|
+ */
|
|
|
|
|
+public class Demo_03_姓名 {
|
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
|
+ int[] scores = {88, 72, 93, 65, 81, 97, 78, 85};
|
|
|
|
|
+ System.out.println("原始成绩:" + Arrays.toString(scores));
|
|
|
|
|
+
|
|
|
|
|
+ // 插入排序代码写在这里
|
|
|
|
|
+ // 每轮插入后输出:System.out.println("第" + i + "轮插入后:" + Arrays.toString(scores));
|
|
|
|
|
+
|
|
|
|
|
+ System.out.println("排序完成!");
|
|
|
|
|
+ // 输出最低分和最高分
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> 💡 **提示**:
|
|
|
|
|
+> - 插入排序将数组分为"已排序"和"未排序"两部分
|
|
|
|
|
+> - 从索引 `1` 开始,每次取未排序的第 1 个元素插入到已排序部分的正确位置
|
|
|
|
|
+> - 内层使用 `while` 循环从后往前扫描,比当前元素大的就后移
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 二、进阶题(选做)
|
|
|
|
|
+
|
|
|
|
|
+### 题目 4:Scanner 学生信息采集系统
|
|
|
|
|
+
|
|
|
|
|
+**难度**:⭐⭐⭐⭐
|
|
|
|
|
+**知识点**:Scanner 键盘输入、数据类型、字符串拼接、条件判断
|
|
|
|
|
+
|
|
|
|
|
+使用 `Scanner` 实现一个**学生信息采集系统**,要求用户输入以下信息:
|
|
|
|
|
+
|
|
|
|
|
+| 信息项 | 数据类型 | 提示语 |
|
|
|
|
|
+|--------|---------|--------|
|
|
|
|
|
+| 姓名 | String | `请输入您的姓名:` |
|
|
|
|
|
+| 学号 | String | `请输入您的学号:` |
|
|
|
|
|
+| 年龄 | int | `请输入您的年龄:` |
|
|
|
|
|
+| 性别 | String | `请输入您的性别(男/女):` |
|
|
|
|
|
+| 身高(米) | double | `请输入您的身高(米):` |
|
|
|
|
|
+| 体重(公斤) | double | `请输入您的体重(公斤):` |
|
|
|
|
|
+| 是否在校(true/false) | boolean | `请输入您是否在校(true/false):` |
|
|
|
|
|
+
|
|
|
|
|
+**要求**:
|
|
|
|
|
+1. 使用 `Scanner` 依次读取上述所有信息
|
|
|
|
|
+2. 计算 BMI 指数:`BMI = 体重 ÷ (身高 × 身高)`
|
|
|
|
|
+3. 根据 BMI 判断体型(参考中国标准):
|
|
|
|
|
+ - `BMI < 18.5` → `偏瘦`
|
|
|
|
|
+ - `18.5 ≤ BMI < 24` → `正常`
|
|
|
|
|
+ - `24 ≤ BMI < 28` → `偏胖`
|
|
|
|
|
+ - `BMI ≥ 28` → `肥胖`
|
|
|
|
|
+4. 最后将收集到的所有信息格式化输出(见示例输出)
|
|
|
|
|
+5. 注意 `nextInt()` / `nextDouble()` 与 `nextLine()` 混用时的**换行符陷阱**
|
|
|
|
|
+
|
|
|
|
|
+**示例输出**:
|
|
|
|
|
+```
|
|
|
|
|
+======== 学生信息采集系统 ========
|
|
|
|
|
+请输入您的姓名:张三
|
|
|
|
|
+请输入您的学号:2024001
|
|
|
|
|
+请输入您的年龄:20
|
|
|
|
|
+请输入您的性别(男/女):男
|
|
|
|
|
+请输入您的身高(米):1.75
|
|
|
|
|
+请输入您的体重(公斤):70
|
|
|
|
|
+请输入您是否在校(true/false):true
|
|
|
|
|
+
|
|
|
|
|
+======== 学生信息卡 ========
|
|
|
|
|
+姓名:张三
|
|
|
|
|
+学号:2024001
|
|
|
|
|
+年龄:20
|
|
|
|
|
+性别:男
|
|
|
|
|
+身高:1.75 米
|
|
|
|
|
+体重:70.0 公斤
|
|
|
|
|
+在校学生:true
|
|
|
|
|
+BMI:22.86
|
|
|
|
|
+体型判定:正常
|
|
|
|
|
+============================
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> 💡 **提示**:
|
|
|
|
|
+> - BMI 计算公式:`weight / (height * height)`
|
|
|
|
|
+> - BMI 结果保留两位小数可以使用:`System.out.printf("%.2f", bmi);`
|
|
|
|
|
+> - 或者使用 `String.format("%.2f", bmi)` 格式化字符串
|
|
|
|
|
+> - 也可以直接用 `Math.round(bmi * 100) / 100.0` 实现四舍五入保留两位小数
|
|
|
|
|
+> - 使用 `if-else if` 多分支判断 BMI 所属区间
|
|
|
|
|
+
|
|
|
|
|
+**进阶挑战(学有余力的同学尝试)**:
|
|
|
|
|
+- 增加对性别的输入校验:如果既不是"男"也不是"女",提示重新输入
|
|
|
|
|
+- 增加对年龄的范围校验:年龄必须在 0~120 之间
|
|
|
|
|
+- 输出"体型判定"时,使用 `switch` 增强表达式(箭头语法)实现
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 三、提交要求
|
|
|
|
|
+
|
|
|
|
|
+1. 在 `提交` 文件夹下创建【以你名字命名】的文件夹,然后复制 Java 源文件
|
|
|
|
|
+2. 每个题目一个文件,命名格式:`Demo_题目编号_姓名.java`
|
|
|
|
|
+ - 例如:`Demo_01_张三.java`
|
|
|
|
|
+3. 文件头部使用文档注释,包含:
|
|
|
|
|
+ ```java
|
|
|
|
|
+ /**
|
|
|
|
|
+ * @author 你的姓名
|
|
|
|
|
+ * @title 题目X:题目名称
|
|
|
|
|
+ * @create 2026/7/16
|
|
|
|
|
+ */
|
|
|
|
|
+ ```
|
|
|
|
|
+4. 代码整洁,有必要的注释
|
|
|
|
|
+5. **基础题(1~3)为必做**
|
|
|
|
|
+6. **进阶题(4)为选做**,鼓励所有同学尝试完成
|