# 第一题 出门检查器 - **类型**:基础语法与代码题(必做) - **基础要求**:Swift 基础语法 - **提交材料**:源码和真实运行截图 - **AI 规则**:仅可辅助学习和讲解基础知识,解题、编码与排错须独立完成 ## 任务背景与概述 出门前,你有一份“需要带的物品”清单,也知道哪些物品已经放进包里。请写一个程序,对照两份清单,告诉你还缺什么。 本题是一道 Swift 基础练习:定义数组,编写并调用函数,再根据结果输出信息。输入数据直接写在代码中,不需要实现键盘输入或图形界面。 ## 任务详细要求 ### 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:先检查初始数据,再向 `packedItems` 依次添加“水杯”和“耳机”,每次添加后重新调用函数并输出结果,得到 A、B、C。然后使用 D、E、F 的数据继续调用函数并输出。 | 案例 | 需要带的物品 | 已装入的物品 | 函数应返回 | | --- | --- | --- | --- | | A 初次检查 | 校园卡、钥匙、水杯、耳机 | 手机、校园卡、钥匙 | 水杯、耳机 | | B 添加水杯后 | 校园卡、钥匙、水杯、耳机 | 手机、校园卡、钥匙、水杯 | 耳机 | | C 再添加耳机后 | 校园卡、钥匙、水杯、耳机 | 手机、校园卡、钥匙、水杯、耳机 | 空数组 | | D 包里什么都没有 | 钥匙、水杯 | 空数组 | 钥匙、水杯 | | E 本次没有必带物品 | 空数组 | 手机 | 空数组 | | F 两份清单都为空 | 空数组 | 空数组 | 空数组 | C 输出准备齐全的提示;E、F 输出无需检查的提示。 ## 提交材料、方式与格式规范 ### 提交材料与格式 | 材料 | 格式与要求 | | --- | --- | | 源码 | 文件名为 `main.swift`,使用 UTF-8 编码,包含函数、调用和 A–F 案例;保持缩进和命名清楚,必要处添加注释 | | 运行截图 | 使用 PNG 或 JPG,文字清晰,能辨认案例名称与实际输出,覆盖 A–F;可分多张,按 `run-01.png`、`run-02.png` 等顺序命名,JPG 使用相应扩展名 | 源码和截图应来自同一个最终版本。允许裁去无关窗口,不得修改运行结果文字、拼造结果或用 AI 生成截图。未全部完成时可提交当前源码与实际结果,标注未完成处。 ### 提交方式 第一题与第二题一起放入 `submissions/年级姓名/`,个人文件夹例如 `25刁泓宁`。本题源码放在 `01-basics/main.swift`,运行截图放在 `01-basics/screenshots/`。 在本仓库的个人分支提交这份文件夹,再发起指向 `main` 的 PR,由干部审核合并。完整目录示例与步骤见[前两题提交说明](../submissions/README.md)。当前仍在筹备,正式开放时间和截止时刻以[仓库首页](../README.md)通知为准。 不需要额外提交设计文档、学习笔记或调试报告。 ## 学习范围与资源 学习到能使用下面这些内容即可: - `let`、`var`,字符串与布尔值; - 数组的创建、遍历、添加、数量和空数组; - `if/else`、`for-in`; - 函数参数、返回值和调用; - `print` 输出及字符串插值。 可从[菜鸟教程 Swift 目录](https://www.runoob.com/swift/swift-tutorial.html)按以上主题阅读。无需通读可选类型、结构体、类、闭包、泛型或 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`?数组怎样表示一份清单? - **条件与循环**:自己用到的判断和遍历在做什么?为什么能找出缺少的物品,并保留原清单的顺序?若用了标准库方法,能否说明它的作用? - **函数与调用**:参数和返回值分别是什么?返回结果与打印结果有什么区别?换一组输入,函数为什么还能工作? - **边界情形**:包为空、需要清单为空、全部带齐时分别会发生什么?为什么“全部带齐”和“本次无需检查”要区分? - **运行与检查**:能否运行自己的源码、对照案例检查输出;修改数据后,能否先预测结果,再运行验证?发现不一致时,能否说明自己的检查过程? 二面会结合源码与真实运行结果交流上述内容,可能请你解释一段代码,或预测输入变化后的输出。重点是基础知识与本人完成过程,不以代码行数、装饰性排版或高级语法数量判断能力。