Tableaux et parcoursDans le dialogue d’impression, choisissez « Enregistrer au format PDF » comme destination.
Retour

Algorithmique 1 · C2 Boucles et tableaux · Chapitre 2 · 25 min

Tableaux et parcours

Manipuler les indices sans déborder : somme, moyenne, minimum, maximum.

Vingt notes à traiter ne justifient pas vingt variables. Le tableau est la structure qui regroupe plusieurs valeurs de même type sous un seul nom, chacune repérée par un numéro.

Variables    T : tableau de 5 entiersDébut    T[0] ← 12    T[1] ← 5    ...

Deux propriétés à retenir. Toutes les cases ont le même type : un tableau d'entiers ne contient que des entiers. Et l'accès à une case est immédiat : atteindre T[3] ne coûte pas plus cher que T[0], la machine n'a pas à parcourir les cases précédentes. Ce détail paraît anodin ; c'est lui qui rendra possible la recherche dichotomique de la leçon 6.

Les cases sont numérotées de 0 à n − 1

C'est la convention de la quasi-totalité des langages, et la source d'erreur numéro un des débutants. Un tableau de 5 cases a pour indices 0, 1, 2, 3, 4. Il n'y a pas de case 5.

T[0]T[1]T[2]T[3]T[4]
1252083

La première case est T[0], la dernière est T[n − 1]n est la taille. Retenez ces deux formes plutôt que des nombres : elles restent justes quelle que soit la taille.

Accéder à T[5] sur ce tableau est un débordement d'indice. Selon le langage, le programme s'arrête net, ou — bien pire — lit un morceau de mémoire qui ne lui appartient pas et continue avec une valeur absurde.

Le parcours

Parcourir un tableau, c'est visiter ses cases une par une, dans l'ordre. Le schéma est toujours le même, et il vaut la peine de l'écrire une fois pour toutes :

Pour i de 0 à n − 1 Faire    ...traiter T[i]...FinPour

Notez n − 1, pas n. Écrire Pour i de 0 à n produit un tour de trop, et ce tour déborde. C'est l'erreur « à un près », la plus fréquente et la plus discrète du semestre.

Animation · 7 étapes

Parcourir T = [12, 5, 20, 8, 3] : somme et maximum

  1. Initialisation, avant le premier toursomme démarre à 0. max démarre à T[0], surtout pas à 0 : sur un tableau de températures négatives, un max initialisé à 0 ne serait jamais remplacé.
  2. i = 0 → T[0] = 12somme devient 0 + 12 = 12. max vaut déjà 12, rien à changer.
  3. i = 1 → T[1] = 5somme passe à 17. Test 5 > 12 ? FAUX : max ne bouge pas.
  4. i = 2 → T[2] = 2020 > 12 : c'est le seul tour où max change. Il vaudra 20 jusqu'à la fin.
  5. i = 3 → T[3] = 8somme continue de grandir, max reste à 20.
  6. i = 4 → dernière casei = 4 = n − 1 : le tableau a 5 cases numérotées de 0 à 4. Un tour de plus tenterait T[5], qui n'existe pas — c'est le débordement d'indice.
  7. Fin du parcoursLa moyenne se calcule APRÈS la boucle : 48 / 5 = 9,6. Un seul parcours a suffi pour trois résultats.

Une seule boucle a produit trois résultats. C'est un réflexe à prendre : quand plusieurs grandeurs se calculent sur les mêmes données, on ne fait pas trois parcours, on en fait un seul avec trois accumulateurs.

Quiz · 1 question

Un tableau T contient 5 valeurs. Quel est l'indice de la dernière ?

  • 5la taille du tableau
  • 4la taille moins un
  • Cela dépend des valeurssans règle fixe

Réponse : Les indices vont de 0 à n − 1, soit de 0 à 4. T[5] n'existe pas : c'est le débordement d'indice classique, et il se produit précisément quand on écrit « de 0 à n » au lieu de « de 0 à n − 1 ».

Somme, moyenne, minimum, maximum

Ces quatre calculs sont les exercices d'application obligés du parcours, et trois d'entre eux cachent un piège d'initialisation.

La somme ne pose pas de problème : accumulateur à 0, puis somme ← somme + T[i].

La moyenne se calcule après la boucle, une seule fois : moyenne ← somme / n. Diviser à l'intérieur donnerait un résultat faux à chaque tour sauf le dernier.

Le minimum et le maximum sont le vrai piège. La tentation est d'écrire :

max ← 0                          ← FAUXPour i de 0 à n − 1 Faire    Si T[i] > max Alors max ← T[i] FinSiFinPour

Sur [12, 5, 20, 8, 3], ça marche. Sur un tableau de températures hivernales [−3, −8, −5], le résultat est 0 — une température qui n'apparaît nulle part dans les données. Le maximum d'un tableau est forcément une valeur du tableau ; il faut donc partir de l'une d'elles :

max ← T[0]Pour i de 1 à n − 1 Faire    Si T[i] > max Alors max ← T[i] FinSiFinPour

Même raisonnement pour le minimum. Cette règle s'énonce simplement : on initialise avec la première valeur, jamais avec une constante inventée.

Quiz · 1 question

Avec max ← 0 au départ, que renvoie l'algorithme du maximum sur le tableau [−3, −8, −5] ?

  • −3, le vrai maximum
  • 0, qui n'est pas dans le tableau
  • −8, le minimum

Réponse : Aucune valeur du tableau n'est supérieure à 0, donc max n'est jamais remplacé et garde son initialisation. Le bug est invisible sur des données positives — c'est ce qui le rend dangereux.

Quiz · 1 question

Où placer le calcul moyenne ← somme / n ?

  • Dans la boucle, après chaque ajout
  • Après la boucle, une seule fois
  • Avant la boucle, pour initialiser

Réponse : La moyenne n'a de sens qu'une fois toutes les valeurs additionnées. La calculer dans la boucle donne n résultats intermédiaires faux — et coûte n divisions au lieu d'une.

À vous

Exercice de code

Calculez somme, minimum, maximum et moyenne en un seul parcours. Attention aux initialisations.

Point de départ

// Un seul parcours, quatre résultats.
// Consigne : écrivez la boucle sur les INDICES. Pas de reduce, pas de
// Math.min(...t) — c'est le parcours qu'on apprend ici, pas la bibliothèque.
const T = [12, -5, 20, 8, 3];

function analyser(t) {
  let somme = 0;
  let min = 0;   // ← initialisation piégée : corrigez-la
  let max = 0;   // ← celle-ci aussi

  for (let i = 0; i < t.length; i++) {
    // à compléter
  }

  return { somme, min, max, moyenne: somme / t.length };
}

console.log(analyser(T));
// attendu : { somme: 38, min: -5, max: 20, moyenne: 7.6 }

Solution

const T = [12, -5, 20, 8, 3];

function analyser(t) {
  let somme = 0;
  // On part de la PREMIÈRE VALEUR, jamais de 0 : avec un tableau de
  // températures négatives, un max initialisé à 0 ne serait jamais remplacé.
  let min = t[0];
  let max = t[0];

  for (let i = 0; i < t.length; i++) {
    somme = somme + t[i];
    if (t[i] < min) min = t[i];
    if (t[i] > max) max = t[i];
  }

  // La moyenne se calcule APRÈS la boucle, une seule fois.
  return { somme, min, max, moyenne: somme / t.length };
}

console.log(analyser(T));

À retenir

Flashcards · 2 cartes

Quels sont les indices valides d'un tableau de n cases ?
De 0 à n − 1. La première case est T[0], la dernière T[n − 1]. T[n] n'existe pas.
Comment initialiser la recherche d'un maximum ?
Avec T[0], la première valeur du tableau — jamais avec 0, qui donne un résultat faux dès que toutes les valeurs sont négatives.