{ "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 }