Files
ryansanchez7115 c26c464492 公布 iOS 部接收邮箱
第一、二题邮件提交的接收邮箱写入首页、提交说明和两道题的提交方式。
2026-10-03 13:02:44 +08:00

177 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第一题 出门检查器
- **类型**:基础语法与代码题(必做)
- **基础要求**:Swift 基础语法,含控制台输入
- **提交材料**:源码和真实运行截图
- **AI 规则**:仅可辅助学习和讲解基础知识,解题、编码与排错须独立完成
## 任务背景与概述
出门前,你有一份“需要带的物品”清单,也知道哪些物品已经放进包里。请写一个程序,对照两份清单,告诉你还缺什么。
本题是一道 Swift 基础练习:定义数组,编写并调用函数,从控制台读取输入来更新清单,再根据结果输出信息。初始数据写在代码中;**往包里添加物品,必须在程序运行时从控制台输入**,不能通过修改源码里的数组再重新运行来完成。不需要图形界面。
> **2026-10-02 更正**:原题面“输入数据直接写在代码中,不需要实现键盘输入”的表述有误,现已更正为上述要求,并重写了“4. 从控制台添加物品与运行案例”。已按旧题面完成的同学,请把 B、C 两个案例改为从控制台输入;函数接口、输出要求和 D–F 案例不变。
## 任务详细要求
### 1. 输入数据与命名规则
使用下面两个字符串数组作为初始数据:
```swift
let requiredItems = ["校园卡", "钥匙", "水杯", "耳机"]
var packedItems = ["手机", "校园卡", "钥匙"]
```
- `requiredItems` 是本次需要带的物品。
- `packedItems` 是已经放进包里的物品,可能包含本次清单之外的东西。
- 初始数组使用上述变量名。`packedItems` 会在运行时根据控制台输入添加物品,因此使用 `var`;其他自定义变量的名称清楚即可。
- 本题保证每个数组内部没有重复名称,也没有空名称。名称按字符串完全相同判断,无需处理错别字、空格清理或模糊匹配。
- 缺少的物品应按 `requiredItems` 中的先后顺序返回。
- 本题只判断物品是否存在,不处理数量。
### 2. 函数要求
编写函数,接收需要清单和已装入清单,返回缺少物品的数组。请使用以下函数名称、参数标签和类型:
```swift
func findMissingItems(required: [String], packed: [String]) -> [String]
```
上面只是接口说明,函数体由你编写。没有缺少物品时返回空数组。函数应适用于符合规则的其他清单,不能把示例答案直接写死。
### 3. 输出要求
调用函数,每次检查都输出:
- 案例名称、需要带的物品、已装入的物品;
- 缺少物品的名称和数量;没有缺少物品时明确显示“无”或空数组,数量为 0;
- 需要清单非空且没有缺少物品时,输出“已经准备好了,可以出发”;
- 需要清单为空时,输出“本次没有必带物品,无需检查”。
初始数据的一种输出形式如下:
```text
案例 A:初次检查
需要带的物品:校园卡、钥匙、水杯、耳机
已装入的物品:手机、校园卡、钥匙
缺少的物品:水杯、耳机
缺少数量:2
```
输出排版可以自行安排,只要信息清楚。标点、空格和数组的显示样式不要求与示例逐字一致。手机不在需要清单里,不影响结果。
### 4. 从控制台添加物品与运行案例
在同一个程序、同一次运行中完成 A–F。
**A–C:从控制台添加物品**
1. 先检查初始数据并输出,得到案例 A。
2. 只要还有缺少的物品,就给出提示,用 `readLine()` 从控制台读取一行,作为要放进包里的物品名称,添加到 `packedItems`,再重新调用函数并输出结果。
3. 重复第 2 步,直到没有缺少的物品,输出准备齐全的提示。
处理输入时遵守以下规则:
- 输入的名称已经在 `packedItems` 里:提示它已经在包里,不重复添加。
- 输入的物品不在需要清单里:照常添加(和初始数据里的手机一样),不影响结果。
- 直接回车(输入为空)或读不到输入:结束添加,继续执行后面的案例。
- 名称仍按字符串完全相同判断。
录制运行截图时,请依次输入“水杯”和“耳机”,得到案例 B、C。交互过程的一种形式如下:
```text
缺少的物品:水杯、耳机
缺少数量:2
请输入放进包里的物品(直接回车结束):水杯
添加“水杯”后
已装入的物品:手机、校园卡、钥匙、水杯
缺少的物品:耳机
缺少数量:1
请输入放进包里的物品(直接回车结束):耳机
```
提示文字和排版可以自行安排。
**D–F:固定数据**
添加环节结束后,使用 D、E、F 的数据(写在代码中)继续调用函数并输出。
| 案例 | 需要带的物品 | 已装入的物品 | 函数应返回 |
| --- | --- | --- | --- |
| A 初次检查 | 校园卡、钥匙、水杯、耳机 | 手机、校园卡、钥匙 | 水杯、耳机 |
| B 输入“水杯”后 | 校园卡、钥匙、水杯、耳机 | 手机、校园卡、钥匙、水杯 | 耳机 |
| C 再输入“耳机”后 | 校园卡、钥匙、水杯、耳机 | 手机、校园卡、钥匙、水杯、耳机 | 空数组 |
| D 包里什么都没有 | 钥匙、水杯 | 空数组 | 钥匙、水杯 |
| E 本次没有必带物品 | 空数组 | 手机 | 空数组 |
| F 两份清单都为空 | 空数组 | 空数组 | 空数组 |
C 输出准备齐全的提示;E、F 输出无需检查的提示。
如果你的终端无法正确读入中文(输入“水杯”后程序认不出来),先按[开发环境配置指南](../guides/environment.md)的“常见报错”处理;仍无法解决时,可以把两份清单中的物品名称统一换成英文或拼音(例如 `cup`、`earphones`),并在邮件正文说明,这不影响评价。
## 提交材料、方式与格式规范
### 提交材料与格式
| 材料 | 格式与要求 |
| --- | --- |
| 源码 | 文件名为 `main.swift`,使用 UTF-8 编码,包含函数、调用、控制台输入和 A–F 案例;保持缩进和命名清楚,必要处添加注释 |
| 运行截图 | 使用 PNG 或 JPG,文字清晰,能辨认案例名称、控制台输入的内容与实际输出,覆盖 A–F;可分多张,按 `run-01.png`、`run-02.png` 等顺序命名,JPG 使用相应扩展名 |
源码和截图应来自同一个最终版本。允许裁去无关窗口,不得修改运行结果文字、拼造结果或用 AI 生成截图。未全部完成时可提交当前源码与实际结果,标注未完成处。
### 提交方式
第一题与第二题一起打包成 `姓名-学号-QQ.zip`,于 **10 月 3 日至 10 月 7 日 23:59** 通过邮件发送到 iOS 部接收邮箱 `diaohongning@gmail.com`,邮件主题为 `姓名-学号-QQ`。压缩包内,本题源码放在 `01-basics/main.swift`,运行截图放在 `01-basics/screenshots/`。完整目录示例与步骤见[前两题提交说明](../submissions/README.md)。
不需要额外提交设计文档、学习笔记或调试报告。
## 运行环境
本题需要能编译运行 Swift 命令行程序,并能在终端里输入,**不需要 Mac**:Windows 可用 VS Code + 官方 Swift 工具链,Mac 安装 Command Line Tools 即可。**iPad 的 Swift Playground 无法在控制台输入,不能用于本题**;没有可用电脑的同学,请尽快在招新 QQ 群联系干部协调。具体步骤与常见报错见[开发环境配置指南](../guides/environment.md)。
## 学习范围与资源
学习到能使用下面这些内容即可:
- `let`、`var`,字符串与布尔值;
- 数组的创建、遍历、添加、数量和空数组;
- `if/else`、`for-in`、`while`;
- 函数参数、返回值和调用;
- `print` 输出及字符串插值;
- `readLine()` 读取一行控制台输入,以及用 `if let` 或 `??` 处理“可能读不到内容”的情况。
可从[菜鸟教程 Swift 目录](https://www.runoob.com/swift/swift-tutorial.html)按以上主题阅读。除 `readLine()` 用到的最基本写法外,无需深入可选类型,也无需学习结构体、类、闭包、泛型或 SwiftUI。遇到教程样例与所用版本不一致,可参考下列 Swift 官方说明或询问授课干部。
- [基础语法](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/)
- [数组与集合](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/collectiontypes/)
- [条件与循环](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/controlflow/)
- [函数](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/functions/)
可以用循环判断,也可以使用自己理解的标准库方法。不以代码行数、运行速度排名或使用高级语法的数量评判本题。
## 独立完成规则
**允许用 AI 辅助学习基础知识。** 例如,询问 `let` 和 `var` 的区别、函数参数标签的含义,或请 AI 讲解教程中看不懂的语法和通用示例。理解之后,本题的思路、代码与检查过程由自己完成。
**不得用 AI 完成本题。** 包括分析题目并给出解题思路或伪代码,生成、补全、修改或优化本题代码,以及检查、解释或调试待提交的代码。不要把本题题面、自己的解法、源码或报错交给 AI 分析;运行证据也必须由自己实际运行获得。
可以阅读教程和官方文档,使用编辑器的非 AI 语法提示,向干部询问环境问题或基础概念;不能让他人代写。按工作室规定,不得向干部或其他成员询问本题解法。
请亲自运行,比较预期与实际结果,必要时自己定位问题、修改后重试。不要求必须遇到或制造某个错误。
## 考察重点
完成后,可以用下面的问题检查自己是否真正理解:
- **变量与数据**:哪些数据会改变?为什么需要区分 `let` 和 `var`?数组怎样表示一份清单?
- **条件与循环**:自己用到的判断和遍历在做什么?为什么能找出缺少的物品,并保留原清单的顺序?若用了标准库方法,能否说明它的作用?
- **函数与调用**:参数和返回值分别是什么?返回结果与打印结果有什么区别?换一组输入,函数为什么还能工作?
- **输入与更新**:`readLine()` 读到的内容怎样进入数组?它的返回值为什么需要先处理“可能没有内容”?输入为空、重复或不在清单里时,程序怎样处理?
- **边界情形**:包为空、需要清单为空、全部带齐时分别会发生什么?为什么“全部带齐”和“本次无需检查”要区分?
- **运行与检查**:能否运行自己的源码、对照案例检查输出;修改数据后,能否先预测结果,再运行验证?发现不一致时,能否说明自己的检查过程?
二面会结合源码与真实运行结果交流上述内容,可能请你解释一段代码,或预测输入变化后的输出。重点是基础知识与本人完成过程,不以代码行数、装饰性排版或高级语法数量判断能力。