Bac NSI common mistakes
Bac NSI · Understand the traps and how to avoid them.
En Python, écrire `for i in range(len(t))` puis accéder à `t[i]` et `t[i+1]` sans borner la boucle, ce qui provoque un IndexError sur le dernier indice ; ou confondre l'indice final avec `len(t)` au lieu de `len(t)-1`.
L'élève transpose la notation mathématique d'un tableau de 1 à n et oublie que l'indexation Python commence à 0 ; le réflexe range(len(t)) est mémorisé sans comprendre que le parcours par indice décale la borne. Le cas limite (dernier élément) n'est jamais testé mentalement.
What to do instead
Avant d'écrire la boucle, noter sur le brouillon les indices valides (0 à n-1) et le nombre d'itérations nécessaires. Pour comparer des voisins, utiliser for i in range(len(t)-1) et vérifier explicitement que t[i+1] reste dans les bornes. Réflexe de test : exécuter à la main avec une liste de 1 puis 2 éléments, cas où les erreurs de borne apparaissent immédiatement.
Confondre la valeur d'une variable et sa référence : affirmer qu'après `b = a` sur une liste, modifier `b` ne change pas `a`, ou croire que `a == b` implique `a is b` pour des listes de même contenu.
Le modèle mental « une variable contient une valeur » est hérité des types immuables (int, str) et n'est pas révisé pour les types construits. L'élève n'a pas intériorisé la distinction objet/référence ni le rôle de la mutabilité dans les affectations et les passages en argument.
What to do instead
Tracer systématiquement sur papier les objets (boîtes) et les flèches des variables lors de toute question d'aliasing. Retenir la règle : == compare le contenu, is compare l'identité ; b = a copie la flèche, pas l'objet. Pour copier réellement une liste, utiliser list(a) ou a[:], et le vérifier par un petit exemple exécuté.
Écrire `t = [[0]*3]*2` pour créer une matrice et s'étonner que modifier `t[0][0]` modifie aussi `t[1][0]` ; ou plus généralement construire des structures imbriquées sans se demander si les sous-objets sont partagés.
La multiplication de liste est perçue comme une duplication profonde alors qu'elle duplique seulement les références. L'élève n'a pas rencontré le piège en cours ou l'a vu sans le relier à la notion d'alias.
What to do instead
Créer une matrice par compréhension : [[0]*3 for _ in range(2)], qui recrée une sous-liste à chaque itération. Vérifier par un test : modifier une cellule et afficher la matrice entière. Savoir expliquer pourquoi la compréhension crée des objets distincts alors que la multiplication répète la même référence.
Sur une requête SQL, écrire `SELECT nom, prix FROM produits WHERE prix > 10 AND categorie = 'livre' ORDER BY prix` mais oublier `GROUP BY` dès qu'une fonction d'agrégat apparaît, ou filtrer avec `WHERE` sur le résultat d'un `COUNT` au lieu d'utiliser `HAVING`.
La clause WHERE est la plus familière et l'élève l'emploie partout ; la distinction entre filtrage de lignes (WHERE) et filtrage de groupes (HAVING) n'est pas stabilisée. L'ordre logique d'évaluation (FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY) est rarement mémorisé.
What to do instead
Mémoriser la chaîne d'évaluation des clauses et l'appliquer en écrivant la requête dans cet ordre. Règle simple : dès qu'on agrège, tout attribut non agrégé du SELECT doit figurer dans le GROUP BY ; un filtre portant sur un agrégat va dans HAVING. S'entraîner à traduire une phrase en français (« le prix moyen par catégorie pour les catégories ayant plus de 3 articles ») clause par clause.
Lire un fichier CSV avec `open` seul puis découper les lignes avec `split(',')`, sans gérer l'en-tête ni les champs contenant des virgules ou des guillemets ; ou oublier de fermer le fichier et de convertir les champs numériques (tout reste en str).
L'élève assimile un CSV à un simple texte et sous-estime le format ; le module csv est perçu comme une boîte noire non maîtrisée. La conversion de type (int, float) est oubliée car l'affichage du texte brut « ressemble » à des nombres.
What to do instead
Utiliser le module csv avec csv.reader ou csv.DictReader (qui exploite l'en-tête), et le bloc with open(...) as f: pour la fermeture. Convertir explicitement les champs numériques (int(ligne[1])) et le vérifier par type(). Savoir expliquer pourquoi split(',') échoue sur un champ "Dupont, Jean".
En HTML, utiliser `<div>` avec des gestionnaires de clic à la place de `<button>`, ou imbriquer des balises de manière invalide (`<p><div>...</div></p>`) ; en CSS, confondre sélecteur d'id (`#`) et de classe (`.`) et croire que l'ordre des règles prime toujours sur la spécificité.
Le rendu visuel fonctionne malgré un code non conforme, ce qui masque l'erreur ; l'élève code par imitation sans connaître la sémantique des balises ni les règles de cascade. La validation W3C n'est jamais pratiquée.
What to do instead
Choisir la balise selon le rôle sémantique (button, nav, main, label) et non selon l'apparence. Retenir la hiérarchie de spécificité : style en ligne > id > classe > type, à spécificité égale la dernière règle l'emporte. Prendre l'habitude de valider une page avec le validateur du W3C et d'inspecter les styles appliqués dans les outils de développement.
Décrire le fonctionnement du Web en inversant les rôles client/serveur et en confondant requête HTTP et réponse : dire que le client envoie une réponse, que le serveur « pousse » la page sans requête, ou ignorer que la méthode GET place les paramètres dans l'URL alors que POST les place dans le corps.
Le vocabulaire courant (« le site m'envoie la page ») entretient une vision passive du client. Le cycle requête-réponse n'est pas modélisé comme une suite d'étapes ordonnées, et la distinction GET/POST est apprise par cœur sans lien avec l'exposition des données.
What to do instead
Reconstituer le dialogue sous forme de chronologie numérotée : résolution DNS, connexion TCP, requête HTTP (ligne de requête + en-têtes), réponse (code de statut + en-têtes + corps). Associer GET à une lecture sans effet de bord et POST à une modification, en justifiant par la visibilité des paramètres dans l'URL et l'historique du navigateur. S'entraîner à lire une requête et une réponse réelles dans l'onglet Réseau.
Affirmer qu'un nombre flottant comme 0,1 est stocké exactement, ou que `0.1 + 0.2 == 0.3` renvoie True ; à l'inverse, croire qu'un entier est toujours codé sur un nombre fixe de bits sans limite, ou mal évaluer le débordement d'un entier non signé sur 8 bits (255 + 1).
L'élève raisonne en décimal et projette les propriétés des réels mathématiques sur les flottants ; la norme IEEE 754 et la mantisse/exposant ne sont pas comprises, seulement récitée. Le codage binaire en complément à deux est souvent confondu avec une simple valeur absolue signée.
What to do instead
Faire le calcul à la main sur des exemples courts : décomposer 0,1 en somme de puissances de 2 négatives et constater la troncature ; calculer 255+1 en binaire sur 8 bits. Retenir que la comparaison de flottants se fait avec une tolérance (abs(a-b) < 1e-9). Pour les entiers signés, vérifier la plage -128 à 127 sur 8 bits et la règle du bit de poids fort.
Écrire une fonction récursive sans cas de base atteignable, ou avec un appel récursif qui ne réduit pas le problème (par exemple `factorielle(n)` qui appelle `factorielle(n)`), ce qui provoque un débordement de pile ; ou ne pas savoir transformer une boucle simple en récursion et inversement.
La récursion est souvent apprise par des exemples mémorisés (factorielle, Fibonacci) sans schéma général. L'élève oublie de vérifier la terminaison et ne distingue pas la condition d'arrêt de la progression vers celle-ci.
What to do instead
Pour toute fonction récursive, écrire d'abord le cas de base et le cas récursif, puis vérifier que chaque appel se rapproche du cas de base (décrément, sous-liste plus courte). Tracer l'exécution sur un petit argument (n=3) en dessinant la pile d'appels. Savoir réécrire la même fonction en itératif pour comparer et comprendre l'invariant.
Confondre complexité en temps et en mémoire, et annoncer « O(n) » pour une recherche par dichotomie ou pour un double parcours imbriqué ; ou dire que le tri par insertion est en O(n log n) dans tous les cas.
La notation O est utilisée comme un slogan sans revenir à la définition du comportement asymptotique. L'élève compte les lignes de code au lieu des opérations dominantes et oublie de considérer le meilleur, le moyen et le pire cas.
What to do instead
Compter systématiquement le nombre d'opérations élémentaires en fonction de n, puis ne garder que le terme dominant. Mémoriser les ordres de grandeur : recherche linéaire O(n), dichotomie O(log n), tri par insertion O(n²) au pire et O(n) au mieux, tri par fusion O(n log n). Justifier chaque réponse par le nombre de comparaisons, pas par l'intuition.