# 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）为选做**，鼓励所有同学尝试完成
