# 第 35 课学生工作纸｜找错误、看修改、留证据

60 分钟。一人一台电脑。材料为原创学习时长小项目，不用自己的私人学习记录。先预测，再运行；首答保留，猜错不扣分。浏览器实验执行真实 JavaScript，但没有调用 Cursor。真实编辑器操作与本地后备要分别记录。

## Q1｜0—6 分钟：先看规则

输入是一组记录。minutes 允许数字或只含十进制数字的字符串，允许字符串首尾空格。换算后必须是 1—480 的整数。空白、零、负数、小数、布尔值、null、缺字段、非数字字符串拒绝。空数组返回 0。旧调用仍传字符串，必须保持兼容。

默认输入：

~~~json
[{"subject":"阅读","minutes":"25"},{"subject":"练习","minutes":"15"},{"subject":"复盘","minutes":" "}]
~~~

按规则应该返回什么类型的结果？____。猜原始程序会怎样处理第三条？____。写数学合计与输入是否合法分别要检查什么：____。

## Q2｜6—12 分钟：拿到四个文件

教师已准备 Node 的同学，在本人练习位置新建 ai-study-time 文件夹，把下面四个文件保存进去。文件名必须完全一致，后缀是 .cjs，不是 .cjs.txt。打开文件链接后可复制原文至编辑器同名新文件再保存。尚未准备运行时者使用本页浏览器后备，无需课堂临时安装。

- [README.md](project/README.md)
- [total.cjs](project/total.cjs)
- [main.cjs](project/main.cjs)
- [test.cjs](project/test.cjs)

| 文件 | 它能回答什么问题 | 你找到的具体证据 |
|---|---|---|
| README.md | | |
| total.cjs | | |
| main.cjs | | |
| test.cjs | | |

在编辑器全项目搜索输入 minutes，打开函数与调用处。没有编辑器时，页面关键词框输入 minutes，点“检索摘录并运行检查”。网页只搜四份短摘录。写你的检索范围____；命中对象____；未看到的内容____。画输入 → 转换累计 → 结果比较，并标出规则从哪里来。

## Q3｜12—25 分钟：实际执行和定位

Node 路径：在 ai-study-time 目录打开终端，一条一条执行并保留原输出：

~~~sh
node --version
node main.cjs
node test.cjs
~~~

若提示找不到 node，写运行时未准备并切换浏览器；若提示找不到文件，核对当前目录和文件名。不要删除测试以消除 FAIL。初始程序就是待修版本。

网页路径：关键词 minutes，版本原始直接转换，记录保持默认。点击“检索摘录并运行检查”。观察第三条原始值、类型、Number 转换结果和最终合计。

| 观察项 | 我的实际记录 |
|---|---|
| 执行位置（Node / 浏览器） | |
| 第三条原始值和类型 | |
| Number 转换结果 | |
| 自定义记录结果 | |
| 固定八例通过 / 失败 | |
| 一项失败的输入、规则预期、实际结果 | |

错误定位句：当____输入经过____时，程序____，但 README 要求____。

已有可用 Cursor：通过 File → Open Folder 打开该练习目录，进入 Agent 面板，粘贴下列阅读任务。界面因版本不同找不到时，用命令面板搜索 Agent；仍不可用则人工阅读四文件，不新购服务。

~~~text
这是课堂原创学习时长项目。请先阅读README.md、total.cjs、main.cjs、test.cjs，不修改文件。
问题：main里minutes只有空格，却输出了合计。请指出输入从哪个文件进入，在哪一步被转换，并引用实际文件和函数。
解释规则对空白、数字字符串、整数范围、空数组的要求。列出最小修复计划以及需要保留的正常和边界测试。
没有读取到的文件请明确说明，不推测已经看过整个项目。
~~~

记录工具实际引用的文件____；自行打开核对过的证据____；漏掉的规则或尚未读取的文件____。无 Cursor 者用同样清单写人工阅读结果并注明。

## Q4｜25—38 分钟：比较与修复

候选一只加入 if (!row.minutes) 这样的真假值判空。先预测一个空格字符串与数值 0 各会怎样____，再切到“仅增加真假值判空”运行。随后比较“按类型、格式、范围完整校验”。

| 程序版本 | 默认记录结果 | 八例通过数 | 一个仍失败的输入与原因 |
|---|---|---:|---|
| 原始直接转换 | | | |
| 仅真假值检查 | | | |
| 完整校验 | | | |

写两个能区分候选的具体输入与规则依据，不只写“多测一些”：____。为什么检查需要发生在累加之前？____。

Cursor 实操者继续粘贴：

~~~text
现在执行最小修复。只修改total.cjs中与输入校验有关的代码，保留导出的total名称以及数字、十进制整数字符串两类调用。
按README拒绝空白和非法类型/范围，空数组仍返回0。不要删除或放宽已有八个测试，不安装依赖，不改其他项目。
修改后运行node main.cjs与node test.cjs，报告真实结果和未运行的部分。
~~~

打开实际文件差异，记录新增校验在哪里、导出名字是否保留、测试有无被放宽。自己执行两条命令核对结果，不只相信工具口头说明。没有 Cursor 可人工修改；未进行项目编辑者标明只完成浏览器候选验证。

## Q5｜38—48 分钟：独立新输入与迁移

先独立写每题预期和依据，再将 JSON 逐项放进网页记录框，选择完整校验版运行。不要提前打开答案。真实项目已修复者可把新例加入自己的检查，但保留原八例。

| 题 | 完整输入 JSON | 预测 | 实际结果 | 判断发生在类型 / 格式 / 数值范围哪层 |
|---|---|---|---|---|
| A | [{"minutes":12},{"minutes":"8"}] | | | |
| B | [{"minutes":"00"}] | | | |
| C | [{"minutes":" 7 "}] | | | |
| D | [{"minutes":true}] | | | |
| E | [{}] | | | |

选择一条预测修订，写依据如何改变____。选择一个应保留的字符串输入，说明为什么不能把接口随意改成只收数字____。

迁移卡：另一个调用方仍传 minutes 字符串。AI 建议改成只收数字，说“目前所见测试已通过”。你还要检索哪些位置、读哪些约定，增加哪条具体检查，才可以判断兼容性？____。

## Q6｜48—60 分钟：交付一段可信的说明

~~~text
原问题及触发输入：
实际修改或检查的程序：
找到的规则、函数与调用证据：
实际执行命令或网页输入：
正常、边界、字符串调用检查结果：
AI协助与人工完成的部分：
尚未执行或未覆盖：
~~~

画出“文件变化 → 变化定位 → 分块与表示 → 索引 → 取回上下文 → 修改验证”。实线圈出本节亲手操作的部分，虚线标出只从官方资料了解的部分。

离堂回答：找到函数后为什么仍要看调用方？八个样例通过能证明什么，又不能证明什么？____。

提交 Q1 首答、Q2 四文件角色、Q3 原始失败、Q4 候选对比、Q5 独立新输入与修订、Q6 修改说明。真实 Cursor 操作另附实际差异和终端输出；后备操作写浏览器本地验证，产品操作写未执行，不把不同证据混在一起。
