02 — Convertisseur d'unités
Niveau requis : 1 (input, conversions de types) + début du 2 (if/elif) / Difficulté : 1/5 / Durée estimée : 1 h
Objectif
L'utilisateur lance le programme, choisit une conversion dans un petit menu (1 : °C → °F, 2 : km → miles, 3 : kg → livres), saisit une valeur, et le programme affiche le résultat arrondi. Un outil qu'on pourrait vraiment utiliser.
Convertisseur d'unites
1. Celsius -> Fahrenheit
2. Kilometres -> Miles
3. Kilogrammes -> Livres
Ton choix : 1
Valeur : 25
25.0 degC = 77.0 degF
Notions utilisées
input()et le fait qu'il renvoie toujours une chaîne — niveau 1- Conversion de types :
float(),int()— niveau 1 - f-strings avec formatage (
{value:.1f}) — niveau 1 if/elif/else— niveau 2 (leçon sur les conditions)- Comparaison de chaînes (
choice == "1") — niveau 2
Cahier des charges
- Fichier
converter.py, lancé avecpython converter.py. - Le menu affiche les 3 conversions numérotées, puis demande le choix.
- Formules exactes :
f = c * 9/5 + 32;miles = km * 0.621371;pounds = kg * 2.20462. - Le résultat est affiché avec 1 ou 2 décimales via le formatage f-string (pas
round()dans le calcul). - Un choix invalide (ex.
7ouabc) affiche un message clair et le programme se termine proprement — pas de traceback. - La phrase de résultat rappelle la valeur d'entrée ET le résultat, avec les deux unités.
Étapes de construction
- Écris
converter.pyqui fait UNE seule conversion, sans menu : demande une température en °C, affiche les °F. Lance et vérifie avec 0 °C (= 32 °F) et 100 °C (= 212 °F). - Soigne l'affichage : f-string avec
:.1f, phrase complète avec les deux unités. Relance. - Ajoute le menu (3
print()) et lis le choix avecinput(). Pour l'instant, affiche juste le choix reçu. Vérifie qu'il arrive bien comme chaîne ("1", pas1). - Branche le choix
1sur ta conversion existante avec unif. Les choix 2 et 3 ne font encore rien. Teste le chemin 1 de bout en bout. - Ajoute les branches
elifpour km → miles et kg → livres. Teste les trois chemins, avec des valeurs dont tu connais le résultat. - Ajoute le
elsefinal pour les choix invalides : message clair, fin propre. Teste avec7puis avecabc.
Extensions possibles
- Ajouter les conversions inverses (°F → °C, etc.) : le menu passe à 6 choix.
- Redemander la valeur tant qu'elle n'est pas un nombre valide — nécessite
while(fin du niveau 2) et te fera toucher du doigt le problème defloat("abc"); la vraie solution propre (try/except) arrive au niveau 5. - Boucler sur le menu après chaque conversion, avec un choix « q » pour quitter (niveau 2,
while).
Erreurs fréquentes sur ce projet
TypeError: can't multiply sequence by non-int of type 'float': tu as oubliéfloat()sur le retour d'input(). C'est LA leçon de ce projet.- Comparer le choix à un entier :
if choice == 1ne matche jamais, carinput()renvoie"1". Pas d'erreur, juste un menu qui tombe toujours dans leelse. - Formule °F fausse (
c * 9/5 + 32mal parenthésée enc * 9 / (5 + 32)). Vérifie toujours avec 0 °C et 100 °C — deux points de contrôle connus. ValueError: could not convert string to float: '25,5': en France on tape une virgule, Python veut un point. À signaler dans le message d'invite (« utilise un point décimal »).
Critères de réussite
- Les trois conversions donnent des résultats exacts sur des valeurs de contrôle (0 °C → 32 °F, 100 km → 62.1 miles, 1 kg → 2.2 livres).
- Un choix hors menu affiche un message clair, sans traceback.
- Le résultat est formaté avec un nombre fixe de décimales via f-string.
- Le code ne contient aucune conversion de type inutile ou dupliquée.
- Je peux expliquer pourquoi
input()imposefloat()ensuite.
Commit conseillé
git add projects/mini-projects/02-convertisseur-unites/
git commit -m "project: add unit converter"
Puis entrée de journal + git push.