# 项目1 · 编程实训题（一）题目 · 学生版

> **范围**：任务2「学生画像表示」+ 任务3「发展团员条件审核」
> **主线**：沿用教材虚拟学伴「河小青」的大学生活
> **难度梯度**：★ 基础 → ★★ 提高 → ★★★ 综合，一题比一题难，建议按顺序做

| 题号 | 题目 | 难度 | 核心知识点 | 建议分值 | 预计用时 |
|---|---|---|---|---|---|
| 第1题 | 制作学生名片 | ★☆☆ 基础 | 变量定义、四种数值类型、print 输出 | 30 分 | 10 分钟 |
| 第2题 | 三科成绩统计器 | ★★☆ 提高 | 算术运算符、// 与 %、复合赋值、round() | 30 分 | 15 分钟 |
| 第3题 | 入团资格审核器 | ★★★ 综合 | 比较运算符、逻辑运算符、布尔类型、括号、用户输入 | 40 分 | 20 分钟 |

---

## 第 1 题 · 制作学生名片 【★☆☆ 基础】

### 题目描述
用 Python 变量描述河小青同学的基本信息，并把它们打印成一张整齐的"学生名片"。

需要描述的信息如下：

| 信息 | 值 | 数据类型 |
|---|---|---|
| 姓名 | 河小青 | 字符串 |
| 年龄 | 18 | 整型 |
| 身高 | 1.75（米） | 浮点型 |
| 体重 | 60.5（千克） | 浮点型 |
| 班级人数 | 45 | 整型 |
| 是否团员 | 是 | 布尔型 |

### 输出要求
运行后屏幕输出类似下面的效果（内容与顺序对即可，排版不要求一模一样）：

```
====== 学生名片 ======
姓名：河小青
年龄：18 岁
身高：1.75 米
体重：60.5 千克
班级人数：45 人
是否团员：True
=====================
```

### 代码框架（把标了 `# TODO` 的地方补完）
```python
# 1_学生名片.py
# 河小青的学生名片

# 1. 定义变量（注意每个值该用什么类型）
name = "河小青"
age = 18
height = 1.75
weight = 60.5
class_size = 45
is_league = True

# 2. 打印名片
print("====== 学生名片 ======")
print("姓名：", name)
# TODO：输出年龄
# TODO：输出身高
# TODO：输出体重
# TODO：输出班级人数
# TODO：输出是否团员
print("=====================")
```

### 挑战加分（选做，+5 分）
用**一行解包赋值**同时给身高和体重赋值，替换掉原来的两行。

### 提交要求
文件命名为 `1_学生名片.py`，附一张运行结果截图。

---

## 第 2 题 · 三科成绩统计器 【★★☆ 提高】

### 题目描述
河小青在新生入学考试中，语文 85 分、数学 92 分、英语 87 分。请编写程序帮她算出四件事：

1. **总分**是多少；
2. **平均分**是多少（保留 1 位小数）；
3. 总分**折合几个满分**（每 100 分算一个满分）；
4. 折合完满分后**还剩多少分**。

### 输出要求
```
三科总分：264 分
平均成绩：88.0 分
折合满分：2 个，剩余 64 分
```

### 代码框架
```python
# 2_成绩统计.py
# 三科成绩统计器

chinese = 85
math_score = 92
english = 87

# 1. TODO：计算总分
total = 0

# 2. TODO：计算平均分，保留 1 位小数（提示：round(数字, 1)）
average = 0

# 3. TODO：用 // 算折合几个满分，用 % 算剩余分数
full_count = 0
rest = 0

print("三科总分：", total, "分")
print("平均成绩：", average, "分")
print("折合满分：", full_count, "个，剩余", rest, "分")
```

### 挑战加分（选做，+5 分）
用**复合赋值运算符**给总分加上 5 分平时分，然后重新输出总分。

### 提交要求
文件命名为 `2_成绩统计.py`，附一张运行结果截图。

---

## 第 3 题 · 入团资格审核器 【★★★ 综合】

### 题目描述
学院要发展新团员，审核规则有三条**硬条件**，必须**全部满足**才算合格：

1. 年龄在 **14 周岁以上、28 周岁以下**（含 14 和 28）；
2. 平均成绩 **不低于 80 分**；
3. **没有受过处分**。

另外还有一条**优先条件**：担任班干部的同学优先考虑。

请你编写程序完成以下任务：

1. 分别判断三条硬条件是否满足，并输出每一项的结果；
2. 判断是否**符合入团条件**（三条硬条件同时成立）；
3. 若不符合，**逐条输出未通过的原因**；
4. 输出是否**优先推荐**（合格 且 是班干部）。

### 输出要求
用两组数据测试你的程序。

**第一组**：王强，18 岁，平均成绩 88.0 分，没有受过处分，是班干部。

```
年龄是否合规：True
成绩是否达标：True
是否无处分：True
===== 是否符合入团条件：True =====
是否优先推荐：True
```

**第二组**：李某，30 岁，平均成绩 75.0 分，受过处分，不是班干部。

```
年龄是否合规：False
成绩是否达标：False
是否无处分：False
===== 是否符合入团条件：False =====
未通过原因：年龄不符合要求
未通过原因：成绩未达到 80 分
未通过原因：有处分记录
是否优先推荐：False
```

### 代码框架
```python
# 3_入团资格审核.py
# 入团资格审核器

age = 18
score = 88.0
punished = False        # False 表示没有受过处分
is_cadre = True         # True 表示是班干部

# 1. TODO：判断年龄是否在 14 到 28 之间（两个比较用 and 连起来，加括号更清楚）
cond_age = False

# 2. TODO：判断成绩是否不低于 80
cond_score = False

# 3. TODO：判断是否"没有受过处分"（punished 为 False 才合格）
cond_clean = False

# 4. TODO：三条硬条件同时成立才算合格
qualified = False

# 5. TODO：合格 且 是班干部，才算优先推荐
priority = False

print("年龄是否合规：", cond_age)
print("成绩是否达标：", cond_score)
print("是否无处分：", cond_clean)
print("===== 是否符合入团条件：", qualified, "=====")

# 6. TODO：如果不符合，逐条输出未通过原因
# 提示：if not cond_age:  print("未通过原因：年龄不符合要求")

print("是否优先推荐：", priority)
```

### 挑战加分（选做，+10 分）
把程序改成**从键盘接收输入**，而不是把数据写死在代码里：

```python
age = int(input("请输入年龄："))
score = float(input("请输入平均成绩："))
punished = bool(int(input("是否受过处分（1=是，0=否）：")))
is_cadre = bool(int(input("是否班干部（1=是，0=否）：")))
```

> 提示：`input()` 接收到的内容是**字符串**，做数字比较或运算前，必须先转成数字类型。

### 提交要求
文件命名为 `3_入团资格审核.py`，附**两组数据**的运行结果截图。

---

## 通用提交要求

1. 三个 `.py` 文件：`1_学生名片.py`、`2_成绩统计.py`、`3_入团资格审核.py`。
2. 每个文件开头写**单行注释**，说明这个文件是干什么的（用 `#` 开头）。
3. 变量名做到**见名知意**，不要用 `a`、`b`、`x1` 这种。
4. 缩进统一，不要空格和 Tab 混用。
5. 提交时附运行结果截图。

> 💡 **做题顺序建议**：先做完第 1 题确保环境没问题，再做第 2 题，最后攻第 3 题。遇到报错先读一遍红色提示，大部分问题都在提示里写着。
