Aller au contenu

Guide enseignant — Questions fréquentes par projet


Questions communes à tous les projets

"On peut utiliser sort() ou sorted() ?" Non. L'objectif est précisément d'implémenter les algorithmes vus en cours. Ces fonctions intégrées existent, mais leur utilisation ici invalide le travail demandé.

"Comment copier une liste sans modifier l'original ?"

copie = ma_liste[:]   # ou list(ma_liste)
Ne pas faire copie = ma_liste : les deux variables pointeraient sur le même objet en mémoire.

"La dichotomie ne fonctionne pas, j'ai une erreur ou un résultat faux." Vérifier que la liste est bien triée avant d'appeler la dichotomie. C'est la condition indispensable. Si la liste n'est pas triée, le résultat est imprévisible.

"Mon tri modifie la liste originale, est-ce normal ?" Oui. tri_insertion et tri_selection trient la liste en place (ils la modifient directement). Si l'on veut conserver l'original, il faut travailler sur une copie : tri_insertion(ma_liste[:]).

"J'ai une IndexError." La cause la plus fréquente est un indice qui dépasse la taille de la liste. Vérifiez les bornes de vos boucles (range) et les conditions d'arrêt (while).


Projet 01 — Le Nombre Mystère

"Pourquoi la condition est while gauche <= droite et pas while gauche < droite ?" Quand il ne reste qu'un seul élément possible, gauche et droite sont égaux. Si on exclut ce cas avec <, on rate le dernier candidat. Le <= permet de traiter ce dernier cas.

"Pourquoi 7 essais suffisent toujours pour 100 nombres ?" Parce que la recherche dichotomique a une complexité logarithmique : log₂(100) ≈ 6,64, donc 7 essais au maximum. À chaque question, on élimine la moitié des candidats restants.

"Et si l'utilisateur ment ou se trompe dans sa réponse ?" Le programme finira par épuiser l'intervalle et afficher "tu as triché". Ce comportement est déjà géré dans le starter (fin de boucle sans return).

"Comment modifier gauche et droite selon la réponse ?" - Si le nombre cherché est < milieu : droite = milieu - 1 - Si le nombre cherché est > milieu : gauche = milieu + 1


Projet 02 — Le Tri de Cartes

"Comment accéder à la valeur d'une carte ?" Chaque carte est un tuple (valeur, couleur). carte[0] donne la valeur, carte[1] donne la couleur.

"Pourquoi l'As vaut 14 ?" C'est une convention pour qu'il soit la carte la plus forte (valeur maximale). Cela permet de le trier après le Roi (13) avec une simple comparaison numérique.

"La condition du while dans le tri insertion : que faut-il écrire ?"

while j > 0 and main[j - 1][0] > x[0]:
On compare uniquement les valeurs ([0]), pas les couleurs.

"Ma dichotomie retourne toujours False même si la carte est là." Vérifier que la main est bien triée avant la recherche. Et que la comparaison porte bien sur main_triee[m][0] (la valeur), pas sur la carte entière.


Projet 03 — Le Podium

"Comment trier des dictionnaires ?" On ne trie pas le dictionnaire en tant que tel, on trie la liste de dictionnaires. Dans le tri, on compare athletes[j]["temps"] et athletes[mini]["temps"].

"Que se passe-t-il si deux athlètes ont le même temps ?" Le tri par sélection n'est pas stable : il ne garantit pas que deux éléments égaux restent dans leur ordre d'origine. L'un des deux sera placé en premier de façon arbitraire. C'est une propriété à connaître pour le DS.

"Comment aligner le texte dans le podium ASCII ?" Avec les f-strings et le formatage d'alignement :

f"{nom:^12}"   # centré sur 12 caractères
f"{nom:<12}"   # aligné à gauche
f"{nom:>12}"   # aligné à droite

"La dichotomie sur les temps : pourquoi ça compare des flottants ?" Comparer des flottants avec == peut poser des problèmes de précision en Python (ex. 0.1 + 0.2 != 0.3). Ici les données sont saisies à la main donc c'est acceptable, mais c'est un point de vigilance à mentionner.


Projet 04 — L'Annuaire

"Comment ajouter un élément à la fin d'une liste ?"

ma_liste.append(element)

"Comment supprimer un élément d'une liste par sa valeur ?"

ma_liste.remove(element)   # supprime la première occurrence
Ou par indice :
del ma_liste[i]

"La condition du while dans ajouter_contact : que comparer ?"

while j > 0 and annuaire[j - 1]["nom"] > contact["nom"]:
On compare les noms alphabétiquement.

"La dichotomie me retourne le bon contact mais je n'affiche rien." Vérifier que l'appel dans le menu() est bien resultat = rechercher(annuaire, nom) et que le résultat est ensuite utilisé (if resultat is not None:).

"Le menu ne s'arrête jamais." C'est le comportement voulu (while True). Il faut saisir 4 pour déclencher le break.


Projet 05 — Le Correcteur Orthographique

"Pourquoi les bornes a et b donnent les voisins à la fin de la dichotomie ?" À la fin de la boucle (quand a > b), b vaut l'indice du dernier élément plus petit que le mot cherché, et a vaut l'indice du premier élément plus grand. Ce sont donc les deux voisins alphabétiques du mot absent. C'est une propriété de la dichotomie que l'on exploite ici de façon non conventionnelle.

"Il faut vérifier quoi pour les cas limites des voisins ?" - Si b < 0 : le mot serait avant tous les mots du dictionnaire → pas de voisin avant - Si a >= len(dictionnaire) : le mot serait après tous les mots → pas de voisin après

voisin_avant = dictionnaire[b] if b >= 0 else None
voisin_apres = dictionnaire[a] if a < len(dictionnaire) else None

"La condition du while dans ajouter_mot : que comparer ?"

while j > 0 and dictionnaire[j - 1] > mot:
Les chaînes se comparent directement en Python (ordre alphabétique).

"Les suggestions ne correspondent pas au mot saisi." Vérifier que la comparaison se fait bien en minuscules. Utiliser .lower() sur le mot saisi par l'utilisateur pour uniformiser.


Projet 06 — La Bibliothèque

"Comment trier par titre (chaînes) avec le tri sélection ?"

if livres[j]["titre"] < livres[mini]["titre"]:
Python compare les chaînes alphabétiquement avec < et >.

"La dichotomie ne trouve pas un livre qui est pourtant dans la liste." Les titres dans le dictionnaire sont tous en minuscules. Si l'utilisateur saisit "1984" avec une majuscule ou des espaces en trop, la comparaison échouera. Appliquer .strip().lower() à la saisie.

"Comment trier une copie sans modifier la liste originale ?"

livres_par_pages = livres[:]          # copie
tri_selection_livres_par_pages(livres_par_pages)   # trier la copie

"Comment calculer la moyenne ?"

total = sum(l["pages"] for l in livres)
moyenne = total / len(livres)


Projet 07 — La Météo

"Comment accéder au jour et à la température dans un tuple ?" Chaque relevé est (jour, temperature). On accède avec releve[0] pour le jour et releve[1] pour la température. Ou avec le déballage : jour, temp = releve.

"La condition du while dans le tri : que comparer ?"

while j > 0 and tab[j - 1][1] > x[1]:
On compare le deuxième élément du tuple (la température).

"Qu'est-ce que .get() sur un dictionnaire ?" compteur.get(degre, 0) retourne la valeur associée à la clé degre si elle existe, sinon retourne 0. C'est équivalent à :

if degre in compteur:
    return compteur[degre]
else:
    return 0

"Pourquoi travailler sur une copie des relevés ?" Pour conserver l'ordre chronologique original. Si on trie directement releves, on perd l'information "quel jour avait quelle température".

"Comment calculer la médiane ?" Sur une liste triée de taille n, la médiane est l'élément à l'indice n // 2 :

mediane = tab_trie[len(tab_trie) // 2]


Projet 08 — La Course des Algorithmes

"Les temps mesurés varient à chaque exécution, c'est normal ?" Oui. Le temps dépend de la charge du processeur au moment de l'exécution. Pour des résultats plus stables, on peut faire la moyenne sur plusieurs exécutions. Mais les tendances (quel algorithme est plus rapide) restent les mêmes.

"Pourquoi travailler sur une copie dans mesurer_temps ?" Si on trie directement la liste passée en argument, elle sera triée pour la deuxième mesure : les deux algorithmes ne partiraient pas dans les mêmes conditions.

"Mon tri insertion est beaucoup plus rapide sur une liste déjà triée, pourquoi ?" Parce que sur une liste déjà triée, la boucle while interne ne s'exécute jamais (la condition est fausse dès le premier tour). Sa complexité devient linéaire O(n) au lieu de O(n²). Ce n'est pas le cas du tri sélection, qui parcourt toujours toute la liste restante.

"Qu'est-ce que random.sample(range(n * 10), n) ?" Cela génère une liste de n entiers distincts choisis aléatoirement entre 0 et n*10. Le * 10 évite les doublons dans la liste.

"Comment interpréter les résultats pour la conclusion ?" Le tri insertion est plus rapide sur des listes presque triées. Le tri sélection est plus constant (toujours O(n²) quel que soit le cas). Pour des listes aléatoires de grande taille, les deux sont comparables.


Projet 09 — Le Générateur Web

"Le fichier HTML se génère où ?" Dans le même dossier que starter.py. Si le navigateur ne s'ouvre pas automatiquement, ouvrir manuellement classement.html depuis ce dossier.

"La dichotomie inversée : comment ça marche ?" Quand la liste est triée par ordre décroissant, un score plus grand se trouve à gauche. Les comparaisons sont donc inversées : - Si score_m > score (le milieu est trop grand) → chercher à droite (a = m + 1) - Si score_m < score (le milieu est trop petit) → chercher à gauche (b = m - 1)

"La condition du while dans le tri décroissant : que mettre ?"

while j > 0 and jeux[j - 1]["score"] < x["score"]:
On décale quand le score précédent est inférieur (l'inverse du tri croissant).

"Comment écrire dans un fichier en Python ?"

with open("fichier.html", "w", encoding="utf-8") as f:
    f.write(contenu)
Le with garantit que le fichier est bien fermé après l'écriture.

"Pourquoi Python peut générer du HTML mais HTML ne peut pas exécuter Python ?" HTML est un langage de description (il décrit une structure), pas un langage d'exécution. Python, lui, s'exécute côté serveur ou en local et peut produire n'importe quel texte en sortie, y compris du HTML. Un navigateur lit le HTML généré, mais ne sait pas d'où il vient.


Dernière mise à jour : 07/07/2026