petit exercice - améliorable ?

petit exercice - améliorable ? - C - Programmation

Marsh Posté le 07-02-2006 à 20:58:29    

Bonjour à tous.
 
Je dois faire un petit exercice :
Écrire un programme qui calcule la durée d'un trajet connaissant l'heure de départ et d'arrivée. On se contente
des heures et des minutes, la durée totale ne dépassera jamais 24 heures.
 
 
voici mon code :

Code :
  1. #include <stdio.h>
  2. int main( void )
  3. {
  4. struct {
  5.  unsigned int h, m, mins;
  6. } depart, arrivee, duree;
  7. printf( "\n==Calcul du temps de trajet==\n\n" );
  8. do {
  9.  printf( "heure de depart (HH-MM) : " );
  10.  scanf( "%d-%d", &depart.h, &depart.m );
  11. } while( depart.h>23 || depart.m>59 );
  12. do {
  13.  printf( "\nheure d'arrivee (HH-MM) : " );
  14.  scanf( "%d-%d", &arrivee.h, &arrivee.m );
  15. } while( arrivee.h>23 || arrivee.m>59 );
  16. depart.mins = 60*depart.h + depart.m;
  17. arrivee.mins = 60*arrivee.h + arrivee.m;
  18. if( depart.mins <= arrivee.mins )
  19. {
  20.  //depart <= arrivee
  21.  duree.mins = arrivee.mins - depart.mins;
  22. }
  23. else
  24. {
  25.  //depart > arrivee
  26.  duree.mins = 24*60 - (depart.mins - arrivee.mins);
  27. }
  28. duree.h = duree.mins / 60;
  29. duree.m = duree.mins % 60;
  30. printf( "\n\nDuree de trajet : %d h %d mn\n", duree.h, duree.m );
  31. return 0;
  32. }


 
Ca fonctionne sans problème, mais je voudrais simplement savoir s'il y a des points à améliorer ou à optimiser.
 
Merci :)

Reply

Marsh Posté le 07-02-2006 à 20:58:29   

Reply

Marsh Posté le 07-02-2006 à 21:50:57    

tu peux déjà améliorer la saisie, c'est pénible pour un utilisateur de voir le programme partir en boucle infinie à cause d'une mauvaise saisie
 
http://mapage.noos.fr/emdel/notes.htm#saisie
 
c'est mieux d'utiliser puts ou fputs à la place de printf quand tu n'as pas de chaine formatée à afficher et penses aux fflush(stdout) entre l'affichage d'une chaine qui ne se termine pas par un '\n' et une saisie
 
http://mapage.noos.fr/emdel/notes.htm#fflush_stdout

Reply

Marsh Posté le 07-02-2006 à 21:51:32    

ritzle a écrit :


Ca fonctionne sans problème, mais je voudrais simplement savoir s'il y a des points à améliorer ou à optimiser.


 
Mes remarques préliminaires :

  • L'indentation est cohérente (quoique les do-while ne sont pas traités comme le if-else...), mais je la trouve horrible (c'est personnel, et tu n'y peux rien). De toutes façons, avec Code::Blocks, on a un indenteur intégré, alors tout va bien...
  • J'ai tapé 'a'<enter> au lieu d'un nombre et c'est parti en boucle. Problème de saisie... (scanf() mal utilisé, probablement...)
  • La structure monolithique du code ne permet pas de faire de test unitaire facilement car le code de calcul n'est pas isolé...


#include <stdio.h>
 
int main( void )
{
 
/* -ed-
   struct
   {
      unsigned int h, m, mins;
   }
   depart, arrivee, duree;
 
j'evite la factorisation des donnees.
*/
   struct heure
   {
      unsigned h;
      unsigned m;
      unsigned mins;
   }
   depart;
   struct heure arrivee;
   struct heure duree;
 
   printf( "\n==Calcul du temps de trajet==\n\n" );
 
   do
   {
      printf( "heure de depart (HH-MM) : " );
      scanf( "%d-%d", &depart.h, &depart.m );
      /* -ed- NON! */
   }
   while ( depart.h > 23 || depart.m > 59 );


Pas le temps de finir. J'essayerais demain soir...
 
En attendant, lit ça :  
 
http://mapage.noos.fr/emdel/notes.htm#saisie


Message édité par Emmanuel Delahaye le 07-02-2006 à 21:52:38

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-02-2006 à 23:22:06    

ritzle a écrit :

Bonjour à tous.
 
Je dois faire un petit exercice :
Écrire un programme qui calcule la durée d'un trajet connaissant l'heure de départ et d'arrivée. On se contente
des heures et des minutes, la durée totale ne dépassera jamais 24 heures.
Ca fonctionne sans problème, mais je voudrais simplement savoir s'il y a des points à améliorer ou à optimiser.


 
Tout convertir en minutes est une méthode qui coûte du calcul. Tu peux essayer de soustraire directement les minutes et heures avec retenue
 

m=m_fin - m_deb
si (m < 0)
{
    m=m + 60
    h_fin = h_fin - 1
}
 
h=h_fin - h_deb
si (h < 0)
   h=h + 24
 
Durée = concaténation {h} heures + {m} minutes


 
Tu évites les divisions et multiplications gourmandes en ressources...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 07-02-2006 à 23:49:57    

Ah ouais quand même :whistle:  
Je vais améliorer ca en tenant compte des conseils de ton site, emmanuel
 
 

Sve@r a écrit :

Tout convertir en minutes est une méthode qui coûte du calcul. Tu peux essayer de soustraire directement les minutes et heures avec retenue
 
Tu évites les divisions et multiplications gourmandes en ressources...


Justement j'avais commencé comme ca mais je pensais que ca faisait plus de calculs...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed