Files
1ereNSI/representation_construits/evaluation/TP10_Voyage.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

542 lines
18 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TP Évaluation - Planification de Voyage\n",
"\n",
"**Durée : 1h30**\n",
"\n",
"**Nom :** \n",
"\n",
"**Prénom :**\n",
"\n",
"---\n",
"\n",
"Dans ce TP de synthèse, vous allez créer un système de planification de voyage.\n",
"\n",
"**Compétences évaluées :**\n",
"- Listes de tuples et dictionnaires\n",
"- Filtrage et tri de données\n",
"- Algorithmes de recherche"
]
},
{
"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": [
"# Base de donnees des villes\n",
"# Chaque ville : (nom, pays, langue, monnaie, decalage_horaire)\n",
"villes = [\n",
" (\"Paris\", \"France\", \"Francais\", \"EUR\", 0),\n",
" (\"Londres\", \"Royaume-Uni\", \"Anglais\", \"GBP\", 0),\n",
" (\"New York\", \"Etats-Unis\", \"Anglais\", \"USD\", -6),\n",
" (\"Tokyo\", \"Japon\", \"Japonais\", \"JPY\", 8),\n",
" (\"Barcelone\", \"Espagne\", \"Espagnol\", \"EUR\", 0),\n",
" (\"Rome\", \"Italie\", \"Italien\", \"EUR\", 0),\n",
" (\"Amsterdam\", \"Pays-Bas\", \"Neerlandais\", \"EUR\", 0),\n",
" (\"Berlin\", \"Allemagne\", \"Allemand\", \"EUR\", 0),\n",
" (\"Dubai\", \"Emirats Arabes Unis\", \"Arabe\", \"AED\", 3),\n",
" (\"Sydney\", \"Australie\", \"Anglais\", \"AUD\", 9)\n",
"]\n",
"\n",
"# Base de donnees des hotels\n",
"# Chaque hotel est un dictionnaire\n",
"hotels = [\n",
" {\"nom\": \"Le Marais Boutique\", \"ville\": \"Paris\", \"etoiles\": 3, \"prix_nuit\": 120, \"note\": 8.5},\n",
" {\"nom\": \"Paris Luxury Palace\", \"ville\": \"Paris\", \"etoiles\": 5, \"prix_nuit\": 450, \"note\": 9.2},\n",
" {\"nom\": \"Eiffel Budget\", \"ville\": \"Paris\", \"etoiles\": 2, \"prix_nuit\": 65, \"note\": 7.1},\n",
" {\"nom\": \"London Central\", \"ville\": \"Londres\", \"etoiles\": 4, \"prix_nuit\": 180, \"note\": 8.8},\n",
" {\"nom\": \"Westminster Inn\", \"ville\": \"Londres\", \"etoiles\": 3, \"prix_nuit\": 95, \"note\": 7.9},\n",
" {\"nom\": \"Manhattan View\", \"ville\": \"New York\", \"etoiles\": 4, \"prix_nuit\": 220, \"note\": 8.6},\n",
" {\"nom\": \"Times Square Budget\", \"ville\": \"New York\", \"etoiles\": 2, \"prix_nuit\": 89, \"note\": 6.8},\n",
" {\"nom\": \"Tokyo Garden\", \"ville\": \"Tokyo\", \"etoiles\": 4, \"prix_nuit\": 150, \"note\": 9.0},\n",
" {\"nom\": \"Shibuya Capsule\", \"ville\": \"Tokyo\", \"etoiles\": 1, \"prix_nuit\": 35, \"note\": 7.5},\n",
" {\"nom\": \"Barcelona Beach\", \"ville\": \"Barcelone\", \"etoiles\": 4, \"prix_nuit\": 140, \"note\": 8.7},\n",
" {\"nom\": \"Roma Antica\", \"ville\": \"Rome\", \"etoiles\": 3, \"prix_nuit\": 110, \"note\": 8.3},\n",
" {\"nom\": \"Canal House\", \"ville\": \"Amsterdam\", \"etoiles\": 3, \"prix_nuit\": 130, \"note\": 8.4},\n",
" {\"nom\": \"Berlin Modern\", \"ville\": \"Berlin\", \"etoiles\": 3, \"prix_nuit\": 85, \"note\": 8.1},\n",
" {\"nom\": \"Burj Luxury\", \"ville\": \"Dubai\", \"etoiles\": 5, \"prix_nuit\": 380, \"note\": 9.4},\n",
" {\"nom\": \"Sydney Harbour\", \"ville\": \"Sydney\", \"etoiles\": 4, \"prix_nuit\": 200, \"note\": 8.9}\n",
"]\n",
"\n",
"# Base de donnees des vols (depuis Paris)\n",
"# Chaque vol : (compagnie, depart, arrivee, prix, escales)\n",
"vols = [\n",
" (\"Air France\", \"Paris\", \"Londres\", 120, 0),\n",
" (\"EasyJet\", \"Paris\", \"Londres\", 65, 0),\n",
" (\"Air France\", \"Paris\", \"New York\", 480, 0),\n",
" (\"Delta\", \"Paris\", \"New York\", 420, 0),\n",
" (\"United\", \"Paris\", \"New York\", 350, 1),\n",
" (\"JAL\", \"Paris\", \"Tokyo\", 750, 0),\n",
" (\"Air France\", \"Paris\", \"Tokyo\", 680, 0),\n",
" (\"ANA\", \"Paris\", \"Tokyo\", 620, 1),\n",
" (\"Vueling\", \"Paris\", \"Barcelone\", 85, 0),\n",
" (\"Air France\", \"Paris\", \"Barcelone\", 130, 0),\n",
" (\"Alitalia\", \"Paris\", \"Rome\", 110, 0),\n",
" (\"EasyJet\", \"Paris\", \"Rome\", 75, 0),\n",
" (\"KLM\", \"Paris\", \"Amsterdam\", 95, 0),\n",
" (\"Lufthansa\", \"Paris\", \"Berlin\", 110, 0),\n",
" (\"Emirates\", \"Paris\", \"Dubai\", 450, 0),\n",
" (\"Qantas\", \"Paris\", \"Sydney\", 980, 1),\n",
" (\"Emirates\", \"Paris\", \"Sydney\", 1100, 1)\n",
"]\n",
"\n",
"# Activites par ville\n",
"activites = {\n",
" \"Paris\": [\n",
" {\"nom\": \"Tour Eiffel\", \"prix\": 26, \"duree\": 2, \"type\": \"monument\"},\n",
" {\"nom\": \"Louvre\", \"prix\": 17, \"duree\": 4, \"type\": \"musee\"},\n",
" {\"nom\": \"Croisiere Seine\", \"prix\": 15, \"duree\": 1, \"type\": \"excursion\"}\n",
" ],\n",
" \"Londres\": [\n",
" {\"nom\": \"British Museum\", \"prix\": 0, \"duree\": 3, \"type\": \"musee\"},\n",
" {\"nom\": \"London Eye\", \"prix\": 32, \"duree\": 1, \"type\": \"attraction\"},\n",
" {\"nom\": \"Tower of London\", \"prix\": 28, \"duree\": 2, \"type\": \"monument\"}\n",
" ],\n",
" \"New York\": [\n",
" {\"nom\": \"Statue of Liberty\", \"prix\": 24, \"duree\": 4, \"type\": \"monument\"},\n",
" {\"nom\": \"Empire State Building\", \"prix\": 44, \"duree\": 2, \"type\": \"monument\"},\n",
" {\"nom\": \"Broadway Show\", \"prix\": 150, \"duree\": 3, \"type\": \"spectacle\"}\n",
" ],\n",
" \"Tokyo\": [\n",
" {\"nom\": \"Temple Senso-ji\", \"prix\": 0, \"duree\": 2, \"type\": \"monument\"},\n",
" {\"nom\": \"Tokyo Skytree\", \"prix\": 20, \"duree\": 2, \"type\": \"attraction\"},\n",
" {\"nom\": \"Robot Restaurant\", \"prix\": 80, \"duree\": 2, \"type\": \"spectacle\"}\n",
" ],\n",
" \"Barcelone\": [\n",
" {\"nom\": \"Sagrada Familia\", \"prix\": 26, \"duree\": 2, \"type\": \"monument\"},\n",
" {\"nom\": \"Parc Guell\", \"prix\": 10, \"duree\": 2, \"type\": \"parc\"},\n",
" {\"nom\": \"Camp Nou\", \"prix\": 28, \"duree\": 2, \"type\": \"sport\"}\n",
" ],\n",
" \"Rome\": [\n",
" {\"nom\": \"Colisee\", \"prix\": 16, \"duree\": 2, \"type\": \"monument\"},\n",
" {\"nom\": \"Vatican\", \"prix\": 20, \"duree\": 4, \"type\": \"monument\"},\n",
" {\"nom\": \"Fontaine de Trevi\", \"prix\": 0, \"duree\": 1, \"type\": \"monument\"}\n",
" ]\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 1 - Exploration des données (25 min)\n",
"\n",
"### 1.1 Affichage d'une ville (4 pts)\n",
"\n",
"Écrivez une fonction `afficher_ville(ville)` qui affiche les informations d'une ville.\n",
"\n",
"Exemple :\n",
"```\n",
"Tokyo (Japon)\n",
"Langue : Japonais | Monnaie : JPY\n",
"Decalage horaire : +8h\n",
"```\n",
"\n",
"*Rappel : ville[0] = nom, ville[1] = pays, ville[2] = langue, ville[3] = monnaie, ville[4] = decalage*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def afficher_ville(ville):\n",
" nom = ville[0]\n",
" pays = ville[1]\n",
" langue = ville[2]\n",
" monnaie = ville[3]\n",
" decalage = ville[4]\n",
" \n",
" # Votre code ici : afficher les informations\n",
" pass\n",
"\n",
"# Test\n",
"afficher_ville(villes[3]) # Tokyo"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.2 Rechercher une ville (4 pts)\n",
"\n",
"Écrivez une fonction `rechercher_ville(nom, villes)` qui renvoie le tuple de la ville correspondante, ou `None` si non trouvée."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def rechercher_ville(nom, villes):\n",
" for ville in villes:\n",
" # Votre code ici\n",
" pass\n",
" return None\n",
"\n",
"# Test\n",
"v = rechercher_ville(\"Rome\", villes)\n",
"if v:\n",
" afficher_ville(v)\n",
"print()\n",
"print(\"Madrid :\", rechercher_ville(\"Madrid\", villes))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.3 Villes par monnaie (4 pts)\n",
"\n",
"Écrivez une fonction `villes_par_monnaie(villes, monnaie)` qui renvoie la liste des noms de villes utilisant cette monnaie."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def villes_par_monnaie(villes, monnaie):\n",
" resultats = []\n",
" \n",
" for ville in villes:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return resultats\n",
"\n",
"# Test\n",
"print(\"Villes en zone Euro :\", villes_par_monnaie(villes, \"EUR\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 2 - Recherche d'hôtels et vols (35 min)\n",
"\n",
"### 2.1 Hôtels dans une ville (5 pts)\n",
"\n",
"Écrivez une fonction `hotels_ville(ville, hotels)` qui renvoie la liste des hôtels d'une ville, triés par note décroissante."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def hotels_ville(ville, hotels):\n",
" resultats = []\n",
" \n",
" for hotel in hotels:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Trier par note decroissante\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return resultats\n",
"\n",
"# Test\n",
"print(\"Hotels a Paris :\")\n",
"for h in hotels_ville(\"Paris\", hotels):\n",
" print(\" \", h[\"nom\"], \"-\", h[\"etoiles\"], \"etoiles -\", h[\"prix_nuit\"], \"euros/nuit - Note:\", h[\"note\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 Vols vers une destination (5 pts)\n",
"\n",
"Écrivez une fonction `vols_vers(destination, vols)` qui renvoie la liste des vols vers cette destination, triés par prix croissant.\n",
"\n",
"*Rappel : vol[2] = arrivee, vol[3] = prix*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def vols_vers(destination, vols):\n",
" resultats = []\n",
" \n",
" for vol in vols:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Trier par prix croissant\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return resultats\n",
"\n",
"# Test\n",
"print(\"Vols vers Tokyo :\")\n",
"for v in vols_vers(\"Tokyo\", vols):\n",
" escales = \"direct\" if v[4] == 0 else str(v[4]) + \" escale(s)\"\n",
" print(\" \", v[0], \":\", v[3], \"euros (\", escales, \")\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.3 Vol le moins cher (5 pts)\n",
"\n",
"Écrivez une fonction `vol_moins_cher(destination, vols, direct_seulement)` qui renvoie le vol le moins cher vers une destination.\n",
"\n",
"Si `direct_seulement` est `True`, ne considérer que les vols sans escale."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def vol_moins_cher(destination, vols, direct_seulement):\n",
" meilleur = None\n",
" meilleur_prix = 999999\n",
" \n",
" for vol in vols:\n",
" if vol[2] == destination:\n",
" # Verifier si on veut que des vols directs\n",
" if direct_seulement and vol[4] > 0:\n",
" continue\n",
" \n",
" # Votre code ici : garder le vol le moins cher\n",
" pass\n",
" \n",
" return meilleur\n",
"\n",
"# Tests\n",
"vol = vol_moins_cher(\"New York\", vols, True)\n",
"if vol:\n",
" print(\"Vol direct le moins cher vers New York :\", vol[0], \"-\", vol[3], \"euros\")\n",
"\n",
"vol = vol_moins_cher(\"New York\", vols, False)\n",
"if vol:\n",
" print(\"Vol le moins cher vers New York (avec escales) :\", vol[0], \"-\", vol[3], \"euros\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.4 Budget hotel (6 pts)\n",
"\n",
"Écrivez une fonction `hotels_budget(ville, hotels, budget_max, etoiles_min)` qui renvoie les hôtels correspondant aux critères, triés par prix croissant."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def hotels_budget(ville, hotels, budget_max, etoiles_min):\n",
" resultats = []\n",
" \n",
" for hotel in hotels:\n",
" # Verifier ville, budget et etoiles\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Trier par prix croissant\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return resultats\n",
"\n",
"# Test\n",
"print(\"Hotels a Paris, max 150 euros, min 3 etoiles :\")\n",
"for h in hotels_budget(\"Paris\", hotels, 150, 3):\n",
" print(\" \", h[\"nom\"], \"-\", h[\"prix_nuit\"], \"euros/nuit\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 3 - Bonus (20 min)\n",
"\n",
"### 3.1 Calculer le budget voyage (5 pts)\n",
"\n",
"Écrivez une fonction `calculer_budget(destination, nuits, vol, hotel, activites_choisies, activites)` qui calcule le budget total.\n",
"\n",
"Budget = prix vol + (prix hotel × nuits) + somme des activités"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def calculer_budget(destination, nuits, vol, hotel, activites_choisies, activites):\n",
" budget = {}\n",
" \n",
" # Vol\n",
" budget[\"vol\"] = vol[3]\n",
" \n",
" # Hotel\n",
" budget[\"hotel\"] = hotel[\"prix_nuit\"] * nuits\n",
" \n",
" # Activites\n",
" budget[\"activites\"] = 0\n",
" if destination in activites:\n",
" for act in activites[destination]:\n",
" # Votre code ici : ajouter le prix si l'activite est choisie\n",
" pass\n",
" \n",
" budget[\"total\"] = budget[\"vol\"] + budget[\"hotel\"] + budget[\"activites\"]\n",
" \n",
" return budget\n",
"\n",
"# Test\n",
"vol_choisi = vols[6] # Air France Paris-Tokyo\n",
"hotel_choisi = hotels[7] # Tokyo Garden\n",
"acts = [\"Temple Senso-ji\", \"Tokyo Skytree\"]\n",
"\n",
"budget = calculer_budget(\"Tokyo\", 5, vol_choisi, hotel_choisi, acts, activites)\n",
"print(\"Budget voyage Tokyo :\")\n",
"for poste, montant in budget.items():\n",
" print(\" \", poste, \":\", montant, \"euros\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.2 Activités gratuites (4 pts)\n",
"\n",
"Écrivez une fonction `activites_gratuites(activites)` qui renvoie la liste de toutes les activités gratuites (prix = 0).\n",
"\n",
"Renvoie une liste de dictionnaires `{\"ville\": ..., \"activite\": ...}`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def activites_gratuites(activites):\n",
" gratuites = []\n",
" \n",
" for ville, liste_acts in activites.items():\n",
" for act in liste_acts:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return gratuites\n",
"\n",
"# Test\n",
"print(\"Activites gratuites :\")\n",
"for a in activites_gratuites(activites):\n",
" print(\" \", a[\"ville\"], \":\", a[\"activite\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.3 Destination la moins chère (5 pts)\n",
"\n",
"Écrivez une fonction `destination_moins_chere(vols, hotels, nuits)` qui trouve la destination la moins chère (vol + hotel × nuits).\n",
"\n",
"Pour chaque destination, prendre le vol le moins cher et l'hotel le moins cher."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def destination_moins_chere(vols, hotels, nuits):\n",
" # Trouver toutes les destinations\n",
" destinations = []\n",
" for vol in vols:\n",
" if vol[2] not in destinations:\n",
" destinations.append(vol[2])\n",
" \n",
" meilleure = None\n",
" meilleur_prix = 999999\n",
" \n",
" for dest in destinations:\n",
" # Trouver le vol le moins cher\n",
" vol = vol_moins_cher(dest, vols, False)\n",
" if vol == None:\n",
" continue\n",
" \n",
" # Trouver l'hotel le moins cher\n",
" hotels_dest = hotels_ville(dest, hotels)\n",
" if len(hotels_dest) == 0:\n",
" continue\n",
" \n",
" hotel_min = hotels_dest[0]\n",
" for h in hotels_dest:\n",
" if h[\"prix_nuit\"] < hotel_min[\"prix_nuit\"]:\n",
" hotel_min = h\n",
" \n",
" # Calculer le prix total\n",
" # Votre code ici : mettre a jour meilleure si prix_total est inferieur\n",
" prix_total = 0\n",
" \n",
" return meilleure\n",
"\n",
"# Test\n",
"dest = destination_moins_chere(vols, hotels, 3)\n",
"if dest:\n",
" print(\"Destination la moins chere pour 3 nuits :\")\n",
" print(\" Destination :\", dest[\"destination\"])\n",
" print(\" Vol :\", dest[\"vol\"], \"-\", dest[\"prix_vol\"], \"euros\")\n",
" print(\" Hotel :\", dest[\"hotel\"], \"-\", dest[\"prix_hotel\"], \"euros/nuit\")\n",
" print(\" Total :\", dest[\"total\"], \"euros\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}