Procedures, functions and structured programming · Procédures, fonctions et programmation structurée
| English | Français |
|---|---|
| subroutines/ˈsʌbruːtiːnz/ | sous-programmes |
| function/ˈfʌŋkʃn/ | fonction |
| procedure/prəˈsiːdʒə/ | procédure |
| structured programming/ˈstrʌktʃəd ˈprəʊɡræmɪŋ/ | programmation structurée |
| decomposition/ˌdiːkɒmpəˈzɪʃn/ | décomposition |
| parameters/pəˈræmɪtəz/ | paramètres |
| arguments/ˈɑːɡjuːmənts/ | arguments |
| signature/ˈsɪɡnɪtʃə/ | signature |
| pass by value/pæs baɪ ˈvæljuː/ | passage par valeur |
| pass by reference/pæs baɪ ˈrefrəns/ | passage par référence |
| global variable/ˈɡləʊbl ˈveərɪəbl/ | variable globale |
| local variable/ˈləʊkl ˈveərɪəbl/ | variable locale |
| scope/skəʊp/ | portée |
A tape of routines anyone could borrow
- By 1951 the EDSAC team in Cambridge kept a library of subroutines on punched paper tape: square roots, printing, logarithms. Any program could read one in and call it.
- The hard part was getting back. David Wheeler's trick, the "Wheeler jump", stored the return address so a routine could return to wherever it had been called from.
- Every function call you write today does the same thing, and every language library descends from that tape.
- This lesson is procedures and functions: how to define them, how to pass values in and out, and how to write one the way Paper 2 marks it.
Une bande de routines que tout le monde pourrait emprunter
- D'ici 1951, l'équipe EDSAC de Cambridge conservait une bibliothèque de sous-routines sur ruban perforé : racines carrées, impression, logarithmes. Tout programme pouvait en lire une et l'appeler.
- Le difficile était de revenir. La technique de David Wheeler, le "Wheeler jump", stockait l'adresse de retour pour qu'une routine puisse retourner à l'endroit exact d'où elle avait été appelée.
- Chaque appel de fonction que vous écrivez aujourd'hui fait la même chose, et chaque bibliothèque de langage descend de ce ruban.
- Cette leçon porte sur les procédures et fonctions : comment les définir, comment passer des valeurs à l'intérieur et à l'extérieur, et comment en écrire une comme le Paper 2 la note.
Procedures and functions
- Structured programming 结构化编程 builds a program from small named subroutines 子程序, each with one job.
- A procedure 过程 is a named block that does an action and returns nothing:
PROCEDURE Greet(Name : STRING) … ENDPROCEDURE, run withCALL Greet("Ada"). - A function 函数 returns a value that becomes part of an expression:
FUNCTION Square(X : INTEGER) RETURNS INTEGER … RETURN X * X … ENDFUNCTION, used asResult ← Square(5) + 1.
A procedure does something; a function hands back a value
Procédures et fonctions
- La programmation structurée 结构化编程 construit un programme à partir de petites sous-routines 子程序 nommées, chacune ayant une seule tâche.
- Une procédure 过程 est un bloc nommé qui effectue une action et ne retourne rien :
PROCEDURE Greet(Name : STRING) … ENDPROCEDURE, exécuté avecCALL Greet("Ada"). - Une fonction 函数 retourne une valeur qui fait partie d'une expression :
FUNCTION Square(X : INTEGER) RETURNS INTEGER … RETURN X * X … ENDFUNCTION, utilisée commeResult ← Square(5) + 1.

Une procédure fait quelque chose ; une fonction rend une valeur
The call stack: push on call, pop on return · La pile d'appels : poussée lors de l'appel, retirée lors du retour
Calling a subroutine pushes a new frame on top; returning pops it and hands a value back to the caller. The call that is running is always the frame on top. · 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.
The key difference between a procedure and a function is that a function: · La différence clé entre une procédure et une fonction est qu'une fonction :
A function returns a value (used in an expression); a procedure performs an action and returns nothing. · Une fonction retourne une valeur (utilisée dans une expression) ; une procédure effectue une action et ne retourne rien.
A function Square(x) returns · rendements x * x. What does the call Square(5) return? · Une fonction Square(x) retourne x * x. Que retourne l'appel Square(5) ?
5 × 5 = 25 — the value the function hands back to its caller (the frame popped off the call stack). · 5 × 5 = 25 — la valeur que la fonction rend à son appelant (le cadre retiré de la pile d'appels).
Where each is appropriate
- A procedure 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 where a single value must be calculated and then used in an expression: a total, a
TRUE/FALSEresult, the larger of two numbers. The return value replaces the call. - Use a subroutine when logic appears in more than one place, when a block has a clear named purpose, when the program is complex enough to need decomposition 分解, or when you want to test one piece on its own.
Où chaque option est appropriée
- Une procédure là où le même groupe d'étapes est nécessaire à plusieurs endroits : valider une entrée, afficher un menu, échanger deux valeurs. Les étapes sont écrites une fois et appelées par nom.
- Une fonction là où une valeur unique doit être calculée puis utilisée dans une expression : un total, un résultat
TRUE/FALSE, le plus grand de deux nombres. La valeur de retour remplace l'appel. - Utilisez une sous-routine lorsque la logique apparaît à plusieurs endroits, lorsqu'un bloc a un but clairement nommé, lorsque le programme est complexe au point de nécessiter une décomposition 分解, ou lorsque vous voulez tester un morceau seul.
A good reason to write a subroutine is that: · Une bonne raison d'écrire une sous-routine est que :
Subroutines remove duplication, give a named purpose, and can be tested in isolation. · Les sous-routines éliminent la duplication, donnent un but nommé, et peuvent être testées isolément.
Parameters, arguments and the interface
- Parameters 参数 are the variables a subroutine declares to receive values; the values the caller supplies are the arguments 实参.
- The header is the first line:
PROCEDURE Name(Param : TYPE)orFUNCTION Name(Param : TYPE) RETURNS TYPE. The interface, or signature 签名, is the name, the parameters in order with their types, and the return type: everything a caller must know. - The return value is what a function passes back with
RETURN.
Paramètres, arguments et interface
- Les paramètres 参数 sont les variables qu'une sous-routine déclare pour recevoir des valeurs ; les valeurs fournies par l'appelant sont les arguments 实参.
- L'en-tête est la première ligne :
PROCEDURE Name(Param : TYPE)ouFUNCTION Name(Param : TYPE) RETURNS TYPE. L'interface, ou signature 签名, est le nom, les paramètres dans l'ordre avec leurs types, et le type de retour : tout ce qu'un appelant doit savoir. - La valeur de retour est ce qu'une fonction renvoie avec
RETURN.
Match each term to what it means. · Associez chaque terme à sa signification.
Function vs procedure = returns a value or not; by value vs by reference = copy or original. · Fonction vs procédure = retourne une valeur ou non ; par valeur vs par référence = copie ou original.
Worked example: describe each term in a header
FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN.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 that parameter.RETURNS BOOLEAN: the data type of the value the function returns. Five parts, one mark each.
Exemple résolu : décrire chaque terme dans un en-tête
FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN.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 de ce paramètre.RETURNS BOOLEAN: le type de données de la valeur que la fonction retourne. Cinq parties, un point chacune.
In FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN, the identifier Count is the ____. · Dans FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN, l'identifiant Count est le ____.
The parameter receives the argument the caller passes in and is used inside the function like a local variable. · Le paramètre reçoit l'argument que l'appelant passe et est utilisé à l'intérieur de la fonction comme une variable locale.
Pass by value and pass by reference
- Pass by value 传值: the routine receives a copy, so changes inside it do not reach the caller. Use it for inputs the routine only reads.
- Pass by reference 传引用: the routine receives a reference to the caller's own variable, so changes do reach the caller. Use it when the routine must update the argument, as in
Swap. - Cambridge writes the mode in the header,
BYVALorBYREF, before each parameter. If neither is written,BYVALis assumed.
A copy, or a link to the caller's variable
Passage par valeur et passage par référence
- Passage par valeur 传值 : la routine reçoit une copie, donc les changements à l'intérieur n'atteignent pas l'appelant. Utilisez-le pour les entrées que la routine lit seulement.
- Passage par référence 传引用 : la routine reçoit une référence à la propre variable de l'appelant, donc les changements atteignent l'appelant. Utilisez-le lorsque la routine doit mettre à jour l'argument, comme dans
Swap. - Cambridge écrit le mode dans l'en-tête,
BYVALouBYREF, devant chaque paramètre. Si aucun n'est écrit,BYVALest supposé.

Une copie, ou un lien vers la variable de l'appelant
Worked example: what is output?
Xis a reference toA, soAbecomes 8.Yis a copy ofB, so doublingYleavesBat 3.- The output is
8, 3. Had the header saidBYVAL X,Awould still be 5.
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
Xest une référence àA, doncAdevient 8.Yest une copie deB, donc doublerYlaisseBà 3.- La sortie est
8, 3. Si l'en-tête avait ditBYVAL X,Aserait resté 5.
In the worked example, what is the value of A after CALL Adjust(A, B)? · Dans l'exemple illustré, quelle est la valeur de A après CALL Adjust(A, B) ?
X is passed BYREF, so X ← X + Y adds 3 to the caller's A: 5 + 3 = 8. B stays 3 because Y was a copy. · X est passé PAR RÉFÉRENCE, donc X ← X + Y ajoute 3 à A de l'appelant : 5 + 3 = 8. B reste 3 car Y était une copie.
Local and 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. The region where a name is visible is its scope 作用域.
- Locals are preferred: the same identifier can be reused elsewhere without a clash, the value cannot be changed accidentally by other parts of the program, the memory is released on return, and the subroutine is self-contained.
- A local is created new on every call, so it cannot carry a value between calls. A routine that builds up a string over repeated calls needs that string to be global, or passed
BYREF.
A global is visible everywhere; a local lives only inside its own subroutine
Variables locales et globales
- Une variable locale 局部变量 est déclarée à l'intérieur d'une sous-routine et existe uniquement pendant son exécution ; une variable globale 全局变量 est déclarée à l'extérieur et est visible partout. La région où un nom est visible est sa portée 作用域.
- Les locales sont préférées : le même identifiant peut être réutilisé ailleurs sans conflit, la valeur ne peut pas être changée accidentellement par d'autres parties du programme, la mémoire est libérée au retour, et la sous-routine est autonome.
- Une locale est créée à nouveau à chaque appel, donc elle ne peut pas conserver une valeur entre les appels. Une routine qui construit une chaîne sur des appels répétés a besoin que cette chaîne soit globale, ou passée
BYREF.

Une globale est visible partout ; une locale vit uniquement à l'intérieur de sa propre sous-routine
A local variable exists only inside the subroutine where it is declared, while a global variable is visible everywhere in the program. · Une variable locale n'existe que dans la sous-routine où elle est déclarée, tandis qu'une variable globale est visible partout dans le programme.
Keeping variables local limits their scope, avoids name clashes, and makes a subroutine testable on its own — globals are best avoided. · Garder les variables locales limite leur portée, évite les conflits de noms, et rend une sous-routine testable indépendamment — les globales sont à éviter.
Which are benefits of using local variables? Select all · tout that apply. · Quels sont les avantages d'utiliser des variables locales ? Sélectionnez tous ceux qui s'appliquent.
A local is created fresh on every call, so it cannot keep a value between calls. That is the one job a global, or a BYREF parameter, does instead. · Une variable locale est créée à chaque appel, elle ne peut donc pas conserver une valeur entre les appels. C'est là une fonction qu'une variable globale ou un paramètre PAR RÉFÉRENCE accomplit à la place.
Turning a procedure into a function
- Change
PROCEDUREtoFUNCTIONand addRETURNS <type>to the header. - Replace the
OUTPUT, or theBYREFparameter that carried the result out, with aRETURNstatement. - Change every call so the returned value is used:
Result ← Unpack(Text)instead ofCALL Unpack(Text, Result).
Transformer une procédure en fonction
- Changez
PROCEDUREenFUNCTIONet ajoutezRETURNS <type>à l'en-tête. - Remplacez le
OUTPUT, ou le paramètreBYREFqui transportait le résultat vers l'extérieur, par une instructionRETURN. - Changez chaque appel pour que la valeur retournée soit utilisée :
Result ← Unpack(Text)au lieu deCALL Unpack(Text, Result).
To convert a procedure into a function you change the header to FUNCTION with RETURNS, replace the OUTPUT with RETURN, and change the calls to use the returned value. · Pour convertir une procédure en fonction, vous modifiez l'en-tête en FUNCTION avec RETURNS, remplacez OUTPUT par RETURN, et modifiez les appels pour utiliser la valeur retournée.
Three changes, three marks: the header, the RETURN, and the calls. · Trois changements, trois points : l'en-tête, RETURN, et les appels.
Worked example: writing a module for Paper 2
- A global array
Score : ARRAY[1:50] OF INTEGERholds test scores. Write a functionCountAbove(Limit : INTEGER)that returns how many scores are greater thanLimit.
- The scheme awards a mark per feature: the header with parameter and return type, the local declarations, the counter initialised before the loop, the loop over every element, the condition with the right comparison, the update inside it, the constructs closed, and one
RETURNafter the loop. - An unfinished module still scores for every correct part, so write all of them.
Each part of a module answer carries its own mark
Exemple résolu : écrire un module pour le Paper 2
- Un tableau global
Score : ARRAY[1:50] OF INTEGERcontient les notes d'examen. Écrivez une fonctionCountAbove(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
- Le barème attribue un point par caractéristique : l'en-tête avec paramètre et type de retour, les déclarations locales, le compteur initialisé avant la boucle, la boucle sur chaque élément, la condition avec la bonne comparaison, la mise à jour à l'intérieur, les constructions fermées, et une
RETURNaprès la boucle. - Un module inachevé rapporte encore des points pour chaque partie correcte, donc écrivez-les toutes.

Chaque partie d'une réponse de module porte son propre point
Put the parts of a Paper 2 module answer in the order they are written. · Placez les parties d'une réponse de module Paper 2 dans l'ordre dans lequel elles sont écrites.
Header, declare, loop, condition, update, return. Each part is a mark, even if another part is wrong. · En-tête, déclarer, boucle, condition, mise à jour, retourner. Chaque partie vaut un point, même si une autre partie est fausse.
Marks that slip away
- A routine that must change the caller's variable needs
BYREFin its header; without itBYVALis assumed and the change is lost. - A function has one
RETURN, after the loop, andENDFUNCTION. ARETURNinside the loop ends it on the first element. DECLAREevery local, and initialise a counter or total to 0 before the loop.- "Efficient pseudocode" means moving work that does not change out of the loop, stopping a search at the first match, and not repeating a call whose result could be stored.
Pièges qui font perdre des points
- Une routine qui doit changer la variable de l'appelant a besoin de
BYREFdans son en-tête ; sans cela,BYVALest supposé et le changement est perdu. - Une fonction a une
RETURN, après la boucle, etENDFUNCTION. UnRETURNà l'intérieur de la boucle la termine sur le premier élément. DECLAREchaque locale, et initialisez un compteur ou un total à 0 avant la boucle.- Le « pseudocode efficace » signifie déplacer le travail qui ne change pas hors de la boucle, arrêter une recherche à la première correspondance, et ne pas répéter un appel dont le résultat pourrait être stocké.
To make a loop more efficient, a value that does not change with the loop counter should be: · Pour rendre une boucle plus efficace, une valeur qui ne change pas avec le compteur de boucle doit être :
Hoisting a loop invariant out avoids recomputing the same value on every iteration. · Extraitre un invariant de boucle évite de recalculer la même valeur à chaque itération.
You've got it
- a procedure does an action and is
CALLed; a function returns a value used in an expression - the header names the routine, its parameters with types and the return type; arguments are the values passed in
- BYVAL passes a copy (the default); BYREF lets the routine change the caller's variable
- prefer local variables; a local is new on every call, a global keeps its value
- a Paper 2 module: header, declarations, initialisation, loop, condition, update, closed constructs, one
RETURN
Vous avez compris
- une procédure effectue une action et est
CALLée ; une fonction renvoie une valeur utilisée dans une expression - l'en-tête nomme la routine, ses paramètres avec types et le type de retour ; les arguments sont les valeurs passées
- BYVAL passe une copie (par défaut) ; BYREF permet à la routine de changer la variable de l'appelant
- préférez les variables locales ; une locale est neuve à chaque appel, une globale conserve sa valeur
- un module Paper 2 : en-tête, déclarations, initialisation, boucle, condition, mise à jour, constructions fermées, une
RETURN