程式控制结构
进阶任何程式逻辑都由三种控制结构组成:顺序结构逐步执行,分支结构按条件选路,循环结构重复执行;配合变量、赋值与布尔条件,以伪代码便能写出语言中立的算法。
- 变量是储存资料的具名位置,赋值把右边算式的结果存入左边变量。
- 三种控制结构:顺序逐步执行、分支按条件选路、循环重复执行,可层层套叠。
- 次数已知用计数循环,次数不明用条件循环;循环变量每轮必须更新。
文体小知识:科技知识说明文——讲解变量与赋值的基础上,剖析顺序、分支、循环三种控制结构,以伪代码训练语言中立的程式逻辑。
§课文原文 Passage
1程式的本质是对资料的处理:变量是储存资料的具名位置,赋值把资料放入变量,例如把总和设为零;处理资料的指令则由控制结构安排次序。理论与实践都证明:只需顺序、分支、循环三种基本结构,便足以写出任何逻辑的程式。
2顺序结构是最基本的结构:指令按书写次序逐一执行,上一句完成才轮到下一句。看似简单,次序却至关重要,例如必须先输入分数才计算总和;又如交换两个变量的值,需要第三个暂存变量,先后次序错了资料便会遗失。
3分支结构让程式按条件选择不同路径:单向分支只在条件成立时执行一段指令;双向分支条件成立走一路,不成立走另一路;多向分支与巢状分支则应付多于两种情况,例如把分数分为甲乙丙丁等级。
4循环结构让程式重复执行一段指令:计数循环适合次数已知的重复,例如逐个处理全班三十个分数;条件循环适合次数不明、由条件决定的重复,例如不断要求输入直至密码正确。循环变量必须在回圈内更新,否则条件永远不变,便成死循环。
5条件由比较与逻辑运算符构成,结果是布尔值,只有成立与不成立两种;复杂条件可用且、或、非组合。三种结构可以互相套叠:循环之内可以有分支,分支之内可以有循环,层层组合,便是解决现实问题的全部工具。
1重点摘要 Summary
任何程式逻辑都由三种控制结构组成:顺序结构逐步执行,分支结构按条件选路,循环结构重复执行;配合变量、赋值与布尔条件,以伪代码便能写出语言中立的算法。
2生字卡 Vocabulary
储存资料的具名位置,其值可在程式执行期间改变。
把数值或运算结果存入变量的动作,例如把总和设为总和加分数。
指令按书写次序逐一执行的控制结构,是最基本的结构。
按条件成立与否选择执行路径的结构,有单向、双向与多向等形式。
重复执行一段指令的结构,分为次数已知的计数循环与由条件控制的条件循环。
由比较与逻辑运算符组成的式子,其结果只有成立与不成立两种,用于分支与循环。
只有成立与不成立两种取值的资料类型,是条件判断的基础。
进行运算的记号,包括算术运算符、比较运算符与逻辑运算符(且、或、非)。
因循环条件永远成立而无法结束的循环,多因循环变量未有更新。
把一种控制结构放进另一种之内,例如循环之内有分支,层层组合出复杂逻辑。
3逐步讲解 Steps
- 第一步:变量与赋值变量可想像为一个贴了名称的储存格,程式执行期间可随时读取或更改其内容;赋值便是把资料放进变量的动作,写法一般为变量在左、数值或算式在右。赋值会覆盖旧值,而右边算式可引用变量自身,例如把总和设为总和加分数,意即用新分数更新累计。举个例子:初学者常问「总和等于总和加分数」岂非矛盾,其实右边先用旧值算好,才存回左边,执行一次总和便增加一个分数,这是累加的基本手法。
- 第二步:顺序结构与次序的重要顺序结构按书写次序逐一执行指令,上一句未完成,下一句不会开始。次序错了,结果便错:必须先输入人数与分数,才可计算平均;必须先把计数器设为零,才开始累加。最经典的例子是交换两个变量的值:直接把甲设为乙,甲的原值便告消失,正确做法是先把甲存入暂存变量,再把乙设为甲,最后把暂存变量设回乙。举个例子:以五十与二十为例逐步执行,可见暂存变量保住了五十这个原值,交换才得以完成。
- 第三步:分支结构——单向与双向分支结构按条件成立与否选路。单向分支只在条件成立时执行一段指令,不成立便跳过,例如成绩大于或等于五十便把及格人数加一。双向分支则两边都有安排:条件成立执行一段,不成立执行另一段,例如成立输出及格,不成立输出不及格,两条路必不齐做、亦不齐跳。举个例子:判断分数是否及格时,用双向分支能把两种结果都交代清楚;若只需处理及格者,例如及格才加分,用单向分支便可,题目要求决定用哪一种。
- 第四步:多向分支与巢状分支情况多于两种时,可用巢状分支层层判断,或多向分支一次分流。以评级为例:分数大于或等于八十为甲,六十或以上为乙,其余为丙——巢状写法先判断是否达八十,是则甲,否则再判断是否达六十,是则乙,否则丙。巢状必须留意层次分明,内层判断只在外层条件不成立时才会执行。举个例子:多个条件的次序不可随便调换,若先判断是否达六十,八十的分数也会被评为乙;由严到宽依次判断,是多向分支的基本原则。
- 第五步:条件与布尔运算条件由比较运算符构成,包括大于、小于、等于、大于或等于、小于或等于与不等于,结果只有成立与不成立两种,属布尔值。复杂条件以逻辑运算符组合:且要求两边同时成立;或要求任一边成立;非把成立与不成立倒转。举个例子:「分数大于或等于五十且分数小于六十」锁定五十至五十九分的区间;「年满十二岁或身高达一米四」则满足其一即可,写条件时宜先想清楚要同时满足还是满足其一。
- 第六步:计数循环与条件循环循环结构分两类。计数循环适合次数已知的重复:设计数器由一数到全班人数,每轮输入一个分数并累加,例如三十人便整整重复三十次。条件循环适合次数不明的重复:以 WHILE 条件控制,每轮先检查条件,成立才继续,例如不断要求输入密码直至正确为止。两者可互换,但次数已知时用计数循环较清晰。举个例子:计一班平均分宜用计数循环,因为人数已知;等使用者按停止键才结束的输入,则宜用条件循环。
- 第七步:死循环的成因与三结构的组合条件循环若在循环之内从不更新影响条件的变量,条件便永远成立,程式永远做不完,这是死循环;例如计数器忘记加一,条件始终少于人数。避免方法是在每轮回圈内更新变量,确保条件最终不成立。三种结构可以套叠:循环之内放分支判断及格,分支之内放循环重试输入。举个例子:统计全班分数的程式,正是顺序定初值、循环读入、循环内分支计及格人数、循环后顺序输出——四步组合,任何复杂逻辑都不外乎如此层层搭建。
4图解 Diagrams
5例题示范 Example
应用题:某班完成测验,人数以 N 表示。试以伪代码写出算法:逐个输入全班分数,输出平均分与及格人数(五十分或以上为及格),并指出所用控制结构与必须初始化的变量。
- 顺序结构定初值:输入人数 N;把总和 T、及格人数 P、计数器 C 都设为零——三个变量都必须初始化,否则累加与计数无从开始。
- 循环结构读入全班:WHILE C 少于 N 时重复——输入分数 S,把 T 设为 T 加 S。
- 分支结构判断及格:在循环之内,若 S 大于或等于五十,便把 P 设为 P 加一(单向分支);每轮最后把 C 设为 C 加一,保证循环有限,避免死循环。
- 顺序结构输出结果:离开循环后,把平均 A 设为 T 除以 N,输出 A 与 P。
- 答案:伪代码:INPUT N;T 设为 0;P 设为 0;C 设为 0;WHILE C < N 重复:INPUT S;T 设为 T + S;若 S >= 50 则 P 设为 P + 1;C 设为 C + 1;ENDWHILE;A 设为 T / N;OUTPUT A;OUTPUT P。所用结构:顺序(初始化与输出)、循环(读入全班)、分支(判断及格);必须初始化的变量是 T、P、C。
6常见错误 Mistakes
75 题快测 Quick check
Q1三种基本控制结构是甚么?
Q2全班人数已知,要逐个输入分数并计总和,宜用哪种循环?为甚么?
Q3循环之内漏写「计数器加一」,会发生甚么事?
Q4条件「分数大于或等于五十且分数小于六十」涵盖哪个分数范围?
Q5交换变量甲与乙的值,为甚么需要第三个暂存变量?
8重点回顾 Recap
- 变量是储存资料的具名位置,赋值把右边算式的结果存入左边变量。
- 三种控制结构:顺序逐步执行、分支按条件选路、循环重复执行,可层层套叠。
- 次数已知用计数循环,次数不明用条件循环;循环变量每轮必须更新。
- 条件产生布尔值,以比较运算符配合且、或、非组合复杂判断。
- 多向判断由严到宽依次进行;累加变量使用前必须初始化为零。