本章精髓 所有工具型软件都是同一个骨架:拿到输入、按规则处理、给出输出。三段里最容易出事的是中间那段:规则没写死,它就替你猜;边界没交代,算出来的数没法拿去用。
学完本章后,你应该能够:
- 把一个计算需求拆成输入、公式、取整、边界、校验五行,写成一张规则卡;
- 说清为什么输入框里的 8 不能直接参与计算,以及电脑算小数为什么会多出几位;
- 指定取整方式与边界处理,并说出不指定的后果;
- 认出静默失败:程序不报错、页面正常,只是给出了一个错误的答案;
- 用五组极端数据把自己做的工具测一遍,包括正好用满和填汉字。
成品 · 规则卡 · 给规则不给形容词
先看规则少写一句会怎样,再看规则卡怎么写。
1.1本章成品:《我还能翘几节课》
输入三个数:本课程总课时、已缺勤次数、学校规定的缺勤上限比例。算出还剩几次额度,并按三种情况分别给出提示。
所有工具型软件都是这个骨架,换个题目也一样
成品在 第06章演示_翘课计算器.html,双击打开就能试。断网也能算,填的数字全部在本机处理,不会发送出去。
1.2规则少写一句,答案就差一次
把同一组数交给三种不同的取整方式,结果是这样的:
这个决定应当由谁来做。规则里不写清取整方式,它就由大模型替你定了。打开 第06章演示_取整对照.html 可以换着数试,看两种取法在哪些数上分开。
1.3规则卡:本章真正的产出物
本章不写需求文档,写规则卡。五行,每一行都是给它的一条硬指令,一个字都不让它猜。
这张卡上任何一行少写,都会在成品上留下一处问题。五行写完,提示词也就写好了。
1.4本章新技巧:给规则,不给形容词
前几章的需求可以有一定弹性,界面风格大致合适即可。本章不行:计算类的程序,规则差一个字,答案就差一个数,而这个数会被人当真拿去使用。
所以本章的提示词几乎全是硬性规定,没有一句形容词。规则卡有几行,提示词就有几段。
1.5可直接复制的提示词
1.6大模型的常见偏差
第06章演示_翘课计算器.html;取整对照用 第06章演示_取整对照.html,反面教材用 第06章演示_静默失败.html。三个文件都是现成的,不依赖网络。
输入处理输出 · 类型 · 浮点 · 取整
本章的核心内容集中在这一部分和下一部分。
这八个术语会原样出现在报错信息、平台界面与技术文档中。前五个在本部分讲解,后三个在第三、四部分讲解。
2.1五个知识点,一个一个看
换成绩点换算器、稿费估算器,还是这三段
现象:几个输入框、一个按钮、一块结果区。
概念:工具型软件都是输入、处理、输出三段。头尾两段一眼能看见,中间那一段藏在代码里:规则、取整、边界全都在这一段,也全靠你写清楚。
类比:投币、机器运转、出货。币投进去了,出来什么,取决于里面那套机关怎么设的。
上面那一行不是算错,它根本不是在做加法
现象:两个数相加,结果变成了 88。
概念:输入框里取出来的永远是字符串(string),也就是文字。文字相加是首尾拼接,不是求和。能参与四则运算的是数值(number)。两种类型写出来很相似,区别只在有没有引号。
类比:"8"是纸上写的八字,8 是八个苹果。两张纸条粘在一起还是纸条,不会变成十六个苹果。
转换失败不报错,只是给出一个 NaN
现象:结果区出现了一个叫 NaN 的东西。
概念:把字符串变成数值的过程叫类型转换(type conversion)。转换失败时得到 NaN,含义是"这不是一个数"。转换之后必须紧接着检查是不是 NaN,否则后面每一步计算都会把它一路带下去,最终显示在页面上。
类比:把纸条上的数字读出来记进账本。读不出来的那几张要单独挑开,不能当成 0 记进去。
这几位不是缺陷,是小数在电脑里存不精确
现象:结果区出现一串很长的小数。
概念:电脑用二进制存小数,很多十进制小数存不精确,这叫浮点数精度问题。因此凡是给人看的数字都要指定显示方式:取整,或者保留几位小数。
类比:用计算器算 1÷3,屏幕上是一串 3,永远除不尽。电脑存小数也有除不尽的时候。
换成 6.5,四舍五入会跳到 7,向下还是 6
现象:还剩 2.7 次机会,这个数能不能当 3 次用。
概念:取整有三种:向下(舍掉小数)、向上(进一位)、四舍五入。三种在不同的数上给不同结果。规则里不指定,它通常选四舍五入,而"还能缺勤几次"这一类问题,选错方向会造成实际损失。
类比:剩 2.7 次额度,按 2 次用是保守,按 3 次用是冒险。这个决定应当由你来做。
校验 · 边界 · 那段代码
出问题的地方几乎都在边界上,正常范围之内反而不容易出错。
3.1另外两个知识点
三种输入都能填进去,也都算得出东西
现象:填一个汉字进去,结果显示 NaN;填一个负数进去,它也照样给出了答案。
概念:输入校验就是在算之前先检查:填没填、是不是数字、在不在合理范围内。不通过就给出提示并且不进行计算,不能算出一个异常的数却不作说明。
类比:窗口的工作人员会把填错的表退回,不会拿着一张乱填的表继续往下办。
正好等于 0 的那一格,说法要单独定
现象:剩余额度正好是 0 时,页面上显示"还剩 0 次",这句话读起来像是还能缺勤一次。
概念:边界值是规则的临界点:等于上限算不算超、正好为 0 怎么说、负数怎么显示。出问题的地方几乎都在边界上,正常范围之内反而不容易出错。
类比:报名满 30 人截止,第 30 个人算进还是算不进。这一句不写清楚,现场一定会有争议。
3.2规则卡落到代码上,正好是四段
顺序和卡上一样:拿输入、校验、按规则算、分边界给话。
// ① 拿到输入:输入框里取出来的永远是文字
var t = document.getElementById('total').value.trim();
var a = document.getElementById('absent').value.trim();
var p = document.getElementById('rate').value.trim();
// ② 校验:必填、必须是数字、不能为负、比例不能超过 100
if (t === '' || a === '' || p === '') { err.textContent = '三项都要填。'; return; }
var T = Number(t), A = Number(a), P = Number(p); // 文字转成数值
if (isNaN(T) || isNaN(A) || isNaN(P)) { err.textContent = '请填数字,不要填汉字。'; return; }
if (T <= 0 || A < 0 || P < 0) { err.textContent = '课时要大于 0,次数和比例不能是负数。'; return; }
if (P > 100) { err.textContent = '上限比例不会超过 100。'; return; }
// ③ 按规则计算:向下取整,结果一律是整数
var allow = Math.floor(T * P / 100);
var left = allow - A;
// ④ 边界:三种情况,三种说法
if (left > 0) { num.textContent = '还剩 ' + left + ' 次'; }
else if (left === 0) { num.textContent = '已用满'; cap.textContent = '再缺一次就超'; }
else { num.textContent = '已超出 ' + (-left) + ' 次'; }
3.3边界测试表长这样
以翘课计算器为例,总课时 32、上限 20%,可缺勤 6 次:
换成自己的题目时,把左边那一列换成本题的临界值即可。第二行和第五行最容易通不过:正好卡在临界点,以及填了汉字,是这类工具最常出问题的两处。
不中断 · 页面正常 · 答案是错的
这一类问题从本章起会一路跟到学期末。
4.1反面教材:三个实验
打开 第06章演示_静默失败.html,这一版没写校验也没写取整。按上面的提示做三个实验,三次都能看到不同的毛病。
4.2第八个知识点
后一种更危险,因为它看上去没有问题
现象:上面那三个毛病有个共同点:都不报错、不中断,页面显示正常,只是给出了一个错误的答案。
概念:行业里把这一类叫静默失败。程序照常运行,没有任何异常提示,错误会被下游一路当真用下去。崩掉时你知道要修;给出一个错的数,你可能就直接采信了。
类比:秤没坏,只是少了两百克。它照样报数,你也照样付钱。
4.3前沿三分钟:算错一个数的代价
软件出的错分两种。一种是程序中断、打不开、报出一屏红字,这一种其实不可怕,一眼就知道要修。另一种是它照常运行,只是给出了一个错的数,页面显示正常,没有任何异常提示。
金融、医疗、计量这些领域最怕后一种,因为错误会被下游一路当真用下去,等到发现时,中间已经经手了很多人。取整方向、边界归属、单位换算是这类问题最集中的三个地方,恰好就是本章讲的三条。
所以本章的方法不是技巧,是习惯:先自己用计算器算一遍,再看程序给的对不对。这个习惯不会随工具变好而失效,反而随工具变好而更重要,因为它给出的数字看上去越来越可信。
三选一 · 规则卡 · 五组边界
上机环节由此开始,当堂完成并提交。
5.1三个题目,任选其一
输入各科分数与学分,算加权绩点;支持两种换算规则切换。
通用输入字数、千字单价、体裁系数,算税前税后稿费。
偏文科输入原浓度、目标浓度、目标体积,算需要的原液和溶剂量。
偏理工三个题目都要有取整或保留小数的规定、至少三条边界规定、完整的输入校验。允许更换题材,验收标准不变。
5.2上机六步
照着走,每一步都有产出。第一步和第四步是本章的关键:第一步促使你把规则想清楚,第四步促使你去试那些通常不会有人填的数。
5.3共同验收标准
5.4常见错误与处理
5.5上机时容易卡住的三处
5.6提交内容
提交方式:按教师提供的作业模板(Word)填写,文档开头注明所选题目。提交渠道见课堂通知。当堂提交。
5.7再进一步(选做)
给你的工具加一个规则切换:比如绩点换算器支持四分制和五分制两种算法,用一个下拉框切换。
加完之后会发现一件事:规则卡要写两份,公式、取整、边界都可能不同。实际工作中的工具大多如此,同一个界面下面藏着好几套规则,而每一套都要有人把它写清楚。
- 工具型软件都是输入、处理、输出三段。看得见的是头尾,出问题的在中间:规则、取整、边界都藏在那一段。
- 输入框拿到的是文字,不是数字。要先做类型转换,转不出来会得到 NaN;电脑算小数会多出几位,所以给人看的数字都要指定显示方式。
- 取整方向要由你来定,不定它就替你定。定的时候自问一句:算多了谁承担后果,算少了谁承担后果。
- 出问题的地方几乎都在边界上:正好卡在临界点、填 0、填负数、填汉字。这四种通常不会有人填,但总会有人填。
- 不报错,但结果不对,比崩掉危险得多。崩掉时你知道要修;给出一个错的数,你可能就直接采信了。所以先自己算一遍,再看它算的对不对。