Files
1ereNSI/representation_construits/evaluation/TP08_McDonalds.ipynb
Florian Mathieu 1290ccf453 ajout exercices, corrections diverses, glossaire
- Ajout des 10 TPs d'évaluation (sans PDF)
- Création GLOSSAIRE.md et AMELIORATIONS.md
- Corrections f-strings, eval(), sommaires

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 23:37:26 +01:00

519 lines
17 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TP Évaluation - Système de commande McDonald's\n",
"\n",
"**Durée : 1h30**\n",
"\n",
"**Nom :** \n",
"\n",
"**Prénom :**\n",
"\n",
"---\n",
"\n",
"Dans ce TP, vous allez créer un système de gestion de commandes pour un fast-food.\n",
"\n",
"**Compétences évaluées :**\n",
"- Manipulation de dictionnaires imbriqués\n",
"- Calculs sur des structures de données\n",
"- Algorithmes de traitement de commandes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Données initiales\n",
"\n",
"**Exécutez cette cellule avant de commencer.**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Menu du restaurant\n",
"menu = {\n",
" \"burgers\": {\n",
" \"Big Mac\": {\"prix\": 5.50, \"calories\": 540},\n",
" \"McChicken\": {\"prix\": 4.90, \"calories\": 400},\n",
" \"Royal Deluxe\": {\"prix\": 6.20, \"calories\": 580},\n",
" \"Double Cheese\": {\"prix\": 4.50, \"calories\": 450},\n",
" \"Filet-O-Fish\": {\"prix\": 4.80, \"calories\": 380},\n",
" \"McFirst\": {\"prix\": 2.50, \"calories\": 260}\n",
" },\n",
" \"accompagnements\": {\n",
" \"Frites (P)\": {\"prix\": 2.00, \"calories\": 230},\n",
" \"Frites (M)\": {\"prix\": 2.50, \"calories\": 340},\n",
" \"Frites (G)\": {\"prix\": 3.00, \"calories\": 450},\n",
" \"Potatoes\": {\"prix\": 3.20, \"calories\": 290},\n",
" \"Salade\": {\"prix\": 3.50, \"calories\": 80},\n",
" \"Nuggets x6\": {\"prix\": 4.50, \"calories\": 260},\n",
" \"Nuggets x9\": {\"prix\": 5.90, \"calories\": 390}\n",
" },\n",
" \"boissons\": {\n",
" \"Coca-Cola (M)\": {\"prix\": 2.50, \"calories\": 140},\n",
" \"Coca-Cola (G)\": {\"prix\": 3.00, \"calories\": 200},\n",
" \"Sprite (M)\": {\"prix\": 2.50, \"calories\": 130},\n",
" \"Eau\": {\"prix\": 1.50, \"calories\": 0},\n",
" \"Cafe\": {\"prix\": 1.80, \"calories\": 5}\n",
" },\n",
" \"desserts\": {\n",
" \"Sundae Caramel\": {\"prix\": 2.80, \"calories\": 340},\n",
" \"Sundae Chocolat\": {\"prix\": 2.80, \"calories\": 350},\n",
" \"McFlurry Oreo\": {\"prix\": 3.50, \"calories\": 380},\n",
" \"Cookie\": {\"prix\": 1.50, \"calories\": 180}\n",
" }\n",
"}\n",
"\n",
"# Menus Best-Of (formules)\n",
"menus_bestof = {\n",
" \"Best-Of Big Mac\": {\"burger\": \"Big Mac\", \"frites\": \"Frites (M)\", \"boisson\": \"Coca-Cola (M)\", \"prix\": 8.90},\n",
" \"Best-Of McChicken\": {\"burger\": \"McChicken\", \"frites\": \"Frites (M)\", \"boisson\": \"Coca-Cola (M)\", \"prix\": 8.50},\n",
" \"Best-Of Royal\": {\"burger\": \"Royal Deluxe\", \"frites\": \"Frites (M)\", \"boisson\": \"Coca-Cola (M)\", \"prix\": 9.50}\n",
"}\n",
"\n",
"# File de commandes en cours\n",
"# Chaque commande : {\"id\": numero, \"items\": [(article, quantite), ...], \"heure\": \"HH:MM\"}\n",
"commandes_en_cours = [\n",
" {\"id\": 101, \"items\": [(\"Big Mac\", 2), (\"Frites (G)\", 2), (\"Coca-Cola (G)\", 2)], \"heure\": \"12:05\"},\n",
" {\"id\": 102, \"items\": [(\"Best-Of McChicken\", 1), (\"McFlurry Oreo\", 1)], \"heure\": \"12:07\"},\n",
" {\"id\": 103, \"items\": [(\"Nuggets x9\", 2), (\"Frites (M)\", 2), (\"Sprite (M)\", 2)], \"heure\": \"12:08\"},\n",
" {\"id\": 104, \"items\": [(\"Best-Of Royal\", 1), (\"Salade\", 1), (\"Eau\", 1)], \"heure\": \"12:10\"},\n",
" {\"id\": 105, \"items\": [(\"Double Cheese\", 3), (\"Frites (G)\", 3), (\"Sundae Chocolat\", 3)], \"heure\": \"12:12\"}\n",
"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 1 - Exploration du menu (25 min)\n",
"\n",
"### 1.1 Affichage d'une catégorie (4 pts)\n",
"\n",
"Écrivez une fonction `afficher_categorie(menu, categorie)` qui affiche les articles d'une catégorie.\n",
"\n",
"Exemple :\n",
"```\n",
"=== BURGERS ===\n",
"Big Mac : 5.50 euros (540 cal)\n",
"McChicken : 4.90 euros (400 cal)\n",
"...\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def afficher_categorie(menu, categorie):\n",
" if categorie not in menu:\n",
" print(\"Categorie inconnue\")\n",
" return\n",
" \n",
" print(\"===\", categorie.upper(), \"===\")\n",
" \n",
" articles = menu[categorie]\n",
" for nom, infos in articles.items():\n",
" # Votre code ici : afficher le nom, prix et calories\n",
" pass\n",
"\n",
"# Test\n",
"afficher_categorie(menu, \"burgers\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.2 Rechercher un article (4 pts)\n",
"\n",
"Écrivez une fonction `rechercher_article(menu, nom)` qui cherche un article par son nom.\n",
"\n",
"Renvoie un dictionnaire `{\"nom\": ..., \"categorie\": ..., \"prix\": ..., \"calories\": ...}` ou `None` si non trouvé."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def rechercher_article(menu, nom):\n",
" for categorie, articles in menu.items():\n",
" if nom in articles:\n",
" infos = articles[nom]\n",
" # Votre code ici : renvoyer le dictionnaire avec nom, categorie, prix, calories\n",
" pass\n",
" return None\n",
"\n",
"# Tests\n",
"article = rechercher_article(menu, \"Big Mac\")\n",
"if article:\n",
" print(article[\"nom\"], \"trouve dans\", article[\"categorie\"])\n",
" print(\"Prix :\", article[\"prix\"], \"euros\")\n",
"\n",
"print()\n",
"print(\"Pizza :\", rechercher_article(menu, \"Pizza\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.3 Article le moins calorique (4 pts)\n",
"\n",
"Écrivez une fonction `moins_calorique(menu, categorie)` qui renvoie l'article le moins calorique d'une catégorie.\n",
"\n",
"Si `categorie` est `None`, chercher dans tout le menu.\n",
"\n",
"Renvoie un tuple `(nom, calories)`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def moins_calorique(menu, categorie):\n",
" meilleur_nom = None\n",
" meilleur_cal = 99999\n",
" \n",
" if categorie != None:\n",
" # Chercher dans une seule categorie\n",
" articles = menu[categorie]\n",
" for nom, infos in articles.items():\n",
" # Votre code ici\n",
" pass\n",
" else:\n",
" # Chercher dans tout le menu\n",
" for cat, articles in menu.items():\n",
" for nom, infos in articles.items():\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return (meilleur_nom, meilleur_cal)\n",
"\n",
"# Tests\n",
"print(\"Moins calorique (burgers) :\", moins_calorique(menu, \"burgers\"))\n",
"print(\"Moins calorique (tout) :\", moins_calorique(menu, None))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 2 - Gestion des commandes (35 min)\n",
"\n",
"### 2.1 Calculer le prix d'une commande (6 pts)\n",
"\n",
"Écrivez une fonction `calculer_prix(commande, menu, menus_bestof)` qui calcule le prix total d'une commande.\n",
"\n",
"Attention : les articles peuvent être des Best-Of ou des articles individuels.\n",
"\n",
"*Aide : utilisez `rechercher_article()` pour trouver le prix d'un article dans le menu.*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def calculer_prix(commande, menu, menus_bestof):\n",
" total = 0\n",
" \n",
" for item in commande[\"items\"]:\n",
" nom_article = item[0]\n",
" quantite = item[1]\n",
" \n",
" # Verifier si c'est un Best-Of\n",
" if nom_article in menus_bestof:\n",
" # Votre code ici : ajouter le prix du Best-Of * quantite\n",
" pass\n",
" else:\n",
" # Chercher dans le menu normal avec rechercher_article\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return round(total, 2)\n",
"\n",
"# Test\n",
"for cmd in commandes_en_cours:\n",
" prix = calculer_prix(cmd, menu, menus_bestof)\n",
" print(\"Commande\", cmd[\"id\"], \":\", prix, \"euros\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 Calculer les calories d'une commande (5 pts)\n",
"\n",
"Écrivez une fonction `calculer_calories(commande, menu, menus_bestof)` qui calcule le total des calories.\n",
"\n",
"Pour un Best-Of, additionner les calories du burger, des frites et de la boisson."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def calculer_calories(commande, menu, menus_bestof):\n",
" total_cal = 0\n",
" \n",
" for item in commande[\"items\"]:\n",
" nom_article = item[0]\n",
" quantite = item[1]\n",
" \n",
" # Verifier si c'est un Best-Of\n",
" if nom_article in menus_bestof:\n",
" bestof = menus_bestof[nom_article]\n",
" # Votre code ici : additionner les calories du burger, frites et boisson\n",
" pass\n",
" else:\n",
" # Chercher dans le menu normal\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return total_cal\n",
"\n",
"# Test\n",
"for cmd in commandes_en_cours:\n",
" cal = calculer_calories(cmd, menu, menus_bestof)\n",
" print(\"Commande\", cmd[\"id\"], \":\", cal, \"calories\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.3 Ticket de caisse (6 pts)\n",
"\n",
"Écrivez une fonction `generer_ticket(commande, menu, menus_bestof)` qui génère un ticket de caisse sous forme de chaîne de caractères."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def generer_ticket(commande, menu, menus_bestof):\n",
" lignes = []\n",
" lignes.append(\"=\" * 30)\n",
" lignes.append(\"COMMANDE #\" + str(commande[\"id\"]))\n",
" lignes.append(\"Heure : \" + commande[\"heure\"])\n",
" lignes.append(\"-\" * 30)\n",
" \n",
" for item in commande[\"items\"]:\n",
" nom_article = item[0]\n",
" quantite = item[1]\n",
" \n",
" # Trouver le prix de l'article\n",
" # Votre code ici\n",
" prix = 0\n",
" \n",
" sous_total = prix * quantite\n",
" ligne = str(quantite) + \"x \" + nom_article + \" - \" + str(sous_total) + \" euros\"\n",
" lignes.append(ligne)\n",
" \n",
" lignes.append(\"-\" * 30)\n",
" total = calculer_prix(commande, menu, menus_bestof)\n",
" lignes.append(\"TOTAL : \" + str(total) + \" euros\")\n",
" lignes.append(\"=\" * 30)\n",
" \n",
" return \"\\n\".join(lignes)\n",
"\n",
"# Test\n",
"print(generer_ticket(commandes_en_cours[0], menu, menus_bestof))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.4 Chiffre d'affaires (5 pts)\n",
"\n",
"Écrivez une fonction `chiffre_affaires(commandes, menu, menus_bestof)` qui calcule le chiffre d'affaires total de toutes les commandes."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def chiffre_affaires(commandes, menu, menus_bestof):\n",
" total = 0\n",
" \n",
" for commande in commandes:\n",
" # Votre code ici : utiliser calculer_prix\n",
" pass\n",
" \n",
" return round(total, 2)\n",
"\n",
"# Test\n",
"ca = chiffre_affaires(commandes_en_cours, menu, menus_bestof)\n",
"print(\"Chiffre d'affaires :\", ca, \"euros\")\n",
"print(\"Nombre de commandes :\", len(commandes_en_cours))\n",
"print(\"Panier moyen :\", round(ca / len(commandes_en_cours), 2), \"euros\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 3 - Bonus (20 min)\n",
"\n",
"### 3.1 Article le plus commandé (5 pts)\n",
"\n",
"Écrivez une fonction `article_plus_commande(commandes)` qui renvoie l'article le plus commandé (en nombre total).\n",
"\n",
"Renvoie un tuple `(nom_article, nombre_total)`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def article_plus_commande(commandes):\n",
" compteur = {}\n",
" \n",
" for commande in commandes:\n",
" for item in commande[\"items\"]:\n",
" nom = item[0]\n",
" quantite = item[1]\n",
" # Votre code ici : incrementer le compteur\n",
" pass\n",
" \n",
" # Trouver le maximum\n",
" meilleur = None\n",
" meilleur_nb = 0\n",
" \n",
" for article, nb in compteur.items():\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return (meilleur, meilleur_nb)\n",
"\n",
"# Test\n",
"art, nb = article_plus_commande(commandes_en_cours)\n",
"print(\"Article le plus commande :\", art, \"(\", nb, \"fois)\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.2 Économie Best-Of (5 pts)\n",
"\n",
"Écrivez une fonction `economie_bestof(nom_bestof, menu, menus_bestof)` qui calcule l'économie réalisée en prenant un Best-Of par rapport aux articles séparés."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def economie_bestof(nom_bestof, menu, menus_bestof):\n",
" if nom_bestof not in menus_bestof:\n",
" return 0\n",
" \n",
" bestof = menus_bestof[nom_bestof]\n",
" prix_bestof = bestof[\"prix\"]\n",
" \n",
" # Calculer le prix des articles separes (burger + frites + boisson)\n",
" # Votre code ici\n",
" prix_separe = 0\n",
" \n",
" economie = prix_separe - prix_bestof\n",
" \n",
" return round(economie, 2)\n",
"\n",
"# Test\n",
"for nom in menus_bestof.keys():\n",
" eco = economie_bestof(nom, menu, menus_bestof)\n",
" print(nom, \": economie de\", eco, \"euros\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.3 Statistiques par catégorie (4 pts)\n",
"\n",
"Écrivez une fonction `stats_menu(menu)` qui renvoie des statistiques pour chaque catégorie : nombre d'articles, prix moyen, calories moyennes."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def stats_menu(menu):\n",
" stats = {}\n",
" \n",
" for categorie, articles in menu.items():\n",
" nb = len(articles)\n",
" total_prix = 0\n",
" total_cal = 0\n",
" \n",
" for nom, infos in articles.items():\n",
" # Votre code ici : cumuler prix et calories\n",
" pass\n",
" \n",
" stats[categorie] = {\n",
" \"nb_articles\": nb,\n",
" \"prix_moyen\": round(total_prix / nb, 2),\n",
" \"calories_moyennes\": round(total_cal / nb)\n",
" }\n",
" \n",
" return stats\n",
"\n",
"# Test\n",
"print(\"Statistiques du menu :\")\n",
"for cat, data in stats_menu(menu).items():\n",
" print(\" \", cat, \":\")\n",
" print(\" Articles :\", data[\"nb_articles\"])\n",
" print(\" Prix moyen :\", data[\"prix_moyen\"], \"euros\")\n",
" print(\" Calories moyennes :\", data[\"calories_moyennes\"])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}