IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Programme d'heure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut Programme d'heure
    Bonjour,

    Je souhaite faire un programme permettant de calculer des heures supplémentaires.
    En paramètre, j'aurai l'heure d'arrivé, l'heure de départ.

    Le programme devra me calculer la différence entre les 2 heures du matin.
    Idem pour l'après-midi. Puis, vérifier que y'a pas plus de 1h00 entre midi et deux.
    Puis, afficher le nombre d'heure de présence.

    J'ai vu la fonction difftime de time.h. Mais, voici ca syntax :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double difftime (time_t time0, time_t time1)
    Sur quel format devra être mon heure ?
    Si c'est un seconde ... et en format double, comment convertir en time_t ensuite, pour que la fonction difftime ne bug pas ?

    Merci par avance.

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Programme d'heure
    Citation Envoyé par Fl0r3nt
    Je souhaite faire un programme permettant de calculer des heures supplémentaires.
    En paramètre, j'aurai l'heure d'arrivé, l'heure de départ.

    Le programme devra me calculer la différence entre les 2 heures du matin.
    Idem pour l'après-midi. Puis, vérifier que y'a pas plus de 1h00 entre midi et deux.
    Puis, afficher le nombre d'heure de présence.

    J'ai vu la fonction difftime de time.h. Mais, voici sa syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double difftime (time_t time0, time_t time1)
    Sur quel format devra être mon heure ?
    time_t.
    Si c'est un seconde ... et en format double, comment convertir en time_t ensuite, pour que la fonction difftime ne bug pas ?
    struct tm (Bien lire la doc )
    mktime()

  3. #3
    Membre expérimenté
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    Bonjour,

    Voici ma 1er ébauche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #include <stdio.h>
    #include <time.h>
     
    int main(void) {
     
    struct tm dh1, dh2;
    double temps;
     
    dh1.tm_sec = 0; dh1.tm_min = 30; dh1.tm_hour = 7;
    dh2.tm_sec = 0; dh2.tm_min = 25; dh2.tm_hour = 12;
     
    printf("Heure 1 :%d, minute 1 :%d\n",dh1.tm_hour, dh1.tm_min);
    printf("Heure 2 :%d, minute 2 :%d\n",dh2.tm_hour, dh2.tm_min);
     
    temps=difftime(dh2,dh1);
     
    }
    Pour le moment, la compilation avec Devcpp bloque a cause de la focntion
    difftime() que je dois mal utiliser.

    Pouvez-vous m'aider ?

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Fl0r3nt
    Bonjour,

    Voici ma 1er ébauche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #include <stdio.h>
    #include <time.h>
     
    int main(void) {
     
    struct tm dh1, dh2;
    double temps;
     
    dh1.tm_sec = 0; dh1.tm_min = 30; dh1.tm_hour = 7;
    dh2.tm_sec = 0; dh2.tm_min = 25; dh2.tm_hour = 12;
     
    printf("Heure 1 :%d, minute 1 :%d\n",dh1.tm_hour, dh1.tm_min);
    printf("Heure 2 :%d, minute 2 :%d\n",dh2.tm_hour, dh2.tm_min);
     
    temps=difftime(dh2,dh1);
     
    }
    Pour le moment, la compilation avec Devcpp bloque a cause de la focntion
    difftime() que je dois mal utiliser.
    Regarde bien le prototype de difftime(). Il attend des time_t.

    D'autre part, pour que difftime() fonctionne correctement, tous les champs doivent être cohérents. Il faut donc

    Exemple explicatif...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include <stdio.h>
    #include <time.h>
     
    int main (void)
    {
       struct tm dh1 =
       {0};
       struct tm dh2 =
       {0};
     
       dh1.tm_hour = 7;
       dh1.tm_min = 30;
     
       dh1.tm_mday = 1;
       dh1.tm_mon = 1 - 1;
       dh1.tm_year = 1970 - 1900;
     
       dh2.tm_hour = 12;
       dh2.tm_min = 25;
     
       dh2.tm_mday = 1;
       dh2.tm_mon = 1 - 1;
       dh2.tm_year = 1970 - 1900;
     
       {
          time_t t1 = mktime (&dh1);
     
          if (t1 != (time_t) - 1)
          {
          }
          else
          {
             puts ("t1 error");
          }
          time_t t2 = mktime (&dh2);
     
          if (t1 != (time_t) - 1)
          {
          }
          else
          {
             puts ("t2 error");
          }
     
          {
             char s[32];
    #define FMT "%d-%m-%Y %H:%M:%S"
     
             strftime (s, sizeof s, FMT, &dh1);
             printf ("%s (t1 = %ld)\n", s, (long) t1);
     
             strftime (s, sizeof s, FMT, &dh2);
             printf ("%s (t2 = %ld)\n", s, (long) t2);
          }
     
          {
             double secs = difftime (t2, t1);
     
             ldiv_t h = ldiv ((long) secs, 3600);
             ldiv_t m = ldiv (h.rem, 60);
     
             printf ("%.0f sec, soit %02u:%02u:%02u\n"
                     ,secs
                     ,(unsigned) h.quot
                     ,(unsigned) m.quot
                     ,(unsigned) m.rem);
     
          }
       }
       return 0;
    }

  5. #5
    Membre expérimenté
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    Rebonjour,

    Merci beaucoup pour ces explications claire mais néanmoins très très complete. C'est très gentil à vous.

    Bon, la mauvaise nouvelle est que je ne maitrise pas beaucoup le language C, et les fonctions que vous n'indiquez sont quand même difficile à comprendre.

    Donc, pour facilité la chose, je vais donc convertir toute les heures en minutes, puis faire la difféence entre les 2 heures. Et pour finir, reconvertir en format horaire.

    Y'a-t-il une fonction toute faite qui permet de convertir de la base décimal en base 60 ?

    Si je demande par exemple de taper "2h10" ... comment différencier le "2" du "10" ?

    Merci par avance.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Fl0r3nt
    Y'a-t-il une fonction toute faite qui permet de convertir de la base décimal en base 60 ?
    Je crain que non... du moins pas de manière standard. De toute manière, d'après ce que je lis entre les lignes, il semble que c'est un question interessante de ton exercice. De plus, c'est particulierement simple...
    il suffit de faire des divisions entières, et des modulo, ca n'est quand même pas catastrophique...

    Si je demande par exemple de taper "2h10" ... comment différencier le "2" du "10" ?
    Ceci devrait se resoudre sans trop de probleme avec un getchar() judicieusement placé dans une boucle while...

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    h_ou_min = 1;
    while( ( c = getchar() ) != '\n' ) {
        if( c == 'h' )
            h_ou_min = 0;
        else switch (h_ou_min) {
            case 0: min = c ; break;
            case 1: heure = c ; break;
        }
    }
    Le code n'est ici pas complet, il manque la conversion des char en int, et le fait qu'un nombre est un string, et non un char...

  7. #7
    Membre expérimenté
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    Peut-on faire une structure disant par exemple :

    Qu'un groupe de cast HEURE (par exemple) est contitué de un INT, puis un CHAR, puis un INT.

    Puis, demander à l'utilisateur de saisir une donnée de type HEURE ?

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Fl0r3nt
    Peut-on faire une structure disant par exemple :

    Qu'un groupe de cast HEURE (par exemple) est contitué de un INT, puis un CHAR, puis un INT.

    Puis, demander à l'utilisateur de saisir une donnée de type HEURE ?
    Non. On peut faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    #include <stdio.h>
    #include <time.h>
     
    int main (void)
    {
       char s[32];
       struct tm tm =
       {0};
       time_t t;
     
       /* date minimale : 01-01-1970 */
       tm.tm_year = 1970 - 1900;
       tm.tm_mon = 1 - 1;
       tm.tm_mday = 1;
     
       do
       {
          int n;
          do
          {
             printf ("Entrez l'heure (hh:mm:ss) ");
             fflush (stdout);
     
             fgets (s, sizeof s, stdin);
     
             n = sscanf (s
                         ,"%d:%d:%d"
                         ,&tm.tm_hour
                         ,&tm.tm_min
                         ,&tm.tm_sec
                );
          }
          while (n != 3
                 || tm.tm_hour > 23
                 || tm.tm_min > 59
                 || tm.tm_sec > 59
             );
          t = mktime (&tm);
       }
       while (t == ((time_t) - 1));
     
       printf ("'%s'\n %s", s, asctime (&tm));
     
       return 0;
    }
    Mais si tu ne connais pas le C, tu vas avoir du mal... Je te conseille d'apprendre le C avant d'aller plus loin. Il faut 3 mois à un an...

  9. #9
    Membre expérimenté
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    Merci Emmanuel.

    "A force de forger, on devient forgeron."

    J'ai lu pas mal de documentation, de livre, etc. C'est bien.
    Mais ... y'a jamais réellement de pratique sur un problème concret comme celui-ci.
    En plus, les fonction utilisées ne sont pas tout le temps les même.

    Donc, maintenante et grace à ton code ... je vais pouvoir me documenter et apprendre sur qq chose de concret.

    merci.

  10. #10
    Membre expérimenté
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while (t == ((time_t) - 1));
    A quoi sert ce 'do' ?

  11. #11
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    A quoi sert ce 'do' ?
    Quel do?

    Je suppose que ton code est quelque chose du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    do
    {
    ...
    }
    while(t == ((time_t) -1));
    Le do {...]while permet de définir une boucle qui sera exécutée au moins une fois avant d'avoir un test qui servira de condition d'arrêt.

    A l'inverse, while(..){...} subit d'abord le test avant d'exécuter l'itération, ce qui veut dire qu'il est possible qu'on ne rentre jamais dans la boucle...

    Jc

  12. #12
    Membre expérimenté
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    Oui, pardon, j'ai du taper un peu vite. En fait, c'est pas vraiment l'utilité du 'DO' ou du 'WHILE' que je demande, mais plutôt :

    Pourquoi Emmanuel place-t-il ce 'DO' 'WHILE' ici ?

    Et de plus,

    dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       tm.tm_year = 1970 - 1900;
       tm.tm_mon = 1 - 1;
       tm.tm_mday = 1;
    Voici une struct tm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct tm
    {
      int  tm_sec;   /* secondes           */
      int  tm_min;   /* minutes            */
      int  tm_hour;  /* heures             */
      int  tm_mday;  /* jour du mois       */
      int  tm_mon;   /* mois               */
      int  tm_year;  /* année              */
      int  tm_wday;  /* jour de la semaine */
      int  tm_yday;  /* jour de l'année    */
      int  tm_isdst; /* décalage été/hiver */
    };
    Pourquoi n'initialisé que tm_year, tm_mon et tm_mday.
    Aussi, pourquoi mettre par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tm.tm_year = 1970 - 1900;
    et pas :

    Merci par avance.

  13. #13
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Pourquoi Emmanuel place-t-il ce 'DO' 'WHILE' ici ?
    Parce qu'il veut qu'on rentre dans la boucle au moins une fois pour faire le "Entrer l'heure..."...

    Pourquoi n'initialisé que tm_year, tm_mon et tm_mday.
    Parce que tm_sec, tm_min et tm_hour seront initialisés par l'utilisateur et tm_wday, tm_yday sont calculés par mktime...

    Pour ce qui est de tm_isdst, je ne sais pas si mktime le prend en compte ou le calcul, ce n'est pas spécifié dans la page man...

    En principe il faudrait le mettre à -1 pour dire qu'on ne sait pas, mais je pense que les fonctions l'ignore...

    Pour ce qui est de pourquoi il écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tm.tm_year = 1970 - 1900; 
    tm.tm_mon = 1 - 1
    tm.tm_mday = 1;
    C'est pour bien se souvenir que les années sont comptées à partir de l'année 1900 et que les mois sont numérotés de 0 à 11...
    EDITION: Et pour pas se prendre la tête à les calculer à la main!
    Jc

  14. #14
    Membre expérimenté
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    Parfait, merci beaucoup.

  15. #15
    Membre expérimenté
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    Si, pardon, encore un truc.

    Il y a :

    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fgets (s, sizeof s, stdin);
     
             n = sscanf (s
                         ,"%d:%d:%d"
                         ,&tm.tm_hour
                         ,&tm.tm_min
                         ,&tm.tm_sec
    Donc 's' est de type char. Pourquoi une longeur de 32 ?

  16. #16
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Non, s n'est pas de type char, c'est un char[32], c'est un tableau de caractère.

  17. #17
    Membre expérimenté
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    Pourquoi 32 caractère ?

    Si on enlève le \0 ... ca donne 31 caractère, ca représente quoi ? 31

  18. #18
    Membre expérimenté
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    [quote="fearyourself"]
    Pourquoi Emmanuel place-t-il ce 'DO' 'WHILE' ici ?
    Parce qu'il veut qu'on rentre dans la boucle au moins une fois pour faire le "Entrer l'heure..."...


    On est bien obligé de rentrer dans la boucle, comment peut-on faire autrement ?

  19. #19
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Fl0r3nt
    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fgets (s, sizeof s, stdin);
     
             n = sscanf (s
                         ,"%d:%d:%d"
                         ,&tm.tm_hour
                         ,&tm.tm_min
                         ,&tm.tm_sec
    Donc 's' est de type char. Pourquoi une longeur de 32 ?
    C'est une taille 'raisonnable' et une puissance de 2 (j'aime bien les puissance de 2).

    Entre 16 qui me paraissait trop court (j'ai pas mesuré) et 64 qui me paraissait inutilement grand, j'ai choisi instinctivement 32. Voilà.

  20. #20
    Membre expérimenté
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    D'accord. J'ai juste pour comprendre, il n'y avait bien entendu aucun jugement dans mes propos.

    En tout cas, merci... je comprends mieux les structs et le time_t maintenant.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 9
    Dernier message: 26/05/2015, 08h14
  2. [XL-2003] Désamorcer une macro programmée à une heure précise
    Par coklin dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 17/11/2009, 11h18
  3. Comment programmer un rappel sur date et heure
    Par pierrot67 dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/05/2007, 18h45
  4. Réponses: 5
    Dernier message: 16/01/2007, 11h07
  5. Programme de gestion d'heure
    Par krfa1 dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 30/08/2006, 18h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo