Aller au contenu principal

Ch. 03 · Leçon 3

Paramètres : passage par valeur et par variable

180 minanalyse · python
Affichage du code

Ce que vous saurez faire

  • Distinguer paramètre formel et paramètre effectif
  • Identifier les passages par valeur et par variable
  • Prédire l'effet d'un sous-programme sur les arguments selon le mode de passage
  • Concevoir un sous-programme qui modifie plusieurs valeurs simultanément

Plan de cours

Copie ou pointeur : le destin des arguments

Comment les sous-programmes reçoivent leurs données, et surtout renvoient leurs effets : c'est le mécanisme des paramètres. Sujet de toutes les confusions au bac, et heureusement de toutes les bonnes questions de cours.

Concepts clés

  1. Paramètre formel (signature) vs effectif (appel).
  2. Passage par valeur = copie ; modifications locales.
  3. Passage par variable = même mémoire ; modifications persistent.
  4. En Python : immuables (int, str, tuple) → comme par valeur. Mutables (list, dict) → comme par référence.

Avant de commencer

  • Q1. Si une fonction modifie un paramètre x, le x de l'appelant change-t-il ?
  • Q2. En Python, est-ce que def f(L): L.append(5) modifie le tableau de l'appelant ?
  • Q3. Pourquoi écrire Procédure echange(VAR a, VAR b) en algorithmique tunisien ?

1. Le contenu du cours

1.1 Vocabulaire de base

Exemple :

def calculer(a, b):       # a, b : paramètres formels
    return a + b

x = 3
y = 5
resultat = calculer(x, y)  # x, y : paramètres effectifs

1.2 Le passage par valeur

Mode par défaut en algorithmique tunisien quand on n'écrit rien devant le paramètre.

Syntaxe algorithmique

Procédure exemple(x : entier)
    x ← x + 10
FinProcédure

Trace mentale

Appel : exemple(5)
   x reçoit la VALEUR 5 (copie)
   x ← x + 10 → x devient 15 (dans le sous-programme)
Fin de l'appel : la copie est détruite, la variable de l'appelant est intacte.

Conséquence. Si vous passez n = 5 à la procédure et qu'elle fait x ← x + 10, votre n reste 5 après l'appel.

1.3 Le passage par variable

Syntaxe algorithmique tunisienne

On préfixe le paramètre du mot-clé VAR :

Procédure incrementer(VAR x : entier)
    x ← x + 1
FinProcédure

Appel et trace :

n ← 5
incrementer(n)
→ x et n désignent la MÊME case mémoire
→ x ← x + 1 → la case devient 6
→ n vaut maintenant 6 après l'appel

1.4 Python : pas de syntaxe explicite mais une règle simple

Python n'a pas de mot-clé VAR ou ref. Mais le comportement dépend du type de l'argument :

TypeMutable ?Comportement
int, float, str, tuple, boolNonComme par valeur
list, dict, set, objets définis par l'utilisateurOuiComme par référence

Exemple 1 — Immuable (entier)

def incrementer(x):
    x = x + 1
    print("dans fonction, x =", x)

n = 5
incrementer(n)
print("après appel, n =", n)

Sortie :

dans fonction, x = 6
après appel, n = 5

L'entier n n'est pas modifié. C'est comme un passage par valeur.

Exemple 2 — Mutable (liste)

def ajouter_zero(T):
    T.append(0)
    print("dans fonction, T =", T)

L = [1, 2, 3]
ajouter_zero(L)
print("après appel, L =", L)

Sortie :

dans fonction, T = [1, 2, 3, 0]
après appel, L = [1, 2, 3, 0]

La liste est modifiée : c'est comme un passage par référence.

1.5 Cas canonique : échange de deux variables

En notation tunisienne :

Procédure echanger(VAR a : entier, VAR b : entier)
    Variables locales : temp : entier
    Début
        temp ← a
        a ← b
        b ← temp
    Fin
FinProcédure

Appel :

x ← 3 ; y ← 7
echanger(x, y)
{ Maintenant x = 7 et y = 3 }

En Python — version 1 (avec une liste, par référence)

def echanger(T, i, j):
    T[i], T[j] = T[j], T[i]

L = [3, 7, 12]
echanger(L, 0, 1)
print(L)   # [7, 3, 12]

En Python — version 2 (avec un tuple de retour, idiomatique)

def echanger(a, b):
    return b, a

x, y = 3, 7
x, y = echanger(x, y)
print(x, y)   # 7 3

1.6 Retourner plusieurs valeurs

Quand on a besoin de plusieurs résultats, deux options :

Option A — Plusieurs paramètres VAR (algorithmique)

Procédure division_entiere(a : entier, b : entier, VAR q : entier, VAR r : entier)
    q ← a DIV b
    r ← a MOD b
FinProcédure

Option B — Tuple de retour (Python idiomatique)

def division_entiere(a, b):
    q = a // b
    r = a % b
    return q, r

quotient, reste = division_entiere(17, 5)
print(quotient, reste)   # 3 2

1.7 Trace d'exécution — Mode mixte

Énoncé. Un programme appelle :

n ← 5
T ← [1, 2, 3]
modifier(n, T)

avec la procédure :

Procédure modifier(VAR n : entier, T : tableau d'entiers)
    n ← n + 100
    T[0] ← 99
FinProcédure

Question. Que valent n et T après l'appel ?

Trace d'exécution
0 / 5
Instructionn_appelantT_appelant
01···??
02···??
03···??
04···??
05···??

2. Exercices pratiques

Niveau Débutant — Type bac courant

Exercice 1facile
Que vaut n après l'appel ?

Pour chacune des procédures suivantes, indiquer la valeur de n après l'appel, sachant que l'appel se fait avec n = 10.

Procédure A

Procédure A(x : entier)
    x ← x * 2
FinProcédure

Procédure B

Procédure B(VAR x : entier)
    x ← x * 2
FinProcédure

Procédure C

Procédure C(x : entier)
    Écrire(x * 2)
FinProcédure
Voir le corrigé
ProcédureModen après appelPourquoi
APar valeur10Copie modifiée, original intact
BPar variable (VAR)20Même mémoire, modification persistante
CPar valeur10C ne fait qu'afficher, jamais affecter à x

Leçon. Le mot-clé VAR change tout. Sans lui, peu importe ce que le sous-programme fait, l'argument de l'appelant reste intact.

Niveau Intermédiaire — Type bac difficile

Exercice 2moyen
Procédure de tri minimal sur 3 entiers

Écrire une procédure trier_trois(VAR a, VAR b, VAR c : entier) qui réordonne a, b, c par ordre croissant, en utilisant uniquement des appels à echanger.

Donner :

  1. La procédure echanger.
  2. La procédure trier_trois.
  3. Une trace pour l'appel initial (7, 2, 5).
Voir le corrigé

Procédures

Procédure echanger(VAR x : entier, VAR y : entier)
    Variables : temp : entier
    Début
        temp ← x
        x ← y
        y ← temp
    Fin
FinProcédure

Procédure trier_trois(VAR a : entier, VAR b : entier, VAR c : entier)
    Début
        Si a > b Alors echanger(a, b) FinSi
        Si b > c Alors echanger(b, c) FinSi
        Si a > b Alors echanger(a, b) FinSi
    Fin
FinProcédure

Trace (7, 2, 5)

ÉtapeabcAction
Init725
a > b ? 7 > 2 ✓275swap a/b
b > c ? 7 > 5 ✓257swap b/c
a > b ? 2 > 5 ✗257rien

Résultat : 2, 5, 7 ✓ trié.

Variante Python idiomatique :

def trier_trois(a, b, c):
    return sorted([a, b, c])

Une seule ligne, mais ne respecte pas le format bac. Pour la copie d'examen, restez sur la version algorithmique.

Niveau Avancé — Hors bac (bonus)

Exercice 3difficile
Mise à jour d'une statistique de classe

Vous disposez de :

  • Un tableau notes de N réels (notes des élèves de la classe).
  • Une procédure statistiques qui doit mettre à jour quatre paramètres : la moyenne, le minimum, le maximum, et le nombre d'admis (note ≥ 10).

Questions.

  1. Donner la signature de la procédure en notation tunisienne.
  2. Écrire l'algorithme de la procédure.
  3. Écrire l'équivalent Python en utilisant un tuple de retour (idiomatique).
  4. Pourquoi n'utilise-t-on pas une seule fonction au lieu de 4 paramètres ?
Voir le corrigé

1. Signature en notation tunisienne

Procédure statistiques(
    notes : tableau de N réels,
    N : entier,
    VAR moy : réel,
    VAR mini : réel,
    VAR maxi : réel,
    VAR nb_admis : entier
)

2. Algorithme

Procédure statistiques(notes, N, VAR moy, VAR mini, VAR maxi, VAR nb_admis)
    Variables : i : entier, somme : réel
    Début
        somme ← 0
        mini ← notes[1]
        maxi ← notes[1]
        nb_admis ← 0
        Pour i de 1 à N Faire
            somme ← somme + notes[i]
            Si notes[i] < mini Alors mini ← notes[i] FinSi
            Si notes[i] > maxi Alors maxi ← notes[i] FinSi
            Si notes[i] >= 10 Alors nb_admis ← nb_admis + 1 FinSi
        FinPour
        moy ← somme / N
    Fin
FinProcédure

3. Équivalent Python (tuple de retour)

def statistiques(notes):
    """Retourne (moyenne, min, max, nb_admis)."""
    somme = 0
    mini = notes[0]
    maxi = notes[0]
    nb_admis = 0
    
    for note in notes:
        somme += note
        if note < mini:
            mini = note
        if note > maxi:
            maxi = note
        if note >= 10:
            nb_admis += 1
    
    moy = somme / len(notes)
    return moy, mini, maxi, nb_admis

# Appel
notes = [12, 8, 15, 18, 9, 13.5]
moy, mini, maxi, n_admis = statistiques(notes)
print(f"Moyenne : {moy:.2f}")
print(f"Min : {mini}, Max : {maxi}")
print(f"Admis : {n_admis}/{len(notes)}")

4. Pourquoi pas une seule fonction ?

Une fonction Python ne peut retourner qu'une seule valeur. Mais cette valeur peut être un tuple (groupe de plusieurs valeurs), ce qui permet de simuler le retour multiple :

return moy, mini, maxi, nb_admis   # retourne un tuple à 4 éléments

À l'appel, on dépaquète le tuple :

moy, mini, maxi, n_admis = statistiques(notes)

En notation algorithmique tunisienne, on n'a pas de tuple : on utilise donc des paramètres VAR. Au bac, écrivez la version VAR. En Python pratique, préférez le tuple de retour.


⚠️ Erreurs fréquentes au bac

Avant le quiz, mémorisez ces pièges classiques qui font perdre des points :

  • Erreur 1. Oublier VAR devant un paramètre qu'on veut modifier (passage par variable obligatoire).
  • Erreur 2. Modifier un paramètre passé par valeur en croyant modifier l'original. Ne marche que pour les types mutables (tableaux/listes).
  • Erreur 3. En Python, croire qu'un entier passé en paramètre sera modifié à l'extérieur. Faux : les entiers sont immuables.
  • Erreur 4. Confondre paramètre formel (celui de la déclaration) et paramètre effectif (celui de l'appel).

3. Quiz de vérification

Paramètres et passage (5 questions)

1

Le passage par VALEUR :

2

En notation tunisienne, comment marquer qu'un paramètre est passé par variable ?

3

En Python, def f(L): L.append(5) appelée avec L = [1,2,3] :

4

Pour échanger deux entiers en notation tunisienne, la signature doit être :

5

En Python, pour retourner plusieurs valeurs, on utilise :


En résumé

Avant la leçon 3.4 (Traitements sur tableaux), vérifiez que vous savez :

  • ✅ Marquer VAR quand un paramètre doit être modifié,
  • ✅ Prédire la valeur d'une variable après un appel de procédure,
  • ✅ Distinguer mutables (listes) et immuables (entiers, chaînes) en Python,
  • ✅ Retourner plusieurs valeurs (par tuple en Python, par VAR en algorithmique).

Les tableaux que vous verrez à la leçon suivante sont toujours manipulés via passage par référence — d'où l'importance de bien comprendre les modes.

Bravo d'être arrivé jusqu'ici. Marquez la leçon terminée pour ancrer le progrès.