Skip to content · ⁨Bỏ qua nội dung⁩

Algorithm Design and Problem-solving · ⁨Thiết kế thuật toán và giải quyết vấn đề⁩

A-Level Computer Science · ⁨Khoa học máy tính A-Level⁩ · Topic 9 · ⁨Chủ đề 9⁩

Video lesson for this topic · ⁨Bài học video cho chủ đề này⁩ Open the video page · ⁨Mở trang video⁩
14:52

Tư duy tính toán

Đây là một nhiệm vụ: xây dựng hệ thống quản lý tồn kho của cả một cửa hàng — mọi sản phẩm, mọi lần bán, mọi lô hàng, mọi báo cáo. Xét như một vấn đề lớn, nó quá to để…

English narration · English + 中文 subtitles burned in · ⁨Giọng đọc tiếng Anh · phụ đề tiếng Anh + 中文 được ghi trực tiếp⁩

9.1

Computational thinking · ⁨Tư duy tính toán⁩

Syllabus · ⁨Chương trình⁩
English
Candidates should be able to: Notes and guidance
Show an understanding of abstraction Need for and benefits of using abstraction Describe the purpose of abstraction Produce an abstract model of a system by only including essential details
Describe and use decomposition Break down problems into sub-problems leading to the concept of a program module (procedure / function)
Tiếng Việt
Thí sinh cần có thể: Ghi chú và hướng dẫn
Thể hiện sự hiểu biết về trừu tượng hóa Nhu cầu và lợi ích của việc sử dụng trừu tượng hóa Mô tả mục đích của trừu tượng hóa Xây dựng một mô hình trừu tượng của hệ thống chỉ bằng cách bao gồm các chi tiết thiết yếu
Mô tả và sử dụng phân rã Chia nhỏ các vấn đề thành các vấn đề con dẫn đến khái niệm về một mô-đun chương trình (hàm / thủ tục)

Source: Cambridge International syllabus · ⁨Nguồn: Chương trình Cambridge International⁩

English

Computational thinking 计算思维 is the set of mental tools for analysing a problem and designing a solution a computer can run. Two key ones are abstraction and decomposition.

Abstraction

Abstraction 抽象 means keeping the essential features of a problem and ignoring the irrelevant detail, giving a simpler model.

Examples:

  • a train-network map keeps the stations and lines but drops the geography.
  • a class in object-oriented programming keeps only the attributes and methods the system needs.
  • a function hides a piece of work behind a name.

A full model of any real problem would be too big to reason about, so abstraction is essential.

The examiner asks for the purpose of abstraction and for its benefits. Purpose: to produce a simpler model of a problem that contains only the details needed to solve it. Benefits: the problem is easier to understand and to program; the program is smaller and faster to write and test; the same model can be reused for similar problems. When you are asked to produce an abstract model of a system, list only the data and actions the task needs. For a school timetable that means the classes, rooms, teachers and periods; it does not mean the colour of the rooms or the age of the teachers.

Decomposition

Decomposition 分解 means breaking a large problem into smaller sub-problems, each easier to solve and tackled one at a time.

  1. find the main parts of the task.
  2. break each into smaller sub-tasks.
  3. continue until each is small enough to design directly.
  4. solve the small tasks and combine them.

For stock control: "manage stock" → "record sales", "record deliveries", "produce reports" → ("record sales") "look up product", "decrease stock count", "save the transaction". Decomposition makes big problems manageable, lets a team divide the work, and gives modular code — each module becomes a procedure 过程 or function.

"Explain why decomposition is used" is a three-mark question with a fixed shape. Give three separate benefits: each sub-problem 子问题 is small enough to design, code and test on its own; different programmers can work on different modules 模块 at the same time; a module that already exists (or a library routine) can be reused, and a fault is easier to find because it lies inside one module. A structure chart (topic 12) is the diagram of a decomposition: the program at the top, its modules beneath, and the data passed between them.

Tiếng Việt

Tư duy tính toán là tập hợp các công cụ tư duy để phân tích một vấn đề và thiết kế một giải pháp mà máy tính có thể thực thi. Hai yếu tố cốt lõi là trừu tượng hóa và phân rã.

Một phần puzzle chưa hoàn chỉnh
Tư duy tính toán chia nhỏ một vấn đề lớn thành các phần nhỏ hơn, dễ giải quyết hơn — giống như việc giải một bài puzzle

Trừu tượng hóa

Trừu tượng hóa có nghĩa là giữ lại các đặc điểm thiết yếu của một vấn đề và bỏ qua các chi tiết không liên quan, tạo ra một mô hình đơn giản hơn.

Ví dụ:

  • bản đồ mạng lưới tàu hỏa giữ lại các ga và tuyến đường nhưng bỏ qua địa lý.
  • một class trong lập trình hướng đối tượng chỉ giữ lại các thuộc tính và phương thức mà hệ thống cần.
  • một hàm ẩn đi một phần công việc dưới một cái tên.

Một mô hình đầy đủ của bất kỳ vấn đề thực tế nào sẽ quá lớn để suy luận, nên trừu tượng hóa là cần thiết.

Người ra đề yêu cầu giải thích mục đích của sự trừu tượng và các lợi ích của nó. Mục đích: tạo ra một mô hình đơn giản hơn cho vấn đề, chỉ chứa những chi tiết cần thiết để giải quyết nó. Lợi ích: vấn đề dễ hiểu và dễ lập trình hơn; chương trình nhỏ gọn hơn, nhanh chóng viết và kiểm thử hơn; cùng một mô hình có thể tái sử dụng cho các vấn đề tương tự. Khi được yêu cầu tạo mô hình trừu tượng cho một hệ thống, chỉ liệt kê dữ liệu và hành động mà tác vụ cần. Ví dụ với bảng thời khóa biểu trường học, điều đó có nghĩa là các lớp học, phòng học, giáo viên và tiết học; không phải màu sắc phòng học hay độ tuổi của giáo viên.

Trừu tượng biến bản đồ địa lý thực tế lộn xộn (một tuyến đường ngoằn ngoèo với các tòa nhà rải rác) thành một bản đồ tàu điện ngầm sạch sẽ — các vòng tròn ga đều đặn trên một đường thẳng, giữ lại các ga và tuyến, nhưng loại bỏ địa lý thực tế
Trừu tượng giữ lại những yếu tố cốt lõi (các ga và tuyến) và loại bỏ chi tiết không liên quan (bản đồ địa lý)

Phân rã (Decomposition)

Phân rã có nghĩa là chia một vấn đề lớn thành các vấn đề con nhỏ hơn, mỗi vấn đề con dễ giải quyết hơn và được giải quyết từng bước một.

  1. xác định các phần chính của tác vụ.
  2. chia mỗi phần thành các tác vụ con nhỏ hơn.
  3. tiếp tục cho đến khi mỗi phần đủ nhỏ để thiết kế trực tiếp.
  4. giải quyết các tác vụ nhỏ và kết hợp chúng lại.

Đối với quản lý tồn kho: "quản lý tồn kho" → "ghi nhận bán hàng", "ghi nhận giao hàng", "tạo báo cáo" → ("ghi nhận bán hàng") "tra cứu sản phẩm", "giảm số lượng tồn kho", "lưu giao dịch". Phân rã giúp các vấn đề lớn trở nên khả thi, cho phép nhóm chia sẻ công việc và tạo ra mã code theo mô-đun — mỗi mô-đun trở thành một thủ tục hoặc hàm.

Câu hỏi "Giải thích tại sao phân rã được sử dụng" là câu hỏi 3 điểm với cấu trúc cố định. Hãy đưa ra ba lợi ích riêng biệt: mỗi vấn đề con đủ nhỏ để thiết kế, viết code và kiểm thử độc lập; các lập trình viên khác nhau có thể làm việc trên các mô-đun khác nhau cùng lúc; một mô-đun đã tồn tại (hoặc thủ tục thư viện) có thể tái sử dụng, và lỗi dễ tìm thấy hơn vì nó nằm bên trong một mô-đun cụ thể. Biểu đồ cấu trúc (chủ đề 12) là sơ đồ của sự phân rã: chương trình ở trên cùng, các mô-đun của nó bên dưới, và dữ liệu truyền giữa chúng.

Một cây với "Manage stock" ở phía trên nhánh ra các module "Record sales", "Record deliveries" và "Produce reports", và "Record sales" tách ra các tác vụ con "Look up product", "Decrease stock count" và "Save the transaction"
Phân rã một chương trình thành các module và sub-modules
Explore · ⁨Khám phá⁩

Solving a problem the computational way · ⁨Giải quyết một vấn đề theo cách tính toán⁩

Step through the four cornerstones in the order you'd use them — break the problem down, spot what repeats, strip it to essentials, then write the steps. · ⁨Tiến hành qua bốn trụ cột theo thứ tự bạn sẽ sử dụng chúng — phân rã vấn đề, nhận diện sự lặp lại, loại bỏ chi tiết không cần thiết, sau đó viết các bước.⁩

Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
English Tiếng Việt
computational thinking/ˌkɒmpjuːˈteɪʃənl ˈθɪŋkɪŋ/ tư duy tính toán
abstraction/əbˈstrækʃn/ trừu tượng hóa
decomposition/ˌdiːkɒmpəˈzɪʃn/ decomposition
sub-problem/sʌb ˈprɒbləm/ vấn đề con
procedure/prəˈsiːdʒə/ thủ tục
modules/ˈmɒdjuːlz/ module
algorithm/ˈælɡərɪθəm/ thuật toán
sequence/ˈsiːkwəns/ dãy (sequence)
unambiguous/ʌnæmˈbɪɡjuːəs/ không mơ hồ
deterministic/dɪˌtɜːmɪˈnɪstɪk/ quy định trước
9.2

Algorithms · ⁨Thuật toán⁩

Syllabus · ⁨Chương trình⁩
English
Candidates should be able to: Notes and guidance
Show understanding that an algorithm is a solution to a problem expressed as a sequence of defined steps
Use suitable identifier names for the representation of data used by a problem and represent these using an identifier table
Write pseudocode that contains input, process and output
Write pseudocode using the three basic constructs of sequence, selection and iteration (repetition)
Document a simple algorithm using a structured English description, a flowchart or pseudocode
Write pseudocode from: • a structured English description • a flowchart
Draw a flowchart from: • a structured English description • pseudocode
Describe and use the process of stepwise refinement to express an algorithm to a level of detail from which the task may be programmed
Use logic statements to define parts of an algorithm solution
Tiếng Việt
Thí sinh cần có thể: Ghi chú và hướng dẫn
Thể hiện sự hiểu biết rằng một thuật toán là lời giải cho một vấn đề được biểu diễn dưới dạng một chuỗi các bước xác định
Sử dụng tên định danh phù hợp để biểu diễn dữ liệu được sử dụng bởi một vấn đề và biểu diễn chúng bằng một bảng định danh
Viết giả mã chứa đầu vào, xử lý và đầu ra
Viết giả mã sử dụng ba kiến trúc cơ bản của trình tự, lựa chọn và lặp lại (vùng lặp)
Tài liệu hóa một thuật toán đơn giản bằng mô tả tiếng Anh có cấu trúc, sơ đồ khối hoặc giả mã
Viết giả mã từ: • mô tả tiếng Anh có cấu trúc • sơ đồ khối
Vẽ sơ đồ khối từ: • mô tả tiếng Anh có cấu trúc • giả mã
Mô tả và sử dụng quá trình tinh chỉnh từng bước để biểu diễn một thuật toán ở mức độ chi tiết mà từ đó có thể lập trình được nhiệm vụ
Sử dụng các mệnh đề logic để xác định các phần của lời giải thuật toán

Source: Cambridge International syllabus · ⁨Nguồn: Chương trình Cambridge International⁩

English
Bubble sort, pass by pass

An algorithm 算法 is a solution expressed as a sequence of defined steps. Each step is unambiguous 无歧义 (one meaning), deterministic 确定性 (same input → same output), finite (the steps end), and effective (each can be done). An algorithm says what to do, independent of the programming language used to implement it.

Tiếng Việt
Thuật toán sắp xếp nổi bọt, qua từng lượt

Một thuật toán là một phương pháp giải quyết được diễn đạt dưới dạng chuỗi các bước xác định. Mỗi bước không mơ hồ (có một ý nghĩa), xác định (cùng đầu vào → cùng đầu ra), hữu hạn (các bước kết thúc), và hiệu quả (mỗi bước đều có thể thực hiện). Một thuật toán nói cần làm gì, độc lập với ngôn ngữ lập trình được dùng để triển khai nó.

Explore · ⁨Khám phá⁩

Selection: follow the IF / ELSE branches · ⁨Lựa chọn: đi theo các nhánh IF / ELSE⁩

Drag the score and watch which branch runs. Selection tests each condition in turn and takes the FIRST one that is true — that is how IF … ELSE IF … ELSE works. · ⁨Kéo điểm số và xem nhánh nào được thực thi. Sự lựa chọn kiểm tra từng điều kiện một và chọn NHÁNH ĐẦU TIÊN đúng — đó là cách hoạt động của IF … ELSE IF … ELSE.⁩

Watch lesson · ⁨Xem bài học⁩
9.2

Identifier table · ⁨Bảng ký hiệu⁩

English

When you start an algorithm, list every piece of data in an identifier table 标识符表 — its identifier 标识符 (the variable 变量 name), data type 数据类型, and description. The exam's table has exactly these three columns:

Identifier Data type Description
Category STRING the product category
SaleDate DATE when the item was sold
ItemCost REAL cost of the item
InStock BOOLEAN TRUE if in stock
Sales ARRAY[1:30] OF REAL the last 30 daily sales totals

Use descriptive names (ItemCost, not x): an identifier starts with a letter, contains no spaces, and is written the same way every time it appears. Common types are INTEGER, REAL, STRING, CHAR, BOOLEAN, DATE, plus arrays. The table forces you to name every piece of data before writing code, and a "complete the identifier table" question gives one mark for each correct data type or description, so write the type exactly as the pseudocode guide does.

Tiếng Việt

Khi bắt đầu một thuật toán, hãy liệt kê mọi piece dữ liệu vào một bảng ký hiệu — bao gồm ký hiệu (tên biến), kiểu dữ liệu, và mô tả. Bảng kiểm tra sẽ có đúng ba cột này:

Ký hiệu Kiểu dữ liệu Mô tả
Category STRING danh mục sản phẩm
SaleDate DATE thời điểm mặt hàng được bán
ItemCost REAL giá thành của mặt hàng
InStock BOOLEAN TRUE nếu còn trong kho
Sales ARRAY[1:30] OF REAL tổng doanh số hàng ngày trong 30 lần gần nhất

Sử dụng tên mô tả (ItemCost, không phải x): một ký hiệu bắt đầu bằng chữ cái, không chứa khoảng trắng, và được viết giống hệt nhau mỗi lần xuất hiện. Các kiểu phổ biến là INTEGER, REAL, STRING, CHAR, BOOLEAN, DATE, cộng thêm mảng. Bảng buộc bạn phải đặt tên cho mọi piece dữ liệu trước khi viết code, và câu hỏi "hoàn thành bảng ký hiệu" sẽ cho 1 điểm cho mỗi kiểu dữ liệu hoặc mô tả đúng, vì vậy hãy viết kiểu chính xác như hướng dẫn pseudocode yêu cầu.

Bảng định danh liệt kê từng biến với tên, kiểu dữ liệu và mô tả, ví dụ ItemCost là REAL cho chi phí của mặt hàng
Bảng ký danh đặt tên cho mọi mảnh dữ liệu trước khi bạn viết code
Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
English Tiếng Việt
identifier table/aɪˈdentɪfaɪə ˈteɪbl/ bảng định danh
identifier/aɪˈdentɪfaɪə/ định danh
Boolean/ˈbuːlɪən/ Boolean
pseudocode/ˈsuːdəʊkəʊd/ pseudocode (giả mã)
9.2

Pseudocode — the three basic constructs · ⁨Pseudocode — Ba kiến trúc cơ bản⁩

English

Pseudocode 伪代码 is a structured, language-neutral way to describe algorithms.

1. Sequence

Steps run one after another (sequence 顺序):

2. Selection

A choice of which steps run, based on a condition (selection 选择):

For more options, use CASE OF ... ENDCASE.

3. Iteration

Repeating a block (iteration 迭代, a loop 循环):

A WHILE loop tests the condition before each pass (may run zero times); a REPEAT...UNTIL loop tests after each pass (always runs at least once).

Choosing the loop is itself a mark: FOR when you know how many times (a count-controlled loop 计数循环); WHILE when the loop might not run at all (a pre-condition loop 前测循环); REPEAT ... UNTIL when it must run at least once, as in validating an input (a post-condition loop 后测循环). A "describe the iteration construct" answer names the construct, says where the condition is tested, and gives the consequence (zero times or at least once).

Common operations

  • assignment 赋值: x ← 5 (an arrow; = is for comparison).
  • input/output: INPUT variable, OUTPUT expression.
  • comparisons =, <>, <, >, <=, >=; logic AND, OR, NOT.
  • arithmetic + - * /, plus DIV (integer division) and MOD (remainder).
  • strings: LENGTH, LEFT, RIGHT, MID, and & for concatenation 拼接 (joining).

The pseudocode the exam expects

Every pseudocode answer is marked against Cambridge's published pseudocode guide. Write these forms exactly:

Construct Pseudocode
Variable DECLARE Total : INTEGER
Array DECLARE Marks : ARRAY[1:30] OF REAL
Constant CONSTANT MaxTries = 3
Assignment Total ← Total + Value
Input / output INPUT Name
OUTPUT "Hello ", Name
Selection CASE OF Choice
1 : OUTPUT "Add"
OTHERWISE OUTPUT "Error"
ENDCASE
FOR loop FOR i ← 1 TO 10 STEP 2 ... NEXT i
WHILE loop WHILE Total < 100 DO ... ENDWHILE
REPEAT loop REPEAT ... UNTIL Mark >= 0
Integer arithmetic 17 DIV 5 = 3
17 MOD 5 = 2
Strings LENGTH(S), LEFT(S, 3), RIGHT(S, 2)
MID(S, 2, 4), UCASE(S), LCASE(S)
Conversions INT(3.7) = 3, NUM_TO_STR(12)
STR_TO_NUM("4.5"), ASC('A') = 65, CHR(66) = 'B'
Random RAND(100)
INT(RAND(100)) + 1

RAND(100) gives a real number from 0 up to (but not including) 100. INT(RAND(100)) + 1 gives an integer from 1 to 100.

Two habits earn marks on every question: declare every variable you use, with the type from your identifier table, and initialise 初始化 every counter 计数器 and total (Count ← 0, Total ← 0) before the loop that changes it.

Input → Process → Output

Every program follows this shape:

Listing the inputs and outputs first makes the algorithm cleaner.

Worked example. Write pseudocode that inputs 100 integers and outputs how many of them, and the total of those, that lie between 10 and 20 inclusive.

Identifier table: Count : INTEGER (loop counter), Value : INTEGER (the integer just input), InRange : INTEGER (how many were in range), Total : INTEGER (their sum).

If the question then asks you to "identify two constructs and state how each is used", answer in the same shape: iteration, the FOR loop, repeats the input 100 times; selection, the IF statement, adds a value only when it is in range.

Worked example. A program picks a secret integer from 1 to 100. The user guesses until they are right; after each wrong guess the program says "Too low" or "Too high", and at the end it outputs how many guesses were made.

Identifier table: Secret : INTEGER (the number to guess), Guess : INTEGER (the user's input), Tries : INTEGER (how many guesses so far).

A REPEAT ... UNTIL loop is the right choice because the user must guess at least once. The marks are for: the random number in the right range, a loop that ends on a correct guess, the counter that starts at zero and increases inside the loop, the two messages under the right conditions, and the final output.

Worked example. Output two different random integers, each between $-10$ and $10$ inclusive.

There are 21 possible values, so INT(RAND(21)) gives 0 to 20 and subtracting 10 shifts it to the range $-10$ to $10$. The second number must be generated again until it differs from the first:

Tiếng Việt

Pseudocode là cách mô tả thuật toán mang tính cấu trúc, trung lập với ngôn ngữ.

Ba cấu trúc cơ bản dưới dạng sơ đồ luồng nhỏ: trình tự chạy bước A rồi B rồi C; lựa chọn kiểm tra điều kiện và thực hiện X hoặc Y; lặp lại thực thi thân vòng lặp khi điều kiện còn đúng, quay trở lại
Ba khối xây dựng cơ bản của bất kỳ thuật toán nào: tuần tự, chọn lọc và lặp

1. Tuần tự

Các bước chạy lần lượt theo thứ tự (tuần tự):

INPUT Name
INPUT Age
OUTPUT "Hello", Name

2. Chọn lọc

Lựa chọn các bước nào sẽ chạy, dựa trên một điều kiện (chọn lọc):

IF Age >= 18 THEN
    OUTPUT "Adult"
ELSE
    OUTPUT "Minor"
ENDIF

Để có nhiều tùy chọn hơn, hãy dùng CASE OF ... ENDCASE.

3. Lặp

Lặp lại một khối lệnh (lặp, một vòng lặp):

FOR i ← 1 TO 10
    OUTPUT i
NEXT i

Vòng lặp WHILE kiểm tra điều kiện trước mỗi lượt chạy (có thể chạy 0 lần); vòng lặp REPEAT...UNTIL kiểm tra sau mỗi lượt chạy (luôn chạy ít nhất một lần).

WHILE Total < 100 DO
    INPUT Value
    Total ← Total + Value
ENDWHILE

REPEAT
    INPUT Mark
UNTIL Mark >= 0 AND Mark <= 100
Hai sơ đồ luồng đặt cạnh nhau. WHILE kiểm tra điều kiện trước, nên thân có thể không bao giờ chạy: hình thoi nằm trên thân và nhánh Không thoát khỏi vòng lặp. REPEAT UNTIL thực thi thân trước và kiểm tra sau đó, nên thân luôn chạy ít nhất một lần: thân nằm trên hình thoi và nhánh Không quay trở về thân
Vòng lặp WHILE kiểm tra trước khi thân lệnh chạy; vòng lặp REPEAT ... UNTIL kiểm tra sau khi thân lệnh chạy, nên thân lệnh luôn chạy ít nhất một lần

Việc chọn loại vòng lặp chính là điểm số: FOR khi bạn biết số lần lặp (một vòng lặp kiểm soát đếm; WHILE khi vòng lặp có thể không chạy chút nào (một vòng lặp tiền điều kiện); REPEAT ... UNTIL khi nó phải chạy ít nhất một lần, như trong việc xác thực đầu vào (một vòng lặp hậu điều kiện). Câu trả lời "mô tả cấu trúc lặp" cần nêu tên cấu trúc, chỉ ra nơi điều kiện được kiểm tra, và đưa ra hệ quả (không chạy lần nào hoặc chạy ít nhất một lần).

Các phép toán thường gặp

  • gán: x ← 5 (một mũi tên; = dùng để so sánh).
  • nhập/xuất: INPUT variable, OUTPUT expression.
  • so sánh =, <>, <, >, <=, >=; logic AND, OR, NOT.
  • phép toán số học + - * /, cộng DIV (phép chia lấy phần nguyên) và MOD (phần dư).
  • chuỗi: LENGTH, LEFT, RIGHT, MID, và & để nối (ghép nối).

Mã giả mà đề thi yêu cầu

Mọi câu trả lời伪代码都会被剑桥出版的伪代码指南评分。请严格写出以下格式:

结构 伪代码
变量 DECLARE Total : INTEGER
数组 DECLARE Marks : ARRAY[1:30] OF REAL
常量 CONSTANT MaxTries = 3
赋值 Total ← Total + Value
输入 / 输出 INPUT Name
OUTPUT "Hello ", Name
选择 CASE OF Choice
1 : OUTPUT "Add"
OTHERWISE OUTPUT "Error"
ENDCASE
FOR 循环 FOR i ← 1 TO 10 STEP 2 ... NEXT i
Vòng lặp WHILE WHILE Total < 100 DO ... ENDWHILE
REPEAT 循环 REPEAT ... UNTIL Mark >= 0
整数运算 17 DIV 5 = 3
17 MOD 5 = 2
Chuỗi ký tự LENGTH(S), LEFT(S, 3), RIGHT(S, 2)
MID(S, 2, 4), UCASE(S), LCASE(S)
Chuyển đổi INT(3.7) = 3, NUM_TO_STR(12)
STR_TO_NUM("4.5"), ASC('A') = 65, CHR(66) = 'B'
随机数 RAND(100)
INT(RAND(100)) + 1

RAND(100) trả về một số thực từ 0 đến (nhưng không bao gồm) 100. INT(RAND(100)) + 1 trả về một số nguyên từ 1 đến 100.

两种习惯会在每道题中获得分数:声明你使用的每一个变量,并附带标识符表中的类型;在改变该变量的循环之前初始化每一个计数器和总和(Count ← 0, Total ← 0)。

输入 → 处理 → 输出

每个程序都遵循这种结构:

INPUT Length
INPUT Width
Area ← Length * Width
OUTPUT "Area = ", Area

首先列出输入和输出会使算法更清晰。

Ví dụ giải. Viết mã giả nhập 100 số nguyên và xuất ra số lượng cũng như tổng của những số nằm giữa 10 và 20 bao gồm cả hai giá trị biên.

标识符表:Count : INTEGER(循环计数器),Value : INTEGER(刚输入的整数),InRange : INTEGER(在范围内的数量),Total : INTEGER(它们的总和)。

DECLARE Count, Value, InRange, Total : INTEGER
InRange ← 0
Total ← 0
FOR Count ← 1 TO 100
    INPUT Value
    IF Value >= 10 AND Value <= 20 THEN
        InRange ← InRange + 1
        Total ← Total + Value
    ENDIF
NEXT Count
OUTPUT InRange, Total

Nếu câu hỏi sau đó yêu cầu bạn "xác định hai cấu trúc và phát biểu cách mỗi cấu trúc được sử dụng", hãy trả lời theo cùng định dạng: lặp lại, vòng lặp FOR, lặp lại việc nhập liệu 100 lần; lựa chọn, câu lệnh IF, cộng giá trị chỉ khi nó nằm trong phạm vi.

例题。 一个程序从1到100中随机选取一个秘密整数。用户猜测直到猜对为止;每次猜错后,程序显示“太低”或“太高”,最后它输出总共猜了多少次。

标识符表:Secret : INTEGER(要猜的数),Guess : INTEGER(用户的输入),Tries : INTEGER(到目前为止猜的次数)。

DECLARE Secret, Guess, Tries : INTEGER
Secret ← INT(RAND(100)) + 1
Tries ← 0
REPEAT
    INPUT Guess
    Tries ← Tries + 1
    IF Guess < Secret THEN
        OUTPUT "Too low"
    ELSE
        IF Guess > Secret THEN
            OUTPUT "Too high"
        ENDIF
    ENDIF
UNTIL Guess = Secret
OUTPUT "You took ", Tries, " guesses"

使用REPEAT ... UNTIL循环是正确选择,因为用户至少需要猜一次。得分点包括:正确范围内的随机数、以猜对为结束条件的循环、从0开始并在循环内递增的计数器、在正确条件下显示的两条消息,以及最终输出。

猜数游戏流程图:开始,然后设置Secret为1到100之间的随机整数,Tries设为0,接着输入猜测,Tries加1,测试猜测是否等于Secret(Yes导致输出Tries并停止),否则测试猜测是否较小(Yes输出Too low,No输出Too high),两个输出分支都返回到输入
与流程图相同的猜数游戏:两个菱形决策框是两个IF语句,返回箭头是REPEAT ... UNTIL循环

例题。 输出两个不同的随机整数,每个都在$-10$到$10$之间(包含两端)。

共有21种可能值,因此INT(RAND(21))给出0到20,减去10将其平移到$-10$到$10$范围。第二个数必须重新生成,直到它与第一个不同:

DECLARE First, Second : INTEGER
First ← INT(RAND(21)) - 10
REPEAT
    Second ← INT(RAND(21)) - 10
UNTIL Second <> First
OUTPUT First, Second
每个程序遵循输入、处理、输出的结构,用面积计算示例展示:输入长和宽,通过相乘进行处理,输出面积
每个程序都遵循输入、处理、输出的结构
Explore · ⁨Khám phá⁩

IF … ELSE selection · ⁨IF … ELSE chọn lọc⁩

Change the value and watch which branch runs — how a program makes a decision. · ⁨Thay đổi giá trị và quan sát nhánh nào chạy — cách chương trình đưa ra quyết định.⁩

Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
English Tiếng Việt
variable/ˈveərɪəbl/ biến
data type/ˈdeɪtə taɪp/ kiểu dữ liệu
flowchart/ˈfləʊtʃɑːt/ sơ đồ khối
selection/sɪˈlekʃn/ chọn lọc
iteration/ˌɪtəˈreɪʃn/ lặp lại
loop/luːp/ vòng lặp
count-controlled loop/kaʊnt kənˈtrəʊld luːp/ vòng lặp điều khiển bằng đếm
pre-condition loop/priː kənˈdɪʃn luːp/ vòng lặp tiền điều kiện
post-condition loop/pəʊst kənˈdɪʃn luːp/ vòng lặp hậu điều kiện
assignment/əˈsaɪnmənt/ gán (assignment)
concatenation/kənˌkætəˈneɪʃn/ nối chuỗi (concatenation)
initialise/ɪˈnɪʃəlaɪz/ khởi tạo
counter/ˈkaʊntə/ chống ví dụ
structured English/ˈstrʌktʃəd ˈɪŋɡlɪʃ/ tiếng Anh có cấu trúc
stepwise refinement/ˈstepwaɪz rɪˈfaɪnmənt/ tinh chỉnh từng bước
logic statement/ˈlɒdʒɪk ˈsteɪtmənt/ phát biểu logic
precedence/ˈpresɪdəns/ độ ưu tiên
De Morgan's law/də ˈmɔːɡənz lɔː/ định luật De Morgan
9.2

Three notations · ⁨三种表示法⁩

English

The same algorithm can be written three ways.

  • structured English 结构化英语 — natural language with indentation and fixed keywords; good for a high-level description.
  • flowchart 流程图 — a diagram with standard shapes:
Shape Meaning
Rounded rectangle Start / Stop
Parallelogram Input / Output
Rectangle Process
Diamond Decision
Arrow Flow of control
  • pseudocode — the keyword notation above; closest to code.

You should be able to convert between any pair: each IF is a decision diamond, each loop is a back-arrow, and a sequence is stacked rectangles.

IF ... THEN ... ELSE ... ENDIF

Tiếng Việt

同一个算法可以用三种方式编写。

  • 结构化英语 — 带有缩进和固定关键字的自然语言;适合高层次描述。
  • 流程图 — 带有标准形状的图表:
形状 含义
圆角矩形 开始 / 结束
平行四边形 输入 / 输出
矩形 处理
菱形 决策
箭头 控制流
  • 伪代码 — 上述的关键字表示法;最接近实际代码。

你应该能够在任意两者之间进行转换:每个IF是一个菱形决策框,每个循环是一个回指箭头,序列是堆叠的矩形。

IF ... THEN ... ELSE ... ENDIF

求平均数的流程图:圆角的开始和结束终止符,输入/输出平行四边形,处理矩形,以及一个“count < n?”的菱形决策框,其Yes分支循环回去读取下一个值 *使用标准形状对一列数字求平均值的流程图

9.2

Stepwise refinement · ⁨逐步细化⁩

English

Stepwise refinement 逐步求精 starts with a high-level outline and expands each step until it is small enough to code. For an average of $n$ numbers:

Level 1:

Level 2:

Each refinement keeps the previous structure and adds detail.

A six-mark "apply stepwise refinement" question gives you a high-level outline and wants each step expanded into the concrete statements a programmer could code. Keep the steps in the same order, name the data each step reads or produces, and stop when every line is a single input, assignment, output, loop or condition. For example, "validate the password" becomes: input the password; check its length is at least 8; check it contains at least one digit; output "accepted" if both checks pass, otherwise output "rejected".

Tiếng Việt

逐步细化从一个高层次大纲开始,并展开每一步直到它足够小以便编码。对于$n$个数的平均值:

第1层:

Read in the numbers
Compute the average
Output the average

第2层:

INPUT n
total ← 0
FOR i ← 1 TO n
    INPUT value
    total ← total + value
NEXT i
average ← total / n
OUTPUT average

每次细化都保留之前的结构并增加细节。

一道六分的“应用逐步细化”题目会给你一个高层大纲,并希望你将每一步展开为程序员可以编码的具体语句。保持步骤顺序不变,命名每个步骤读取或产生的数据,直到每一行都是单个输入、赋值、输出、循环或条件。例如,“验证密码”变为:输入密码;检查其长度至少为8;检查它至少包含一个数字;如果两个检查都通过则输出“接受”,否则输出“拒绝”。

逐步细化:第1层大纲(读取数字,计算平均值,输出平均值)被展开为包含输入循环和除法的第2层详细伪代码
Tinh chỉnh từng bước: mở rộng mỗi bước cấp cao thành giả mã chi tiết
Explore · ⁨Khám phá⁩

Stepwise refinement: outline to code · ⁨Sự tinh luyện từng bước: dàn ý sang mã⁩

Step down the levels. You start with the whole task in one line and keep expanding each step into smaller ones — until every step is simple enough to code directly. · ⁨Đi xuống các cấp độ. Bạn bắt đầu với toàn bộ nhiệm vụ trong một dòng và tiếp tục mở rộng từng bước thành những bước nhỏ hơn — cho đến khi mỗi bước đơn giản enough để mã hóa trực tiếp.⁩

9.2

Logic statements · ⁨Câu lệnh logic⁩

English

A logic statement 逻辑语句 is a Boolean 布尔 condition that controls branching, built from comparisons (x > 10), connectives (AND, OR, NOT) and brackets. Use it as the condition of IF, WHILE or REPEAT...UNTIL:

Precedence 优先级 (highest to lowest): NOT, then AND, then OR. Use brackets when unsure. Common mistakes:

  • a = 1 OR 2 is wrong — write a = 1 OR a = 2.
  • NOT a > 5 means NOT (a > 5), i.e. a <= 5.
  • NOT (A AND B) is the same as (NOT A) OR (NOT B) (De Morgan's law 德摩根定律) — handy for simplifying conditions.

Turning a sentence into a logic statement is a skill the papers test directly. "A ticket is free for anyone under 5 or over 65" becomes Age < 5 OR Age > 65. "A mark is valid if it is a whole number from 0 to 100" becomes Mark >= 0 AND Mark <= 100. "The loop stops when the file is finished or ten records have been read" becomes UNTIL EOF(File) OR Count = 10. Write each comparison in full: Age > 65 and Age < 5, never Age > 65 OR < 5.

Worked example. Write an identifier table and pseudocode to read 10 numbers and output the largest. The identifier table names each variable with its data type and purpose: Count : INTEGER (loop counter), Num : REAL (the number just read), Max : REAL (largest so far).

The design decision carrying the marks is initialising Max: it must start lower than any possible input - or, safer still, be set to the first number read. Initialise it to 0 and the algorithm wrongly returns 0 for a list of negative numbers, a bug your trace only exposes if the test data include a negative.

Tiếng Việt

Một câu lệnh logic là một điều kiện Boolean điều khiển nhánh, được xây dựng từ phép so sánh (x > 10), toán tử kết hợp (AND, OR, NOT) và ngoặc. Sử dụng nó như điều kiện của IF, WHILE hoặc REPEAT...UNTIL:

WHILE attempts < 3 AND NOT loggedIn DO
    INPUT password
    IF password = correctPassword THEN
        loggedIn ← TRUE
    ELSE
        attempts ← attempts + 1
    ENDIF
ENDWHILE

Độ ưu tiên (cao nhất đến thấp nhất): NOT, sau đó AND, rồi OR. Sử dụng ngoặc khi không chắc chắn. Lỗi thường gặp:

  • a = 1 OR 2 là sai — hãy viết a = 1 OR a = 2.
  • NOT a > 5 có nghĩa là NOT (a > 5), tức là a <= 5.
  • NOT (A AND B) giống hệt với (NOT A) OR (NOT B) (Định luật De Morgan) — hữu ích để rút gọn điều kiện.

Biến câu văn thành câu lệnh logic là kỹ năng mà đề thi kiểm tra trực tiếp. "Vé miễn phí cho bất kỳ ai dưới 5 tuổi hoặc trên 65 tuổi" trở thành Age < 5 OR Age > 65. "Điểm số hợp lệ nếu nó là số nguyên từ 0 đến 100" trở thành Mark >= 0 AND Mark <= 100. "Vòng lặp dừng lại khi file đã đọc xong hoặc đã đọc mười bản ghi" trở thành UNTIL EOF(File) OR Count = 10. Viết đầy đủ mỗi phép so sánh: Age > 65 và Age < 5, tuyệt đối không viết Age > 65 OR < 5.

Cây phân tích cho "attempts < 3 AND NOT loggedIn": NOT áp dụng vào loggedIn trước, sau đó AND gộp nó với attempts < 3
Độ ưu tiên: NOT gắn vào loggedIn trước, sau đó AND kết hợp hai vế

Ví dụ minh họa. Viết bảng định danh và giả mã để đọc 10 số và xuất ra số lớn nhất. Bảng định danh đặt tên cho từng biến kèm kiểu dữ liệu và mục đích: Count : INTEGER (bộ đếm vòng lặp), Num : REAL (số vừa được đọc), Max : REAL (số lớn nhất tính đến thời điểm đó).

Max ← -999999
FOR Count ← 1 TO 10
    INPUT Num
    IF Num > Max THEN
        Max ← Num
    ENDIF
NEXT Count
OUTPUT Max

Quyết định thiết kế mang điểm số chính là khởi tạo Max: nó phải bắt đầu thấp hơn bất kỳ giá trị đầu vào nào có thể xảy ra - hoặc an toàn hơn, hãy gán cho nó số đầu tiên được đọc. Khởi tạo nó là 0 thì thuật toán sẽ trả về sai là 0 cho danh sách các số âm, một lỗi chỉ bị phát hiện qua việc theo dõi thuật toán nếu dữ liệu thử nghiệm bao gồm số âm.

9.2

Definitions the examiner accepts · ⁨Các định nghĩa mà giám khảo chấp nhận⁩

English

A definition question is marked against fixed wording. Learn these exactly, and give one answer only.

Term Definition
abstraction keeping the essential details of a problem and leaving out the details that are not needed
decomposition breaking a problem down into smaller sub-problems, each of which can be solved separately
algorithm a solution to a problem expressed as a sequence of defined steps
identifier table a table listing each identifier used in an algorithm with its data type and a description of its purpose
pseudocode a structured, language-independent way of writing the steps of an algorithm
flowchart a diagram that shows the steps and decisions of an algorithm using standard symbols joined by arrows
sequence statements executed one after another in the order written
selection choosing which statements to execute according to a condition
iteration repeating a group of statements while, or until, a condition holds
stepwise refinement breaking each step of an outline into smaller steps, repeatedly, until each step can be coded directly
logic statement a condition built from comparisons and the operators AND, OR and NOT that evaluates to TRUE or FALSE
Tiếng Việt

Câu hỏi định nghĩa được chấm dựa trên văn phong cố định. Hãy học thuộc những định nghĩa này và chỉ đưa ra một đáp án duy nhất.

Thuật ngữ Định nghĩa
trừu tượng hóa giữ lại các chi tiết cốt lõi của bài toán và bỏ qua các chi tiết không cần thiết
phân tách chia nhỏ bài toán thành các bài toán con nhỏ hơn, mỗi cái có thể giải quyết riêng biệt
thuật toán lời giải cho một bài toán được biểu diễn dưới dạng chuỗi các bước xác định
bảng định danh bảng liệt kê từng định danh được sử dụng trong thuật toán kèm kiểu dữ liệu và mô tả mục đích của nó
giả mã cách viết cấu trúc, độc lập với ngôn ngữ, các bước của thuật toán
sơ đồ khối biểu đồ hiển thị các bước và quyết định của thuật toán bằng các ký hiệu tiêu chuẩn nối với nhau bằng mũi tên
tuần tự các câu lệnh được thực thi lần lượt theo thứ tự đã viết
chọn lọc lựa chọn câu lệnh nào sẽ được thực thi dựa trên một điều kiện
lặp lại lặp đi lặp lại một nhóm câu lệnh trong khi hoặc cho đến khi một điều kiện còn đúng
tinh chỉnh từng bước chia nhỏ từng bước của phác thảo thành các bước nhỏ hơn, liên tục cho đến khi mỗi bước có thể viết code trực tiếp
câu lệnh logic điều kiện được xây dựng từ các phép so sánh và các toán tử AND, OR và NOT, đánh giá ra TRUE hoặc FALSE
9.2

Exam tips · ⁨Mẹo làm bài thi⁩

English
  • Define an algorithm as an unambiguous, finite, deterministic sequence of steps, independent of language.
  • Use the three constructs correctly — sequence, selection, iteration — and keep an identifier table with data types.
  • Break a problem down by decomposition and abstraction, then stepwise refinement.
  • Write pseudocode that would actually run: declare variables and follow the exam's pseudocode style.

Common mistakes

  • Using = to assign a value. Assignment is ←; = is a comparison.
  • Forgetting ENDIF, ENDWHILE, ENDCASE or NEXT. Every construct closes, and the closing word is where the mark for the construct is checked.
  • Not initialising a total or counter before the loop, so the algorithm adds to a value that never existed.
  • Using a FOR loop when the number of repetitions is unknown. Reading until a sentinel value or a correct guess needs WHILE or REPEAT ... UNTIL.
  • Writing Age > 65 OR < 5. Each side of OR and AND must be a complete comparison.
  • Answering "explain why decomposition is used" with one benefit written three ways. Three marks need three different benefits.
Tiếng Việt
  • Định nghĩa thuật toán là một chuỗi các bước rõ ràng, hữu hạn, xác định, độc lập với ngôn ngữ.
  • Sử dụng đúng ba cấu trúc — tuần tự, chọn lọc, lặp lại — và giữ bảng định danh có kiểu dữ liệu.
  • Chia nhỏ bài toán bằng phân tách và trừu tượng hóa, sau đó tinh chỉnh từng bước.
  • Viết giả mã có thể chạy được: khai báo biến và tuân theo phong cách giả mã của đề thi.

Lỗi thường gặp

  • Sử dụng = để gán giá trị. Gán giá trị là ←; = là phép so sánh.
  • Quên ENDIF, ENDWHILE, ENDCASE hoặc NEXT. Mỗi cấu trúc đều phải đóng, và từ đóng ở cuối chính là nơi chấm điểm cho cấu trúc đó được kiểm tra.
  • Không khởi tạo tổng hoặc bộ đếm trước vòng lặp, khiến thuật toán cộng vào một giá trị chưa bao giờ tồn tại.
  • Sử dụng vòng lặp FOR khi số lần lặp chưa biết. Đọc cho đến khi gặp giá trị dấu hiệu hoặc đoán đúng cần WHILE hoặc REPEAT ... UNTIL.
  • Viết Age > 65 OR < 5. Mỗi vế của OR và AND phải là một phép so sánh hoàn chỉnh.
  • Trả lời "giải thích vì sao sử dụng phân tách" bằng cách viết ba lợi ích theo ba cách khác nhau. Ba điểm số cần ba lợi ích khác nhau.

Interactive lessons on this topic · ⁨Bài học tương tác về chủ đề này⁩

Work through it step by step, with instant-check exercises. · ⁨Làm theo từng bước, kèm theo bài tập kiểm tra ngay lập tức.⁩

Past Papers · ⁨Đề thi cũ⁩

More topics in A-Level Computer Science · ⁨Khoa học máy tính A-Level⁩ · ⁨Nhiều chủ đề hơn trong A-Level Computer Science · ⁨Khoa học máy tính A-Level⁩⁩

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

IGCSE, A-Level & AP