Adloun

Le sens du décalage

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 7 — Structures séquentielles : listes, piles, files

Énoncé

On insère en position dans la liste rangée dans un tableau. Que donne chacune de ces deux boucles ?


/* A */ for (int j = l->n; j > i; j = j - 1) { l->tab[j] = l->tab[j-1]; }
/* B */ for (int j = i; j < l->n; j = j + 1) { l->tab[j+1] = l->tab[j]; }

Corrigé

Mesuré :


A (de la fin vers i) : [7 5 2 9 4]      correct
B (de i vers la fin) : [7 5 2 2 2]      faux

Ce qui se passe dans B. Le premier tour écrit tab[2] = tab[1], c'est-à-dire dans la case qui contenait . Le tour suivant lit tab[2] — qui vaut désormais , et non plus . L'écriture a détruit la valeur que la lecture suivante devait trouver, et le se propage jusqu'au bout.

La règle, en une phrase : on décale en partant du bout vers lequel on pousse. Pour ouvrir un trou en poussant vers la droite, on commence par la case la plus à droite ; pour boucher un trou en tirant vers la gauche — la suppression —, on commence par la gauche.

Pourquoi cet exercice mérite sa place. Aucune erreur de compilation, aucun avertissement, aucun accès hors tableau : le programme B est parfaitement légal et parfaitement faux. Il n'existe qu'un moyen de l'attraper, et c'est de le faire tourner sur trois éléments — ce qui prend une seconde. C'est la démonstration en miniature de la discipline du chapitre chap:discipline : le test n'est pas ce qu'on fait quand on doute, c'est ce qui remplace le doute.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.