# 2026-07-14 JavaSE 课后作业

> **课程内容**：流程控制、运算符（算术/赋值/比较/逻辑/位/三目）、运算符优先级  
> **提交方式**：在 `提交\姓名\` 目录下创建对应的 Java 源文件  
> **截止时间**：下次上课前

---

## 一、基础题（必做）

### 题目 1：判断闰年

**难度**：⭐  
**知识点**：if-else、逻辑运算符、算术运算符

从键盘输入一个年份（整数），判断该年份是否为闰年。

**闰年规则（满足其一即可）**：
1. 能被 4 整除但不能被 100 整除；或者
2. 能被 400 整除

**要求**：
- 定义 `int year` 变量并赋值为要判断的年份
- 使用 `if-else` 分支结构
- 使用逻辑运算符 `&&` 和 `||`
- 输出格式：`xxxx 年是闰年` 或 `xxxx 年不是闰年`

**示例输出**：
```
2024 年是闰年
2025 年不是闰年
```

---

### 题目 2：三个数比大小

**难度**：⭐  
**知识点**：三目运算符、if-else

定义三个整数变量 `a`、`b`、`c`，找出其中的最大值并输出。

**要求**：
- 方法一：使用三目运算符嵌套实现
- 方法二：使用 `if-else` 实现
- 两种方法都写在同一个文件中（分别注释标注）

**示例输出**：
```
三个数中最大的值是: 78
```

---

### 题目 3：位运算练习

**难度**：⭐  
**知识点**：位运算符

定义两个整数 `int m = 27`、`int n = 15`，计算并输出以下位运算的结果，**并在注释中写出每一步的二进制运算过程**。

```java
int m = 27, n = 15;
// 1. m & n  (按位与)
// 2. m | n  (按位或)
// 3. m ^ n  (按位异或)
// 4. ~m     (按位取反)
// 5. m << 2 (左移2位)
// 6. n >> 2 (右移2位)
```

**示例注释格式**：

```java
// 27 & 15
//  0001 1011  ← 27
// & 0000 1111  ← 15
// --------
//  0000 1011  → 11
System.out.println("27 & 15 = " + (27 & 15));  // 11
```

---

## 二、进阶题（必做）

### 题目 4：水仙花数判定

**难度**：⭐⭐  
**知识点**：算术运算符（`/`、`%`）、if-else

"水仙花数"是指一个三位数，其各位数字的立方和等于该数本身。例如：`153 = 1³ + 5³ + 3³`。

**要求**：

- 定义一个三位数整数 `int num = 153;`（可自行修改测试其他数字）
- 使用 `/` 和 `%` 分别取出个位、十位、百位
- 判断是否为水仙花数，并输出结果

**示例输出**：
```
153 是水仙花数
```

**提示**：
```java
int num = 153;
int bai = num / 100;        // 百位
int shi = num / 10 % 10;    // 十位
int ge  = num % 10;         // 个位
```

---

### 题目 5：简易计算器

**难度**：⭐⭐  
**知识点**：if-else、算术运算符、Scanner（选做）

定义两个整数 `a` 和 `b`，以及一个字符变量 `operator`（取值为 `'+'`、`'-'`、`'*'`、`'/'`、`'%'`），根据运算符输出对应的运算结果。

**要求**：

- 使用 `if-else if-else` 多分支判断
- 除号为 `/` 时，判断除数是否为 0，如果是则输出"除数不能为 0"
- 取模为 `%` 时，同样判断除数是否为 0

**示例输出 1**：
```
a = 20, b = 7, operator = '%'
20 % 7 = 6
```

**示例输出 2**：
```
a = 20, b = 0, operator = '/'
除数不能为 0
```

---

### 题目 6：成绩等级判定（升级版）

**难度**：⭐⭐  
**知识点**：if-else if-else、逻辑运算符、三目运算符

结合课堂练习的成绩等级判定，增加以下功能：

**要求**：

1. 定义 `double score = 85.5;`（可自行修改测试）
2. 使用 `if-else` 实现以下等级判定：

| 分数范围 | 等级 | 评价语 |
|---------|------|--------|
| 90 ≤ score ≤ 100 | A | 优秀，继续保持！ |
| 80 ≤ score < 90 | B | 良好，再接再厉！ |
| 70 ≤ score < 80 | C | 中等，还需努力！ |
| 60 ≤ score < 70 | D | 及格，危险边缘！ |
| 0 ≤ score < 60 | E | 不及格，加油啊！ |
| 其他 | 无效 | 分数错误！ |

3. 额外使用**三目运算符**判断该成绩是否及格（≥ 60 为及格），并输出结果
4. 输出格式参考如下：

**示例输出**：
```
成绩: 85.5 分
等级: B - 良好，再接再厉！
是否及格: 是
```

---

## 三、挑战题（选做）

### 题目 7：数字加密系统

**难度**：⭐⭐⭐  
**知识点**：算术运算符、位运算符、三目运算符、综合运用

设计一个简单的 4 位数字加密系统。

**加密规则**：

1. 输入一个 4 位整数（如 `1234`）
2. 对每一位数字进行以下处理：
   - 每个数字加 5
   - 对 10 取余
   - 将第 1 位与第 4 位交换，第 2 位与第 3 位交换
3. 输出加密后的数字

**示例**：

```
原始数字: 1234
每位+5后: 6789
取余10后: 6789
交换后:   9876
加密结果: 9876
```

**要求**：
- 分别使用算术运算符（`/`、`%`）取出每位数字
- 使用三目运算符处理可能的负数情况
- 输出每一步的中间结果（如上所示）
- 可以尝试用位运算符对加密结果再次进行异或运算：`加密结果 ^ 0xAA`

---

### 题目 8：程序员智商测试

**难度**：⭐⭐⭐  
**知识点**：运算符优先级、自增/自减、综合运用

请问以下代码的输出结果是什么？**先手算，再用 IDE 验证**。

```java
public class IQTest {
    public static void main(String[] args) {
        int a = 5, b = 3, c = 2;
        int result1 = a++ + ++b * c--;
        System.out.println("result1 = " + result1);
        System.out.println("a = " + a + ", b = " + b + ", c = " + c);

        int x = 10, y = 4;
        boolean flag = (x > y) && (++x > 10) || (y-- < 3);
        System.out.println("flag = " + flag);
        System.out.println("x = " + x + ", y = " + y);

        int m = 8, n = 3;
        int r = m++ - --n + ++m - n--;
        System.out.println("r = " + r);
        System.out.println("m = " + m + ", n = " + n);
    }
}
```

**要求**：
1. 先手算出每一步的中间结果，写在注释中
2. 再运行代码验证，输出结果
3. 分析 `&&` 短路特性对执行结果的影响

---

### 题目 9：位运算权限系统

**难度**：⭐⭐⭐  
**知识点**：位运算符（`&`、`|`、`~`、`<<`）、综合运用

在计算机系统中，常用**位运算**来实现权限控制。假设一个系统的权限定义如下：

```java
// 权限定义（每个权限占用一个二进制位）
int READ    = 1 << 0;  // 0001 = 1   读权限
int WRITE   = 1 << 1;  // 0010 = 2   写权限
int EXECUTE = 1 << 2;  // 0100 = 4   执行权限
int DELETE  = 1 << 3;  // 1000 = 8   删除权限
```

**要求**：
1. 定义一个用户权限变量 `int userPerm = 0;`（初始无权限）
2. 使用 `|` 赋予用户读、写、执行权限：`userPerm = READ | WRITE | EXECUTE;`
3. 使用 `&` 判断用户是否拥有某个权限（如判断是否有删除权限）
4. 使用 `&` 和 `~` 取消用户的写权限
5. 按以下格式输出每一步的结果：

**示例输出**：
```
初始权限: 0 (无权限)
赋予权限(读|写|执行): 7
是否有删除权限? false
取消写权限后: 5
最终权限: 读取=有, 写入=无, 执行=有, 删除=无
```

**提示**：
```java
// 判断是否有写权限
boolean hasWrite = (userPerm & WRITE) == WRITE;

// 取消写权限
userPerm = userPerm & ~WRITE;
```

---

## 四、提交要求

1. 在 `提交` 文件夹下创建【以你名字命名】的文件夹，然后复制 Java 源文件。比如：

   ![image-20260714171229747](https://gitee.com/lk506667090/PicGo_img/raw/master/images/202607141713967.png)

2. 每个题目一个文件，命名格式：`Demo_题目编号_姓名.java`
   - 例如：`Demo_01_张三.java`

3. 文件头部使用文档注释，包含：
   ```java
   /**
    * @author 你的姓名
    * @title 题目X：题目名称
    * @create 2026/7/14
    */
   ```

4. 代码整洁，有必要的注释

5. 基础题`（1~3）`和进阶题`（4~6）`为**必做**

6. 挑战题`（7~9）`为 **选做**，学有余力的同学尝试完成
