Votre question

Exercice algorithmique

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
28 Février 2011 11:08:43

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

28 Février 2011 11:52:31

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
m
0
l
28 Février 2011 13:30:06

Non je veut pas qu'on m'aide à faire tout le boulot mais je n'arrive pas a trouver toute les variables
m
0
l
Contenus similaires
Pas de réponse à votre question ? Demandez !
a c 232 L Programmation
28 Février 2011 15:47:28

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
m
0
l
28 Février 2011 15:57:14

Mais d'après l'énoncé, il ne faut pas tenir compte des années bissextiles, je cite :

"(Rappel du nombre de jour par mois : 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)"
m
0
l
28 Février 2011 16:03:13

Donc ce sera toujours erroné les années bissextiles, ce sera une "optimisation" éventuel !

Et comme dis OmaR, tu as toutes les variables nécessaires, donc quel est le problème ?
m
0
l
28 Février 2011 16:05:12

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

m
0
l
28 Février 2011 16:39:21

Mais il me manque a rentrer le nombre jour de chaque que mois comment faire?
m
0
l
28 Février 2011 18:56:23

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#-}"
m
0
l
28 Février 2011 19:33:41

ok mais j'ai rien compris à ton fichier bash ^^
m
0
l
28 Février 2011 19:57:27

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.
m
0
l
1 Mars 2011 09:14:25

Je suis quand 1ere année de BTS IG donc les programme que l'on fait ne sont pas du tout comme sa mais merci de m'avoir aider
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS