Un programme doit demander un mot de passe, et continuer à demander jusqu'à ce qu'il soit bon. Simple — mais quelle boucle utilisez-vous ? Les programmes prennent des décisions et répètent des travaux, et choisir…
English narration · English + 中文 subtitles burned in · Narration en anglais · Sous-titres anglais + 中文 incrustés
11.1
Programming basics · Bases de la programmation
Syllabus · Programme
English
Candidates should be able to:
Notes and guidance
Implement and write pseudocode from a given design presented as either a program flowchart or structured English
Write pseudocode statements for: • the declaration and initialisation of constants • the declaration of variables • the assignment of values to variables • expressions involving any of the arithmetic or logical operators input from the keyboard and output to the console
Use built-in functions and library routines
Any functions not given in the pseudocode guide will be provided String manipulation functions will always be given
Français
Les candidats doivent être capables de :
Notes et orientations
Implémenter et écrire du pseudocode à partir d'une conception donnée présentée sous forme de diagramme de flux de programme ou d'anglais structuré
Écrire des instructions de pseudocode pour : • la déclaration et l'initialisation de constantes • la déclaration de variables • l'assignation de valeurs aux variables • les expressions impliquant n'importe quel opérateur arithmétique ou logique l'entrée au clavier et la sortie sur la console
Utiliser des fonctions intégrées et des routines de bibliothèque
Toutes les fonctions non données dans le guide de pseudocode seront fournies. Les fonctions de manipulation de chaînes seront toujours données
Source: Cambridge International syllabus · Source : Programme Cambridge International
English
From design to code
You should be able to turn a design — a flowchart 流程图 (program flowchart) or structured English 结构化英语 — into pseudocode 伪代码, and then into a real language:
find the variables 变量 and their data types 数据类型.
turn input/output boxes into INPUT / OUTPUT.
turn decision diamonds into IF...ELSE...ENDIF (or CASE).
turn loop arrows into WHILE, REPEAT...UNTIL, or FOR.
turn process boxes into assignments or calculations.
check by tracing a small input.
Constants and variables
A constant 常量 holds a value that never changes; a variable holds one that may change. Declare them with a type:
Use constants for fixed values that recur (Pi, MaxScore); they make code clearer and easy to change in one place.
In the exam, a constant is the answer to "identify a more appropriate way of representing" a fixed value, such as a tax rate or a maximum score, that appears at several places in the pseudocode. The benefits the scheme lists: the value is set once and cannot be changed accidentally by the program; a change is made in one place and reaches every statement that uses it; the identifier gives the value a meaning (MaxScore rather than 100), so the code is easier to read and to check; and there is less risk of a typing error in a long value such as 3.14159. A "state a value that could be replaced by a constant" question wants the literal from the pseudocode (0.2, 40), not a new name.
Every variable is declared once, with an identifier 标识符 (its name) and a data type, before it is used. The six types in the 9618 pseudocode guide:
Type
Holds
Written in the code as
Typical use
INTEGER
whole numbers
42, -3
a count, an array index, a loop counter
REAL
numbers with a fractional part
3.75
a price, an average
CHAR
one character
'A' (single quotes)
a grade letter, a menu key
STRING
a sequence of characters
"Hello" (double quotes)
a name, a postcode
BOOLEAN
TRUE or FALSE
TRUE
a flag such as Found
DATE
a calendar date
12/05/2026
a date of birth
A "give the appropriate data type" question is answered from how the variable is used in the pseudocode: a value with a decimal point is REAL; something set to TRUE or FALSE is BOOLEAN; a value in single quotes is CHAR; a value used as an array index, or with DIV and MOD, is INTEGER. Write the type in capitals, spelled as the guide spells it.
Worked example. State the appropriate data type for each variable.
Found is BOOLEAN (it holds FALSE); Initial is CHAR (one character in single quotes); Price is REAL (a decimal value); Count is INTEGER (a counter that goes up by one); Name is STRING (text in double quotes).
Assignment and expressions
Use ← for assignment 赋值:
Expressions use operators 运算符:
arithmetic + - * /, plus DIV (integer division) and MOD (remainder): 7 DIV 2 = 3; 7 MOD 2 = 1.
comparisons =, <>, <, >, <=, >=.
logic AND, OR, NOT.
Precedence 优先级 (highest to lowest): NOT → * / DIV MOD → + - → comparisons → AND → OR. Use brackets when unsure.
Input and output
Built-in functions and library routines
Many tasks have ready-made library routines 库例程, so you need not write them. The Paper 2 insert 附页 lists the ones you may use, with their exact names, parameters and return types; any other function a question needs is given in the question. The names below are the insert's names. VAL and STR are IGCSE names and appear in neither 9618 document, so they earn nothing. UCASE and LCASE are a different case: they are 9618, defined in the Pseudocode Guide, but they take a single CHAR, and the insert does not list them at all — for a whole string on Paper 2 the routine is TO_UPPER.
A program library 程序库 holds routines that have already been written, compiled and tested; a program calls them instead of writing its own. The benefits the scheme accepts, for a "state three benefits" question: the routines are already tested, so they are less likely to contain errors; they save development time; they may do things the programmer could not write (complex statistics, graphics); they are written by experts and reused across many programs; and a routine with a fixed interface can be called from anywhere in the program.
Routine
Returns
Example
LENGTH(s)
the number of characters in s
LENGTH("Hello") = 5
LEFT(s, n) / RIGHT(s, n)
the first / last n characters
RIGHT("Hello", 2) = "lo"
MID(s, start, n)
n characters from position start (positions count from 1)
MID("Hello", 2, 3) = "ell"
TO_UPPER(s) / TO_LOWER(s)
s in capitals / in small letters
TO_UPPER("ab1") = "AB1"
NUM_TO_STR(x) / STR_TO_NUM(s)
a number as a string / a string as a number
STR_TO_NUM("3.5") = 3.5
IS_NUM(s)
TRUE if s is a valid number
IS_NUM("12a") = FALSE
ASC(c) / CHR(n)
the character code of c / the character with code n
ASC('A') = 65, CHR(66) = 'B'
INT(x)
the whole-number part of x
INT(7.9) = 7
RAND(n)
a random real number from 0 up to, but not including, n
INT(RAND(6)) + 1 is a dice roll
DAY(d), MONTH(d), YEAR(d)
the parts of a DATE
YEAR(TODAY())
DAYINDEX(d), SETDATE(d, m, y), TODAY()
the day of the week (1 = Sunday); a date built from three integers; today's date
EOF(f)
TRUE when the file f has no more lines to read
WHILE NOT EOF("data.txt")
Strings are joined with & (concatenation 连接): "A" & "BC" is "ABC". Use the exact names from the insert, with the parameters in its order.
Dates and random numbers come up as one-line statements. SETDATE(17, 11, 2007) builds 17 November 2007; 12 - MONTH(MyDOB) is the number of months from the month of birth to the end of the year; IF DAYINDEX(MyDOB) = 5 THEN tests for a Thursday, because Sunday is day 1. RAND(n) returns a real number from 0 up to, but not including, n, so a random integer from Low to High inclusive is INT(RAND(High - Low + 1)) + Low: INT(RAND(21)) - 10 gives a value from -10 to 10.
Worked example. Evaluate each expression, given Word ← "Program", Code ← 'Q' and N ← 7.
Expression
Value
Why
LENGTH(Word)
7
seven characters
MID(Word, 4, 2)
"gr"
two characters, starting at position 4
LEFT(Word, 3) & "!"
"Pro!"
joined with &
TO_UPPER(RIGHT(Word, 2))
"AM"
the inner function runs first
ASC(Code) - ASC('A')
16
'Q' is 81 and 'A' is 65
N DIV 2 + N MOD 2
4
3 + 1
NUM_TO_STR(N) & "th"
"7th"
the number becomes a string first
INT(N / 2)
3
3.5 cut to its whole part
Work from the inside out, and keep the quotes: "7" is a string and 7 is a number.
Worked example. Each statement may contain an error in its use of a function or operator. Describe the error, or write NO ERROR. (Assume every variable has the correct type.)
Statement
Error
Result ← 2 & 4
& joins strings; 2 and 4 are integers, so + is needed
SubString ← MID("pseudocode", 4, 1)
NO ERROR: one character from position 4, "u"
IF x = 3 OR 4 THEN
OR needs a Boolean on each side: IF x = 3 OR x = 4 THEN
Result ← Status AND INT(x / 2)
AND needs two Booleans; INT(x / 2) is an integer
Message ← "Done" + LENGTH(MyString)
+ cannot add a string to an integer: "Done" & NUM_TO_STR(LENGTH(MyString))
Every operator works on particular types: & on strings, + - * / DIV MOD on numbers, AND OR NOT on Booleans, and = <> on two values of the same type. An "evaluate each expression, or write ERROR" table is marked the same way: LENGTH(42) and "A" + 1 are ERROR, because the type does not match the function or the operator.
Worked example. With Points ← 100, Active ← TRUE and Exempt ← FALSE, evaluate each expression.
Expression
Value
Why
(Points > 99) OR Active
TRUE
both sides are true; one would do
(Points MOD 2 = 0) OR Exempt
TRUE
100 MOD 2 is 0
(Points <= 75) AND (Active OR Exempt)
FALSE
the first side is false, and AND needs both
(Active OR NOT Active) AND NOT Exempt
TRUE
Active OR NOT Active is always true
The last expression simplifies: X OR NOT X is TRUE whatever X is, so the whole expression is just NOT Exempt. Evaluate the brackets first, then NOT, then AND, then OR.
Français
La programmation transforme une conception en instructions écrites sous forme de codeUn programmeur écrit le code et le teste au fur et à mesure
De la conception au code
Vous devriez être capable de transformer une conception — un organigramme 流程图 (program flowchart) ou anglais structuré 结构化英语 — en pseudo-code 伪代码, puis dans un langage réel :
repérez les variables 变量 et leurs types de données 数据类型.
convertissez les boîtes d'entrée/sortie en INPUT / OUTPUT.
convertissez les losanges de décision en IF...ELSE...ENDIF (ou CASE).
convertissez les flèches de boucle en WHILE, REPEAT...UNTIL, ou FOR.
convertissez les boîtes de traitement en affectations ou calculs.
vérifiez en effectuant un traçage avec une petite entrée.
Chaque symbole d'organigramme devient un mot-clé de pseudo-code
Constantes et variables
Une constante 常量 retient une valeur qui ne change jamais ; une variable retient une valeur qui peut changer. Déclarez-les avec un type :
La valeur d'une variable peut changer ; une constante reste fixe
CONSTANT Pi = 3.14159
DECLARE Radius : REAL
DECLARE Area : REAL
Radius ← 5
Area ← Pi * Radius * Radius
Utilisez des constantes pour les valeurs fixes qui reviennent (Pi, MaxScore) ; elles rendent le code plus clair et facile à modifier en un seul endroit.
Dans l'examen, une constante est la réponse à la question « identifier un moyen plus approprié de représenter » une valeur fixe, comme un taux de taxe ou un score maximum, qui apparaît à plusieurs endroits dans le pseudo-code. Les avantages que le barème liste : la valeur est définie une seule fois et ne peut pas être modifiée accidentellement par le programme ; un changement est fait en un seul endroit et atteint toutes les instructions qui l'utilisent ; l'identifiant donne à la valeur un sens (MaxScore plutôt que 100), donc le code est plus facile à lire et à vérifier ; et il y a moins de risque d'erreur de frappe dans une longue valeur telle que 3.14159. Une question « indiquer une valeur qui pourrait être remplacée par une constante » demande la littérale du pseudo-code (0.2, 40), pas un nouveau nom.
Chaque variable est déclarée une seule fois, avec un identificateur 标识符 (son nom) et un type de données, avant qu'elle ne soit utilisée. Les six types dans le guide de pseudo-code 9618 :
Type
Contient
Écrit dans le code comme
Usage typique
INTEGER
nombres entiers
42, -3
un compteur, un index de tableau, un compteur de boucle
REAL
nombres avec une partie fractionnaire
3.75
un prix, une moyenne
CHAR
un seul caractère
'A' (guillemets simples)
une lettre de note, une touche de menu
STRING
une séquence de caractères
"Hello" (guillemets doubles)
un nom, un code postal
BOOLEAN
TRUE ou FALSE
TRUE
un indicateur tel que Found
DATE
une date calendaire
12/05/2026
une date de naissance
Une question « donner le type de données approprié » se répond selon la manière dont la variable est utilisée dans le pseudo-code : une valeur avec une virgule décimale est REAL ; quelque chose défini à TRUE ou FALSE est BOOLEAN ; une valeur entre guillemets simples est CHAR ; une valeur utilisée comme index de tableau, ou avec DIV et MOD, est INTEGER. Écrivez le type en majuscules, orthographié comme le guide l'écrit.
Exemple résolu. Indiquez le type de données approprié pour chaque variable.
Found ← FALSE
Initial ← 'K'
Price ← 12.99
Count ← Count + 1
Name ← "Li Wei"
Found est BOOLEAN (elle retient FALSE) ; Initial est CHAR (un caractère entre guillemets simples) ; Price est REAL (une valeur décimale) ; Count est INTEGER (un compteur qui augmente de un) ; Name est STRING (du texte entre guillemets doubles).
Affectation et expressions
Utilisez ← pour l'affectation 赋值 :
Total ← Total + 1
Average ← Sum / Count
Les expressions utilisent des opérateurs 运算符 :
arithmétiques + - * /, plus DIV (division entière) et MOD (reste) : 7 DIV 2 = 3 ; 7 MOD 2 = 1.
comparaisons =, <>, <, >, <=, >=.
logique AND, OR, NOT.
Précédence 优先级 (du plus élevé au plus bas) : NOT → * / DIV MOD → + - → comparaisons → AND → OR. Utilisez des parenthèses si vous n'en êtes pas sûr.
Entrée et sortie
OUTPUT "Enter your name:"
INPUT Name
OUTPUT "Hello, ", Name
Fonctions intégrées et routines de bibliothèque
De nombreuses tâches disposent de routines de bibliothèque 库例程 prêtes, donc vous n'avez pas besoin de les écrire. La feuille d'insertion Paper 2 insert 附页 répertorie celles que vous pouvez utiliser, avec leurs noms exacts, paramètres et types de retour ; toute autre fonction dont une question a besoin est donnée dans l'énoncé. Les noms ci-dessous sont ceux de l'insert. VAL et STR sont des noms IGCSE et n'apparaissent ni dans le document 9618, donc ils ne rapportent rien. UCASE et LCASE sont d'un cas différent : ce sont des 9618, définis dans le Guide de Pseudo-code, mais ils prennent un seul CHAR, et l'insert ne les répertorie absolument pas — pour une chaîne complète sur Paper 2, la routine est TO_UPPER.
Une bibliothèque de programmes 程序库 contient des routines déjà écrites, compilées et testées ; un programme les appelle au lieu d'en écrire ses propres. Les avantages que le barème accepte, pour une question « citez trois avantages » : les routines sont déjà testées, donc elles sont moins susceptibles de contenir des erreurs ; elles économisent du temps de développement ; elles peuvent faire des choses qu'un programmeur ne pourrait pas écrire (statistiques complexes, graphismes) ; elles sont écrites par des experts et réutilisées dans de nombreux programmes ; et une routine avec une interface fixe peut être appelée depuis n'importe où dans le programme.
Routine
Retourne
Exemple
LENGTH(s)
le nombre de caractères dans s
LENGTH("Hello") = 5
LEFT(s, n) / RIGHT(s, n)
les premiers / derniers n caractères
RIGHT("Hello", 2) = "lo"
MID(s, start, n)
n caractères à partir de la position start (les positions comptent à partir de 1)
MID("Hello", 2, 3) = "ell"
TO_UPPER(s) / TO_LOWER(s)
s en majuscules / en minuscules
TO_UPPER("ab1") = "AB1"
NUM_TO_STR(x) / STR_TO_NUM(s)
un nombre sous forme de chaîne / une chaîne sous forme de nombre
STR_TO_NUM("3.5") = 3.5
IS_NUM(s)
TRUE si s est un nombre valide
IS_NUM("12a") = FALSE
ASC(c) / CHR(n)
le code caractère de c / le caractère avec le code n
ASC('A') = 65, CHR(66) = 'B'
INT(x)
la partie entier de x
INT(7.9) = 7
RAND(n)
un nombre réel aléatoire de 0 jusqu'à, mais sans inclure, n
INT(RAND(6)) + 1 est un lancer de dé
DAY(d), MONTH(d), YEAR(d)
les parties d'un DATE
YEAR(TODAY())
DAYINDEX(d), SETDATE(d, m, y), TODAY()
le jour de la semaine (1 = Dimanche) ; une date construite à partir de trois entiers ; la date d'aujourd'hui
EOF(f)
TRUE lorsque le fichier f n'a plus de lignes à lire
WHILE NOT EOF("data.txt")
Les chaînes sont jointes avec & (concaténation 连接) : "A" & "BC" est "ABC". Utilisez les noms exacts de l'insert, avec les paramètres dans son ordre.
Les dates et nombres aléatoires apparaissent sous forme d'instructions sur une ligne. SETDATE(17, 11, 2007) construit le 17 novembre 2007 ; 12 - MONTH(MyDOB) est le nombre de mois du mois de naissance jusqu'à la fin de l'année ; IF DAYINDEX(MyDOB) = 5 THEN teste pour un jeudi, car dimanche est le jour 1. RAND(n) retourne un nombre réel de 0 jusqu'à, mais sans inclure, n, donc un entier aléatoire de Low à High inclus est INT(RAND(High - Low + 1)) + Low : INT(RAND(21)) - 10 donne une valeur de -10 à 10.
Les routines de chaîne courantes agissant sur s = "COMPUTER" (positions 1–8)
Exemple résolu. Évaluez chaque expression, sachant Word ← "Program", Code ← 'Q' et N ← 7.
Expression
Valeur
Pourquoi
LENGTH(Word)
7
sept caractères
MID(Word, 4, 2)
"gr"
deux caractères, commençant à la position 4
LEFT(Word, 3) & "!"
"Pro!"
joints avec &
TO_UPPER(RIGHT(Word, 2))
"AM"
la fonction interne s'exécute en premier
ASC(Code) - ASC('A')
16
'Q' est 81 et 'A' est 65
N DIV 2 + N MOD 2
4
3 + 1
NUM_TO_STR(N) & "th"
"7th"
le nombre devient d'abord une chaîne
INT(N / 2)
3
3.5 est coupé à sa partie entière
Travaillez de l'intérieur vers l'extérieur, et gardez les guillemets : "7" est une chaîne et 7 est un nombre.
Exemple résolu. Chaque instruction peut contenir une erreur dans son utilisation d'une fonction ou d'un opérateur. Décrivez l'erreur, ou écriveZ NO ERROR. (Supposez que chaque variable a le bon type.)
Instruction
Erreur
Result ← 2 & 4
& joint des chaînes ; 2 et 4 sont des entiers, donc + est nécessaire
SubString ← MID("pseudocode", 4, 1)
NO ERROR : un caractère à partir de la position 4, "u"
IF x = 3 OR 4 THEN
OR a besoin d'un Booléen de chaque côté : IF x = 3 OR x = 4 THEN
Result ← Status AND INT(x / 2)
AND a besoin de deux Booléens ; INT(x / 2) est un entier
Message ← "Done" + LENGTH(MyString)
+ ne peut pas ajouter une chaîne à un entier : "Done" & NUM_TO_STR(LENGTH(MyString))
Chaque opérateur fonctionne sur des types particuliers : & sur les chaînes, + - * / DIV MOD sur les nombres, AND OR NOT sur les Booléens, et = <> sur deux valeurs du même type. Un tableau « évaluez chaque expression, ou écrivez ERROR » est noté de la même façon : LENGTH(42) et "A" + 1 sont ERROR, car le type ne correspond pas à la fonction ou à l'opérateur.
Exemple résolu. Avec Points ← 100, Active ← TRUE et Exempt ← FALSE, évaluez chaque expression.
Expression
Valeur
Pourquoi
(Points > 99) OR Active
TRUE
les deux côtés sont vrais ; l'un suffirait
(Points MOD 2 = 0) OR Exempt
TRUE
100 MOD 2 est 0
(Points <= 75) AND (Active OR Exempt)
FALSE
le premier côté est faux, et AND a besoin des deux
(Active OR NOT Active) AND NOT Exempt
TRUE
Active OR NOT Active est toujours vrai
La dernière expression se simplifie : X OR NOT X est TRUE quel que soit X, donc toute l'expression n'est que NOT Exempt. Évaluez d'abord les parenthèses, puis NOT, ensuite AND, puis OR.
Explore · Explorer
Une variable est une boîte étiquetée
Chaque affectation stocke une seule valeur dans une boîte nommée ; réaffecter le même nom l'écrase. Suivez le programme et observez chaque boîte prendre sa valeur actuelle.
Use pseudocode to write: • an ‘IF’ statement including the ‘ELSE’ clause and nested IF statements • a ‘CASE’ structure • a ‘count-controlled’ loop: • a ‘post-condition’ loop • a ‘pre-condition’ loop
Justify why one loop structure may be better suited to solve a problem than the others
Français
Les candidats doivent être capables de :
Notes et orientations
Utiliser du pseudocode pour écrire : • une instruction 'IF' incluant la clause 'ELSE' et des instructions IF imbriquées • une structure 'CASE' • une boucle 'contrôlée par compteur' : • une boucle 'post-condition' • une boucle 'pré-condition'
Justifier pourquoi une structure de boucle peut être mieux adaptée pour résoudre un problème que les autres
Source: Cambridge International syllabus · Source : Programme Cambridge International
English
Selection 选择 chooses which steps run.
For more than two cases you can use a nested 嵌套 IF, but deep nesting is hard to read — a CASE is cleaner when testing one value against several options:
Cambridge CASE allows single values, value lists (1, 2, 3:), and ranges (1 TO 5:).
A nested IF is an IF inside a branch of another IF. Each IF needs its own ENDIF, and the examiner checks that every construct is closed:
Boundaries are where marks are lost. "A mark of 50 or more passes" is Mark >= 50, not Mark > 50; the last CASE branch, for "anything else", is written OTHERWISE, not a condition such as > 200. A wrong comparison here is a logic error 逻辑错误: the program runs, but gives the wrong output for some inputs — and a trace table with a boundary value such as 50 is how you find it.
Worked example. Rewrite this with the same functionality, without using a CASE structure.
Each value becomes a branch of a chain of IFs, and OTHERWISE becomes the last ELSE:
Two clauses that assign the same value are merged into one clause with a value list: 1, 2: ThisChar ← 'a'. The guards are tested in order: with ranges such as 1 TO 50: followed by 40 TO 60:, a value of 45 takes the first branch that matches, so an assignment in a later branch may never be performed — and when the earlier branches already cover every possible value, the OTHERWISE branch is never reached either.
Going the other way, nested IFs that test several Booleans are clearer as one condition per outcome: IF A AND B AND C THEN CALL Sub1(), then IF A AND B AND NOT C THEN CALL Sub2(), and so on. Joining tests with AND and OR removes the nesting, and IF A THEN is accepted in place of IF A = TRUE THEN.
Français
Sélection 选择 choisit quelles étapes s'exécutent.
IF age >= 18 THEN
OUTPUT "Adult"
ELSE
OUTPUT "Minor"
ENDIF
Un IF...ELSE teste la condition une seule fois, puis exécute exactement une branche
Pour plus de deux cas, vous pouvez utiliser un IF imbriqué nested 嵌套, mais une forte imbrication est difficile à lire — un CASE est plus propre lors du test d'une valeur contre plusieurs options :
CASE OF Grade
"A": OUTPUT "Excellent"
"B": OUTPUT "Good"
OTHERWISE: OUTPUT "Try again"
ENDCASE
Cambridge CASE permet les valeurs simples, les listes de valeurs (1, 2, 3:) et les plages (1 TO 5:).
Un IF imbriqué est un IF à l'intérieur d'une branche d'un autre IF. Chaque IF a besoin de son propre ENDIF, et l'examinateur vérifie que chaque construction est fermée :
IF Mark >= 50 THEN
IF Mark >= 80 THEN
OUTPUT "Distinction"
ELSE
OUTPUT "Pass"
ENDIF
ELSE
OUTPUT "Fail"
ENDIF
Les limites sont là où des points sont perdus. "Une note de 50 ou plus suffit" est Mark >= 50, pas Mark > 50 ; la dernière CASE branche, pour "tout le reste", s'écrit OTHERWISE, pas une condition comme > 200. Une mauvaise comparaison ici est une erreur logique 逻辑错误 : le programme s'exécute, mais donne la mauvaise sortie pour certaines entrées — et une table de traçage avec une valeur limite telle que 50 est la méthode pour la détecter.
Une instruction CASE exécute la branche qui correspond à la valeur
Exemple résolu. Réécrivez ceci avec la même fonctionnalité, sans utiliser de structure CASE.
CASE OF MySwitch
1: ThisChar ← 'a'
2: ThisChar ← 'y'
3: ThisChar ← '7'
OTHERWISE: ThisChar ← '*'
ENDCASE
Chaque valeur devient une branche d'une chaîne de IFs, et OTHERWISE devient la dernière ELSE :
IF MySwitch = 1 THEN
ThisChar ← 'a'
ELSE
IF MySwitch = 2 THEN
ThisChar ← 'y'
ELSE
IF MySwitch = 3 THEN
ThisChar ← '7'
ELSE
ThisChar ← '*'
ENDIF
ENDIF
ENDIF
Deux clauses qui attribuent la même valeur sont fusionnées en une seule clause avec une liste de valeurs : 1, 2: ThisChar ← 'a'. Les gardes sont testés dans l'ordre : avec des plages telles que 1 TO 50: suivies de 40 TO 60:, une valeur de 45 suit la première branche correspondante, donc une attribution dans une branche ultérieure peut ne jamais être exécutée — et lorsque les branches précédentes couvrent déjà toutes les valeurs possibles, la branche OTHERWISE n'est jamais atteinte non plus.
Dans l'autre sens, les IF imbriqués qui testent plusieurs booléens sont plus clairs sous la forme d'une condition par résultat : IF A AND B AND C THEN CALL Sub1(), puis IF A AND B AND NOT C THEN CALL Sub2(), et ainsi de suite. Le regroupement des tests avec AND et OR élimine l'imbrication, et IF A THEN est accepté à la place de IF A = TRUE THEN.
Explore · Explorer
Sélection (SI / SINON)
Changez l'entrée et voyez quelle branche s'exécute — l'essence de la sélection.
Iteration 迭代 repeats a block. Three loops differ in how many times the body runs.
Count-controlled (FOR) loop
A count-controlled loop 计数循环 — use it when you know how many times to repeat:
A STEP can change the count (e.g. FOR i ← 10 TO 1 STEP -1). Best for a fixed number of repeats or processing each element of an array 数组.
Pre-condition (WHILE) loop
A pre-condition loop 前测循环 tests the condition before each pass, so it may run zero times:
Post-condition (REPEAT...UNTIL) loop
A post-condition loop 后测循环 tests the condition after each pass, so it always runs at least once:
Choosing the right loop
count known up front → FOR.
may need zero passes → WHILE.
always at least one pass → REPEAT...UNTIL.
Justify your choice by whether the count is known and whether the body must run at least once. A typical question gives a scenario ("ask for a password until correct, but always ask at least once") and asks which loop fits.
The two marks are for the name of the loop and the reason, in the scheme's words: count-controlled, because the number of iterations is known before the loop starts; post-condition, because the loop body must be executed at least once; pre-condition, because the loop may not need to execute at all. A loop over the four elements of an array that has been written as a WHILE with a counter is "not the most appropriate": the count, four, is known, so a FOR loop fits.
Worked example. Which loop suits each task? (a) print the 12 times table; (b) keep reading numbers until the user enters 0; (c) ask for a password until it is correct. Choose by asking how many times the body runs and when the test happens. (a) The count is known in advance (12), so use a FOR loop. (b) The count is unknown, and the very first input might already be 0 - so the test must come before the body: a WHILE loop, which runs zero or more times. (c) The count is unknown, but you must always ask at least once before there is anything to test - so the test comes after the body: a REPEAT...UNTIL, which runs one or more times. The deciding question is whether the body must run at least once: WHILE may run zero times, REPEAT always runs once.
Dry running with a trace table
A trace table 跟踪表 records the value of each variable as you dry run 手工跟踪 (work through by hand) an algorithm. It is how you test a loop on paper, and a six-mark question on most Paper 2s.
Count
Total
Total < 10
OUTPUT
1
0
TRUE
2
2
TRUE
3
6
TRUE
4
12
FALSE
4, 12
Rules that earn the marks: one column per variable, in the order the question gives; write a value only when it changes; start a new row each time the loop repeats; evaluate the condition with the current values, and stop the moment it is FALSE; put the output in its own column, exactly as it would appear. Trace the algorithm as written, not the one you think was intended — if it never stops, say so.
Worked example. Which constructs does each line use — selection, iteration or a subroutine call?
Pseudocode
Selection
Iteration
Subroutine
IF Ready = TRUE THEN
ENDIF
| FOR I ← 1 TO 20 ... NEXT I | | yes | |
| WHILE NOT IsFull() ... ENDWHILE | | yes | yes |
| CASE OF Key ... OTHERWISE ... ENDCASE | yes | | |
IF and CASE are selection; FOR, WHILE and REPEAT are iteration; a name followed by brackets — Start(), IsFull() — is a call to a procedure or a function, wherever it appears, including inside a condition.
Français
Itération 迭代 répète un bloc. Trois boucles diffèrent par le nombre de fois que le corps s'exécute.
Boucle contrôlée par compteur (FOR)
Une boucle contrôlée par compteur 计数循环 — utilisez-la lorsque vous savez combien de fois répéter :
FOR i ← 1 TO 10
OUTPUT i
NEXT i
Un STEP peut modifier le compteur (par ex. FOR i ← 10 TO 1 STEP -1). Idéal pour un nombre fixe de répétitions ou pour traiter chaque élément d'un tableau 数组.
Boucle à précondition (WHILE)
Une boucle à précondition 前测循环 teste la condition avant chaque passage, elle peut donc s'exécuter zéro fois :
WHILE total < 100 DO
INPUT n
total ← total + n
ENDWHILE
Boucle à postcondition (REPEAT...UNTIL)
Une boucle à postcondition 后测循环 teste la condition après chaque passage, elle s'exécute donc toujours au moins une fois :
REPEAT
INPUT password
UNTIL password = correctPassword
Choisir la bonne boucle
Les trois boucles diffèrent par l'emplacement du test de condition — avant le corps (WHILE), après (REPEAT), ou un nombre défini de fois (FOR)
compteur connu à l'avance → FOR.
peut nécessiter zéro passages → WHILE.
toujours au moins un passage → REPEAT...UNTIL.
Justifiez votre choix selon si le compteur est connu et si le corps doit s'exécuter au moins une fois. Une question typique donne un scénario ("demander un mot de passe jusqu'à ce qu'il soit correct, mais toujours demander au moins une fois") et demande quelle boucle convient.
Les deux points sont attribués au nom de la boucle et à la raison, dans les termes du barème : count-controlled, because the number of iterations is known before the loop starts; post-condition, because the loop body must be executed at least once; pre-condition, because the loop may not need to execute at all. Une boucle sur les quatre éléments d'un tableau écrit comme un WHILE avec un compteur est "pas la plus appropriée" : le compteur, quatre, est connu, donc une boucle FOR convient.
Exemple résolu. Quelle boucle convient à chaque tâche ? (a) imprimer la table de multiplication de 12 ; (b) continuer à lire des nombres jusqu'à ce que l'utilisateur entre 0 ; (c) demander un mot de passe jusqu'à ce qu'il soit correct. Choisissez en demandant combien de fois le corps s'exécute et quand le test a lieu. (a) Le compteur est connu à l'avance (12), donc utilisez une boucle FOR. (b) Le compteur est inconnu, et la toute première entrée pourrait déjà être 0 - donc le test doit venir avant le corps : une boucle WHILE, qui s'exécute zéro ou plus fois. (c) Le compteur est inconnu, mais vous devez toujours demander au moins une fois avant qu'il y ait quoi que ce soit à tester - donc le test vient après le corps : une REPEAT...UNTIL, qui s'exécute une ou plus fois. La question décisive est de savoir si le corps doit s'exécuter au moins une fois : WHILE peut s'exécuter zéro fois, REPEAT s'exécute toujours une fois.
Exécution manuelle avec une table de traçage
Une table de traçage 跟踪表 enregistre la valeur de chaque variable pendant que vous faites une exécution manuelle 手工跟踪 (passez en revue à la main) un algorithme. C'est comment vous testez une boucle sur papier, et c'est une question de six points sur la plupart des Paper 2s.
DECLARE Count, Total : INTEGER
Count ← 1
Total ← 0
WHILE Total < 10
Total ← Total + Count * 2
Count ← Count + 1
ENDWHILE
OUTPUT Count, Total
Count
Total
Total < 10
OUTPUT
1
0
TRUE
2
2
TRUE
3
6
TRUE
4
12
FALSE
4, 12
Règles qui rapportent les points : une colonne par variable, dans l'ordre donné par la question ; n'écrivez une valeur que lorsqu'elle change ; commencez une nouvelle ligne à chaque fois que la boucle se répète ; évaluez la condition avec les valeurs actuelles, et arrêtez-vous dès qu'elle est FALSE ; mettez la sortie dans sa propre colonne, exactement tel qu'elle apparaîtrait. Tracez l'algorithme tel qu'il est écrit, pas celui que vous pensez avoir été intendu — s'il ne s'arrête jamais, dites-le.
Exemple résolu. Quelles constructions utilise chaque ligne — sélection, itération ou appel de sous-routine ?
Pseudocode
Selection
Iteration
Subroutine
IF Ready = TRUE THEN
CALL Start()
FIN SI
| FOR I ← 1 TO 20 ... NEXT I | | yes | |
| WHILE NOT IsFull() ... ENDWHILE | | yes | yes |
| CASE OF Key ... OTHERWISE ... ENDCASE | yes | | |
IF et CASE sont des sélections ; FOR, WHILE et REPEAT sont des itérations ; un nom suivi de parenthèses — Start(), IsFull() — est un appel à une procédure ou une fonction, partout où il apparaît, y compris dans une condition.
Explore · Explorer
Suivez une boucle, passage par passage
Un tableau de traçage enregistre chaque variable après chaque passage de la boucle. Observez le compteur i grimper pendant que le total cumulatif se construit — exactement ce qu'une question de traçage d'examen vous demande de remplir.
Explore · Explorer
Tracer une boucle
Parcourez la boucle et observez les variables changer à chaque itération — c'est exactement ce qu'enregistre une table de traçage.
Procedures and functions · Procédures et fonctions
Syllabus · Programme
English
Candidates should be able to:
Notes and guidance
Define and use a procedure
Explain where in the construction of an algorithm it would be appropriate to use a procedure
Use parameters
A procedure may have none, one or more parameters A parameter can be passed by reference or by value
Define and use a function
Explain where in the construction of an algorithm it is appropriate to use a function
A function is used in an expression, e.g. the return value replaces the call
Use the terminology associated with procedures and functions
including procedure/function header, procedure/function interface, parameter, argument, return value
Write efficient pseudocode
Français
Les candidats doivent être capables de :
Notes et orientations
Définir et utiliser une procédure
Expliquer où, dans la construction d'un algorithme, il serait approprié d'utiliser une procédure
Utiliser des paramètres
Une procédure peut avoir zéro, un ou plusieurs paramètres Un paramètre peut être passé par référence ou par valeur
Définir et utiliser une fonction
Expliquer où, dans la construction d'un algorithme, il est approprié d'utiliser une fonction
Une fonction est utilisée dans une expression, ex. la valeur de retour remplace l'appel
Utiliser la terminologie associée aux procédures et fonctions
y compris en-tête de procédure/fonction, interface de procédure/fonction, paramètre, argument, valeur de retour
Écrire du pseudocode efficace
Source: Cambridge International syllabus · Source : Programme Cambridge International
English
Structured programming 结构化编程 builds a program from small named subroutines 子程序, each with one job.
Procedure
A procedure 过程 is a named block that does an action; it may take parameters 参数 but does not return a value.
Function
A function 函数 is like a procedure but it returns a value that becomes part of an expression.
Use a procedure when the subroutine performs an action; use a function when it computes a value for the caller.
The syllabus asks where in the construction of an algorithm each is appropriate. A procedure is appropriate where the same group of steps is needed at several points (validate an input, print a menu, swap two values): the steps are written once and CALLed by name. A function is appropriate where a single value must be calculated and then used in an expression — a total, a TRUE/FALSE result, the larger of two numbers — because the return value 返回值 replaces the call: IF IsValid(Code) THEN.
Parameters
A parameter is a variable a subroutine declares to receive input; the values the caller supplies are arguments 实参. Two ways to pass them:
pass by value 传值 — the routine gets a copy; changes inside it do not affect the caller. Use for inputs it only reads.
pass by reference 传引用 — the routine gets a reference to the caller's variable; changes do affect the caller. Use when it must update a parameter.
Cambridge pseudocode writes the mode in the header, BYVAL or BYREF, before each parameter. If neither is written, BYVAL is assumed, so a routine that must change the caller's variable — Swap, or a procedure that updates a running total — needs BYREF in its header.
Worked example. What is output?
X is a reference to A, so A becomes 8. Y is a copy of B, so doubling Y leaves B at 3. The output is 8, 3. Had the header said BYVAL X, A would still be 5.
Local vs global variables
A local variable 局部变量 is declared inside a subroutine and exists only while it runs. A global variable 全局变量 is declared outside and is visible everywhere. Prefer locals and parameters — heavy use of globals makes code hard to follow and test. (The region where a name is visible is its scope 作用域.)
The one-line difference: a global variable can be accessed from anywhere in the program, a local variable only inside the subroutine that declares it. Benefits of local variables the scheme accepts: the same identifier can be used in another subroutine without a clash; the value cannot be changed accidentally by other parts of the program; the memory is released when the subroutine ends; and the subroutine is self-contained, so it can be tested on its own and reused in another program.
A local variable is created each time the subroutine is called and destroyed when it returns, so it cannot carry a value from one call to the next. A procedure that builds up a string over repeated calls therefore needs that string to be global (or passed BYREF). If MyString is changed from a global to a local declared inside MyOutput(), every call starts with a new, empty MyString, the text added by earlier calls is lost, and the procedure "does not work as expected".
When to use a subroutine
Use a subroutine when:
the same logic appears in more than one place — write it once, call it many times.
a block has a clear named purpose — the name documents what it does.
the program is complex — break it into parts (decomposition 分解).
you want to test a piece in isolation.
Don't make them so tiny that the call costs more than the work inside.
Terminology
definition — the PROCEDURE ... ENDPROCEDURE (or function) block.
call — where it is invoked. argument — a value passed in. parameter — the variable that receives it.
return value — what a function passes back.
procedure/function header — the first line giving the name and parameters (PROCEDURE Name(params) or FUNCTION Name(params) RETURNS type).
procedure/function interface / signature 签名 — name + parameters + return type: what a caller must know to use it.
Worked example. Describe each term used in the header FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN.
Term
Meaning
FUNCTION
a subroutine that returns a value
Pass2
the identifier used to call it
Count
the parameter: the identifier that receives the argument passed in
INTEGER
the data type of the parameter
RETURNS BOOLEAN
the data type of the value the function returns
The two identifiers in PROCEDURE MyProc(Count : INTEGER, Message : STRING) are parameters: they receive the values passed in when the procedure is called, and are used inside it like local variables.
To convert a procedure into a function: change PROCEDURE to FUNCTION and add RETURNS <type>; replace the OUTPUT (or the BYREF parameter that carried the result out) with a RETURN statement; and change every call so that the returned value is used, Result ← Unpack(Text) instead of CALL Unpack(Text, Result). For a "write the header" question, write the whole line: FUNCTION Calculate(Expression : STRING) RETURNS INTEGER. An array parameter is passed by reference, so a procedure that writes into an array changes the caller's array.
When a program gains a new module, the interface is what is agreed first: the name, the parameters (how many, in what order, of what type) and the return type, plus any global data the module reads or writes. A module that sends a reminder before a due date needs the record (or its index) as a parameter and returns nothing, so it is a procedure; the main program calls it once per record.
Writing a module for Paper 2
Half of Paper 2 is "write pseudocode for module X". The scheme awards a mark per feature, so a module that is not finished still scores for every correct part. The parts the examiner looks for:
The header, as the question describes it: PROCEDURE Name(Param : TYPE) or FUNCTION Name(Param : TYPE) RETURNS TYPE, with BYREF where the routine must change the argument.
Local declarations: DECLARE every local variable with its type, and initialise counters and totals (Count ← 0).
The loop that visits every element: FOR Index ← 1 TO 50 for an array whose size is given; WHILE NOT EOF(...) for a file.
The condition, with the right comparison and boundary, on the right item: IF Score[Index] > Limit THEN.
The update inside the branch: the count increased, the value stored, or the message output.
The end: RETURN once, after the loop, in a function; ENDFUNCTION or ENDPROCEDURE; and every IF, FOR and WHILE closed.
Worked example. A global array Score : ARRAY[1:50] OF INTEGER holds test scores. Write a function CountAbove(Limit : INTEGER) that returns how many scores are greater than Limit.
Marks: the header with its parameter and RETURNS INTEGER; Count declared and set to 0; a loop over all 50 elements; the comparison > Limit (not >=); the count updated inside the IF; RETURN Count after the loop. The main program uses the return value in an expression or an output: OUTPUT "Above 70: ", CountAbove(70).
Worked example. Write a function IsValid(Code : STRING) that returns TRUE when Code is two capital letters followed by four digits — the format 格式AB1234 — and FALSE otherwise.
The length check comes first, so MID is never asked for a position that does not exist. Validation 验证 like this returns a BOOLEAN so the caller can write IF IsValid(Entry) THEN ... ELSE OUTPUT "Invalid code" ENDIF: a message to the user is output by the caller, not by the function — a function calculates, a procedure acts.
Worked example. Write a function IsPalindrome(Word : STRING) that returns TRUE when Word reads the same backwards, such as "RACECAR".
Compare the characters from the two ends, moving inwards: position Index is paired with position Len - Index + 1, and only the first half needs testing.
The same three tools — a FOR over the positions, MID(s, i, 1) to read one character, and & to build a new string — answer most string modules on Paper 2: counting how often a character occurs (IF MID(s, i, 1) = Ch THEN Count ← Count + 1), replacing every instance of a character (add either NewChar or the original character to NewString at each position), hiding all but the last four digits of a card number (add '*' for every position up to Len - 4), or writing your own MID() by joining the characters from Start to Start + Length - 1. Asking MID for a position past the end of the string is a run-time error, so check LENGTH first.
Files. Values in variables disappear when the program ends, so a module that must keep data for the next run writes it to a file: OPENFILE "scores.txt" FOR WRITE, one WRITEFILE "scores.txt", NUM_TO_STR(Score[Index]) per line inside the loop, and CLOSEFILE "scores.txt" once, after the loop; reading back uses FOR READ, READFILE and WHILE NOT EOF("scores.txt"). Topic 10 has the full file section; here the marks are for opening in the right mode, the read or write inside the loop, and closing once after it.
Français
Programmation structurée 结构化编程 construit un programme à partir de petites sous-routines 子程序 nommées, chacune ayant une seule tâche.
Procédure
Une procédure 过程 est un bloc nommé qui exécute une action ; elle peut prendre des paramètres 参数 mais ne retourne pas de valeur.
Une fonction 函数 est semblable à une procédure mais elle retourne une valeur qui fait partie d'une expression.
FUNCTION Square(x : INTEGER) RETURNS INTEGER
RETURN x * x
ENDFUNCTION
result ← Square(5) + 1 // result = 26
Utilisez une procédure lorsque la sous-routine effectue une action ; utilisez une fonction lorsqu'elle calcule une valeur pour l'appelant.
Le syllabus demande où, dans la construction d’un algorithme, chacun est approprié. Une procédure est appropriée lorsque le même groupe d’étapes est nécessaire à plusieurs endroits (valider une entrée, imprimer un menu, échanger deux valeurs) : les étapes sont écrites une fois et CALLées par nom. Une fonction est appropriée lorsqu’une seule valeur doit être calculée puis utilisée dans une expression — un total, un résultat TRUE/FALSE, le plus grand de deux nombres — car la valeur de retour 返回值 remplace l’appel : IF IsValid(Code) THEN.
Une procédure exécute une action et ne retourne rien ; une fonction retourne une valeur que vous utilisez dans une expression
Paramètres
Un paramètre est une variable qu'une sous-routine déclare pour recevoir une entrée ; les valeurs fournies par l'appelant sont des arguments 实参. Deux façons de les passer :
passage par valeur 传值 — la routine reçoit une copie ; les modifications à l'intérieur n'affectent pas l'appelant. Utilisez pour les entrées qu'elle lit uniquement.
passage par référence 传引用 — la routine reçoit une référence à la variable de l'appelant ; les modifications affectent l'appelant. Utilisez lorsqu'elle doit mettre à jour un paramètre.
Passage par valeur copie la valeur dans une nouvelle boîte ; passage par référence permet à la routine de modifier la propre variable de l'appelant
PROCEDURE Swap(BYREF a : INTEGER, BYREF b : INTEGER)
DECLARE temp : INTEGER
temp ← a
a ← b
b ← temp
ENDPROCEDURE
Le pseudocode Cambridge écrit le mode dans l'en-tête, BYVAL ou BYREF, avant chaque paramètre. Si aucun n'est écrit, BYVAL est supposé, donc une routine qui doit modifier la variable de l'appelant — Swap, ou une procédure qui met à jour un total accumulé — nécessite BYREF dans son en-tête.
Exemple résolu. Quelle est la sortie ?
PROCEDURE Adjust(BYREF X : INTEGER, BYVAL Y : INTEGER)
X ← X + Y
Y ← Y * 2
ENDPROCEDURE
A ← 5
B ← 3
CALL Adjust(A, B)
OUTPUT A, B
X est une référence à A, donc A devient 8. Y est une copie de B, donc doubler Y laisse B à 3. La sortie est 8, 3. Si l'en-tête avait dit BYVAL X, A serait toujours 5.
Variables locales vs globales
Une variable locale 局部变量 est déclarée à l'intérieur d'une sous-routine et n'existe que tant qu'elle s'exécute. Une variable globale 全局变量 est déclarée à l'extérieur et est visible partout. Privilégiez les variables locales et les paramètres — une utilisation excessive des variables globales rend le code difficile à suivre et à tester. (La zone où un nom est visible est sa portée 作用域.)
La différence d'une ligne : une variable globale peut être accédée de n'importe où dans le programme, une variable locale uniquement à l'intérieur de la sous-routine qui la déclare. Avantages des variables locales acceptés par le barème : le même identificateur peut être utilisé dans une autre sous-routine sans conflit ; la valeur ne peut pas être changée accidentellement par d'autres parties du programme ; la mémoire est libérée lorsque la sous-routine se termine ; et la sous-routine est autonome, elle peut donc être testée individuellement et réutilisée dans un autre programme.
Une variable locale est créée chaque fois que la sous-routine est appelée et détruite lors du retour, elle ne peut donc pas conserver une valeur d'un appel à l'autre. Une procédure qui construit une chaîne sur des appels répétés a donc besoin que cette chaîne soit globale (ou passée BYREF). Si MyString est changée d'une variable globale à une variable locale déclarée à l'intérieur de MyOutput(), chaque appel commence avec une nouvelle MyString vide, le texte ajouté par les appels précédents est perdu, et la procédure "ne fonctionne pas comme prévu".
Une variable locale est une nouvelle boîte vide à chaque appel ; seule une variable globale (ou un paramètre BYREF) conserve une valeur entre les appelsUne variable globale est visible partout ; une variable locale n'existe que dans sa propre procédure
Quand utiliser une sous-routine
Utilisez une sous-routine lorsque :
la même logique apparaît à plusieurs endroits — écrivez-la une fois, appelez-la plusieurs fois.
un bloc a un but nommé clair — le nom documente ce qu'il fait.
le programme est complexe — divisez-le en parties (décomposition 分解).
vous voulez tester une partie isolément.
Ne les rendez pas si petites que le coût de l'appel dépense plus que le travail à l'intérieur.
Terminologie
définition — le bloc PROCEDURE ... ENDPROCEDURE (ou fonction).
appel — là où il est invoqué. argument — une valeur passée. paramètre — la variable qui le reçoit.
valeur de retour — ce qu'une fonction renvoie.
en-tête de procédure/fonction — la première ligne donnant le nom et les paramètres (PROCEDURE Name(params) ou FUNCTION Name(params) RETURNS type).
interface de procédure/fonction / signature 签名 — nom + paramètres + type de retour : ce qu'un appelant doit savoir pour l'utiliser.
Exemple résolu. Décrivez chaque terme utilisé dans l'en-tête FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN.
Terme
Signification
FUNCTION
une sous-routine qui retourne une valeur
Pass2
l'identifiant utilisé pour l'appeler
Count
le paramètre : l'identifiant qui reçoit l'argument passé
INTEGER
le type de données du paramètre
RETURNS BOOLEAN
le type de données de la valeur retournée par la fonction
Les deux identifiants dans PROCEDURE MyProc(Count : INTEGER, Message : STRING) sont des paramètres : ils reçoivent les valeurs passées lors de l'appel de la procédure et sont utilisés à l'intérieur comme des variables locales.
Pour convertir une procédure en fonction : remplacez PROCEDURE par FUNCTION et ajoutez RETURNS <type> ; remplacez le OUTPUT (ou le paramètre BYREF qui transportait le résultat vers l'extérieur) par une instruction RETURN ; et modifiez chaque appel pour que la valeur retournée soit utilisée, Result ← Unpack(Text) au lieu de CALL Unpack(Text, Result). Pour une question « écrire l'en-tête », écrivez toute la ligne : FUNCTION Calculate(Expression : STRING) RETURNS INTEGER. Un paramètre tableau est passé par référence, donc une procédure qui écrit dans un tableau modifie le tableau de l'appelant.
Lorsqu'un programme acquiert un nouveau module, l'interface est d'abord agreed : le nom, les paramètres (combien, dans quel ordre, de quel type) et le type de retour, ainsi que toute donnée globale que le module lit ou écrit. Un module envoyant un rappel avant une date limite a besoin du record (ou de son index) comme paramètre et ne retourne rien, c'est donc une procédure ; le programme principal l'appelle une fois par record.
Écrire un module pour Paper 2
La moitié de Paper 2 est « écrire du pseudocode pour le module X ». Le barème attribue une marque par élément, donc un module inachevé obtient encore des points pour chaque bonne partie. Les éléments que l'examinateur recherche :
Chaque partie d'une réponse de module porte sa propre marque, donc écrivez-les toutes même si l'une est incertaine
L'en-tête, tel que décrit par la question : PROCEDURE Name(Param : TYPE) ou FUNCTION Name(Param : TYPE) RETURNS TYPE, avec BYREF où la routine doit modifier l'argument.
Déclarations locales : DECLARE chaque variable locale avec son type, et initialisez les compteurs et totaux (Count ← 0).
La boucle visitant chaque élément : FOR Index ← 1 TO 50 pour un tableau dont la taille est donnée ; WHILE NOT EOF(...) pour un fichier.
La condition, avec la bonne comparaison et borne, sur le bon élément : IF Score[Index] > Limit THEN.
La mise à jour à l'intérieur de la branche : le compteur augmenté, la valeur stockée, ou le message affiché.
La fin : RETURN une fois, après la boucle, dans une fonction ; ENDFUNCTION ou ENDPROCEDURE ; et chaque IF, FOR et WHILE fermé.
Exemple résolu. Un tableau global Score : ARRAY[1:50] OF INTEGER contient les notes. Écrivez une fonction CountAbove(Limit : INTEGER) qui retourne combien de notes sont supérieures à Limit.
FUNCTION CountAbove(BYVAL Limit : INTEGER) RETURNS INTEGER
DECLARE Index, Count : INTEGER
Count ← 0
FOR Index ← 1 TO 50
IF Score[Index] > Limit THEN
Count ← Count + 1
ENDIF
NEXT Index
RETURN Count
ENDFUNCTION
Marques : l'en-tête avec son paramètre et RETURNS INTEGER ; Count déclaré et mis à 0 ; une boucle sur les 50 éléments ; la comparaison > Limit (pas >=) ; le compteur mis à jour à l'intérieur du IF ; RETURN Count après la boucle. Le programme principal utilise la valeur de retour dans une expression ou une sortie : OUTPUT "Above 70: ", CountAbove(70).
Exemple résolu. Écrivez une fonction IsValid(Code : STRING) qui retourne TRUE lorsque Code est deux lettres majuscules suivies de quatre chiffres — le format 格式AB1234 — et FALSE sinon.
FUNCTION IsValid(BYVAL Code : STRING) RETURNS BOOLEAN
DECLARE Index : INTEGER
DECLARE Ch : STRING
IF LENGTH(Code) <> 6 THEN
RETURN FALSE
ENDIF
FOR Index ← 1 TO 6
Ch ← MID(Code, Index, 1)
IF Index <= 2 THEN
IF Ch < "A" OR Ch > "Z" THEN
RETURN FALSE
ENDIF
ELSE
IF Ch < "0" OR Ch > "9" THEN
RETURN FALSE
ENDIF
ENDIF
NEXT Index
RETURN TRUE
ENDFUNCTION
Le contrôle de longueur vient en premier, donc MID n'est jamais demandé pour une position inexistante. Une validation 验证 comme celle-ci retourne un BOOLEAN pour que l'appelant puisse écrire IF IsValid(Entry) THEN ... ELSE OUTPUT "Invalid code" ENDIF : un message à l'utilisateur est affiché par l'appelant, pas par la fonction — une fonction calcule, une procédure agit.
Exemple résolu. Écrivez une fonction IsPalindrome(Word : STRING) qui retourne TRUE lorsque Word se lit de la même manière à l'envers, comme "RACECAR".
Comparez les caractères des deux extrémités, en avançant vers l'intérieur : la position Index est appariée avec la position Len - Index + 1, et seule la première moitié doit être testée.
Un contrôle de palindrome appaire la position i avec la position Len - i + 1 et s'arrête au milieu
FUNCTION IsPalindrome(BYVAL Word : STRING) RETURNS BOOLEAN
DECLARE Len, Index : INTEGER
Len ← LENGTH(Word)
FOR Index ← 1 TO Len DIV 2
IF MID(Word, Index, 1) <> MID(Word, Len - Index + 1, 1) THEN
RETURN FALSE
ENDIF
NEXT Index
RETURN TRUE
ENDFUNCTION
Les mêmes trois outils — une FOR sur les positions, MID(s, i, 1) pour lire un caractère, et & pour construire une nouvelle chaîne — répondent à la plupart des modules de chaînes sur Paper 2 : compter combien de fois un caractère apparaît (IF MID(s, i, 1) = Ch THEN Count ← Count + 1), remplacer chaque instance d'un caractère (ajouter soit NewChar ou le caractère original à NewString à chaque position), masquer tout sauf les quatre derniers chiffres d'un numéro de carte (ajouter '*' pour chaque position jusqu'à Len - 4), ou écrire votre propre MID() en joignant les caractères de Start à Start + Length - 1. Demander MID pour une position beyond la fin de la chaîne est une erreur d'exécution, donc vérifiez LENGTH d'abord.
Fichiers. Les valeurs dans les variables disparaissent quand le programme se termine, donc un module qui doit conserver des données pour la prochaine exécution les écrit dans un fichier : OPENFILE "scores.txt" FOR WRITE, une WRITEFILE "scores.txt", NUM_TO_STR(Score[Index]) par ligne à l'intérieur de la boucle, et CLOSEFILE "scores.txt" une fois, après la boucle ; la lecture utilise FOR READ, READFILE et WHILE NOT EOF("scores.txt"). Topic 10 a la section complète sur les fichiers ; ici les marques sont pour l'ouverture dans le bon mode, la lecture ou l'écriture à l'intérieur de la boucle, et la fermeture une fois après celle-ci.
Explore · Explorer
La pile d'appels : poussée lors de l'appel, retirée lors du retour
Appeler une sous-routine pousse un nouveau cadre sur le dessus ; retourner retire celui-ci et renvoie une valeur à l'appelant. L'appel en cours d'exécution est toujours le cadre du sommet.
Writing efficient pseudocode · Écrire du pseudocode efficace
English
Three features that make pseudocode easier to understand — the answer to a "state three features" question — are meaningful identifiers (Total, not t), indentation of the statements inside each construct, and comments (// ...) that explain the purpose; keywords in capitals, one statement per line and blank lines between sections are also accepted. Efficient pseudocode goes further:
move invariants out of loops — if a value (an invariant 不变量) does not change with the loop counter, compute it once before the loop.
exit a loop early when the answer is found (stop a linear search 线性查找 as soon as the target appears).
avoid redundant work — store a result and reuse it instead of recomputing.
choose the right data structure — an array beats many separate variables when the items belong together.
replace deep nested IFs with CASE when testing one value against many.
comment the intent, not the mechanics (// validate the postcode, not // loop 6 times).
use meaningful names (numberOfPupils, not n) and initialise variables before use.
Français
Trois caractéristiques qui facilitent la compréhension du pseudocode — la réponse à une question « énoncer trois caractéristiques » — sont les identifiants significatifs (Total, pas t), l'indentation des instructions à l'intérieur de chaque construction, et les commentaires (// ...) expliquant le but ; les mots-clés en majuscules, une instruction par ligne et des lignes vides entre les sections sont aussi acceptés. Le pseudocode efficace va plus loin :
déplacer les invariants hors des boucles — si une valeur (un invariant 不变量) ne change pas avec le compteur de boucle, calculez-la une fois avant la boucle.
sortir d'une boucle tôt lorsque la réponse est trouvée (arrêter une recherche linéaire 线性查找 dès que la cible apparaît).
éviter le travail redondant — stocker un résultat et le réutiliser au lieu de recalculer.
choisir la bonne structure de données — un tableau bat de nombreux variables séparées lorsque les éléments appartiennent ensemble.
remplacer les IF imbriqués profonds par CASE lorsqu'on teste une valeur contre beaucoup.
commenter l'intention, pas la mécanique (// validate the postcode, pas // loop 6 times).
utiliser des noms significatifs (numberOfPupils, pas n) et initialiser les variables avant usage.
Déplacer le travail inchangé hors de la boucle afin qu'il s'exécute une fois
Three kinds of error, each found in a different way:
Error
What it is
Example
Found by
syntax error 语法错误
a statement that breaks the rules of the language
a missing ENDIF; OUTPT "Hi"
the translator, before the program runs
run-time error 运行时错误
the program runs, but a statement cannot be carried out
division by zero; an array index of 0 or 51; a function called with an invalid parameter; a loop that never ends, so the program "freezes"
while running: the program stops or hangs
logic error
the program runs to the end, but the output is wrong
> where >= was needed; a total never set to 0
testing with a trace table and chosen test data
An IDE 集成开发环境 helps find the last two: a breakpoint 断点 stops the program at a chosen line; single stepping 单步执行 then runs one statement at a time; and the report (or watch) window shows the value of each variable at that moment, so the line where a value goes wrong is seen directly. Test methods and test data are in topic 12.
Français
Trois types d'erreurs, chacun trouvé d'une manière différente :
Erreur
Ce que c'est
Exemple
Trouvé par
erreur de syntaxe 语法错误
une instruction qui viole les règles du langage
une⟩ENDIF manquante ; OUTPT "Hi"
le traducteur, avant l'exécution du programme
erreur d'exécution 运行时错误
le programme s'exécute, mais une instruction ne peut être exécutée
division par zéro ; un index de tableau de 0 ou 51 ; une fonction appelée avec un paramètre invalide ; une boucle qui ne se termine jamais, donc le programme « gèle »
pendant l'exécution : le programme s'arrête ou reste bloqué
erreur logique
le programme s'exécute jusqu'au bout, mais la sortie est fausse
> au lieu de >= ; un total jamais mis à 0
le test avec une table de traçage et des données de test choisies
Un IDE 集成开发环境 aide à trouver les deux derniers : un point d'arrêt 断point arrête le programme à une ligne choisie ; le pas à pas 单步执行 exécute ensuite une instruction à la fois ; et la fenêtre de rapport (ou surveillance) montre la valeur de chaque variable à cet instant, donc la ligne où une valeur devient erronée est vue directement. Les méthodes de test et les données de test sont dans le topic 12.
Definitions the examiner accepts · Définitions acceptées par l'examinateur
English
A definition question is marked against fixed wording. Learn these exactly.
Term
Definition
procedure
a subroutine that carries out a task (a sequence of steps) and does not return a value; it is called with CALL
function
a subroutine that returns a single value to the point where it was called, so it can be used in an expression
parameter
the identifier in a subroutine header that receives a value or a reference when the subroutine is called
argument
the value (or variable) supplied in the call, matched to a parameter
passing by value
a copy of the argument's value is given to the subroutine, so changes inside it do not affect the original variable
passing by reference
the address of the variable is given to the subroutine, so changes inside it change the original variable
header
the first line of a subroutine definition: its name, its parameters and, for a function, its return type
interface
what a calling program must know to use a subroutine: its name, its parameters (number, order, type) and its return type
return value
the value a function passes back to the expression that called it
local variable
declared inside a subroutine; it exists only while the subroutine runs and can be used only inside it
global variable
declared outside every subroutine; it can be used anywhere in the program
count-controlled loop
repeats a fixed number of times, controlled by a counter (FOR ... NEXT)
pre-condition loop
tests its condition before each iteration, so the body may never run (WHILE ... ENDWHILE)
post-condition loop
tests its condition after each iteration, so the body runs at least once (REPEAT ... UNTIL)
constant
a named value that cannot change while the program runs
subroutine
a self-contained block of code that performs a task and is called by name: a procedure or a function
library routine
a subroutine that has already been written and tested, and is available to be called from a program
Français
Une question de définition est notée selon un libellé fixe. Apprenez-le exactement.
Terme
Définition
procédure
une sous-routine qui effectue une tâche (une séquence d'étapes) et ne retourne pas de valeur ; elle est appelée avec CALL
fonction
une sous-routine qui retourne une valeur unique au point où elle a été appelée, donc elle peut être utilisée dans une expression
paramètre
l'identifiant dans l'en-tête d'une sous-routine qui reçoit une valeur ou une référence lorsque la sous-routine est appelée
argument
la valeur (ou variable) fournie dans l'appel, associée à un paramètre
passage par valeur
une copie de la valeur de l'argument est donnée à la sous-routine, donc les modifications à l'intérieur n'affectent pas la variable originale
passage par référence
l'adresse de la variable est donnée à la sous-routine, donc les modifications à l'intérieur changent la variable originale
en-tête
la première ligne d'une définition de sous-routine : son nom, ses paramètres et, pour une fonction, son type de retour
interface
ce qu'un programme appelant doit savoir pour utiliser une sous-routine : son nom, ses paramètres (nombre, ordre, type) et son type de retour
valeur de retour
la valeur qu'une fonction renvoie à l'expression qui l'a appelée
variable locale
déclarée à l'intérieur d'une sous-routine ; elle n'existe que pendant l'exécution de la sous-routine et ne peut être utilisée que dans celle-ci
variable globale
déclarée en dehors de toute sous-routine ; elle peut être utilisée partout dans le programme
boucle contrôlée par compteur
répète un nombre fixe de fois, contrôlée par un compteur (FOR ... NEXT)
boucle précondition
teste sa condition avant chaque itération, donc le corps peut ne jamais s'exécuter (WHILE ... ENDWHILE)
boucle postcondition
teste sa condition après chaque itération, donc le corps s'exécute au moins une fois (REPEAT ... UNTIL)
constante
une valeur nommée qui ne peut pas changer pendant l'exécution du programme
sous-routine
bloc de code autonome qui effectue une tâche et est appelé par son nom : une procédure ou une fonction
routine de bibliothèque
sous-routine déjà écrite et testée, disponible pour être appelée depuis un programme
11.3
Exam tips · Conseils d'examen
English
Distinguish a procedure (no return value) from a function (returns a value); know pass by value vs by reference.
Choose the right loop: count-controlled (FOR) when the number of repeats is known, condition-controlled (WHILE/REPEAT) otherwise.
Distinguish local vs global variables and scope; prefer local variables in reusable modules.
Use the insert's exact routine names and parameter order. VAL and STR are IGCSE names and score nothing; UCASE and LCASE are real 9618 routines from the Pseudocode Guide but act on one character, so on Paper 2 a whole string takes TO_UPPER or TO_LOWER.
In a "write pseudocode" answer the header, the declarations, the loop, the condition, the update and the RETURN each carry a mark: write all six parts, even if one is uncertain.
Common mistakes
Calling a function and not using what it returns. Assign the result, or use it in the expression or output: Sorted ← BubbleSort(MyArray, 7).
Passing a length one out: 6 for a seven-element array, or the last index where the length was wanted. Decide whether the parameter is a length or an index, and check that the last element is visited.
Closing a file inside the loop that reads it. Open once, close once, after the loop.
Using the input as a filename directly. Add the extension the question gave: FileName ← Choice & ".txt".
Leaving constructs open. Every IF needs its ENDIF, every FOR its NEXT, every WHILE its ENDWHILE, and every function its RETURN; the scheme has a mark for it.
Wrong boundaries: > for "at least" (which is >=), or a FOR that starts at 0 for an array declared [1:50].
A counter or total that is never set to 0 before the loop.
In a trace table, rewriting every variable on every row, or changing a value before the statement that changes it has run.
Half a condition: IF x = 3 OR 4 — each side of OR and AND must be a complete comparison. And + does not join strings; & does.
Declaring as local a value that must survive between calls. A running total or a string built up over several calls is global or BYREF.
Français
Distiguez une procédure (pas de valeur de retour) d'une fonction (renvoie une valeur) ; maîtrisez le passage par valeur vs par référence.
Choisissez la bonne boucle : contrôlée par compteur (FOR) lorsque le nombre de répétitions est connu, contrôlée par condition (WHILE/REPEAT) sinon.
Distiguez les variables locales vs globales et leur portée ; privilégiez les variables locales dans les modules réutilisables.
Utilisez les noms exacts des routines et l'ordre des paramètres de l'insertion. VAL et STR sont des noms IGCSE et ne rapportent aucun point ; UCASE et LCASE sont de vraies routines 9618 du Guide de Pseudocode mais agissent sur un seul caractère, donc sur Paper 2, une chaîne entière prend TO_UPPER ou TO_LOWER.
Dans une réponse « écrire du pseudocode », l'en-tête, les déclarations, la boucle, la condition, la mise à jour et la ⟨RETURN⟩ rapportent chacun un point : écrivez les six parties, même si l'une vous est incertaine.
Erreurs courantes
Appeler une fonction sans utiliser ce qu’elle retourne. Assigner le résultat, ou l’utiliser dans l’expression ou la sortie : Sorted ← BubbleSort(MyArray, 7).
Passer une longueur d'un : 6 pour un tableau de sept éléments, ou le dernier index où la longueur était souhaitée. Décidez si le paramètre est une longueur ou un index, et vérifiez que le dernier élément est visité.
Fermer un fichier à l'intérieur de la boucle qui le lit. Ouvrez une fois, fermez une fois, après la boucle.
Utiliser l'entrée directement comme nom de fichier. Ajoutez l'extension donnée par la question : FileName ← Choice & ".txt".
Laisser des structures ouvertes. Chaque IF a son ENDIF, chaque FOR a son NEXT, chaque WHILE a son ENDWHILE, et chaque fonction a son RETURN ; le schéma prévoit une marque pour cela.
Mauvaises bornes : > pour "au moins" (qui est >=), ou un FOR qui commence à 0 pour un tableau déclaré [1:50].
Un compteur ou un total qui n'est jamais initialisé à 0 avant la boucle.
Dans une table de traçage, réécrire toutes les variables à chaque ligne, ou modifier une valeur avant que la instruction qui la modifie ne se soit exécutée.
Moitié de condition : IF x = 3 OR 4 — chaque côté de OR et AND doit être une comparaison complète. Et + ne joint pas les chaînes ; & le fait.
Déclarer comme locale une valeur qui doit persister entre les appels. Un total cumulé ou une chaîne construite sur plusieurs appels est global ou BYREF.
Interactive lessons on this topic · Leçons interactives sur ce sujet
Work through it step by step, with instant-check exercises. · Traversez-le étape par étape, avec des exercices à vérification instantanée.
Pick one and the site follows you — notes, papers, videos and practice all open on it. · Sélectionnez-en une et le site vous suit — notes, documents, vidéos et exercices s'ouvrent dessus.
Type to search notes, lessons, code, vocabulary and past-paper questions across every subject. · Tapez pour rechercher des notes, leçons, code, vocabulaire et examens dans toutes les matières.