Menu
CoddyTech

伪代码示例

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 ", total
输出
The 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"
ENDIF
输出
17 is odd

MOD 求除法的余数。偶数除以 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 ", grade
输出
Score 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 ", total
输出
Sum of 1 to 10 is 55

FOR 循环会运行固定的次数: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 i
输出
7 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 ", largest
输出
The largest number is 27

ARRAY[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 / 4
输出
Average mark: 77.5

循环把数组中的每个元素加到 total 上,然后程序除以分数的个数。/ 运算符得到的是小数结果,所以输出是 77.5。想要整数除法时,改用 DIV。

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 i
输出
1
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! = 120

FUNCTION 接收参数,完成计算后用 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 vowels

LENGTH 返回字符串中的字符个数,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 i
输出
1
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"
ENDIF
输出
Try 1: hunter1
Try 2: letmein
Try 3: open sesame
Access granted

REPEAT ... UNTIL 循环在末尾检查条件,所以循环体至少会执行一次。密码匹配或者试完第三次后,循环就停止。猜测的密码来自一个数组,这样示例不用输入就能运行;在考试答案中,通常会用 INPUT 逐个读取。

伪代码示例常见问题

伪代码的例子是什么样的?
一个简短的例子是判断考试是否通过:IF score >= 50 THEN OUTPUT "Pass" ELSE OUTPUT "Fail" ENDIF。它读起来几乎就是英语,但遵循固定的规则,所以可以逐行转换成 Python、Java 或任何其他语言。本页的 15 个程序从一行代码一直讲到查找和排序。
伪代码怎么写?
先想清楚程序要做什么,然后用一小组关键字按顺序写出步骤:用 DECLARE 声明变量,用 ← 赋值,用 IF 做判断,用 FOR 或 WHILE 做重复,用 OUTPUT 输出结果。每个代码块的主体都要缩进,用对应的结束关键字关闭,并且每行只写一个操作。
每种考试的伪代码都一样吗?
不一样。Cambridge(IGCSE 和 A-Level)使用 DECLARE 和 ← 箭头,AQA 使用 ← 但不需要声明,OCR 的 Exam Reference Language 看起来像 Python,Edexcel 则写成 SET ... TO。这里的示例采用 Cambridge 风格;伪代码编辑器可以在这四种风格之间切换。
伪代码可以运行吗?

可以,就在这个页面上。伪代码不是真正的编程语言,所以没有官方编译器,但这里的编辑器可以在你的浏览器中运行 Cambridge 伪代码,显示输出,并逐行执行。在任意示例下方点击“在编辑器中运行”即可。

伪代码和流程图有什么区别?

两者都是在写代码之前描述算法。流程图用方框和箭头画出步骤,适合只有少量判断的简短流程。伪代码用结构化的文字写出步骤,更适合较长的程序,也能更直接地转换成真正的代码。

伪代码中必须声明变量吗?
在 Cambridge 伪代码中必须声明:评分标准要求在使用变量之前写出 DECLARE name : TYPE。其他风格(比如 AQA)则不需要声明。声明变量还能告诉读者它存放的是什么类型的值。
Coddy 编程语言插图

跟着 Coddy 从伪代码走向真正的代码

开始