Exercices : programmes cassés
Diagnostiquer et réparer quatre programmes volontairement cassés.
Objectifs
Entraîner la méthode complète du chapitre sur des cas réels : identifier la famille d'erreur, prédire avant d'exécuter, expliquer la cause, corriger avec un seul changement, vérifier large.
🔗 Pour vous rafraîchir la mémoire : les trois familles d'erreurs · la méthode systématique
Règles du jeu
Pour chacun des quatre programmes :
- Prédire sans exécuter : plante-t-il ? Où ? Quelle famille ? Notez votre prédiction par écrit.
- Exécuter et comparer avec la prédiction — l'écart est l'enseignement principal.
- Expliquer la cause en une phrase.
- Corriger avec une modification minimale (un seul changement !).
- Vérifier sur un cas normal ET un cas limite.
Le point 1 n'est pas décoratif : mesurer ses prédictions est ce qui transforme chaque exercice en apprentissage mesurable. Comptez vos scores : prédiction exacte / inexacte.
Programme 1 — la liste qui refuse de s'afficher
const courses = ["pain", "lait", "œufs"];
courses.forEach(function(produit) {
console.log(produit)
});
Prédiction : plante-t-il ? Si oui, quelle famille ?
Programme 2 — le total impossible
function totalPanier(prix) {
let total = 0;
for (let i = 0; i <= prix.length; i++) {
total += prix[i];
}
return total;
}
console.log(totalPanier([10, 20, 30])); // attendu : 60
Indice : tracez le dernier tour de boucle — que vaut i quand i <= prix.length se joue ?
Programme 3 — l'utilisateur fantôme
const utilisateurs = [
{ nom: "Ana", age: 21 },
{ nom: "Bob" },
];
for (const u of utilisateurs) {
console.log(u.nom + " a " + u.age + " ans");
}
Indice : relisez les données avant le code.
Programme 4 — le filtre qui refuse de démarrer
function filtrerPairs(nombres) {
const pairs = [];
for (const n of nombres) {
if (n % 2 = 0) {
pairs.push(n);
}
}
return pairs;
}
console.log(filtrerPairs([1, 2, 3, 4]));
Indice : trois opérateurs proches — =, ==, ===. Lequel voulait-on ?
Indices supplémentaires (après un vrai essai)
- P2 : souvenez-vous que lire au-delà de la fin d'un tableau ne plante pas (chapitre 3) ; demandez-vous ce que vaut alors l'élément lu.
- P3 : que produit une concaténation de texte avec
undefined? Un crash... ou autre chose ? - P4 : si la grammaire l'avait permis, quelle valeur une affectation renvoie-t-elle, et cette valeur serait-elle truthy ou falsy ?
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Programme 1
Piège de prédiction assumé : il fonctionne tel quel !
pain
lait
œufs
Si vous avez prédit un crash à cause du point-virgule manquant : retenez la leçon — JavaScript tolère largement leur absence (insertion automatique), et seule l'exécution tranche entre intuition et réalité. Vérifier ses certitudes fait partie de la méthode.
La vraie erreur de syntaxe dans ce style serait un délimiteur mal placé :
courses.forEach(function(produit) {
console.log(produit);
}; // ← parenthèse fermée trop tôt : SyntaxError
Correction : refermer avec });. Moralité : famille syntaxe = la machine refuse tout ; mais diagnostiquer « syntaxe » depuis sa seule lecture est moins fiable qu'on croit.
Programme 2
Type : logique (avec contamination silencieuse). Trace complète :
tour i=0 : prix[0] = 10 → total = 10
tour i=1 : prix[1] = 20 → total = 30
tour i=2 : prix[2] = 30 → total = 60
tour i=3 : <= encore vrai ! prix[3] = undefined → 60 + undefined = NaN
retour : NaN
Résultat affiché : NaN — aucun plantage, donc aucune alerte automatique. La cause : <= au lieu de < fait visiter l'index hors limites, et l'addition d'undefined contamine le total (rappel chapitre 3 : hors-limites ne plante pas, ça retourne undefined).
Correction unique :
for (let i = 0; i < prix.length; i++) {
Cas limite qui valide vraiment la correction : totalPanier([]) doit renvoyer 0 — avec l'ancienne version, il renvoyait NaN dès le tour fantôme. C'est exactement l'exemple type de l'erreur logique du chapitre : le dernier tour de boucle est toujours suspect.
Programme 3
Type : logique silencieux, affichage trompeur.
Ana a 21 ans
Bob a undefined ans
La cause vit dans la donnée : Bob n'a pas de propriété age. Détail instructif : lire u.age sur un objet existant ne plante jamais (propriété absente → undefined) ; c'est la concaténation qui fabrique "Bob a undefined ans" — pire qu'un crash : un mensonge discret publié en production.