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 :

Saisie d'une heure sous la forme HHMMSS


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Par défaut Saisie d'une heure sous la forme HHMMSS
    Bonjour, je voudrais faire un programme qui demande la saisie d'une heure au format HHMMSS à l'utilisateur avec un scanf, mais je ne sais pas comment faire pour vérifier que l'int entier possède bien 6 chiffres ? Par exemple je voudrais continuer à boucler si l'utilisateur entre un seul chiffre. Mon code ne fonctionne pas, j'ai essayé ç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
     
    #include <stdio.h>
     
    int main ()
    {
        int heure,ok;
     
        do
        {
            printf("Saisissez l'heure HHMMSS");
            ok =scanf("%06d",&heure);
            while (getchar()!='\n');
        } while (ok==0);
     
        return 0;
    }

  2. #2
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Hello,

    Ne te focalise pas sur du int. Fais ton input avec un tableau de char, ce sera bien plus simple à vérifier. Et ensuite, si tu as besoin de int, il y toujours atoi(...), mais préfère-lui (int)atol(....)

    A+

    Edgar;

  3. #3
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Par défaut
    Salut Edgar, dans les consignes de l'exercice on n'a pas le droit d'utiliser les chaines de carcatères car c'est des tableaux.

    J'ai fait ç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
    47
    48
    49
    50
    51
    52
    53
    54
     
    #include <stdio.h>
     
    int main ()
    {
        int saisie,ok,heure,minute,seconde;
        char rep;
     
        do
        {
            do
            {
                printf("Saisissez l'heure HHMMSS");
                ok =scanf("%d",&saisie);
                while (getchar()!='\n');
                heure=saisie/10000;
                minute=(saisie/100)%100;
                seconde=saisie%100;
                if(ok==0 || saisie>235959 ||saisie <0 || heure>23 || minute>59 ||seconde>59)
                    printf("L'heure n'est pas conforme.\n");
            } while (ok==0 || saisie>235959 ||saisie <0 || heure>23 || minute>59 ||seconde>59);
     
            if (saisie<100000)
            {
                printf("Vouliez-vous dire %06d ? (o/n)",saisie);
                ok = scanf("%c",&rep);
                while (getchar()!='\n');
            }
        } while (tolower(rep)=='n');
     
        if(seconde==59)
        {
            seconde=0;
            if(minute!=59)
            {
                minute=minute+1;
            }
            else
            {
                minute=0;
                if(heure!=23)
                    heure=heure+1;
                else
                    heure=0;
            }
        }
        else
            seconde=seconde+1;
     
        printf("Dans une seconde il sera %02d%02d%02d",heure,minute,seconde);
     
     
        return 0;
    }
    Le but de l'exercice est d'afficher l'heure à la seconde suivante, dis moi si je peux améliorer mon code. Merci !

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    pourquoi ne pas faire directement un truc du genre scanf("%02d%02d%02d", &heure, &minute, &seconde), le fait de récupérer dans un unique int est imposé ?

    sinon le modificateur %n peut ici trouver une application légitime et intéressante :
    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
    #include <stdio.h>
     
    int main (void) {
       int timestamp,heures,minutes,secondes,ret,lus;
     
       do {
          printf("Saisissez l'heure HHMMSS : ");
          ret = scanf("%06d%n", &timestamp, &lus);
          while (getchar()!='\n');
          heures = timestamp / 10000;
          minutes = (timestamp % 10000) / 100;
          secondes = timestamp % 100;
          printf ("lus = %d\tret = %d\ttimestamp = %06d\tHH:MM:SS = %02d,%02d,%02d\n", lus, ret, timestamp, heures, minutes, secondes);
       } while (lus != 6 || ret != 1);
     
       return 0;
    }
    et l'exécution, avec ses pièges :
    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
    # ./pouet 
    Saisissez l'heure HHMMSS : 1
    lus = 1 ret = 1 timestamp = 000001      HH:MM:SS = 00,00,01
    Saisissez l'heure HHMMSS : 1234
    lus = 4 ret = 1 timestamp = 001234      HH:MM:SS = 00,12,34
    Saisissez l'heure HHMMSS : 123456
    lus = 6 ret = 1 timestamp = 123456      HH:MM:SS = 12,34,56
    # ./pouet 
    Saisissez l'heure HHMMSS : 123456789
    lus = 6 ret = 1 timestamp = 123456      HH:MM:SS = 12,34,56
    # ./pouet 
    Saisissez l'heure HHMMSS : s
    lus = -1218387419       ret = 0 timestamp = -1216868364 HH:MM:SS = -121686,-83,-64
    Saisissez l'heure HHMMSS : s8    
    lus = -1218387419       ret = 0 timestamp = -1216868364 HH:MM:SS = -121686,-83,-64
    Saisissez l'heure HHMMSS : 8s
    lus = 1 ret = 1 timestamp = 000008      HH:MM:SS = 00,00,08
    Saisissez l'heure HHMMSS : 
     
     
     
     
    4
    lus = 6 ret = 1 timestamp = 000004      HH:MM:SS = 00,00,04
    Citation Envoyé par benjamin_malaussene Voir le message
    dans les consignes de l'exercice on n'a pas le droit d'utiliser les chaines de carcatères car c'est des tableaux.
    ce serait intéressant de connaître toutes les contraintes de l'exercice avant de répondre, sinon dans l'absolu edgarjacobs a raison, la meilleure façon de faire (pour déjouer les pièges vus plus haut) c'est encore de lire un tableau de 6 caractères %6s et vérifier rapidement avec une boucle que chaque caractère est bien un chiffre, ou mieux encore de déléguer la vérification à scanf avec un pattern %6[0-9] :
    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
    #include <stdio.h>
     
    int main (void) {
       int heures, minutes, secondes, ret, lus;
       char timestamp[16];
     
       do {
          printf("Saisissez l'heure HHMMSS : ");
          ret = scanf("%6[0-9]%n", timestamp, &lus);
          while (getchar()!='\n');
       } while (lus != 6 || ret != 1);
     
       heures = (timestamp[0] - '0') * 10 + timestamp[1] - '0';
       minutes = (timestamp[2] - '0') * 10 + timestamp[3] - '0';
       secondes = (timestamp[3] - '0') * 10 + timestamp[4] - '0';
    /* ou plus simplement encore :
       sscanf (timestamp, "%02d%02d%02d", &heures, &minutes, &secondes);
    */
       printf ("HH:MM:SS = %02d,%02d,%02d\n", heures, minutes, secondes);
       return 0;
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Par défaut
    Salut bufferbob, merci pour ta solution avec es chaines de caractères, elle est très bien, mais malheureusement les consignes interdisent de les utiliser. J'aime bien la première solution que tu as donnée avec le %n, pourquoi ne pas faire un scanf("%d%n",&saisie,&lus) au lieu d'un %06d ? comme ça ça éviterait le piège que l'utilisateur entre un nombre supérieur à 6 chiffres ?
    Sinon quels sont les autres pièges que tu as voulus mettre en évidence dans l'exécution de ton code ? Car ces pièges sont justement détournés par ton do while ?

  6. #6
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par benjamin_malaussene Voir le message
    merci pour ta solution avec es chaines de caractères, elle est très bien, mais malheureusement les consignes interdisent de les utiliser.
    yep, c'est ce que j'ai cru comprendre.
    pourquoi ne pas faire directement un truc du genre scanf("%02d%02d%02d", &heure, &minute, &seconde), le fait de récupérer dans un unique int est imposé ?

    J'aime bien la première solution que tu as donnée avec le %n, pourquoi ne pas faire un scanf("%d%n",&saisie,&lus) au lieu d'un %06d ? comme ça ça éviterait le piège que l'utilisateur entre un nombre supérieur à 6 chiffres ?
    bien vu c'est d'ailleurs pas très logique quand on y réfléchit

    Sinon quels sont les autres pièges que tu as voulus mettre en évidence dans l'exécution de ton code ? Car ces pièges sont justement détournés par ton do while ?
    le dernier par exemple, limpide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Saisissez l'heure HHMMSS :
     
     
     
     
    4
    lus = 6 ret = 1 timestamp = 000004      HH:MM:SS = 00,00,04

Discussions similaires

  1. [MySQL] Calculer la somme d'une durée sous la forme Heure:Minute:Seconde
    Par radhwene dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 23/06/2007, 10h49
  2. Réponses: 8
    Dernier message: 07/03/2007, 08h34
  3. Saisie d'une heure ou d'une date
    Par giloutho dans le forum Composants VCL
    Réponses: 8
    Dernier message: 02/12/2005, 12h27
  4. [JDBC] Requête avec une date sous la forme dd/MM/yyyy
    Par sylviefrfr dans le forum JDBC
    Réponses: 6
    Dernier message: 12/11/2005, 09h35
  5. Formater une durée sous la forme Heure:Minute:Seconde
    Par marsupile dans le forum C++Builder
    Réponses: 2
    Dernier message: 31/01/2004, 23h29

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