Skip to content · ⁨Bỏ qua nội dung⁩
Subjects · ⁨Môn học⁩
  • 1 Style and layout · ⁨Phong cách & bố cục⁩
    1.1

    Từ khóa và viết hoa

    English

    Pseudocode 伪代码 is the language Cambridge writes algorithms 算法 in. It is not a real programming language — no computer runs it — but the exam marks it as if it were, so the form matters.

    Every keyword 关键字 is written in upper case: IF, REPEAT, PROCEDURE, OUTPUT.

    • Write IF, never if or If.
    • A keyword can never be used as a name of your own: you may not call a variable FOR.

    Common mistakes

    • Lower-case keywords. The mark scheme expects upper case.
    • Inventing keywords. Only the words in this handout are in the syllabus.
    Tiếng Việt

    Pseudocode là ngôn ngữ Cambridge viết thuật toán. Nó không phải là một ngôn ngữ lập trình thực sự — không máy tính nào chạy được nó — nhưng đề thi chấm điểm như thể nó là thật, vì vậy hình thức rất quan trọng.

    Mỗi từ khóa đều được viết in HOA: IF, REPEAT, PROCEDURE, OUTPUT.

    DECLARE Count : INTEGER
    Count ← 3
    IF Count > 0
      THEN
        OUTPUT "Ready"
    ENDIF
    
    • Viết IF, tuyệt đối không viết if hay If.
    • Một từ khóa không bao giờ được dùng làm tên của bạn: bạn không thể đặt tên biến là FOR.

    Lỗi thường gặp

    • Các từ khóa in thường. Bảng điểm yêu cầu viết in hoa.
    • Tự sáng tạo từ khóa. Chỉ những từ trong tài liệu này mới nằm trong chương trình học.
    1.2

    Tên gọi

    English

    An identifier 标识符 is the name you give a variable 变量, a constant 常量, a procedure 过程 or a function 函数.

    Four rules, all from the syllabus:

    • It must start with a capital letter: Count, not count.
    • It may hold only letters and digits — no spaces, no punctuation.
    • It is not case-sensitive 不区分大小写, so Count and COUNT are the same name. Pick one spelling and keep it.
    • Make it mean something. NumberOfPlayers earns the reader's time; N does not.

    Common mistakes

    • count ← 0 — a lower-case start. 0478 requires the capital.
    • Number of players — spaces are not allowed inside a name.
    Tiếng Việt

    Một tên gọi là cái tên bạn gán cho biến, hằng, thủ tục hoặc hàm.

    DECLARE NumberOfPlayers : INTEGER
    NumberOfPlayers ← 4
    OUTPUT NumberOfPlayers
    

    Bốn quy tắc, tất cả đều đến từ chương trình học:

    • Phải bắt đầu bằng chữ cái viết hoa: Count, không phải count.
    • Nó chỉ chứa chữ cái và chữ số — không dấu cách, không dấu câu.
    • Nó không phân biệt hoa/thường, nên Count và COUNT là cùng một tên. Chọn một cách viết và duy trì nhất quán.
    • Make it mean something. NumberOfPlayers giúp người đọc hiểu ngay; N thì không.

    Lỗi thường gặp

    • count ← 0 — bắt đầu bằng chữ thường. 0478 yêu cầu chữ cái in hoa.
    • Number of players — không được phép có dấu cách bên trong tên.
    1.3

    Comment và thụt lề

    English

    A comment 注释 starts with // and runs to the end of the line. It is for the human reader; the algorithm ignores it.

    Indentation 缩进 shows which statements are inside a structure. The syllabus asks for four spaces per level, with one exception you must know:

    • THEN and ELSE are indented two spaces from their IF.
    • The statements under them are indented four.
    • ENDIF lines up with its own IF.

    Common mistakes

    • Putting THEN on the IF line. That is the A-Level 9618 layout — see topic 11.
    • No indentation at all. A marker has to see the structure to award the structure marks.
    Tiếng Việt

    Một comment bắt đầu bằng // và kéo dài đến hết dòng. Nó dành cho người đọc; thuật toán bỏ qua nó.

    // Swap the values of X and Y
    DECLARE X, Y, Temp : INTEGER
    X ← 1
    Y ← 2
    Temp ← X   // temporarily store X
    X ← Y
    Y ← Temp
    OUTPUT X, " ", Y
    

    Thụt lề cho biết câu lệnh nào đang nằm trong một cấu trúc. Chương trình học yêu cầu bốn khoảng trắng cho mỗi mức độ, với một ngoại lệ bạn cần nhớ:

    DECLARE X, Y : INTEGER
    X ← 7
    Y ← 3
    IF X > Y
      THEN
        OUTPUT "X is bigger"
      ELSE
        OUTPUT "Y is bigger or equal"
    ENDIF
    
    • THEN và ELSE được thụt hai khoảng trắng so với IF của chúng.
    • Các câu lệnh nằm dưới chúng được thụt bốn khoảng trắng.
    • ENDIF căn chỉnh với IF của riêng nó.

    Lỗi thường gặp

    • Đặt THEN lên dòng IF. Đó là bố cục A-Level 9618 — xem chủ đề 11.
    • Không thụt lề chút nào. Người chấm cần thấy cấu trúc để trao điểm cấu trúc.
  • 2 Variables, constants and types · ⁨Biến, hằng & kiểu⁩
    2.1

    Năm loại dữ liệu

    English

    0478 pseudocode has exactly five data types 数据类型. Learn the list — naming a type that is not on it loses the mark.

    Type Holds Example
    INTEGER a whole number 整数 42, -7
    REAL a number with a decimal part 小数 3.14, -0.5
    CHAR a single character 单个字符 'A'
    STRING a sequence of characters 字符串 "Hello"
    BOOLEAN TRUE or FALSE 布尔值 TRUE
    • A STRING is written in double quotes, a CHAR in single quotes.
    • TRUE and FALSE are keywords, so they are upper case and carry no quotes.

    Common mistakes

    • Writing FLOAT, DOUBLE or BOOL. Those are real languages, not this syllabus.
    • 'Hello' for a string — single quotes hold one character only.
    Tiếng Việt

    Pseudocode 0478 có đúng năm kiểu dữ liệu. Học thuộc danh sách — đặt tên một kiểu không nằm trong đó sẽ mất điểm.

    Type Holds Example
    INTEGER số nguyên 42, -7
    REAL một số có phần thập phân 3.14, -0.5
    CHAR một ký tự đơn lẻ 'A'
    STRING một chuỗi ký tự "Hello"
    BOOLEAN TRUE hoặc FALSE TRUE
    DECLARE Age : INTEGER
    DECLARE Price : REAL
    DECLARE Grade : CHAR
    DECLARE Name : STRING
    DECLARE Passed : BOOLEAN
    Age ← 17
    Price ← 2.50
    Grade ← 'A'
    Name ← "Mei"
    Passed ← TRUE
    OUTPUT Name, " is ", Age, " and passed: ", Passed
    
    • Một STRING được viết trong dấu ngoặc kép đôi, một CHAR trong dấu ngoặc đơn.
    • TRUE và FALSE là từ khóa, nên viết in hoa và không có dấu ngoặc.

    Lỗi thường gặp

    • Viết FLOAT, DOUBLE hay BOOL. Those are real languages, not this syllabus.
    • 'Hello' cho chuỗi — dấu ngoặc đơn chỉ chứa một ký tự.
    2.2

    DECLARE

    English

    DECLARE names a variable 变量 and fixes its type before you use it.

    Several names of one type go on a single line, separated by commas:

    • Declare a variable before its first use, near the top of the algorithm.
    • A variable keeps its type for the whole algorithm — an INTEGER never holds "Mei".

    Common mistakes

    • Leaving out the colon: DECLARE Counter INTEGER.
    • Using a variable that was never declared. The exam expects the declaration.
    Tiếng Việt

    DECLARE đặt tên cho biến và xác định kiểu dữ liệu trước khi sử dụng nó.

    DECLARE <identifier> : <data type>
    
    DECLARE Counter : INTEGER
    DECLARE TotalToPay : REAL
    Counter ← 1
    TotalToPay ← 19.99
    OUTPUT "Item ", Counter, " costs ", TotalToPay
    

    Nhiều tên của cùng một loại được ghi trên một dòng, ngăn cách bởi dấu phẩy:

    DECLARE Length, Width, Area : INTEGER
    Length ← 6
    Width ← 4
    Area ← Length * Width
    OUTPUT "Area = ", Area
    
    • Khai báo biến trước khi sử dụng lần đầu tiên, gần đầu của thuật toán.
    • Biến giữ nguyên kiểu dữ liệu trong suốt thuật toán — một INTEGER không bao giờ chứa "Mei".

    Lỗi thường gặp

    • Leaving out the colon: DECLARE Counter INTEGER.
    • Sử dụng một biến chưa từng được khai báo. Đề thi yêu cầu phải có phần khai báo.
    2.3

    CONSTANT

    English

    A constant 常量 is a value that is fixed for the whole algorithm — a tax rate, π, the size of a class. Naming it once means a change is made in one place.

    • In 0478 the arrow is used, exactly as for an assignment.
    • The value must be a literal 字面量 — a number, a string, TRUE — never a calculation and never another variable.
    • A constant can never be given a new value later. That is the whole point of it.

    Common mistakes

    • CONSTANT TaxRate = 0.20. The = form is the A-Level 9618 spelling — see topic 11.
    • Assigning to a constant further down the algorithm.
    Tiếng Việt

    Một hằng là giá trị cố định trong suốt thuật toán — tỷ lệ thuế, π, kích thước lớp học. Đặt tên một lần nghĩa là thay đổi chỉ diễn ra ở một nơi.

    CONSTANT <identifier> ← <value>
    
    CONSTANT TaxRate ← 0.20
    DECLARE Price, Tax : REAL
    Price ← 50.00
    Tax ← Price * TaxRate
    OUTPUT "Tax to pay: ", Tax
    
    • Trong 0478, mũi tên được sử dụng, giống hệt như phép gán.
    • Giá trị phải là hằng số (literal) — một con số, chuỗi ký tự, TRUE — tuyệt đối không phải phép tính. and never another variable.
    • Hằng số không thể được gán giá trị mới sau này. Đó chính là ý nghĩa cốt lõi của nó.

    Lỗi thường gặp

    • CONSTANT TaxRate = 0.20. The = form is the A-Level 9618 spelling — see topic 11.
    • Assigning to a constant further down the algorithm.
  • 3 Assignment, input and output · ⁨Gán, nhập & xuất⁩
    3.1

    The assignment arrow

    English

    The assignment 赋值 operator is ←, a left-pointing arrow. It means take the value on the right and put it in the box on the left.

    Counter ← Counter + 1 looks impossible as mathematics and is ordinary as an instruction: work out the right-hand side with the value the box holds now, then store the result back.

    • If you cannot type ←, write <-. Both are accepted, here and in the exam.
    • The left side must be a single identifier or one array element. Never a calculation.

    Common mistakes

    • Counter = 0. In pseudocode = is a comparison, not an assignment — and confusing the two is the single commonest syntax error in this paper.
    • Counter + 1 ← Counter. The arrow points at the thing being changed.
    Tiếng Việt

    Toán tử gán là ←, một mũi tên chỉ sang trái. Nó có nghĩa là lấy giá trị ở bên phải và đặt vào ô bên trái.

    <identifier> ← <value>
    
    DECLARE Counter : INTEGER
    Counter ← 0
    Counter ← Counter + 1
    Counter ← Counter + 1
    OUTPUT Counter
    

    Counter ← Counter + 1 trông vô lý dưới góc độ toán học nhưng rất hợp lý dưới dạng chỉ thị: tính toán vế phải dựa trên giá trị hiện tại của ô, sau đó lưu kết quả trở lại vào ô đó.

    • Nếu bạn không thể gõ ←, hãy viết <-. Cả hai đều được chấp nhận, ngay cả trong đề thi.
    • Vế trái phải là một định danh đơn lẻ hoặc một phần tử mảng. Tuyệt đối không phải phép tính.

    Lỗi thường gặp

    • Counter = 0. Trong giả mã, = là phép so sánh, không phải phép gán — và gây nhầm lẫn việc phân biệt sai giữa hai loại này là lỗi cú pháp phổ biến nhất trong bài thi này.
    • Counter + 1 ← Counter. Mũi tên chỉ vào đối tượng đang bị thay đổi.
    3.2

    INPUT và OUTPUT

    English

    INPUT reads a value from the user into a variable. OUTPUT displays one or more values.

    • INPUT takes exactly one variable, and that variable must already be declared.
    • OUTPUT takes any number of items separated by commas; they are printed one after another with nothing between them.
    • A literal 字面量 string in an OUTPUT goes in double quotes; a variable does not.

    Prompting the user

    An INPUT on its own shows nothing on screen, so a well-written algorithm prints a prompt 提示 first:

    Common mistakes

    • INPUT "Enter a number", X — the prompt is a separate OUTPUT statement.
    • OUTPUT "Total: " + Total. 0478 joins output items with a comma; + is arithmetic and & belongs to A-Level 9618 (topic 11).
    • Forgetting the quotes: OUTPUT Hello looks for a variable called Hello.
    Tiếng Việt

    INPUT đọc một giá trị từ người dùng vào biến. OUTPUT hiển thị một hoặc nhiều giá trị.

    DECLARE Name : STRING
    DECLARE Age : INTEGER
    INPUT Name
    INPUT Age
    OUTPUT "Hello ", Name
    OUTPUT "Next year you will be ", Age + 1
    
    • INPUT nhận đúng một biến, và biến đó phải đã được khai báo.
    • OUTPUT nhận bất kỳ số lượng mục nào ngăn cách bởi dấu phẩy; chúng được in ra liền tiếp nhau mà không có ký tự nào giữa chúng.
    • Một chuỗi ký tự literal trong OUTPUT được đặt trong dấu ngoặc kép; một biến thì không.

    Gợi ý người dùng

    Một lệnh INPUT đơn lẻ sẽ không hiển thị gì trên màn hình, vì vậy một thuật toán tốt nên in ra gợi ý trước:

    DECLARE Radius : REAL
    OUTPUT "Enter the radius: "
    INPUT Radius
    OUTPUT "The diameter is ", Radius * 2
    

    Lỗi thường gặp

    • INPUT "Enter a number", X — câu hỏi (prompt) là một câu lệnh OUTPUT riêng biệt.
    • OUTPUT "Total: " + Total. 0478 nối các mục đầu ra bằng dấu phẩy; + là toán học và & thuộc về A-Level 9618 (chủ đề 11).
    • Quên dấu ngoặc kép: OUTPUT Hello tìm kiếm một biến có tên là Hello.
  • 4 Arithmetic and logic · ⁨Toán học & logic⁩
    4.1

    Toán tử số học

    English

    Five arithmetic 算术 operators, in the order a calculator uses them.

    Operator Meaning A is 7, B is 2
    + add 加 A + B is 9
    - subtract 减 A - B is 5
    * multiply 乘 A * B is 14
    / divide 除 A / B is 3.5
    ^ raise to a power 幂 A ^ B is 49

    Brackets come first, then ^, then * and /, then + and - — the usual precedence 优先级. Use brackets whenever the reader would have to stop and think.

    Common mistakes

    • Expecting / to give a whole number. 7 / 2 is 3.5, not 3; for a whole number use DIV.
    • Writing A x B or A ÷ B. Use * and /.
    Tiếng Việt

    Năm toán tử số học, theo thứ tự mà máy tính bỏ túi sử dụng.

    Toán tử Ý nghĩa A là 7, B là 2
    + cộng A + B là 9
    - trừ A - B là 5
    * nhân A * B là 14
    / chia A / B là 3.5
    ^ lũy thừa A ^ B là 49
    DECLARE A, B : INTEGER
    A ← 7
    B ← 2
    OUTPUT "Sum: ", A + B
    OUTPUT "Product: ", A * B
    OUTPUT "Quotient: ", A / B
    OUTPUT "Power: ", A ^ B
    

    Dấu ngoặc đi trước, sau đó là ^, rồi đến * và /, cuối cùng là + và - — theo thứ tự ưu tiên thông thường . Hãy dùng dấu ngoặc vuông bất cứ khi nào người đọc phải dừng lại suy nghĩ.

    DECLARE Total : REAL
    Total ← (12 + 18) / 2
    OUTPUT "Mean: ", Total
    

    Lỗi thường gặp

    • Mong đợi / trả về số nguyên. 7 / 2 là 3.5, không phải 3; để lấy số nguyên, hãy sử dụng DIV.
    • Viết A x B hoặc A ÷ B. Hãy dùng * và /.
    4.2

    DIV VÀ MOD

    English

    Integer division 整数除法 answers two different questions, and 0478 writes each of them as a function 函数, with the two values in brackets.

    • DIV(a, b) — how many whole times b goes into a, the quotient 商.
    • MOD(a, b) — what is left over, the remainder 余数.

    Both take integers, and both return an integer.

    What they are for

    MOD is the standard test for divides exactly, which makes it the way to ask whether a number is even 偶数:

    DIV converts a total into whole units — seconds into minutes, pence into pounds:

    Common mistakes

    • 10 MOD 3. That is the A-Level 9618 form; 0478 uses the function form MOD(10, 3).
    • Mixing the two up. DIV gives the whole part; MOD gives what does not fit.
    Tiếng Việt

    Phép chia lấy phần nguyên trả lời hai câu hỏi khác nhau, và 0478 viết mỗi câu hỏi dưới dạng một hàm, với hai giá trị nằm trong ngoặc vuông.

    • DIV(a, b) — chỉ ra số lần mà b chui vào a một cách trọn vẹn, tức là thương.
    • MOD(a, b) — phần còn lại, hay số dư.
    OUTPUT DIV(10, 3)
    OUTPUT MOD(10, 3)
    OUTPUT DIV(17, 5)
    OUTPUT MOD(17, 5)
    

    Cả hai đều nhận số nguyên làm đầu vào, và cả hai đều trả về số nguyên.

    Công dụng của chúng

    MOD là phép kiểm tra tiêu chuẩn cho việc chia hết, do đó nó cũng là cách để hỏi xem một số có chẵn hay không:

    DECLARE Number : INTEGER
    Number ← 12
    IF MOD(Number, 2) = 0
      THEN
        OUTPUT Number, " is even"
      ELSE
        OUTPUT Number, " is odd"
    ENDIF
    

    DIV chuyển đổi tổng thành các đơn vị nguyên — giây sang phút, pence sang bảng:

    DECLARE Seconds : INTEGER
    Seconds ← 200
    OUTPUT DIV(Seconds, 60), " minutes and ", MOD(Seconds, 60), " seconds"
    

    Lỗi thường gặp

    • 10 MOD 3. Đó chính là dạng A-Level 9618; 0478 sử dụng dạng hàm MOD(10, 3).
    • Nhầm lẫn hai khái niệm này. DIV trả về phần nguyên; MOD trả về phần không khớp.
    4.3

    Toán tử quan hệ và logic

    English

    A relational operator 关系运算符 compares two values and produces TRUE or FALSE.

    Operator Means
    = is equal to 等于
    <> is not equal to 不等于
    > is greater than 大于
    < is less than 小于
    >= is greater than or equal to 大于等于
    <= is less than or equal to 小于等于

    The three logic operators 逻辑运算符 join conditions:

    • AND — both sides must be TRUE.
    • OR — at least one side must be TRUE.
    • NOT — turns TRUE into FALSE and back.

    Common mistakes

    • <> is the not equal sign here — not !=, which belongs to other languages.
    • IF Age >= 15 AND <= 18. Each side of AND needs its own complete comparison: Age >= 15 AND Age <= 18.
    • Calling these comparison operators in an answer. The syllabus term is relational.
    Tiếng Việt

    Một toán tử quan hệ so sánh hai giá trị và tạo ra TRUE hoặc FALSE.

    Toán tử Ý nghĩa
    = bằng
    <> không bằng
    > lớn hơn
    < nhỏ hơn
    >= lớn hơn hoặc bằng
    <= nhỏ hơn hoặc bằng
    DECLARE Mark : INTEGER
    Mark ← 55
    OUTPUT "Pass: ", Mark >= 50
    OUTPUT "Perfect: ", Mark = 100
    OUTPUT "Not zero: ", Mark <> 0
    

    Ba toán tử logic kết hợp các điều kiện:

    • AND — cả hai vế đều phải TRUE.
    • OR — ít nhất một vế phải TRUE.
    • NOT — biến TRUE thành FALSE và quay trở lại.
    DECLARE Age : INTEGER
    DECLARE HasTicket : BOOLEAN
    Age ← 16
    HasTicket ← TRUE
    IF Age >= 15 AND HasTicket = TRUE
      THEN
        OUTPUT "Admitted"
    ENDIF
    IF NOT (Age > 18)
      THEN
        OUTPUT "Still a student rate"
    ENDIF
    

    Lỗi thường gặp

    • <> là ký hiệu không bằng ở đây — không phải !=, vốn thuộc về các ngôn ngữ khác.
    • IF Age >= 15 AND <= 18. Mỗi bên của AND cần một phép so sánh hoàn chỉnh riêng biệt: Age >= 15 AND Age <= 18.
    • Gọi những thứ này là toán tử so sánh trong câu trả lời. Thuật ngữ của chương trình là liên quan (relational).
  • 5 String operations · ⁨Thao tác chuỗi⁩
    5.1

    LENGTH, UCASE VÀ LCASE

    English

    0478 publishes four string 字符串 routines and no others. Three of them are here.

    LENGTH(<identifier>) returns how many characters 字符 a string holds — spaces included.

    UCASE(<identifier>) returns the string in upper case 大写, LCASE(<identifier>) in lower case 小写. Neither changes the original 原值 — each hands back a new value.

    That last line still prints Happy: to keep the change you must assign it back.

    Comparing without worrying about case

    UCASE on both sides is the standard way to accept an answer however it was typed:

    Common mistakes

    • Expecting UCASE(Name) to change Name. Assign the result back.
    • LENGTH counts characters, not words. LENGTH("Happy Days") is 10.
    Tiếng Việt

    0478 xuất bản bốn thủ tục xử lý chuỗi và không có thêm gì. Ba trong số đó được liệt kê ở đây.

    LENGTH(<identifier>) trả về số lượng ký tự mà một chuỗi chứa — bao gồm cả khoảng trắng.

    OUTPUT LENGTH("Happy Days")
    OUTPUT LENGTH("")
    

    UCASE(<identifier>) trả về chuỗi viết hoa, LCASE(<identifier>) thì viết thường thường.Neither không thay đổi giá trị gốc — mỗi hàm đều trả về một giá trị mới.

    DECLARE Name : STRING
    Name ← "Happy"
    OUTPUT UCASE(Name)
    OUTPUT LCASE(Name)
    OUTPUT Name
    

    Dòng cuối cùng vẫn in ra Happy: để giữ nguyên sự thay đổi bạn phải gán lại giá trị cho nó.

    DECLARE Name : STRING
    Name ← "Happy"
    Name ← UCASE(Name)
    OUTPUT Name
    

    So sánh mà không lo lắng về chữ in

    UCASE ở cả hai bên là cách chuẩn để chấp nhận câu trả lời dù người dùng đã gõ như thế nào:

    DECLARE Answer : STRING
    Answer ← "yes"
    IF UCASE(Answer) = "YES"
      THEN
        OUTPUT "Accepted"
    ENDIF
    

    Lỗi thường gặp

    • Kỳ vọng rằng UCASE(Name) sẽ thay đổi Name. Hãy gán kết quả trở lại biến đó.
    • LENGTH đếm số ký tự, không phải số từ. LENGTH("Happy Days") chính là 10.
    5.2

    SUBSTRING

    English

    SUBSTRING(<identifier>, <start>, <length>) pulls a piece out of a string — starting at position start, taking length characters.

    ⚠️ Counting starts at 1, not 0. The first character of "Happy Days" is at position 1.

    Taking one character, and the rest

    LENGTH inside SUBSTRING is what makes the last two lines work for a word of any size — hard-coding 8 would break the moment the word changed.

    Reading a string one character at a time

    Common mistakes

    • Starting at 0. Position 1 is the first character.
    • Reading the third argument as an end position. It is a count — SUBSTRING(W, 2, 3) takes three characters beginning at the second.
    • Asking for more characters than the string has.
    Tiếng Việt

    SUBSTRING(<identifier>, <start>, <length>) trích một phần ra khỏi chuỗi — bắt đầu tại vị trí start, lấy length ký tự.

    OUTPUT SUBSTRING("Happy Days", 1, 5)
    OUTPUT SUBSTRING("Happy Days", 7, 4)
    

    ⚠️ Đếm bắt đầu từ 1, không phải 0. Ký tự đầu tiên của "Happy Days" nằm ở vị trí 1.

    Lấy một ký tự, và phần còn lại

    DECLARE Word : STRING
    Word ← "Computer"
    OUTPUT "First letter: ", SUBSTRING(Word, 1, 1)
    OUTPUT "Last letter: ", SUBSTRING(Word, LENGTH(Word), 1)
    OUTPUT "Without the first: ", SUBSTRING(Word, 2, LENGTH(Word) - 1)
    

    LENGTH nằm trong SUBSTRING là yếu tố khiến hai dòng cuối hoạt động với bất kỳ độ dài từ nào — viết cứng 8 sẽ làm hỏng chương trình ngay khi từ thay đổi.

    Đọc một chuỗi từng ký tự một

    DECLARE Word : STRING
    DECLARE Index : INTEGER
    Word ← "Cat"
    FOR Index ← 1 TO LENGTH(Word)
        OUTPUT SUBSTRING(Word, Index, 1)
    NEXT Index
    

    Lỗi thường gặp

    • Bắt đầu từ 0. Vị trí 1 là ký tự đầu tiên.
    • Đọc đối số thứ ba là một vị trí kết thúc. Nó thực chất là một số lượng — SUBSTRING(W, 2, 3) lấy ba ký tự bắt đầu từ thứ hai.
    • Yêu cầu nhiều ký tự hơn chuỗi có.
  • 6 Selection · ⁨Sự lựa chọn⁩
    6.1

    IF, THEN, ELSE, ENDIF

    English

    Selection 选择 runs one group of statements or another, depending on a condition 条件.

    Add ELSE for the other case. Exactly one of the two branches 分支 runs — never both, never neither.

    The layout is the one part students lose marks on, so learn it as a shape:

    • IF and its condition on one line, nothing after the condition.
    • THEN and ELSE on their own lines, indented two spaces.
    • The statements indented four.
    • ENDIF back at the column of its IF.

    Nesting 嵌套

    An IF inside an IF handles more than two outcomes. Each one needs its own ENDIF.

    Common mistakes

    • Forgetting ENDIF. Every IF closes, and a missing one is a syntax error 语法错误 the marker will see at a glance.
    • IF Mark >= 50 THEN OUTPUT "Pass" on one line. No such form exists in either syllabus; write the three lines.
    • IF Mark = 50 THEN written as IF Mark ← 50. The arrow assigns; = compares.
    Tiếng Việt

    Lựa chọn chạy một nhóm câu lệnh hoặc nhóm khác, tùy thuộc vào một điều kiện.

    IF <condition>
      THEN
        <statements>
    ENDIF
    
    DECLARE Mark : INTEGER
    Mark ← 72
    IF Mark >= 50
      THEN
        OUTPUT "Pass"
    ENDIF
    

    Thêm ELSE cho trường hợp còn lại. Chính xác một trong hai nhánh sẽ chạy — không bao giờ cả hai, cũng không bao giờ Bố cục là phần duy nhất mà học sinh bị mất điểm, vì vậy hãy học nó như một hình dáng:

    DECLARE Mark : INTEGER
    Mark ← 41
    IF Mark >= 50
      THEN
        OUTPUT "Pass"
      ELSE
        OUTPUT "Fail"
    ENDIF
    

    Bố cục là phần duy nhất mà học sinh bị trừ điểm, vì vậy hãy học nó như một hình dạng:

    • IF và điều kiện của nó trên cùng một dòng, không có gì sau điều kiện.
    • THEN và ELSE trên các dòng riêng biệt, thụt vào hai khoảng trắng.
    • ⟨⟩ quay lại cùng cột với ⟨⟩ của nó.
    • ENDIF quay trở lại cột của IF.

    Lồng nhau

    Một IF nằm trong một IF xử lý nhiều hơn hai kết quả. Mỗi kết quả cần một ENDIF riêng.

    DECLARE Mark : INTEGER
    Mark ← 85
    IF Mark >= 80
      THEN
        OUTPUT "Distinction"
      ELSE
        IF Mark >= 50
          THEN
            OUTPUT "Pass"
          ELSE
            OUTPUT "Fail"
        ENDIF
    ENDIF
    

    Lỗi thường gặp

    • Quên ENDIF. Mọi IF đều đóng ngoặc, và việc thiếu một ngoặc sẽ gây ra lỗi cú pháp mà dấu sẽ thấy ngay lập tức.
    • IF Mark >= 50 THEN OUTPUT "Pass" trên một dòng. Không có dạng nào như vậy trong cả hai chương trình; viết ba dòng đó.
    • IF Mark = 50 THEN được viết dưới dạng IF Mark ← 50. Mũi tên chỉ định; = so sánh.
    6.2

    TRƯỜNG HỢP

    English

    When one variable is tested against several single values, CASE OF says it far more clearly than a stack of nested IFs.

    • Each branch is a value, a colon, then what to do.
    • OTHERWISE catches everything the listed values missed. It is optional, and writing one is good practice — it is what happens when the user types something unexpected.
    • The first matching branch runs, and the rest are skipped.

    A range, and a character

    Common mistakes

    • Using CASE OF for a condition. It tests one variable against values; Mark >= 50 needs an IF.
    • Forgetting ENDCASE.
    • Leaving out OTHERWISE and then wondering why an unexpected value does nothing at all.
    Tiếng Việt

    Khi một biến được kiểm tra với nhiều giá trị đơn lẻ, CASE OF thể hiện điều đó rõ ràng hơn rất so với một đống IF lồng nhau.

    CASE OF <identifier>
        <value 1> : <statement>
        <value 2> : <statement>
        OTHERWISE <statement>
    ENDCASE
    
    DECLARE Choice : INTEGER
    Choice ← 2
    CASE OF Choice
        1 : OUTPUT "You chose north"
        2 : OUTPUT "You chose south"
        3 : OUTPUT "You chose east"
        4 : OUTPUT "You chose west"
        OTHERWISE OUTPUT "That is not a direction"
    ENDCASE
    
    • ⟨⟩ bắt mọi thứ mà các giá trị đã liệt kê bỏ sót. Nó tùy chọn, và viết một cái
    • OTHERWISE bắt mọi trường hợp mà các giá trị đã liệt kê bỏ sót. Nó là tùy chọn, và việc viết một rất tốt — đây chính là những gì xảy ra khi người dùng nhập vào một thứ gì đó bất ngờ.
    • Nhánh khớp đầu tiên sẽ chạy, và các nhánh còn lại bị bỏ qua.

    Một khoảng giá trị, và một ký tự

    DECLARE Grade : CHAR
    Grade ← 'B'
    CASE OF Grade
        'A' : OUTPUT "Excellent"
        'B' : OUTPUT "Good"
        'C' : OUTPUT "Satisfactory"
        OTHERWISE OUTPUT "Unclassified"
    ENDCASE
    

    Lỗi thường gặp

    • Sử dụng CASE OF cho một điều kiện. Nó kiểm tra một biến với các giá trị; Mark >= 50 cần một IF.
    • Quên đi ENDCASE.
    • Bỏ qua OTHERWISE và sau đó tự hỏi tại sao một giá trị bất ngờ lại không tạo ra kết quả gì cả.
  • 7 Iteration · ⁨Lặp lại⁩
    7.1

    FOR, vòng lặp đếm

    English

    Iteration 迭代 repeats statements. Use a FOR loop when you know before you start how many times — a count-controlled 计数控制 loop.

    The counter 计数器 starts at the first value, and the loop runs once for every value up to and including the second. 1 TO 5 runs five times.

    STEP

    STEP changes the size of each jump. A negative step counts down.

    Running totals

    The commonest use: a variable outside the loop that the loop adds to.

    Total ← 0 must sit before the loop. Inside, it would reset on every pass.

    Common mistakes

    • NEXT naming the wrong counter. Nested loops must close in the reverse order they opened: the inner NEXT first.
    • Assuming 1 TO 5 runs four times. Both ends are included.
    • Changing the counter inside the loop. Let FOR own it.
    Tiếng Việt

    Lặp thực thi lặp lại các câu lệnh. Sử dụng vòng lặp FOR khi bạn biết trước khi bắt đầu sẽ lặp bao nhiêu lần — một vòng lặp điều khiển bằng bộ đếm.

    FOR <identifier> ← <value1> TO <value2>
        <statements>
    NEXT <identifier>
    
    DECLARE Index : INTEGER
    FOR Index ← 1 TO 5
        OUTPUT "Line ", Index
    NEXT Index
    

    Bộ đếm bắt đầu từ giá trị đầu tiên, và vòng lặp chạy một lần cho mỗi giá trị lên đến và bao gồm cả giá trị thứ hai. 1 TO 5 chạy năm lần.

    BƯỚC

    STEP thay đổi kích thước của mỗi bước nhảy. Một bước nhảy âm sẽ đếm ngược.

    DECLARE Index : INTEGER
    FOR Index ← 2 TO 10 STEP 2
        OUTPUT Index
    NEXT Index
    FOR Index ← 3 TO 1 STEP -1
        OUTPUT "Countdown ", Index
    NEXT Index
    

    Tổng lũy tiến

    Công dụng phổ biến nhất: một biến nằm ngoài vòng lặp mà vòng lặp cộng vào đó.

    DECLARE Index, Total : INTEGER
    Total ← 0
    FOR Index ← 1 TO 10
        Total ← Total + Index
    NEXT Index
    OUTPUT "Sum of 1 to 10 is ", Total
    

    Total ← 0 phải đặt trước vòng lặp. Nếu đặt bên trong, nó sẽ được reset ở mỗi lần lặp.

    Lỗi thường gặp

    • NEXT đặt tên bộ đếm không chính xác. Các vòng lặp lồng nhau phải đóng theo thứ tự ngược lại so với khi chúng mở ra: NEXT bên trong trước tiên.
    • Giả sử rằng 1 TO 5 chạy bốn lần. Cả hai đầu đều được bao gồm.
    • Thay đổi bộ đếm bên trong vòng lặp. Hãy để cho FOR làm chủ nó.
    7.2

    WHILE, vòng lặp tiền điều kiện

    English

    A WHILE loop tests before each pass, so it can run zero times. Use it when the number of repeats depends on something that happens while the loop runs.

    Something inside the loop must eventually make the condition false, or the loop never ends — an infinite loop 无限循环.

    Common mistakes

    • Forgetting to change the variable the condition tests, giving an infinite loop.
    • Leaving out DO or ENDWHILE.
    • Using WHILE where the count is known. A FOR says what you mean in one line.
    Tiếng Việt

    Một vòng lặp WHILE kiểm tra trước mỗi lần lặp, do đó nó có thể chạy không lần nào. Sử dụng nó khi số lần lặp phụ thuộc vào một sự kiện xảy ra trong khi vòng lặp đang chạy. Một thứ gì đó bên trong vòng lặp cuối cùng phải làm cho điều kiện trở thành sai, nếu không vòng lặp sẽ không bao giờ kết thúc

    WHILE <condition> DO
        <statements>
    ENDWHILE
    
    DECLARE Total : INTEGER
    Total ← 1
    WHILE Total < 100 DO
        Total ← Total * 2
    ENDWHILE
    OUTPUT "First power of two past 100: ", Total
    

    — một vòng lặp vô hạn. — một vòng lặp vô hạn.

    DECLARE Count : INTEGER
    Count ← 5
    WHILE Count > 0 DO
        OUTPUT Count
        Count ← Count - 1
    ENDWHILE
    OUTPUT "Lift off"
    

    Lỗi thường gặp

    • Quên thay đổi biến mà điều kiện kiểm tra, dẫn đến vòng lặp vô hạn.
    • Sử dụng DO khi số lượng lặp đã biết. Một câu lệnh ENDWHILE diễn đạt ý bạn muốn trong một dòng mã.
    • Sử dụng WHILE khi đã biết số lần lặp. Một FOR nói rõ ý nghĩa của bạn chỉ trong một dòng.
    7.3

    REPEAT, vòng lặp kiểm tra hậu điều kiện

    English

    A REPEAT loop tests after each pass, so it always runs at least once.

    That "at least once" is the reason to choose it: validating 验证 input, where you must ask before you can judge the answer.

    ⚠️ UNTIL states the condition that stops the loop; WHILE states the one that keeps it going. They are opposites, and swapping them is the classic error.

    Tests Runs at least once? Condition means
    FOR a counter no (an empty range runs zero times) —
    WHILE before no keep going while this is true
    REPEAT after yes stop when this becomes true

    Common mistakes

    • Writing UNTIL Number < 100 when you mean UNTIL Number >= 100.
    • Using REPEAT where the body must be able to run zero times.
    • Forgetting that UNTIL ends the structure — there is no ENDREPEAT.
    Tiếng Việt

    Một REPEAT loop kiểm tra sau mỗi lần lặp, vì vậy nó luôn chạy ít nhất một lần.

    REPEAT
        <statements>
    UNTIL <condition>
    

    Điều "ít nhất một lần" chính là lý do để chọn cấu trúc này: xác thực dữ liệu đầu vào, nơi bạn phải yêu cầu trước khi bạn có thể đánh giá đáp án.

    DECLARE Number : INTEGER
    Number ← 0
    REPEAT
        Number ← Number + 25
        OUTPUT "Trying ", Number
    UNTIL Number >= 100
    OUTPUT "Reached ", Number
    

    ⚠️ UNTIL xác định điều kiện dừng vòng lặp; WHILE xác định điều kiện duy trì việc tiếp tục. Chúng là hai khái niệm trái ngược, và việc hoán đổi chúng là lỗi kinh điển.

    Kiểm tra Chạy ít nhất một lần? Ý nghĩa của điều kiện
    FOR bộ đếm không (phạm vi rỗng chạy 0 lần) —
    WHILE trước không tiếp tục trong khi điều kiện này đúng
    REPEAT sau có dừng lại khi điều kiện này trở thành đúng

    Lỗi thường gặp

    • Viết UNTIL Number < 100 khi ý bạn là UNTIL Number >= 100.
    • Sử dụng REPEAT nơi mà phần thân phải có khả năng chạy 0 lần.
    • Unquên rằng UNTIL kết thúc khối lệnh — sẽ không có ENDREPEAT nào.
  • 8 Arrays · ⁨Mảng⁩
    8.1

    Mảng một chiều

    English

    An array 数组 holds many values of one type under one name. Each value sits at an index 下标.

    • The bounds 边界 are written lower:upper, and both are included — [1:3] has three elements 元素.
    • Cambridge arrays normally start at 1, not 0.
    • Every element has the same type, fixed by OF.

    Filling and reading with a FOR loop

    An array and a counted loop belong together: the counter is the index.

    Finding the largest

    Start Largest at the first element, never at 0 — with negative data, 0 would win and the answer would be wrong.

    Common mistakes

    • Reading Scores[6] from an array declared [1:5]. That is out of bounds 越界.
    • Writing Scores(3). Arrays use square brackets; round brackets call a function.
    • Declaring [1:5] and then looping 0 TO 4.
    Tiếng Việt

    Một mảng chứa nhiều giá trị cùng một loại dưới một tên duy nhất. Mỗi giá trị được đặt tại một chỉ số.

    DECLARE <identifier> : ARRAY[<lower>:<upper>] OF <data type>
    
    DECLARE Names : ARRAY[1:3] OF STRING
    Names[1] ← "Mei"
    Names[2] ← "Sam"
    Names[3] ← "Ana"
    OUTPUT Names[2]
    
    • Các giới hạn được viết là lower:upper, và cả hai đều bao gồm — [1:3] có ba phần tử.
    • Mảng Cambridge thường bắt đầu từ 1, không phải 0.
    • Mọi phần tử đều có cùng một loại, được xác định bởi OF.

    Điền dữ liệu và đọc bằng vòng lặp FOR

    Mảng và vòng đếm đi đôi với nhau: biến đếm chính là chỉ số.

    DECLARE Scores : ARRAY[1:5] OF INTEGER
    DECLARE Index, Total : INTEGER
    FOR Index ← 1 TO 5
        Scores[Index] ← Index * 10
    NEXT Index
    Total ← 0
    FOR Index ← 1 TO 5
        Total ← Total + Scores[Index]
    NEXT Index
    OUTPUT "Total: ", Total
    OUTPUT "Mean: ", Total / 5
    

    Tìm giá trị lớn nhất

    DECLARE Scores : ARRAY[1:5] OF INTEGER
    DECLARE Index, Largest : INTEGER
    Scores[1] ← 42
    Scores[2] ← 17
    Scores[3] ← 93
    Scores[4] ← 8
    Scores[5] ← 55
    Largest ← Scores[1]
    FOR Index ← 2 TO 5
        IF Scores[Index] > Largest
          THEN
            Largest ← Scores[Index]
        ENDIF
    NEXT Index
    OUTPUT "Largest: ", Largest
    

    Bắt đầu Largest tại phần tử đầu tiên, không bao giờ tại 0 — với dữ liệu âm, 0 sẽ chiến thắng và đáp án sẽ sai.

    Lỗi thường gặp

    • Đọc Scores[6] từ một mảng được khai báo [1:5]. Điều này nằm ngoài giới hạn cho phép.
    • Ghi Scores(3). Mảng sử dụng ngoặc vuông; ngoặc tròn dùng để gọi hàm.
    • Khai báo [1:5] sau đó lặp qua 0 TO 4.
    8.2

    Mảng hai chiều

    English

    A 2-D array 二维数组 is a table: rows and columns, two indexes.

    The first index is the row 行, the second the column 列.

    Nested loops walk a table

    One loop per dimension 维度. The inner loop finishes a whole row before the outer moves on.

    ⚠️ The inner NEXT closes the inner counter. NEXT Row before NEXT Col crosses the loops over and is nonsense — a marker spots it instantly.

    Common mistakes

    • Swapping row and column. Grid[2,3] is row 2, column 3.
    • Grid[Row][Col]. Cambridge writes one pair of brackets with a comma inside.
    • Crossing the NEXT lines over, as above.
    Tiếng Việt

    Mảng 2-D là một bảng: gồm các hàng và cột, hai chỉ số.

    DECLARE <identifier> : ARRAY[<lower1>:<upper1>, <lower2>:<upper2>] OF <data type>
    
    DECLARE Grid : ARRAY[1:2, 1:3] OF INTEGER
    Grid[1,1] ← 1
    Grid[1,2] ← 2
    Grid[1,3] ← 3
    Grid[2,1] ← 4
    Grid[2,2] ← 5
    Grid[2,3] ← 6
    OUTPUT Grid[2,3]
    

    Chỉ số đầu tiên là hàng, chỉ số thứ hai là cột.

    Vòng lặp lồng nhau duyệt qua bảng

    Một vòng lặp cho mỗi chiều. Vòng lặp bên trong hoàn thành một hàng trước khi vòng lặp bên ngoài chuyển sang bước tiếp theo.

    DECLARE Grid : ARRAY[1:2, 1:3] OF INTEGER
    DECLARE Row, Col : INTEGER
    FOR Row ← 1 TO 2
        FOR Col ← 1 TO 3
            Grid[Row, Col] ← Row * Col
        NEXT Col
    NEXT Row
    FOR Row ← 1 TO 2
        FOR Col ← 1 TO 3
            OUTPUT "Grid[", Row, ",", Col, "] = ", Grid[Row, Col]
        NEXT Col
    NEXT Row
    

    ⚠️ Vòng lặp NEXT bên trong đóng bộ đếm bên trong. NEXT Row trước khi NEXT Col vượt quá vòng lặp và trở nên vô nghĩa — một dấu hiệu nhận diện sẽ phát hiện ngay lập tức.

    Lỗi thường gặp

    • hoán đổi hàng và cột. Grid[2,3] là hàng 2, cột 3.
    • Grid[Row][Col]. Cambridge viết một cặp ngoặc có chứa dấu phẩy ở bên trong.
    • Lồng các dòng NEXT vào nhau, như trên đã mô tả.
  • 9 Procedures and functions · ⁨Thủ tục & hàm⁩
    9.1

    THỦ TỤC (PROCEDURE) VÀ GỌI (CALL)

    English

    A procedure 过程 is a named block of statements. Writing one once and calling it from several places is decomposition 分解 — the idea the whole of paper 2 rests on.

    A procedure is called by name, with the keyword CALL:

    • The definition 定义 does nothing on its own. Only CALL runs it.
    • Control returns to the line after the CALL when the procedure ends.
    • A procedure does not give a value back. If you need one, you want a function.

    Common mistakes

    • Writing DefaultLine on its own to run it. 0478 requires CALL.
    • Leaving out ENDPROCEDURE.
    • Expecting the procedure's own variables to exist outside it.
    Tiếng Việt

    Một thủ tục là một khối lệnh có tên. Viết một lần và gọi nó từ Một thủ tục được gọi bằng tên, với từ khóa 2:

    PROCEDURE <identifier>
        <statements>
    ENDPROCEDURE
    

    Một thủ tục được gọi bằng tên, với từ khóa CALL:

    PROCEDURE DefaultLine
        OUTPUT "------------------------------"
    ENDPROCEDURE
    
    CALL DefaultLine
    OUTPUT "Report"
    CALL DefaultLine
    
    • Định nghĩa sẽ không làm gì nếu không có sự thực thi. Chỉ khi CALL mới chạy nó.
    • Điều khiển trở lại dòng sau CALL khi thủ tục kết thúc.
    • Một thủ tục không trả về giá trị. Nếu bạn cần một giá trị, hãy sử dụng hàm.

    Lỗi thường gặp

    • Viết DefaultLine đơn lẻ để thực thi nó. 0478 yêu cầu CALL.
    • Bỏ qua ENDPROCEDURE.
    • Mong đợi các biến của chính thủ tục tồn tại bên ngoài nó.
    9.2

    HÀM và TRẢ VỀ

    English

    A function 函数 is a procedure that hands a value back. It is written where that value is needed — inside an OUTPUT, on the right of an assignment, inside a condition.

    • RETURNS <data type> on the header says what type comes back. It is not optional.
    • RETURN ends the function immediately — nothing after it runs.
    • A function is never called with CALL; it is used wherever its value belongs.

    A function inside a condition

    Common mistakes

    • CALL SumSquare(10, 20) — that throws the answer away.
    • A function with no RETURN on some path. Every route out must return a value.
    • Leaving RETURNS INTEGER off the header.
    Tiếng Việt

    Một hàm là một thủ tục trả về một giá trị. Nó được viết ở nơi mà giá trị đó cần thiết — bên trong một OUTPUT, ở bên phải của phép gán, hoặc bên trong một điều kiện.

    FUNCTION <identifier>(<parameters>) RETURNS <data type>
        <statements>
        RETURN <value>
    ENDFUNCTION
    
    FUNCTION SumSquare(Number1 : INTEGER, Number2 : INTEGER) RETURNS INTEGER
        RETURN Number1 * Number1 + Number2 * Number2
    ENDFUNCTION
    
    OUTPUT "Sum of squares = ", SumSquare(10, 20)
    
    • RETURNS <data type> trên phần tiêu đề chỉ ra loại dữ liệu nào sẽ được trả về. Đây không phải là tùy chọn.
    • RETURN kết thúc hàm ngay lập tức — mọi thứ nằm sau nó đều không chạy.
    • Một hàm b bao giờ cũng không được gọi với CALL; nó được sử dụng bất cứ nơi nào giá trị của nó phù hợp.

    Hàm bên trong một điều kiện

    FUNCTION IsEven(Number : INTEGER) RETURNS BOOLEAN
        RETURN MOD(Number, 2) = 0
    ENDFUNCTION
    
    DECLARE Index : INTEGER
    FOR Index ← 1 TO 6
        IF IsEven(Index)
          THEN
            OUTPUT Index, " is even"
        ENDIF
    NEXT Index
    

    Lỗi thường gặp

    • CALL SumSquare(10, 20) — việc này sẽ làm mất đi đáp án.
    • Một hàm thiếu RETURN trên một số đường dẫn. Mọi tuyến đường thoát ra đều phải trả về một giá trị.
    • Bỏ RETURNS INTEGER khỏi phần tiêu đề.
    9.3

    Tham số

    English

    A parameter 参数 is a value a procedure or function is given when it is called. Each one carries its own type.

    Several parameters are separated by commas, and the order at the call must match the order in the definition:

    ⚠️ In 0478 every parameter is passed by value 传值: the procedure works on a copy, so changing it inside changes nothing outside. To get a value back, use a FUNCTION and RETURN it. (A-Level 9618 adds BYREF for the other behaviour — topic 11.)

    Common mistakes

    • PROCEDURE Line(Size) with no type.
    • Calling with the arguments in the wrong order — Greet(2, "Mei") is a type error.
    • Expecting a procedure to change the variable you passed in. In 0478 it cannot.
    Tiếng Việt

    Một tham số là một giá trị mà thủ tục hoặc hàm nhận được khi nó được gọi. Mỗi tham số đều mang riêng một kiểu dữ liệu của nó.

    PROCEDURE Line(Size : INTEGER)
        DECLARE Index : INTEGER
        FOR Index ← 1 TO Size
            OUTPUT "-"
        NEXT Index
    ENDPROCEDURE
    
    CALL Line(5)
    CALL Line(20)
    

    Nhiều tham số được phân tách bằng dấu phẩy, và thứ tự khi gọi phải khớp với thứ tự trong phần định nghĩa:

    PROCEDURE Greet(Name : STRING, Times : INTEGER)
        DECLARE Index : INTEGER
        FOR Index ← 1 TO Times
            OUTPUT "Hello ", Name
        NEXT Index
    ENDPROCEDURE
    
    CALL Greet("Mei", 2)
    CALL Greet("Sam", 1)
    

    ⚠️ Trong 0478 mọi tham số đều được truyền theo giá trị: thủ tục hoạt động trên một bản sao, do đó việc thay đổi nó bên trong sẽ không làm thay đổi gì bên ngoài. Để trả về một giá trị, hãy sử dụng FUNCTION và RETURN nó. (A-Level 9618 thêm BYREF cho hành vi khác — chủ đề 11.)

    FUNCTION Doubled(Number : INTEGER) RETURNS INTEGER
        RETURN Number * 2
    ENDFUNCTION
    
    DECLARE Value : INTEGER
    Value ← 7
    Value ← Doubled(Value)
    OUTPUT Value
    

    Lỗi thường gặp

    • PROCEDURE Line(Size) không có kiểu.
    • Gọi với các đối số theo thứ tự sai — Greet(2, "Mei") là lỗi kiểu.
    • Mong đợi thủ tục thay đổi biến bạn đã truyền vào. Trong 0478, nó không thể làm điều đó.
  • 10 File handling · ⁨Xử lý tệp⁩
    10.1

    Ghi vào tập tin

    English

    A file 文件 keeps data after the program ends. 0478 uses four commands, and every one names the file it works on.

    Three file modes 文件模式:

    Mode What it does
    WRITE start a new file — anything already there is lost
    APPEND add to the end of what is there 追加
    READ read from the start
    • One WRITEFILE writes one line.
    • CLOSEFILE is not optional. An unclosed file can lose the data still waiting to be written, and that is a stock exam answer.

    Common mistakes

    • FOR WRITE when you meant FOR APPEND, which silently destroys the old contents.
    • Forgetting CLOSEFILE.
    • Opening a file that is already open.
    Tiếng Việt

    Một tệp lưu dữ liệu sau khi chương trình kết thúc. 0478 sử dụng bốn lệnh, và mỗi lệnh đều chỉ định tệp mà nó hoạt động.

    OPENFILE <file identifier> FOR WRITE
    WRITEFILE <file identifier>, <data>
    CLOSEFILE <file identifier>
    
    OPENFILE "names.txt" FOR WRITE
    WRITEFILE "names.txt", "Mei"
    WRITEFILE "names.txt", "Sam"
    CLOSEFILE "names.txt"
    OUTPUT "Saved"
    

    Ba chế độ tệp:

    Chế độ Chức năng
    WRITE tạo một tệp mới — mọi dữ liệu hiện có sẽ bị mất
    APPEND thêm vào cuối nội dung hiện có
    READ đọc từ đầu
    OPENFILE "log.txt" FOR WRITE
    WRITEFILE "log.txt", "first"
    CLOSEFILE "log.txt"
    OPENFILE "log.txt" FOR APPEND
    WRITEFILE "log.txt", "second"
    CLOSEFILE "log.txt"
    OUTPUT "Both lines saved"
    
    • Một WRITEFILE ghi một dòng.
    • CLOSEFILE bắt buộc. Một tệp chưa đóng có thể mất dữ liệu vẫn đang chờ để được ghi, và đây là câu trả lời tiêu chuẩn trong kỳ thi.

    Lỗi thường gặp

    • FOR WRITE khi bạn ý định dùng FOR APPEND, thứ này âm thầm xóa bỏ nội dung cũ.
    • Quên đi CLOSEFILE.
    • Mở một tệp đã mở sẵn.
    10.2

    Đọc đến cuối tệp

    English

    READFILE takes one line into a variable. The variable must be declared first.

    Normally you do not know how many lines there are, so you read until the end of the file — which is what the EOF function reports.

    EOF("names.txt") is TRUE once every line has been read, so WHILE NOT EOF(...) means while there is still something to read.

    Counting while reading

    Common mistakes

    • A WHILE EOF(...) loop — that runs only when there is nothing left. You want NOT.
    • Reading past the end because the loop has no EOF guard.
    • Opening FOR READ a file that was never written.
    Tiếng Việt

    READFILE đọc một dòng vào một biến. Biến phải được khai báo trước.

    OPENFILE <file identifier> FOR READ
    READFILE <file identifier>, <variable>
    CLOSEFILE <file identifier>
    

    Thông thường bạn không biết có bao nhiêu dòng, vì vậy bạn đọc cho đến hết tệp — chính là những gì hàm EOF báo cáo.

    OPENFILE "names.txt" FOR WRITE
    WRITEFILE "names.txt", "Mei"
    WRITEFILE "names.txt", "Sam"
    WRITEFILE "names.txt", "Ana"
    CLOSEFILE "names.txt"
    
    DECLARE Line : STRING
    OPENFILE "names.txt" FOR READ
    WHILE NOT EOF("names.txt") DO
        READFILE "names.txt", Line
        OUTPUT Line
    ENDWHILE
    CLOSEFILE "names.txt"
    

    EOF("names.txt") là TRUE khi mọi dòng đã được đọc, nên WHILE NOT EOF(...) có nghĩa là khi vẫn còn dữ liệu để đọc.

    Đếm trong lúc đọc

    OPENFILE "marks.txt" FOR WRITE
    WRITEFILE "marks.txt", 40
    WRITEFILE "marks.txt", 65
    WRITEFILE "marks.txt", 88
    CLOSEFILE "marks.txt"
    
    DECLARE Mark, Count, Total : INTEGER
    Count ← 0
    Total ← 0
    OPENFILE "marks.txt" FOR READ
    WHILE NOT EOF("marks.txt") DO
        READFILE "marks.txt", Mark
        Count ← Count + 1
        Total ← Total + Mark
    ENDWHILE
    CLOSEFILE "marks.txt"
    OUTPUT Count, " marks, mean ", Total / Count
    

    Lỗi thường gặp

    • Vòng lặp WHILE EOF(...) — chạy chỉ khi không còn gì nữa. Bạn cần NOT.
    • Đọc vượt quá cuối do vòng lặp thiếu bảo vệ EOF.
    • Mở FOR READ một tệp chưa từng được ghi.
  • 11 A-Level 9618: what changes · ⁨A-Level 9618: những thay đổi⁩
    11.1

    Bố cục và toán tử

    English

    Cambridge publishes two pseudocode specifications, and they disagree. Everything in topics 1-10 is IGCSE 0478. A-Level 9618 changes the details below — and a student who studies both loses marks by writing one in the other's paper.

    IGCSE 0478 A-Level 9618
    THEN on its own line, indented 2 on the IF line
    constants CONSTANT Pi ← 3.142 CONSTANT Pi = 3.142
    DIV / MOD functions: DIV(10, 3) operators: 10 DIV 3
    joining strings commas in OUTPUT the & operator
    identifiers must start with a capital mixed case allowed 混合大小写
    NEXT must name its counter good practice
    ROUND, RANDOM() both published neither exists

    This is the 0478 form, and it runs here:

    The 9618 form of the same algorithm is written like this — note THEN on the IF line, = in the CONSTANT, and MOD between its two values:

    ⚠️ Which one is right depends only on which paper you are sitting. Neither is a mistake; each is a mistake in the other's exam. The playground on this page runs the 0478 rules, so a 9618 construct is refused with a message naming the syllabus it belongs to — which is a quick way to check your own habits.

    Common mistakes

    • Writing THEN on the IF line in an 0478 answer, because that is what a textbook or a website showed. It is the single commonest cross-syllabus slip.
    • 10 MOD 3 in 0478. There it is MOD(10, 3).
    • ROUND(3.14159, 2) in a 9618 answer. 9618 has no ROUND at all.
    Tiếng Việt

    Cambridge xuất bản hai tài liệu pseudocode, và chúng mâu thuẫn. Tất cả nội dung trong các chủ đề 1-10 thuộc về IGCSE 0478. A-Level 9618 thay đổi các chi tiết bên dưới — và một học sinh học cả hai sẽ bị trừ điểm khi viết cái này vào bài kiểm tra của cái kia.

    IGCSE 0478 A-Level 9618
    THEN trên dòng riêng của nó, thụt vào 2 trên dòng IF
    hằng số CONSTANT Pi ← 3.142 CONSTANT Pi = 3.142
    DIV / MOD hàm: DIV(10, 3) toán tử: 10 DIV 3
    nối chuỗi dấu phẩy trong OUTPUT toán tử &
    tên biến phải bắt đầu bằng chữ viết hoa cho phép viết hoa/thường
    NEXT bắt buộc đặt tên bộ đếm cách tốt
    ROUND, RANDOM() cả hai đều được xuất bản không có cái nào tồn tại

    Đây là dạng 0478, và nó chạy ở đây:

    DECLARE Total : REAL
    CONSTANT Rate ← 0.5
    Total ← 10
    IF MOD(7, 2) = 1
      THEN
        OUTPUT "Odd, half rate ", Total * Rate
    ENDIF
    

    Dạng 9618 của cùng thuật toán được viết như thế này — chú ý THEN nằm trên IF dòng, = nằm trong CONSTANT, và MOD nằm giữa hai giá trị của nó:

    DECLARE Total : REAL
    CONSTANT Rate = 0.5
    Total ← 10
    IF 7 MOD 2 = 1 THEN
        OUTPUT "Odd, half rate " & STR(Total * Rate)
    ENDIF
    

    ⚠️ Việc chọn cái nào đúng phụ thuộc hoàn toàn vào việc bạn đang làm bài kiểm tra nào. Không cái nào sai; mỗi cái đều là sai sót trong bài kiểm tra của cái kia. Sân chơi trên trang này tuân theo quy tắc 0478, nên một cấu trúc 9618 sẽ bị từ chối với thông báo nêu rõ chương trình thi thuộc về — điều này là cách nhanh để kiểm tra thói quen của chính bạn.

    Lỗi thường gặp

    • Viết THEN trên IF dòng trong câu trả lời 0478, vì đó là điều mà sách giáo khoa hoặc trang web đã hiển thị. Đây là sai lầm phổ biến nhất giữa các chương trình thi.
    • 10 MOD 3 trong 0478. Ở đó nó là MOD(10, 3).
    • ROUND(3.14159, 2) trong câu trả lời 9618. 9618 hoàn toàn không có ROUND.
    11.2

    Tham số: BYVAL và BYREF

    English

    0478 passes every parameter by value 传值 (topic 9). 9618 lets you choose, and says so in the header.

    • BYVAL — the procedure gets a copy. Changing it changes nothing outside. This is the default when neither word is written.
    • BYREF — the procedure works on the caller's own variable 引用, so a change is visible after the call.

    This is 9618 only. It does not run here, and it is not accepted in an 0478 answer:

    The 0478 way to get a value back

    Use a FUNCTION and assign what it returns. This is the whole of the 0478 answer, and it runs:

    Common mistakes

    • Writing BYREF in an 0478 answer. The keyword is not in that syllabus.
    • Expecting a plain 9618 parameter to behave like BYREF. Without the word it is BYVAL.
    Tiếng Việt

    0478 truyền mọi tham số theo giá trị (chủ đề 9). 9618 cho phép bạn lựa chọn, và ghi rõ trong phần tiêu đề.

    • BYVAL — thủ tục nhận được một bản sao. Thay đổi nó không ảnh hưởng gì bên ngoài. Đây là mặc định khi không có từ nào được viết ra.
    • BYREF — thủ tục thao tác trực tiếp lên biến gốc của người gọi, nên sự thay đổi sẽ thấy được sau khi gọi.

    Điều này chỉ áp dụng cho 9618. Nó không chạy ở đây, và không chấp nhận trong câu trả lời 0478:

    PROCEDURE Increase(BYREF Value : INTEGER)
        Value ← Value + 1
    ENDPROCEDURE
    
    DECLARE Count : INTEGER
    Count ← 5
    CALL Increase(Count)
    OUTPUT Count      // prints 6
    

    Cách lấy giá trị trả về trong 0478

    Sử dụng một FUNCTION và gán giá trị nó trả về. Đây là toàn bộ câu trả lời 0478, và nó chạy: chạy:

    FUNCTION Increased(Value : INTEGER) RETURNS INTEGER
        RETURN Value + 1
    ENDFUNCTION
    
    DECLARE Count : INTEGER
    Count ← 5
    Count ← Increased(Count)
    OUTPUT Count
    

    Lỗi thường gặp

    • Viết BYREF trong câu trả lời 0478. Từ khóa này không có trong chương trình học đó.
    • kỳ vọng một tham số 9618 đơn thuần sẽ hoạt động như BYREF. Không có từ đó thì nó là BYVAL.
    11.3

    Record và các kiểu dữ liệu khác

    English

    9618 has data structures 数据结构 that 0478 does not. You will meet them only at A-Level, and none of them runs under the 0478 rules of this page.

    A record 记录 groups fields of different types under one name (9618 section 4):

    An enumerated type 枚举类型 lists the only values a variable may take:

    9618 also adds a DATE data type, random-access files (OPENFILE … FOR RANDOM), pointers, and classes with CLASS … ENDCLASS for its object-oriented paper.

    ⚠️ 0478 has five data types and arrays, and nothing else (topic 2). A 0478 answer that declares a record is answering a different syllabus.

    Common mistakes

    • Using a record in an 0478 answer. Use parallel arrays instead — one array per field, sharing an index.
    • Thinking TYPE means the same as DECLARE. TYPE defines a new type; DECLARE creates a variable of an existing one.
    Tiếng Việt

    9618 có các cấu trúc dữ liệu mà 0478 không có. Bạn chỉ gặp chúng ở A-Level, và không có cái nào chạy dưới các quy tắc 0478 của trang này.

    Một record gộp các trường có các kiểu khác nhau dưới cùng một tên (9618 phần 4):

    TYPE Student
        DECLARE Name : STRING
        DECLARE Mark : INTEGER
    ENDTYPE
    
    DECLARE Candidate : Student
    Candidate.Name ← "Mei"
    Candidate.Mark ← 91
    OUTPUT Candidate.Name, " scored ", Candidate.Mark
    

    Một kiểu liệt kê chỉ ra các giá trị duy nhất mà biến có thể nhận:

    TYPE Vehicle = (Car, Bus, Taxi)
    DECLARE MyRide : Vehicle
    MyRide ← Taxi
    

    9618 còn thêm một kiểu dữ liệu DATE, tập tin truy cập ngẫu nhiên (OPENFILE … FOR RANDOM), con trỏ, và các lớp với CLASS … ENDCLASS cho bài kiểm tra lập trình hướng đối tượng của nó.

    ⚠️ 0478 có năm loại dữ liệu và mảng, và không còn gì khác (chủ đề 2). Một câu trả lời 0478 mà việc khai báo record đang giải quyết một chương trình học khác.

    Lỗi thường gặp

    • Sử dụng record trong câu trả lời 0478. Hãy dùng mảng song song thay thế — mỗi trường một mảng, chia sẻ chung chỉ mục.
    • Nghĩ rằng TYPE giống như DECLARE. TYPE định nghĩa một loại mới; DECLARE tạo ra một biến của kiểu đã tồn tại.

Log in or create account · ⁨Đăng nhập hoặc tạo tài khoản⁩

IGCSE, A-Level & AP