伪代码示例
15 个 Cambridge IGCSE 和 A-Level 伪代码的完整示例,从第一个 OUTPUT 到冒泡排序。每个示例都给出输出,你还可以在下方的编辑器中运行它。
如何阅读这些示例
伪代码用结构化的英语描述程序的步骤,不受真实编程语言那些严格规则的约束。下面每个示例都采用 IGCSE 和 A-Level 考试使用的 Cambridge 风格:用 DECLARE 声明变量,用 ← 赋值,用 OUTPUT 输出,代码块用 ENDIF、NEXT 或 ENDWHILE 结束。
每个示例都会先提出问题,再给出伪代码,展示它产生的输出并解释其原理。点击“在编辑器中运行”,可以把任意示例载入页面顶部的编辑器,在那里逐行执行,观察变量的变化。刚接触这种语法?伪代码编辑器里有一个可点击的语法库,涵盖所有结构。
1. Hello, World
在屏幕上输出一条消息。
OUTPUT "Hello, World!"Hello, World!OUTPUT 会输出它后面的内容,文本要写在双引号中。这一行就是一个完整的程序:伪代码不需要 main 函数,也不需要导入任何东西。
2. 两数相加
存储两个整数,把它们相加并输出总和。
DECLARE a : INTEGER
DECLARE b : INTEGER
DECLARE total : INTEGER
a ← 12
b ← 30
total ← a + b
OUTPUT "The total is ", totalThe total is 42每个变量在使用前都要先声明名称和类型。箭头 ← 用来存储一个值,所以 total ← a + b 读作“total 变为 a 加 b”。OUTPUT 中的逗号会把文本和值连在同一行输出。
3. 判断奇偶
判断一个数是偶数还是奇数。
DECLARE n : INTEGER
n ← 17
IF n MOD 2 = 0 THEN
OUTPUT n, " is even"
ELSE
OUTPUT n, " is odd"
ENDIF17 is oddMOD 求除法的余数。偶数除以 2 没有余数,所以用 n MOD 2 = 0 来判断。IF 在两个分支中选择一个,ENDIF 结束这个代码块。在伪代码中,单个 = 用来比较两个值,从不用来赋值。
4. 给考试分数评等级
把满分 100 的分数转换成等级:80 分及以上为 A,60 至 79 分为 B,60 分以下为 C。
DECLARE score : INTEGER
DECLARE grade : CHAR
score ← 74
IF score >= 80 THEN
grade ← 'A'
ELSE
IF score >= 60 THEN
grade ← 'B'
ELSE
grade ← 'C'
ENDIF
ENDIF
OUTPUT "Score ", score, " gets grade ", gradeScore 74 gets grade B判断从最高的分数线往下进行,所以 74 分没有通过第一个判断,但通过了第二个。把一个 IF 放在另一个 IF 的 ELSE 里,就是 Cambridge 伪代码写 else-if 链的方式。CHAR 存放一个写在单引号中的字符。
5. 求 1 到 10 的和
把 1 到 10 的每个整数加起来。
DECLARE total : INTEGER
DECLARE i : INTEGER
total ← 0
FOR i ← 1 TO 10
total ← total + i
NEXT i
OUTPUT "Sum of 1 to 10 is ", totalSum of 1 to 10 is 55FOR 循环会运行固定的次数:i 依次取 1、2、3,一直到 10,NEXT i 标记循环体的结束。累计总和从 0 开始,每循环一次就增加一些。答案 55 与公式 n(n + 1) / 2 的结果一致。
6. 输出乘法表
输出 7 的乘法表的前五行。
DECLARE i : INTEGER
FOR i ← 1 TO 5
OUTPUT "7 x ", i, " = ", 7 * i
NEXT i7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35循环计数器 i 参与了计算,所以每次循环输出的行都不同。OUTPUT 可以用逗号把多段文本和多个值连在一起。
7. 用 WHILE 循环倒数
从 5 倒数到 1,然后输出最后一条消息。
DECLARE count : INTEGER
count ← 5
WHILE count > 0 DO
OUTPUT count
count ← count - 1
ENDWHILE
OUTPUT "Liftoff!"5
4
3
2
1
Liftoff!WHILE 循环在每次执行前检查条件,条件一旦为假就停止。这里的条件是 count > 0,循环体每次把 count 减一。如果漏掉减一的那一行,循环就永远不会结束。事先不知道要循环多少次时,就用 WHILE。
8. 找出数组中的最大数
在六个数的列表中找出最大值。
DECLARE nums : ARRAY[1:6] OF INTEGER
DECLARE i : INTEGER
DECLARE largest : INTEGER
nums[1] ← 14
nums[2] ← 3
nums[3] ← 27
nums[4] ← 9
nums[5] ← 21
nums[6] ← 6
largest ← nums[1]
FOR i ← 2 TO 6
IF nums[i] > largest THEN
largest ← nums[i]
ENDIF
NEXT i
OUTPUT "The largest number is ", largestThe largest number is 27ARRAY[1:6] 声明了编号为 1 到 6 的六个位置,因为 Cambridge 的数组通常从 1 开始。程序先假设第一个元素最大,然后把其他每个元素与它比较,保留较大的那个。把数组遍历一遍后,largest 中就是答案。
9. 计算平均分
求四次测验分数的平均值。
DECLARE marks : ARRAY[1:4] OF INTEGER
DECLARE i : INTEGER
DECLARE total : INTEGER
marks[1] ← 70
marks[2] ← 85
marks[3] ← 64
marks[4] ← 91
total ← 0
FOR i ← 1 TO 4
total ← total + marks[i]
NEXT i
OUTPUT "Average mark: ", total / 4Average mark: 77.5循环把数组中的每个元素加到 total 上,然后程序除以分数的个数。/ 运算符得到的是小数结果,所以输出是 77.5。想要整数除法时,改用 DIV。
10. 线性查找
在一个名字列表中找出 Dara 所在的位置。
DECLARE names : ARRAY[1:5] OF STRING
DECLARE i : INTEGER
DECLARE found : BOOLEAN
names[1] ← "Ana"
names[2] ← "Ben"
names[3] ← "Chen"
names[4] ← "Dara"
names[5] ← "Eli"
found ← FALSE
i ← 1
WHILE i <= 5 AND found = FALSE DO
IF names[i] = "Dara" THEN
found ← TRUE
ELSE
i ← i + 1
ENDIF
ENDWHILE
IF found = TRUE THEN
OUTPUT "Dara is at position ", i
ELSE
OUTPUT "Not found"
ENDIFDara is at position 4线性查找从头开始逐个检查元素。WHILE 条件会在找到名字或检查完所有元素时停止循环,标志变量 found 记录了是哪种情况。它适用于未排序的数据,但列表很长时,可能每个元素都要比较一次。
11. 冒泡排序
把五个数按升序排列。
DECLARE nums : ARRAY[1:5] OF INTEGER
DECLARE i : INTEGER
DECLARE j : INTEGER
DECLARE temp : INTEGER
nums[1] ← 5
nums[2] ← 1
nums[3] ← 4
nums[4] ← 2
nums[5] ← 8
FOR i ← 1 TO 4
FOR j ← 1 TO 5 - i
IF nums[j] > nums[j + 1] THEN
temp ← nums[j]
nums[j] ← nums[j + 1]
nums[j + 1] ← temp
ENDIF
NEXT j
NEXT i
FOR i ← 1 TO 5
OUTPUT nums[i]
NEXT i1
2
4
5
8冒泡排序比较每一对相邻的元素,顺序不对就交换它们。外层循环每执行一轮,剩余元素中最大的值就会移到末尾,所以内层循环每次都可以少比较一个元素。交换需要第三个变量 temp,在复制另一个值时暂存其中一个值。
12. 用函数求阶乘
编写一个返回 n 的阶乘(n!)的函数,然后用它算出 5!。
FUNCTION Factorial(n : INTEGER) RETURNS INTEGER
DECLARE result : INTEGER
DECLARE i : INTEGER
result ← 1
FOR i ← 2 TO n
result ← result * i
NEXT i
RETURN result
ENDFUNCTION
OUTPUT "5! = ", Factorial(5)5! = 120FUNCTION 接收参数,完成计算后用 RETURN 返回一个值;函数头会写明返回值的类型。在函数内部声明的变量只在函数运行期间存在。5! 等于 5 × 4 × 3 × 2 × 1,也就是 120。
13. 统计单词中的元音
统计单词 PSEUDOCODE 中有多少个元音字母。
DECLARE word : STRING
DECLARE letter : CHAR
DECLARE vowels : INTEGER
DECLARE i : INTEGER
word ← "PSEUDOCODE"
vowels ← 0
FOR i ← 1 TO LENGTH(word)
letter ← SUBSTRING(word, i, 1)
IF letter = 'A' OR letter = 'E' OR letter = 'I' OR letter = 'O' OR letter = 'U' THEN
vowels ← vowels + 1
ENDIF
NEXT i
OUTPUT word, " has ", vowels, " vowels"PSEUDOCODE has 5 vowelsLENGTH 返回字符串中的字符个数,SUBSTRING(word, i, 1) 从位置 i 开始取出一个字符。循环访问每个字符,只要是 A、E、I、O 或 U,就给计数器加一。
14. FizzBuzz
输出 1 到 15,但遇到 3 的倍数输出 Fizz,遇到 5 的倍数输出 Buzz,遇到既是 3 又是 5 的倍数输出 FizzBuzz。
DECLARE i : INTEGER
FOR i ← 1 TO 15
IF i MOD 15 = 0 THEN
OUTPUT "FizzBuzz"
ELSE
IF i MOD 3 = 0 THEN
OUTPUT "Fizz"
ELSE
IF i MOD 5 = 0 THEN
OUTPUT "Buzz"
ELSE
OUTPUT i
ENDIF
ENDIF
ENDIF
NEXT i1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz判断的顺序很重要。15 既是 3 的倍数也是 5 的倍数,所以针对 15 的判断必须放在最前面,否则程序会输出 Fizz,永远走不到 FizzBuzz。这是一道经典的面试热身题,考的正是这种推理。
15. 用 REPEAT UNTIL 尝试密码
依次尝试最多三个密码,只要有一个正确就允许访问。
DECLARE attempts : ARRAY[1:3] OF STRING
DECLARE tries : INTEGER
DECLARE guess : STRING
attempts[1] ← "hunter1"
attempts[2] ← "letmein"
attempts[3] ← "open sesame"
tries ← 0
REPEAT
tries ← tries + 1
guess ← attempts[tries]
OUTPUT "Try ", tries, ": ", guess
UNTIL guess = "open sesame" OR tries = 3
IF guess = "open sesame" THEN
OUTPUT "Access granted"
ELSE
OUTPUT "Locked out"
ENDIFTry 1: hunter1
Try 2: letmein
Try 3: open sesame
Access grantedREPEAT ... UNTIL 循环在末尾检查条件,所以循环体至少会执行一次。密码匹配或者试完第三次后,循环就停止。猜测的密码来自一个数组,这样示例不用输入就能运行;在考试答案中,通常会用 INPUT 逐个读取。
伪代码示例常见问题
伪代码的例子是什么样的?
IF score >= 50 THEN OUTPUT "Pass" ELSE OUTPUT "Fail" ENDIF。它读起来几乎就是英语,但遵循固定的规则,所以可以逐行转换成 Python、Java 或任何其他语言。本页的 15 个程序从一行代码一直讲到查找和排序。伪代码怎么写?
DECLARE 声明变量,用 ← 赋值,用 IF 做判断,用 FOR 或 WHILE 做重复,用 OUTPUT 输出结果。每个代码块的主体都要缩进,用对应的结束关键字关闭,并且每行只写一个操作。每种考试的伪代码都一样吗?
DECLARE 和 ← 箭头,AQA 使用 ← 但不需要声明,OCR 的 Exam Reference Language 看起来像 Python,Edexcel 则写成 SET ... TO。这里的示例采用 Cambridge 风格;伪代码编辑器可以在这四种风格之间切换。伪代码可以运行吗?
可以,就在这个页面上。伪代码不是真正的编程语言,所以没有官方编译器,但这里的编辑器可以在你的浏览器中运行 Cambridge 伪代码,显示输出,并逐行执行。在任意示例下方点击“在编辑器中运行”即可。
伪代码和流程图有什么区别?
两者都是在写代码之前描述算法。流程图用方框和箭头画出步骤,适合只有少量判断的简短流程。伪代码用结构化的文字写出步骤,更适合较长的程序,也能更直接地转换成真正的代码。
伪代码中必须声明变量吗?
DECLARE name : TYPE。其他风格(比如 AQA)则不需要声明。声明变量还能告诉读者它存放的是什么类型的值。