跳到主要内容

程序设计

A-Level 计算机科学 · 第 11 主题

训练
讲义 词汇表
11.1

编程基础

大纲
Candidates should be able to: Notes and guidance
Implement and write pseudocode from a given design presented as either a program flowchart or structured English
Write pseudocode statements for: • the declaration and initialisation of constants • the declaration of variables • the assignment of values to variables • expressions involving any of the arithmetic or logical operators input from the keyboard and output to the console
Use built-in functions and library routines Any functions not given in the pseudocode guide will be provided String manipulation functions will always be given

来源:剑桥国际大纲

深色屏幕上的一行行源代码
编程把一个设计变成写成代码的指令
一个程序员在电脑前工作
一个程序员写代码并随手测试它

From design to code

你应当能够把一个设计——一张流程图(flowchart,程序流程图)或结构化英语(structured English)——变成伪代码(pseudocode),然后变成一门真实的语言:

  1. 找出变量(variables)及其数据类型(data types)。
  2. 把输入/输出框变成 INPUT / OUTPUT
  3. 把判断菱形变成 IF...ELSE...ENDIF(或 CASE)。
  4. 把循环箭头变成 WHILEREPEAT...UNTILFOR
  5. 把处理框变成赋值或计算。
  6. 通过追踪一个小输入来检查。
一个从流程图符号到伪代码的映射:一个输入/输出平行四边形变成 INPUT 或 OUTPUT,一个判断菱形变成 IF...THEN 或 CASE,一个处理框变成一个赋值 x = expression,而一个循环箭头变成 WHILE、FOR 或 REPEAT
每个流程图符号变成一个伪代码关键字

Constants and variables

一个常量(constant)容纳一个从不改变的值;一个变量容纳一个可能改变的值。用一个类型声明它们:

一个变量的值可以改变;一个常量保持固定
一个变量的值可以改变;一个常量保持固定
CONSTANT Pi ← 3.14159
DECLARE Radius : REAL
DECLARE Area : REAL

Radius ← 5
Area ← Pi * Radius * Radius

对反复出现的固定值用常量(PiMaxScore);它们使代码更清晰,并且易于在一处改变。

Assignment and expressions

表示赋值(assignment):

Total ← Total + 1
Average ← Sum / Count

表达式用运算符(operators):

  • 算术 + - * /,加上 DIV(整数除法)和 MOD(余数):7 DIV 2 = 3;7 MOD 2 = 1
  • 比较 =<><><=>=
  • 逻辑 ANDORNOT

优先级(precedence,从高到低):NOT* / DIV MOD+ - → 比较 → ANDOR。不确定时用括号。

Input and output

OUTPUT "Enter your name:"
INPUT Name
OUTPUT "Hello, ", Name

Built-in functions and library routines

许多任务有现成的库例程(library routines),所以你不必自己写它们:

  • 字符串:LENGTH(s)LEFT(s, n)RIGHT(s, n)MID(s, start, len)UCASE(s)LCASE(s)
  • 数值:INT(x)ROUND(x)ABS(x)MOD(a, b)RANDOM()
  • 转换:STR(x)(数 → 字符串)、VAL(s)(字符串 → 数)。

使用题目参考列表里确切的名称。

字符串 COMPUTER 显示为八个带编号的字符框(位置 1 到 8),带算出的结果:LENGTH(s) = 8、LEFT(s, 3) = COM、MID(s, 4, 3) = PUT、RIGHT(s, 2) = ER,以及 UCASE/LCASE 改变字母的大小写
常见的字符串例程作用于 s = "COMPUTER"(位置 1–8)
探索

A variable is a labelled box

Each assignment stores one value in a named box; reassigning the same name overwrites it. Step through the program and watch each box take its current value.

词汇表 训练
英文 中文 拼音
flowchart 流程图 liú chéng tú
structured English 结构化英语 jié gòu huà yīng yǔ
pseudocode 伪代码 wěi dài mǎ
variables 变量 biàn liàng
data types 数据类型 shù jù lèi xíng
constant 常量 cháng liàng
assignment 赋值 fù zhí
operators 运算符 yùn suàn fú
precedence 优先级 yōu xiān jí
library routines 库例程 kù lì chéng
11.2

程序结构

大纲
Candidates should be able to: Notes and guidance
Use pseudocode to write: • an ‘IF’ statement including the ‘ELSE’ clause and nested IF statements • a ‘CASE’ structure • a ‘count-controlled’ loop: • a ‘post-condition’ loop • a ‘pre-condition’ loop
Justify why one loop structure may be better suited to solve a problem than the others

来源:剑桥国际大纲

选择(selection)选择哪些步骤运行。

IF age >= 18 THEN
    OUTPUT "Adult"
ELSE
    OUTPUT "Minor"
ENDIF
一张流程图:从开始,一个判断菱形测试 age >= 18;TRUE 分支输出 Adult,FALSE 分支输出 Minor,两者在末端汇合
一个 IF...ELSE 测试条件一次,然后恰好运行一个分支

对于多于两种情况,你可以用一个嵌套(nested)IF,但深度嵌套难以阅读——当把一个值对照几个选项测试时,一个 CASE 更清爽:

CASE OF Grade
    "A": OUTPUT "Excellent"
    "B": OUTPUT "Good"
    OTHERWISE: OUTPUT "Try again"
ENDCASE

Cambridge 的 CASE 允许单个值、值列表(1, 2, 3:)和范围(1 TO 5:)。

一个 CASE OF Grade 语句的流程图:该值被依次对照每个卫式(一个单值、一个值列表,然后一个范围)测试;第一个匹配的分支运行它的语句,否则 OTHERWISE 分支运行,而所有分支在 ENDCASE 汇合
一个 CASE 语句运行匹配该值的分支
探索

Selection (IF / ELSE)

Change the input and see which branch runs — the essence of selection.

词汇表 训练
英文 中文 拼音
selection 选择 xuǎn zé
nested 嵌套 qiàn tào
11.2

迭代

迭代(iteration)重复一个块。三个循环在主体运行多少次上不同。

Count-controlled (FOR) loop

一个计数循环(count-controlled loop)——当你知道要重复多少次时用它:

FOR i ← 1 TO 10
    OUTPUT i
NEXT i

一个 STEP 可以改变计数(例如 FOR i ← 10 TO 1 STEP -1)。最适合固定次数的重复或处理一个数组(array)的每个元素。

Pre-condition (WHILE) loop

一个前测循环(pre-condition loop)在每一趟之前测试条件,所以它可能运行次:

WHILE total < 100 DO
    INPUT n
    total ← total + n
ENDWHILE

Post-condition (REPEAT...UNTIL) loop

一个后测循环(post-condition loop)在每一趟之后测试条件,所以它总是至少运行一次:

REPEAT
    INPUT password
UNTIL password = correctPassword

Choosing the right loop

三个流程图列。FOR:一个计数框(i = 1 到 N)然后一个主体框,循环回去,做设定次数的趟数。WHILE:一个测试菱形在一个主体框之上,所以条件在主体之前被检查,循环可能运行零次。REPEAT:一个主体框在一个测试菱形之上,所以条件在主体之后被检查,循环至少运行一次
三个循环在条件被测试的位置上不同——在主体之前(WHILE)、之后(REPEAT),或做设定的次数(FOR)
  • 事先知道计数 → FOR
  • 可能需要零趟 → WHILE
  • 总是至少一趟 → REPEAT...UNTIL

用计数是否已知、以及主体是否必须至少运行一次来为你的选择辩护。一个典型的题目给出一个场景("要求密码直到正确,但总是至少要求一次")并问哪个循环合适。

探索

Trace a loop, pass by pass

A trace table records each variable after every pass of the loop. Watch the counter i climb while the running total builds up — exactly what an exam trace question asks you to fill in.

探索

Tracing a loop

Step through the loop and watch the variables change each pass — exactly what a trace table records.

词汇表 训练
英文 中文 拼音
iteration 迭代 dié dài
count-controlled loop 计数循环 jì shù xún huán
array 数组 shù zǔ
pre-condition loop 前测循环 qián cè xún huán
post-condition loop 后测循环 hòu cè xún huán
11.3

结构化编程

大纲
Candidates should be able to: Notes and guidance
Define and use a procedure
Explain where in the construction of an algorithm it would be appropriate to use a procedure
Use parameters A procedure may have none, one or more parameters A parameter can be passed by reference or by value
Define and use a function
Explain where in the construction of an algorithm it is appropriate to use a function A function is used in an expression, e.g. the return value replaces the call
Use the terminology associated with procedures and functions including procedure/function header, procedure/function interface, parameter, argument, return value
Write efficient pseudocode

来源:剑桥国际大纲

结构化编程(structured programming)从小的、有名字的子程序(subroutines)构建一个程序,每个有一件工作。

Procedure

一个过程(procedure)是一个有名字的块,它做一个动作;它可以取参数(parameters),但不返回一个值

PROCEDURE Greet(name : STRING)
    OUTPUT "Hello, ", name
ENDPROCEDURE

CALL Greet("Ada")

Function

一个函数(function)像一个过程,但它返回一个值,该值成为一个表达式的一部分。

FUNCTION Square(x : INTEGER) RETURNS INTEGER
    RETURN x * x
ENDFUNCTION

result ← Square(5) + 1     // result = 26

当子程序执行一个动作时用一个过程;当它为调用者计算一个值时用一个函数

两个面板。过程:调用 Greet(Ada) 做一个动作并打印 Hello, Ada,不返回值。函数:设 y = Square(5) 计算 5 乘 5 = 25,返回 25,所以 y 随即容纳 25
一个过程做一个动作并不返回任何东西;一个函数返回一个你在表达式中使用的值

Parameters

一个参数(parameter)是一个子程序声明用来接收输入的变量;调用者提供的值是实参(arguments)。传递它们的两种方式:

  • 传值(pass by value)——例程得到一个副本;它内部的改变不影响调用者。用于它只读取的输入。
  • 传引用(pass by reference)——例程得到一个到调用者变量的引用;改变确实影响调用者。当它必须更新一个参数时用。
两个内存框图。传值:调用者的变量 x = 5 被复制到一个单独的参数框 a = 5,所以改变 a 使 x 保持为 5。传引用:参数 a 是一个指向调用者自己的 x 框的箭头,所以改变 a 也改变 x
传值把值复制到一个新框;传引用让例程改变调用者自己的变量
PROCEDURE Swap(BYREF a : INTEGER, BYREF b : INTEGER)
    DECLARE temp : INTEGER
    temp ← a
    a ← b
    b ← temp
ENDPROCEDURE

Local vs global variables

一个局部变量(local variable)在一个子程序内部声明,只在它运行时存在。一个全局变量(global variable)在外部声明,处处可见。优先用局部变量和参数——大量使用全局变量使代码难以理解和测试。(一个名称可见的区域是它的作用域(scope)。)

一个大的外框标注为全局作用域,容纳全局变量 Total,处处可见,而一个较小的内框标注为 PROCEDURE Calc、局部作用域,容纳局部变量 temp,它只在 Calc 运行时存在
一个全局变量处处可见;一个局部变量只在它自己的过程内部存在

When to use a subroutine

在以下情况用一个子程序:

  • 同样的逻辑出现在不止一处——写它一次,调用它多次。
  • 一个块有一个清晰、有名字的目的——名称记录它做什么。
  • 程序复杂——把它分成部分(分解(decomposition))。
  • 你想孤立地测试一个片段

不要把它们做得那么小,以至于调用的代价超过里面的工作。

Terminology

  • definition——PROCEDURE ... ENDPROCEDURE(或函数)块。
  • call——它被调用的地方。argument——一个被传入的值。parameter——接收它的变量。
  • return value——一个函数传回什么。
  • procedure/function header——给出名称和参数的第一行(PROCEDURE Name(params)FUNCTION Name(params) RETURNS type)。
  • procedure/function interface / signature(签名)——名称 + 参数 + 返回类型:一个调用者要用它必须知道什么。

例题。 每个任务适合哪种循环?(a) 打印 12 的乘法表;(b) 不断读入数字,直到用户输入 0;(c) 反复要求输入密码,直到正确为止。判断的依据是循环体运行多少次,以及在何时检验条件。(a) 次数事先已知(12 次),所以用 FOR 循环。(b) 次数未知,而且第一个输入就可能已经是 0 - 所以条件必须在循环体之前检验:用 WHILE 循环,它可以运行次或多次。(c) 次数未知,但你必须至少问一次之后才有东西可检验 - 所以条件在循环体之后检验:用 REPEAT...UNTIL,它运行次或多次。决定性的问题是:循环体是否必须至少运行一次 - WHILE 可能运行零次,REPEAT 总是运行一次。

探索

The call stack: push on call, pop on return

Calling a subroutine pushes a new frame on top; returning pops it and hands a value back to the caller. The call that is running is always the frame on top.

词汇表 训练
英文 中文 拼音
structured programming 结构化编程 jié gòu huà biān chéng
subroutines 子程序 zi chéng xù
procedure 过程 guò chéng
parameters 参数 cān shù
function 函数 hán shù
arguments 实参 shí cān
pass by value 传值 chuán zhí
pass by reference 传引用 chuán yǐn yòng
local variable 局部变量 jú bù biàn liàng
global variable 全局变量 quán jú biàn liàng
scope 作用域 zuò yòng yù
decomposition 分解 fēn jiě
signature 签名 qiān míng
11.3

编写高效的伪代码

  • 把不变量移出循环——若一个值(一个不变量(invariant))不随循环计数器改变,在循环之前计算它一次。
  • 当答案被找到时尽早退出一个循环(一旦目标出现就停止一个线性查找(linear search))。
  • 避免冗余的工作——存储一个结果并重用它,而不是重新计算。
  • 选择正确的数据结构——当各项属于一起时,一个数组胜过许多分开的变量。
  • 当把一个值对照许多选项测试时,用 CASE 替换深度嵌套的 IF
  • 注释意图,而不是机制(// validate the postcode,而不是 // loop 6 times)。
  • 使用有意义的名称(numberOfPupils,而不是 n)并在使用前初始化变量
把从不改变的工作移出循环,所以它运行一次而不是每一趟
把不变的工作移出循环,所以它运行一次
词汇表 训练
英文 中文 拼音
invariant 不变量 bù biàn liàng
linear search 线性查找 xiàn xìng chá zhǎo
11.3

考试技巧

  • 区分一个过程(无返回值)和一个函数(返回一个值);知道传值对传引用
  • 选择正确的循环:当重复次数已知时用计数循环(FOR),否则用条件控制循环(WHILE/REPEAT)
  • 区分局部对全局变量和作用域;在可重用模块中优先用局部变量。

本主题的互动课程

逐步学习,并即时检测练习。

A-Level 计算机科学历年真题

A-Level 计算机科学的更多主题

登录或创建账号

IGCSE, A-Level & AP