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