IUT ORSAY Page 1 Sujet Partiel Horaires Trains Mesures physiques
Nom : ____________________________________ Date: _____________________________________
Prénom : _________________________________ Ordinateur : ___________ Groupe : _______
Partiel d'Informatique Scientifique Un Paris-Brest
Tout document écrit, clé USB autorisés.
Tout autre système électronique portable interdit.
Vous devez stocker les modules Python et fichiers annexes dans le réper
toire Partiel sur le « bureau » de l'utilisateur info. Les modules devront contenir les en-têtes habituels, entre autre votre nom ; le code devra être documenté/commenté et testé, les modules outils devront avoir leur partie de tests à la fin du module.
La notation tiendra compte du respect strict des consignes sur le travail demandé, de la qualité des chaînes de documentation et des commentaires, de la pertinence des tests.
Attention à la syntaxe, aux calculs d'indices… si vous avez des doutes, pensez à tester dans la zone de l'interpréteur interactif. Dans les formules, attention aux unités.
Construisez vos tests, à la fin du module, au fur et à mesure que vous écrivez le code des fonctions à tester.
Si vous n'arrivez pas à terminer une fonction, faites-lui retourner une valeur fixe du même type que celui qu'elle doit retourner, et passez à la suite du partiel.
1. Introductions
On définit la vitesse de parcours entre une origine et une destination comme le rap
port de la distance entre ces points par le temps de parcours :
v =
ΔΔdt .Lorsque des coordonnées géographiques se présentent sous la forme de latitude et longitude sur la surface du globe, le calcul de la distance entre les deux points est moins trivial que dans le plan. Si l'on considère une altitude moyenne R de 6378 Km par rapport au centre de la terre, on peut utiliser la formule suivante pour calculer la distance d entre une origine O et une destination D :
Les angles étant bien sûr exprimés en radians.
Nous allons utiliser cette formule pour calculer des vitesses de trains entre diffé
rentes stations (c'est une approximation… les trains ne sont pas des oiseaux). Pour cela, le module parisbrest.py vous est fourni (vous pouvez l'ouvrir). Il contient1 :
● Une liste trajet1 composée de tuples contenant, pour chaque étape du trajet, deux chaînes : nom de station (gare), heure de passage.
>>> from parisbrest import trajet1
>>> print(trajet1)
[('Paris-Montparnasse', '7h05'), ('Rennes', '9h08'), ('St Brieuc', '9h57'), ('Guingamp', '10h15'), ('Morlaix', '10h44'), ('Brest', '11h20')]
>>> print(trajet1[2]) ('St Brieuc', '9h57')
1 Il a été constitué à partir d'horaires de trains trouvés sur www.horaires-des-trains.com, et de coordonnées de villes trouvées sur Wikipedia.
d= R ( π
2 −arcsin (sin(latD )×sin (latO)+cos (longD−longO)×cos (latD)×cos(latO)))
IUT ORSAY Page 2 Sujet Partiel Horaires Trains Mesures physiques
● Un dictionnaire horaires qui, pour divers identificateurs de trains (chaîne), fait corres
pondre le trajet correspondant, c'est à dire la liste de tuples avec nom de station et heure de passage. Le train "TGV8603" correspond au trajet1.
● Un dictionnaire coordonnees qui, pour chaque nom de station, fait correspondre un tuple contenant sa latitude et sa longitude sous forme de nombres flottants correspon
dants aux angles exprimés en degrés.
Exemple :
>>> from parisbrest import coordonnees
>>> print (coordonnees['Brest']) (48.390834, -4.485556)
● Quatre variables latParis, longParis, latBrest, longBrest qui contiennent les lati
tudes et longitudes de Paris et de Brest (pour faire facilement les tests).
Dans les scripts, on utilisera les variables et fonctions de ce module de données simple
ment avec un import global : from parisbrest import * print(trajet1)
2. Module outils
Créer un module Python calculs_m.py qui contiendra les fonctions suivantes :
● hstring2hfloat(p_heurestr) qui convertit un horaire p_heurestr fourni dans un format texte avec heures et minutes (ex. "12h15") en une heure en nombre flottant (ex. 12.25). Cette fonction sera utilisée sur les horaires Note : Si vous bloquez sur cette fonction, afin de pouvoir faire la suite, vous pouvez utiliser le calcul (faux) sui
vant :
return float(p_heurestr.replace('h','.'))
● hfloat2hstring(p_heurefloat) qui réalise l'opération inverse en retournant une chaîne correspondant à une heure en nombre flottant. Note : Si vous bloquez sur cette fonction, afin de pouvoir faire la suite, vous pouvez utiliser la représentation (fausse) suivante :
return str(p_heurefloat).replace('.','h')[:5]
● distance_geographique(p_latOrig, p_longOrig, p_latDst, p_longDst) qui calcule et retourne la distance en Km entre deux coordonnées terrestres. Les lati
tudes et longitudes des coordonnées fournies comme paramètres sont exprimées en degrés. Utilisez la formule donnée en introduction (les fonctions nécessaires aux calculs sont disponibles dans le module math) ; attention aux conversions lors des calculs.
● stations_trajet(p_trajet) qui prend en paramètre une liste de tuples corres
pondant à un trajet (comme trajet1 par exemple), construit et retourne la liste des stations par lesquelles passe ce trajet.
● heures_trajet(p_trajet) qui prend en paramètre une liste de tuples correspon
dant à un trajet (comme trajet1 par exemple), construit et retourne la liste des heures de passage du train pour chaque étape du trajet ; heures exprimées sous forme de nombres flottants !
● distance_stations(p_station1, p_station2) qui prend en paramètre deux noms de stations, récupère les latitudes et longitudes de ces stations dans le dic
tionnaire de données coordonnees, et retourne le calcul de la distance entre ces deux points calculée en appelant la fonction distance_geographique().
Exemples d'utilisation de ces fonctions :
>>> from calculs_m import *
IUT ORSAY Page 3 Sujet Partiel Horaires Trains Mesures physiques
>>> from parisbrest import *
>>> distance_geographique(latParis,longParis,latBrest,longBrest) 503.10865201559744
>>> hfloat2hstring(12.75) '12h45'
>>> hstring2hfloat("12h45") 12.75
>>> stations_trajet(trajet1)
['Paris-Montparnasse', 'Rennes', 'St Brieuc', 'Guingamp', 'Morlaix', 'Brest']
>>> heures_trajet(trajet1)
[7.08333333, 9.1333333, 9.95, 10.25, 10.7333333, 11.3333333]
>>> distance_stations("Paris-Montparnasse", "Brest") 503.10865201559744
3. Module principal
Nous disposons maintenant d'outils de base nous permettant de réaliser les traite
ments sur les vitesses.
Créer un module Python vitesses.py, qui importe les fonctions et données des mo
dules parisbrest et calculs_m.
Définir les fonctions suivantes :
● vitesses_etapes(p_trajet) qui prend en paramètre une liste de tuples corres
pondant à un trajet (comme trajet1 par exemple), construit et retourne la liste des vitesses entre les différentes étapes. Attention au niveau des boucles, pour N étapes, il y a N-1 vitesses ; à chaque itération on a besoin d'une station et de la sui
vante.
● vitesse_trajet(p_trajet) qui prend en paramètre une liste de tuples correspon
dant à un trajet (comme trajet1 par exemple), calcule et retourne la vitesse de parcours entre le départ du trajet (première station) et l'arrivée (dernière station).
● moyenne_vitesses(p_trajet) qui prend en paramètre une liste de tuples corres
pondant à un trajet (comme trajet1 par exemple), calcule les vitesses entre les étapes et retourne la moyenne de ces vitesse.
● plus_rapide(p_horaires) qui prend en paramètre un dictionnaire donnant pour chaque nom de train son trajet (comme horaires par exemple), et retourne le nom du train le plus rapide sur les trajets de p_horaires ainsi que sa vitesse.
Exemples de calculs
>>> vitesses_etapes(trajet1)
[149.2156576, 112.447896, 96.30364548, 103.178513, 88.17654354]
>>> vitesse_trajet(trajet1) 118.378506
>>> plus_rapide(horaires)
('TGV????', 1??.?????) # Volontairement brouillé
Écrire dans le programme principal du module vitesses les différentes instructions permettant de répondre aux questions suivantes (et y répondre dans le programme via des print()) :
● Quel temps (heures, minutes) met le train le plus rapide ?
● Sur le trajet1, la moyenne des vitesses entre les étapes est-elle la même que la vitesse moyenne départ/arrivée ?
● Quels trains puis-je utiliser pour passer par la station de « Lamballe » ?
● Quel est le train qui parcours le plus de stations (qui a le plus d'arrêts), combien a-t- il de stations ? Quel temps met-il pour faire le parcours complet ?