Ch. 03 · Leçon 4
Traitements sur tableaux
Ce que vous saurez faire
- Déclarer un tableau en algorithmique et en Python
- Implémenter les traitements canoniques (somme, max, min, occurrence)
- Analyser la complexité d'un parcours de tableau
- Concevoir un sous-programme paramétré pour un traitement de tableau
Plan de cours
Quand 100 variables deviennent un seul tableau
Le tableau est la structure de données la plus utilisée du programme officiel. Manipuler 100 notes ne nécessite pas 100 variables note1, note2, … : un tableau notes[1..100] suffit, et tous les traitements deviennent automatisables par boucle.
Concepts clés
- Un tableau = N éléments du même type, accessibles par indice.
- Algo : indices 1..N. Python : indices 0..N-1.
- Traitements canoniques : somme, max, min, recherche, comptage.
- Un tableau est passé par référence (même sans
VARexplicite).
Avant de commencer
- Q1. Comment accéder au 3ème élément d'un tableau
Ten notation algorithmique ? - Q2. Comment l'accéder en Python ?
- Q3. Quelle valeur initiale donneriez-vous à un accumulateur pour calculer un produit cumulé ?
1. Le contenu du cours
1.1 Analogie : le casier scolaire
Un tableau est un casier numéroté :
Casier T : [ ][ ][ ][ ][ ][ ][ ]
indices : 1 2 3 4 5 6 7
Pour accéder au contenu, vous donnez le numéro du casier (l'indice). Tous les casiers ont la même forme (le même type). C'est tout.
1.2 Déclaration
Notation algorithmique tunisienne
T.D.O
notes : tableau de 25 réels
N : entier = 25
Le tableau notes a 25 cases, indexées de 1 à 25, contenant chacune un réel.
Python — utilisation des listes
N = 25
notes = [0.0] * N # initialise un tableau de 25 zéros
Ou en partant d'une liste pré-remplie :
notes = [12, 15, 8, 17, 13]
1.3 Accès aux éléments
| Algo | Python | Effet |
|---|---|---|
T[i] | T[i] | Lecture / écriture de la case i |
T[1] | T[0] | Premier élément |
T[N] | T[N - 1] ou T[-1] | Dernier élément |
| Long(T) | len(T) | Taille du tableau |
1.4 Les six traitements canoniques
Tous les exercices de bac sur tableaux sont des variations de ces 6 traitements. Maîtrisez-les.
Traitement 1 — Saisie
def saisir_tableau(N):
"""Lit N entiers et retourne le tableau."""
T = [0] * N
for i in range(N):
T[i] = int(input(f"T[{i+1}] = "))
return T
Traitement 2 — Somme / Moyenne
def somme_tableau(T):
s = 0
for x in T:
s = s + x
return s
def moyenne_tableau(T):
return somme_tableau(T) / len(T)
Traitement 3 — Recherche du maximum (et du minimum)
def maximum(T):
"""T non vide."""
m = T[0]
for i in range(1, len(T)):
if T[i] > m:
m = T[i]
return m
Traitement 4 — Recherche d'une valeur (présence)
def contient(T, val):
for x in T:
if x == val:
return True # sortie anticipée
return False
Traitement 5 — Compter les occurrences
def occurrences(T, val):
nb = 0
for x in T:
if x == val:
nb = nb + 1
return nb
Traitement 6 — Filtrer (extraire un sous-tableau)
def positifs(T):
"""Retourne le sous-tableau des valeurs strictement positives."""
resultat = []
for x in T:
if x > 0:
resultat.append(x)
return resultat
1.5 Tableau et passage par référence
Un tableau passé en paramètre est modifiable depuis le sous-programme (référence partagée, voir leçon 3.3).
Exemple — Doubler tous les éléments
def doubler(T):
"""Modifie T sur place : chaque élément est multiplié par 2."""
for i in range(len(T)):
T[i] = T[i] * 2
L = [1, 2, 3]
doubler(L)
print(L) # [2, 4, 6]
Comparaison version « pure »
def double_pur(T):
"""Retourne un NOUVEAU tableau, sans modifier l'original."""
return [x * 2 for x in T]
L = [1, 2, 3]
L2 = double_pur(L)
print(L, L2) # [1, 2, 3] [2, 4, 6]
1.6 Trace d'exécution — Recherche du max
Tableau T = [12, 8, 15, 3, 17, 9], taille N = 6.
| N° | Instruction | i | T_i | m |
|---|---|---|---|---|
| 01 | ··· | ? | ? | ? |
| 02 | ··· | ? | ? | ? |
| 03 | ··· | ? | ? | ? |
| 04 | ··· | ? | ? | ? |
| 05 | ··· | ? | ? | ? |
| 06 | ··· | ? | ? | ? |
2. Exercices pratiques
Niveau Débutant — Type bac courant
Écrire une fonction somme_positifs(T) qui retourne la somme des éléments strictement positifs d'un tableau d'entiers.
Tester avec T = [-3, 5, -1, 8, 0, 12, -7]. Résultat attendu : 25.
Voir le corrigé
def somme_positifs(T):
s = 0
for x in T:
if x > 0:
s = s + x
return s
T = [-3, 5, -1, 8, 0, 12, -7]
print(somme_positifs(T)) # 25
Variante Python idiomatique :
def somme_positifs(T):
return sum(x for x in T if x > 0)
Une seule ligne. Au bac, la version avec boucle explicite est attendue. La version idiomatique est utile en production.
Niveau Intermédiaire — Type bac difficile
Écrire une fonction indice_minimum(T) qui retourne l'indice du plus petit élément du tableau (et non sa valeur). Si plusieurs éléments sont à égalité, retourner l'indice du premier.
Tester avec T = [5, 3, 8, 1, 9, 1, 4]. Résultat attendu : 3 (indice Python ; 4 en algorithmique).
Voir le corrigé
def indice_minimum(T):
"""Indice du plus petit élément ; en cas d'égalité, le premier."""
indice_min = 0
for i in range(1, len(T)):
if T[i] < T[indice_min]:
indice_min = i
return indice_min
T = [5, 3, 8, 1, 9, 1, 4]
print(indice_minimum(T)) # 3
Point clé. On utilise < strict (pas <=) pour garantir que le premier indice est retourné en cas d'égalité.
Variante en notation algorithmique tunisienne :
Fonction indice_min(T : tableau, N : entier) : entier
Variables : i, ind : entier
Début
ind ← 1
Pour i de 2 à N Faire
Si T[i] < T[ind] Alors
ind ← i
FinSi
FinPour
indice_min ← ind
Fin
FinFonction
Notez la différence d'indexation : 1 à N en algo, 0 à N-1 en Python.
Niveau Avancé — Hors bac (bonus)
Écrire une procédure inverser(T) qui inverse l'ordre des éléments d'un tableau sur place (sans créer un nouveau tableau). Par exemple, [1, 2, 3, 4, 5] devient [5, 4, 3, 2, 1] après appel.
Contraintes :
- Ne pas utiliser
T.reverse()ni le slicingT[::-1]. - N'utiliser qu'une seule variable temporaire.
- Donner Tableau de Déclaration des Objets (T.D.O), algorithme, code Python, trace pour
T = [10, 20, 30, 40, 50].
Voir le corrigé
T.D.O
Procédure inverser(VAR T : tableau, N : entier)
Variables : i : entier, temp : entier
Début
Pour i de 1 à N DIV 2 Faire
temp ← T[i]
T[i] ← T[N - i + 1]
T[N - i + 1] ← temp
FinPour
Fin
FinProcédure
Python
def inverser(T):
n = len(T)
for i in range(n // 2):
temp = T[i]
T[i] = T[n - 1 - i]
T[n - 1 - i] = temp
L = [10, 20, 30, 40, 50]
inverser(L)
print(L) # [50, 40, 30, 20, 10]
Trace pour T = [10, 20, 30, 40, 50] (n = 5)
i | n-1-i | Avant swap | Après swap |
|---|---|---|---|
| 0 | 4 | [10, 20, 30, 40, 50] | [50, 20, 30, 40, 10] |
| 1 | 3 | [50, 20, 30, 40, 10] | [50, 40, 30, 20, 10] |
| 2 | (boucle s'arrête, 2 < 5//2 = 2 est faux) | — | — |
Pourquoi n // 2 itérations ? On échange les paires (0, n-1), (1, n-2), …. Au-delà de n//2, on commencerait à re-inverser les paires déjà traitées. Pour n = 5, on s'arrête avant l'élément central qui ne bouge pas. Pour n = 6, on traite toutes les paires.
Idiome Python (hors examen) :
T[i], T[n - 1 - i] = T[n - 1 - i], T[i] # swap sans temp
À l'examen, conservez la version avec temp pour montrer la maîtrise de l'algorithme.
⚠️ Erreurs fréquentes au bac
Avant le quiz, mémorisez ces pièges classiques qui font perdre des points :
- Erreur 1. Indice hors borne :
T[N]en Python (le dernier indice estN-1). LèveIndexError. - Erreur 2. Confondre indexation 1-N (algorithmique tunisien) et 0-(N-1) (Python). Erreur de décalage de 1 (off-by-one).
- Erreur 3. Initialiser le max/min à
0au lieu deT[0]. Pour un tableau de valeurs négatives, le max retourné est faux. - Erreur 4. Modifier un tableau pendant qu'on le parcourt. Le
for x in T:peut alors sauter ou répéter des éléments.
3. Quiz de vérification
Traitements sur tableaux (5 questions)
En Python, T = [10, 20, 30, 40, 50]. Que vaut T[0] ?
Pour parcourir tous les éléments d'un tableau T en Python, la forme la plus idiomatique est :
Pour rechercher le MAXIMUM d'un tableau, on initialise m à :
Si on passe un tableau à une procédure et qu'on modifie T[0] = 99 à l'intérieur, l'appelant :
Pour inverser un tableau de taille N sur place, on itère sur :
En résumé
Avant la leçon 3.5 (Traitements sur chaînes), vous devez :
- ✅ Déclarer un tableau en algorithmique tunisien (
T.D.O) et en Python, - ✅ Implémenter sans hésiter les 6 traitements canoniques,
- ✅ Comprendre que les tableaux sont passés par référence (mutables),
- ✅ Initialiser correctement les variables (max ← T[0], somme ← 0, …).
Les chaînes de caractères se manipulent presque comme des tableaux (1 caractère = 1 case), avec quelques spécificités à venir.