L horaire d arrivée [dt02] - Exercice Karine Zampieri, Stéphane Rivière, Béatrice Amerein-Soltner Unisciel algoprog Version 10 avril 2015 Table des matières 1 L horaire d arrivée / pg-horairea1 (alg) 1 1.1 Décomposition du problème......................... 1 1.2 Procédure saisirhms (saisie vérifiée d un moment)............. 2 1.3 Fonction nsecondes (équivalent secondes d un moment).......... 3 1.4 Procédure calculerhms (moment issu de secondes)............ 3 1.5 Procédure afficherhms (affichage d un moment).............. 4 1.6 Programme principal............................. 5 1 L horaire d arrivée / pg-horairea1 (alg) Mots-Clés Dates et Heures, Algorithmique, Programmation, C++. Requis Structures de base, Structures conditionnelles, Algorithmes paramétrés. Cet exercice reprend l exercice @[L horaire d arrivée] en réalisant une décomposition en procédures et fonctions. 1.1 Décomposition du problème L exercice @[L horaire d arrivée] demande un horaire de départ hms (heure, minutes, secondes) et la durée d un trajet hms, puis calcule et affiche l horaire d arrivée hms. Algorithme initial Constante NSECONDES <- 60 Constante NMINUTES <- 60 Constante NSECSHEURE <- NSECONDES * NMINUTES Algorithme pg_horaire1 Variable hr, mn, ss : Entier 1
Unisciel algoprog L horaire d arrivée / dt02 2 Variable nsecs, nduree : Entier Début Afficher ( "Horaire de départ (h m s)? " ) Saisir ( hr, mn, ss ) nsecs <- ( hr * NMINUTES + mn ) * NSECONDES + ss Afficher ( "Durée du trajet (h m s)? " ) Saisir ( hr, mn, ss ) nduree <- ( hr * NMINUTES + mn ) * NSECONDES + ss nsecs <- nsecs + nduree hr <- DivEnt ( nsecs, NSECSHEURE ) nsecs <- nsecs - hr * NSECSHEURE mn <- DivEnt ( nsecs, NSECONDES ) nsecs <- nsecs - mn * NSECONDES ss <- nsecs Afficher ( "Vous arrivez à ", hr, " h ", mn, " m ", ss, " s" ) Fin Exemple d exécution (Avec cet algorithme) Horaire de départ (h m s)? 5 20 30 Durée du trajet (h m s)? 1 52 41 Vous arrivez à 7 h 13 m 11 s Soient les versions téléchargeables de programmes. alg @[pg-horaire1.alg] Proposez une décomposition en procédures et fonctions. Les procédures et fonctions qui sont intéressantes ici sont : Une procédure saisirhms qui saisit un moment hms (heures, minutes, secondes). Une fonction nsecondes qui calcule l équivalent secondes d un moment hms depuis minuit. Une procédure duale calculerhms qui à partir d un nombre de secondes calcule le moment hms. Une procédure afficherhms qui affiche un moment hms. 1.2 Procédure saisirhms (saisie vérifiée d un moment) Un moment (h, m, s) est valide si : L heure h est dans [0..24[ Les minutes m dans [0..60[ Et les secondes s dans [0..60[
Unisciel algoprog L horaire d arrivée / dt02 3 Écrivez une fonction horaire(hr,mn,ss) qui teste et renvoie Vrai si un triplet d entiers (hr,mn,ss) représente un moment, Faux sinon. Déduisez une procédure saisirhms(hr,mn,ss) qui demande une heure dans hr (entier), des minutes dans mn (entier) et des secondes dans ss (entier) jusqu à ce que le triplet (hr,mn,ss) soit un moment (heures, minutes, secondes). Affichez l invite : h m s? Validez votre fonction et votre procédure avec la solution. alg @[saisirhmsa1.alg] 1.3 Fonction nsecondes (équivalent secondes d un moment) Écrivez une fonction nsecondes(hr,mn,ss) qui calcule et renvoie l équivalent secondes d un triplet d entiers (hr,mn,ss) représentant un moment (heures, minutes, secondes) par rapport à minuit. Exemple : nsecondes(10,12,58) ==> (10 * 60 + 12) * 60 + 58 Aide simple L expression convertit les heures en minutes et les minutes en secondes. Validez votre fonction avec la solution. alg @[nsecondesa1.alg] 1.4 Procédure calculerhms (moment issu de secondes) Soit un moment exprimé en (heures, minutes, secondes). Comment pouvez-vous calculer le moment correspondant à un «nombre de secondes»? Exemple : nsecs=6761 nombre de secondes correspondent à hr=1 heure, mn=52 minutes et ss=41 secondes : 6761 = (1 * 60 + 52) * 60 + 41
Unisciel algoprog L horaire d arrivée / dt02 4 Il suffit de réaliser deux divisions euclidiennes avec reste pour obtenir d abord les secondes, puis les minutes et enfin les heures. On peut également procéder dans l autre sens : d abord calculer les heures, puis les minutes et les secondes. Effectuez les calculs pour 6761 secondes. 6761 correspond à ss = nsecs mod 60 = 41 secondes. Il reste alors nsecs = 6761-41 = 6720 (à décomposer en minutes, heure). 6720 correspond à mn = (nsecs div 60) mod 60 = 52 minutes. Il reste nsecs = 6720-52*60 = 6720-3120 = 3600 (à décomposer en heure). 3600 correspond à hr = nsecs / 3600 = 1 heure. Et dans l autre sens : hr = nsecs div (60*60) = 1 heure. mn = (nsecs mod (60*60)) div 60 = 52 minutes. ss = nsecs mod 60 = 41 secondes. Écrivez une procédure calculerhms(nsecs,hr,mn,ss) qui, étant donné un nombre de secondes nsecs (entier), calcule et restitue le moment équivalent (heures, minutes, secondes) dans un triplet d entiers (hr,mn,ss). Validez votre procédure avec la solution. alg @[calculerhmsa1.alg] Commentaires La fonction définit des constantes locales SECS_PAR_MINUTE (nombre de secondes par minute) et SECS_PAR_HEURE (nombre de secondes par heure) pour des questions de lisibilité (et de pédagogie). Il n est pas nécessaire de procéder ainsi, le code étant très court. 1.5 Procédure afficherhms (affichage d un moment) Écrivez une procédure afficherhms(hr,mn,ss) qui affiche le moment d un triplet d entiers (hr,mn,ss) sous le format suivant (où [x] désigne le contenu de x) : [hr] h [mn] m [ss] s Validez votre procédure avec la solution.
Unisciel algoprog L horaire d arrivée / dt02 5 alg @[afficherhmsa1.alg] 1.6 Programme principal Ce problème ré-écrit un algorithme en utilisant les procédures et fonctions. Écrivez un algorithme qui demande un horaire de départ dans un triplet d entiers hr, mm, ss. Calculez dans nsecs (entier) l équivalent en secondes. Demandez la durée du trajet dans hr, mm, ss. Calculez dans nsecs l équivalent en secondes de l horaire d arrivée. Calculez dans hr, mm, ss l horaire d arrivée. Affichez l horaire d arrivée. Validez algorithme avec la solution. alg @[pg-horairea1.alg]