# 第 35 课参考答案｜先完成独立输入再核查

首次预测错误不扣分，保留依据和改正过程。工具的代码建议不设唯一实现，只要满足 README、保留调用兼容并有真实测试证据。浏览器测试与外部编辑器操作必须分开记。

## Q1：输出一个数不等于输入合法

默认第三条是全空格字符串，规则要求拒绝，不形成有效总数。原版 Number 把它转成 0，最终 25＋15＋0 得到 40。40 的算术没有算错，缺陷在于没有先按任务规则拒绝第三条。这与合法地只提交前两条不同：后者确有两条完整记录，前者有缺失记录却被悄悄当零。

## Q2：四文件承担不同证据

README 规定类型、范围、空数组与兼容要求；total 是转换与累加实现；main 给出包含空格的实际调用；test 将固定输入结果和预期比较。可画 main → total → main 输出，test 另调用 total 并核对 README。

页面 minutes 查询在固定四份摘录中命中 README、total、main，共 3/4；test 摘录用自然语言列案例而没有该关键词。磁盘 test 完整文件确实含 minutes，因此真实编辑器全项目搜索的命中数可能不同。这个差异正好说明检索范围需要写明。没有命中不能推出完整项目不存在相关内容，更不能说已经读完全部仓库。

## Q3：原版失败证据

Node main 的原始输出为“合计分钟：40”。原版固定八例 **3/8 通过、5/8 失败**，通过 A 正常、E 空数组、G 字符串调用；B 空格、C 零、D 小数、F 超范围、H 布尔失败。原版直接做数值转换，对 true 会得 1，对 481 会保留 481，这些不符合输入规则。

定位句例：“全空格 minutes 从 main 进入 total，未经格式检查就经 Number 转成 0，导致不完整记录也得到 40；README 要求拒绝空白。”引用必须指向实际文件内容，工具仅说“类型问题”不构成完整证据。运行环境缺失应标为环境未就绪，不当作函数测试通过或失败。

## Q4：三个版本的区别

| 版本 | 默认输入 | 固定检查 | 原因 |
|---|---|---|---|
| 原始转换 | 40 | 3/8 | 多种不合法原值被直接转换 |
| 仅真假值检查 | 40 | 4/8 | 增加拦截数值0，但空格字符串为真，仍漏空格、小数、超上限、布尔值 |
| 完整校验 | 拒绝第三条 | 8/8 | 类型、去空格后的格式、整数范围均核对后才累加 |

候选区分输入可用一个空格、1.5、481、true；必须说清 README 期望拒绝。不是所有可被 Number 转换的值都是本任务允许的输入。字符串 " 7 " 允许先去首尾空格检查；全空格去空格后为空，不允许。

教师备查的[参考实现](reference-total.cjs)与待修复四文件分开放，避免首次运行已经没有错误。独立题完成后，可以逐行比较自己的修复；不要覆盖唯一的原始失败记录。参考代码如下：

~~~javascript
function total(rows) {
  if (!Array.isArray(rows)) throw new Error('需要记录数组');
  return rows.reduce((sum, row, index) => {
    const value = row && row.minutes;
    if (typeof value !== 'number' && typeof value !== 'string') {
      throw new Error('minutes类型不支持');
    }
    if (typeof value === 'string' && !/^\d+$/.test(value.trim())) {
      throw new Error('需要十进制整数字符串');
    }
    const minutes = Number(value);
    if (!Number.isInteger(minutes) || minutes < 1 || minutes > 480) {
      throw new Error('需要1至480的整数');
    }
    return sum + minutes;
  }, 0);
}
module.exports = { total };
~~~

错误文案可以不同；判断规则与函数导出约定不能偷换。复制参考实现不证明学生能定位问题，仍应提交首答与新输入判断。保存参考文件至四文件目录的上一级后，可在 project 目录运行 node test.cjs ../reference-total.cjs 检查参考模块；它不修改原始 total.cjs。

## Q5：独立题与迁移

| 题 | 结果 | 对应依据 |
|---|---|---|
| A | 20 | 数字12与十进制字符串8均有效 |
| B | 拒绝 | "00" 通过数字字符格式，但转换后为0，违反1至480 |
| C | 7 | 去首尾空格后为有效十进制整数，保留字符串兼容 |
| D | 拒绝 | true 是 boolean，不在允许原始类型中 |
| E | 拒绝 | minutes 缺失，得到 undefined，类型不支持 |

迁移要检索函数引用、导入、调用方与输入组装位置，并阅读接口约定。至少保留一个数字字符串实际调用（如10与"10"合计20）和空数组检查。只测数字的局部新程序即使通过，也没有覆盖原来允许的字符串调用。是否改接口需要明确需求与对应迁移，不由 AI 为了省校验默默决定。

## Q6：修改说明的范围

例：“空格时长原先被 Number 转为零，现按 README 在求和前拒绝无效类型、格式与范围，保留数字字符串调用和空数组。实际执行原八例及 A—E 新例；保存差异和命令输出。未测试真实业务大数据，也未据此验证 Cursor 的内部检索或服务效果。”

浏览器后备应改写为“验证了随课三份候选逻辑，实际项目文件未修改，Cursor 操作未执行”。实际工具建议也应由学生打开文件和运行检查支持。公开索引图中的后台更新、嵌入和检索服务没有在网页被实测，用虚线标明来源阅读。

## 10 分评分

| 项目 | 分数 | 可收集证据 |
|---|---:|---|
| Q1 规则与首答 | 1 | 区分算术结果和输入合法 |
| Q2 四文件定位 | 2 | 规则、函数、调用、测试各有实际对象 |
| Q3 原版复现 | 1 | 命令或网页输入、原输出和一项失败原因 |
| Q4 候选与实际差异 | 2 | 比较两个具体输入，识别真假值误判 |
| Q5 新输入与调用迁移 | 2 | 五题有依据，保留字符串兼容 |
| Q6 修改说明 | 1 | 问题、变化、测试、未覆盖齐全 |
| 执行来源准确 | 1 | AI、人工、浏览器、未执行不混写 |

不能操作 Cursor 不扣概念分；相应操作证据写未执行。原版预期失败和参考版通过属于本地代码检验，不是商业产品验收或真人试教。
