Se connecter avec
S'enregistrer | Connectez-vous

Exercice algorithmique

Dernière réponse : dans Programmation

Bonjours,

Voila j'ai un exercice d'algorithme et j'ai vraiment du mal si quelqu'un peut m'aider voici le sujet:

Nous souhaitons écrire un programme permettant de connaître la durée écoulée entre 2 instants T1 ET T2 définis par une date et une heure; un instant est représentable par un sextuplets contenant un jour, un mois, une année, une heure, des minutes et des secondes; la précision demandée pour la durée est la seconde.
( Rappel du nombre de jour par mois : 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)

Ecrire l'algorithme du programme DUREE permettant d'obtenir ce résultat; une optimisation du programme est demandée.



Voila merci de bien vouloir m'aider

Autres pages sur : exercice algorithmique

Lassé par la pub ? Créez un compte
Expert Programmation

Bonjour,

Là, en l'état, c'est pas de l'aide que tu demandes c'est qu'on fasse ton boulot.
Donc montre nous ce que tu as fais et dis nous là ou tu as un problème.

Sinon, un petit rappel :
1 minute = 60 secondes
1 heure = 60 minutes
1 journée = 24 heures
1 mois = 28 ou 29 pour Février / 30 ou 31 pour les autres mois
1 année = 365 ou 366 jours

Bon courage
Expert Programmation

Y'a aussi les années bissextiles à prendre en compte
Citation :
Depuis l'instauration du calendrier grégorien, sont bissextiles les années[1] :

* soit divisibles par 4 mais non divisibles par 100
* soit divisibles par 400.



Et tu as toutes les variables

Voila ce que j'ai fait

  1. Programme DUREE
  2.  
  3. VAR
  4. T1, T2, Date, Heure, Un jour, Un mois, Une année, Une heure, Des minutes, Des secondes : entier
  5.  
  6. Début
  7. // Saisir instants T1
  8. Affiche « Saisir Date »
  9. Saisir Date
  10. Affiche « Saisir Un jour, Un mois, Une année »
  11. Saisir Heure
  12. Affiche « Saisir une heure, des minutes et des secondes »
  13. // Saisir instants T2
  14. Affiche « Saisir Date »
  15. Saisir Date
  16. Affiche « Saisir Un jour, Un mois, Une année »
  17. Saisir Heure
  18. Affiche « Saisir une heure, des minutes et des secondes »
  19.  
  20. Affiche « Saisir Date et Heure T1 »
  21. Saisir Date & heure
  22. Affiche « jour / mois / année / Une heure / Des minutes / Des secondes »
  23. Affiche « Saisir Date et heure T2 »
  24. Saisir Date & heure
  25. Affiche « jour / mois / année / Une heure / Des minutes / Des secondes »
  26.  
  27. Si T1 = T2
  28. Alors Affiche « Durée égale 0 »
  29. Si non
  30. Si T1 < T2
  31. Alors calcul T2 – T1
  32. Saisir ( T2 * 60²) – ( T1*60²) = T2T1
  33. Affiche « T1T2 »
  34. Si non T1 > T2
  35. Alors calcul T1 + T2
  36. Saisir ( T1 * 60²) + ( T2*60²) = T1T2
  37. Affiche « T1T2 »
  38. Fin si
  39. Fin si
  40. Fin si
  41. Fin si
  42. Fin

Expert Programmation

Pourquoi imposes-tu T1 < T2 ? Il suffit de retourner l'absolue de la différence dans tous les cas, du coup peut importe quelle date est avant l'autre.

Ensuite l'astuce est de tout transformer en secondes, et de tout calculer dessus.
Donc :
1 min = 60 sec
1 h = 60 min * 60 sec
1 jour = 24 h * 60 min * 60 sec
1 mois = (28 ou 29 ou 30 ou 31) jours * 24 h * 60 min * 60 sec
1 annee = (365 ou 366) jours * 24 h * 60 min * 60 sec

Du coup, quand tu as toutes tes valeurs :
T1_EN_SECONDES = ANNEE_CONVERTI_EN_SECONDE + (chaque mois précédent CONVERTI_EN_SECONDE) + JOUR_MOINS_1_CONVERTI_EN_SECONDES + ...

Etc. et pareil pour T2.

Du coup, tu fais "Afficher ValeurAbsolue (T2-T1)" et c'est fini !

Enfin voila quoi ... Le BASH ci-dessous est cadeau, Juste pour le fun j'ai réalisé ton exercice d'algo:

  1. #!/bin/bash
  2.  
  3. function usage() {
  4. if [ $# -eq 1 ]
  5. then
  6. echo "Erreur : " >&2
  7. echo " $1" >&2
  8. fi
  9. echo "Usage of $0 :" >&2
  10. echo " $0 <T1> <T2>" >&2
  11. echo " T1 = Jours/Mois/Annees-Heures:Minutes:secondes" >&2
  12. echo " T2 = Jours/Mois/Annees-Heures:Minutes:secondes" >&2
  13. echo "Attention : combler les valeurs avec des 0 tel que :" >&2
  14. echo " Jours : 01 ... 31" >&2
  15. echo " Mois : 01 ... 12" >&2
  16. echo " Annees : -XXXX ... XXXX" >&2
  17. echo " Heures : 00 ... 23" >&2
  18. echo " Minutes & Secondes : 00 ... 59" >&2
  19. exit 1
  20. }
  21.  
  22. function convertMinuteInSecondes() {
  23. if [ $# -ne 1 ]
  24. then
  25. echo 0
  26. else
  27. echo $(($1 * 60))
  28. fi
  29. }
  30.  
  31. function convertHourInSecondes() {
  32. if [ $# -ne 1 ]
  33. then
  34. echo 0
  35. else
  36. echo $(convertMinuteInSecondes $(($1*60)))
  37. fi
  38. }
  39.  
  40. function convertDayInSecondes() {
  41. if [ $# -ne 1 ]
  42. then
  43. echo 0
  44. else
  45. echo $(convertHourInSecondes $(($1*24)))
  46. fi
  47. }
  48.  
  49. function convertMounthInSecondes() {
  50. if [ $# -ne 2 ]
  51. then
  52. echo 0
  53. else
  54. res=0
  55. for i in $(seq 1 1 $(($1-1)))
  56. do
  57. case $i in
  58. 1|3|05|7|8|10|12)
  59. res=$(($res+31))
  60. ;;
  61. 4|6|9|11)
  62. res=$(($res+30))
  63. ;;
  64. 2)
  65. case $2 in
  66. 0)
  67. res=$(($res+29))
  68. ;;
  69. 1)
  70. res=$(($res+28))
  71. ;;
  72. esac
  73. ;;
  74. esac
  75. done
  76. echo $(convertDayInSecondes $res)
  77. fi
  78. }
  79.  
  80. function convertYearInSecondes() {
  81. if [ $# -ne 2 ]
  82. then
  83. echo 0
  84. else
  85. case $2 in
  86. 0)
  87. echo $(convertDayInSecondes $(($1*366)))
  88. ;;
  89. 1)
  90. echo $(convertDayInSecondes $(($1*365)))
  91. ;;
  92. esac
  93. fi
  94. }
  95.  
  96. test $# -ne 2 && usage "Nombre de parametres incorrect"
  97. test $(expr length $1) -ne 19 && usage "Format de T1 incorrect"
  98. test $(expr length $2) -ne 19 && usage "Format de T2 incorrect"
  99.  
  100. j1=${1:0:2}
  101. M1=${1:3:2}
  102. a1=${1:6:4}
  103. h1=${1:11:2}
  104. m1=${1:14:2}
  105. s1=${1:17:2}
  106.  
  107. j2=${2:0:2}
  108. M2=${2:3:2}
  109. a2=${2:6:4}
  110. h2=${2:11:2}
  111. m2=${2:14:2}
  112. s2=${2:17:2}
  113.  
  114. test $(echo $j1 | sed 's/^[-+0-9][0-9]*//' | wc -c) -ne 1 && usage "Le jour de T1 doit etre un nombre"
  115. test $(echo $M1 | sed 's/^[-+0-9][0-9]*//' | wc -c) -ne 1 && usage "Le mois de T1 doit etre un nombre"
  116. test $(echo $a1 | sed 's/^[-+0-9][0-9]*//' | wc -c) -ne 1 && usage "L'anne de T1 doit etre un nombre"
  117. test $(echo $h1 | sed 's/^[-+0-9][0-9]*//' | wc -c) -ne 1 && usage "L'heure de T1 doit etre un nombre"
  118. test $(echo $m1 | sed 's/^[-+0-9][0-9]*//' | wc -c) -ne 1 && usage "Les minutes de T1 doivent etre un nombre"
  119. test $(echo $s1 | sed 's/^[-+0-9][0-9]*//' | wc -c) -ne 1 && usage "Les secondes de T1 doivent etre un nombre"
  120.  
  121. test $(echo $j2 | sed 's/^[-+0-9][0-9]*//' | wc -c) -ne 1 && usage "Le jour de T2 doit etre un nombre"
  122. test $(echo $M2 | sed 's/^[-+0-9][0-9]*//' | wc -c) -ne 1 && usage "Le mois de T2 doit etre un nombre"
  123. test $(echo $a2 | sed 's/^[-+0-9][0-9]*//' | wc -c) -ne 1 && usage "L'anne de T2 doit etre un nombre"
  124. test $(echo $h2 | sed 's/^[-+0-9][0-9]*//' | wc -c) -ne 1 && usage "L'heure de T2 doit etre un nombre"
  125. test $(echo $m2 | sed 's/^[-+0-9][0-9]*//' | wc -c) -ne 1 && usage "Les minutes de T2 doivent etre un nombre"
  126. test $(echo $s2 | sed 's/^[-+0-9][0-9]*//' | wc -c) -ne 1 && usage "Les secondes de T2 doivent etre un nombre"
  127.  
  128. test $M1 -le 0 -o $M1 -gt 12 && usage "Le mois de T1 doit etre compris entre 01 et 12"
  129. test $h1 -lt 0 -o $h1 -gt 23 && usage "L'heure de T1 doit etre compris entre 00 et 23"
  130. test $m1 -lt 0 -o $m1 -gt 59 && usage "Les minutes de T1 doivent etre comprises entre 00 et 59"
  131. test $s1 -lt 0 -o $s1 -gt 59 && usage "Les secondes de T1 doivent etre comprises entre 00 et 59"
  132.  
  133. a1b=$(test $(expr $a1 % 4) -eq 0 -a $(expr $a1 % 100) -ne 0 -o $(expr $a1 % 400) -eq 0;echo $?)
  134.  
  135. case $M1 in
  136. 01|03|05|07|08|10|12)
  137. test $j1 -le 0 -o $j1 -gt 31 && usage "Le jout de T1 doit etre compris entre 01 et 31"
  138. ;;
  139. 04|06|09|11)
  140. test $j1 -le 0 -o $j1 -gt 30 && usage "Le jout de T1 doit etre compris entre 01 et 30"
  141. ;;
  142. 02)
  143. case $a1b in
  144. 0)
  145. test $j1 -le 0 -o $j1 -gt 29 && usage "Le jout de T1 doit etre compris entre 01 et 29"
  146. ;;
  147. 1)
  148. test $j1 -le 0 -o $j1 -gt 28 && usage "Le jout de T1 doit etre compris entre 01 et 28"
  149. ;;
  150. esac
  151. ;;
  152. esac
  153.  
  154. test $M2 -le 0 -o $M2 -gt 12 && usage "Le mois de T2 doit etre compris entre 01 et 12"
  155. test $h2 -lt 0 -o $h2 -gt 23 && usage "L'heure de T2 doit etre compris entre 00 et 23"
  156. test $m2 -lt 0 -o $m2 -gt 59 && usage "Les minutes de T2 doivent etre comprises entre 00 et 59"
  157. test $s2 -lt 0 -o $s2 -gt 59 && usage "Les secondes de T2 doivent etre comprises entre 00 et 59"
  158.  
  159. a2b=$(test $(expr $a2 % 4) -eq 0 -a $(expr $a2 % 100) -ne 0 -o $(expr $a2 % 400) -eq 0;echo $?)
  160.  
  161. case $M2 in
  162. 01|03|05|07|08|10|12)
  163. test $j2 -le 0 -o $j2 -gt 31 && usage "Le jout de T2 doit etre compris entre 01 et 31"
  164. ;;
  165. 04|06|09|11)
  166. test $j2 -le 0 -o $j2 -gt 30 && usage "Le jout de T2 doit etre compris entre 01 et 30"
  167. ;;
  168. 02)
  169. case $a2b in
  170. 0)
  171. test $j2 -le 0 -o $j2 -gt 29 && usage "Le jout de T2 doit etre compris entre 01 et 29"
  172. ;;
  173. 1)
  174. test $j2 -le 0 -o $j2 -gt 28 && usage "Le jout de T2 doit etre compris entre 01 et 28"
  175. ;;
  176. esac
  177. ;;
  178. esac
  179.  
  180. T1=$(( $(convertYearInSecondes $a1 $a1b) + $(convertMounthInSecondes $M1 $a1b) + $(convertDayInSecondes $(($j1-1))) + $(convertHourInSecondes $h1) + $(convertMinuteInSecondes $m1) + $s1 ))
  181. T2=$(( $(convertYearInSecondes $a2 $a2b) + $(convertMounthInSecondes $M2 $a2b) + $(convertDayInSecondes $(($j2-1))) + $(convertHourInSecondes $h2) + $(convertMinuteInSecondes $m2) + $s2 ))
  182.  
  183. DIFF=$(( $T2 - $T1 ))
  184.  
  185. echo "Le nombre de secondes entre les instants $1 et $2 est de :"
  186. echo " ${DIFF#-}"
Expert Programmation

Dans mon bash, les fonctions intéressantes sont les convert***InSecondes
Puis les 4 dernières lignes.

Tout le reste c'est du test pour vérifier que les données renseignées sont conformes à ce qui est attendu.

Mais ça c'était juste un "bonus", le plus intéressant c'est l'explication au dessus.
Lassé par la pub ? Créez un compte
Tom's guide dans le monde