- 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>
519 lines
17 KiB
Plaintext
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
|
|
}
|