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 :

Exercice d'un cours C incorrect


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 49
    Par défaut Exercice d'un cours C incorrect
    Actuellement je suis un cours pour apprendre le langage C.

    Le problème qui se pose à moi c'est que pour un exercice dont j'avais trouvé la même solution que dans l'exercice mais cela ne fonctionne pas.
    écrivez un programme qui lit la date du clavier et écrit les données ainsi que le nombre de données correctement reçues sur l'écran.
    Exemple:
    Introduisez la date (jour mois année): 11 11 1991

    données reçues : 3
    jour : 11
    mois : 11
    année : 1991
    Voici ce que j'ai fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
     
    int main()
    {
        int recu, jour, mois, annee;
     
        printf("Entrez une date séparée par un espace (ex.: 20 05 1999) : ");
        recu = scanf("%i %i %i", &jour, &mois, &annee);
        printf("Nombre de données reçues : %i\n", recu);
        printf("Jour : %i\nMois : %i\nAnnée : %i", jour, mois, annee);
     
        return (0);
    }
    Et la solution de l'exercice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    main()
    {
        int JOUR, MOIS, ANNEE, RECU;
        printf("Introduisez la date (JOUR, MOIS, ANNéE) : ");
        RECU=scanf("%i %i %i", &JOUR, &MOIS, &ANNEE);
        printf("\ndonnées reçues : %i\njour  : %i\nmois  : 
                     %i\nannee : %i\n", RECU, JOUR, MOIS, ANNEE);
        return 0;
    }
    Mais le résultat donné n'est pas celui souhaité, les variables mois et annee lisent le premier et le 2ème chiffre de mois.

    EDIT : Je viens de découvrir que le réel problème viens du fait que le programme fonctionne correctement mais dès que l'on met un 0 dans le mois le programme bug

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Au minimum (sans validation de la date saisie), il faut:

    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
    #include <stdio.h>
     
    /* -tc- Permet de purger le contenu du tampon du flux d'entree standard */
    void purge(void)
    {
        int c;
     
        while ((c = fgetc(stdin)) != '\n' && c != EOF)
        {
        }
    }
     
    /* -tc- main() retourne un entier de type int, toujours! */
    int main(void)
    {
        /* -tc- C'est une preference personnelle, mais je trouve plus clair de
           definir une variable par ligne. Par ailleurs, les identificateurs
           en majuscules sont, par convension, reserves aux constantes. */
        int jour;
        int mois;
        int annee;
        int recu;
     
        printf("Introduisez la date (JOUR, MOIS, ANNEE) : ");
        /* -tc- Il est necessaire de faire appel a fflush() pour forcer l'affichage
           lorsque l'invite ne se termine pas par un caractere de fin de ligne. */
        fflush(stdout);
        recu = scanf("%d,%d,%d", &jour, &mois, &annee);
        /* -tc- Il est necessaire de purger ici le tampon du flux d'entree standard
           qui contient encore au minimum le caractere de fin de ligne provenant
           de la validation de l'entree a l'aide de la touche ENTER du clavier. */
        purge();
     
        if (recu == 3)
        {
            printf("donnees recues : %d\njour  : %d\nmois  : %d\nannee : %i\n",
                    recu, jour, mois, annee);
        }
        else
        {
            fprintf(stderr, "Erreur durant la saisie!\n");
        }
     
        return 0;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre averti
    Inscrit en
    Février 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 49
    Par défaut
    Merci, je ne cherchais pas aussi compliqué mais merci car je n'ai pas encore appris l'utilisation de fgetc.
    Comme ça j'ai appris quelques trucs en plus.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par condor666 Voir le message
    Merci, je ne cherchais pas aussi compliqué mais merci car je n'ai pas encore appris l'utilisation de fgetc.
    Comme ça j'ai appris quelques trucs en plus.
    En fait, ce qu'il faut surtout apprendre très vite, c'est à se passer de scanf() car cette fonction n'est pas adaptée à la saisie contrôlée. Si jamais l'utilisateur rentre une valeur non prévue, la fonction ne la prend pas en compte et laisse la valeur dans le tampon d'entrée ce qui pose ensuite des problèmes à la saisie suivante.
    Malheureusement la saisie de valeurs est nécessaire pour les TP et comme scanf() est une fonction rapide à expliquer et à implémenter, c'est pour ça que les profs la montrent de suite aux débutants.

    Donc quand tu auras plus de connaissances sur le C, tu pourras te passer de scanf() et la remplacer par d'autres instructions (je vais pas dire plus complexes mais plus "poussées") qui te permettront de détecter les saisies incorrectes tout en laissant le tampon stdin propre
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    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 condor666 Voir le message
    ]Mais le résultat donné n'est pas celui souhaité, les variables mois et annee lisent le premier et le 2ème chiffre de mois.

    EDIT : Je viens de découvrir que le réel problème viens du fait que le programme fonctionne correctement mais dès que l'on met un 0 dans le mois le programme bug
    J'aurais fait comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
     
    int main (void)
    {
       int recu, jour, mois, annee;
     
       printf ("Entrez une date separee par un espace (ex.: 20 05 1999) : ");
       recu = scanf ("%d %d %d", &jour, &mois, &annee);
       printf ("Nombre de donnees recues : %i\n", recu);
       printf ("Jour : %i\nMois : %i\nAnnee : %i", jour, mois, annee);
     
       return 0;
    }
    Pas de problèmes avec le mois à 0...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Entrez une date separee par un espace (ex.: 20 05 1999) : 1 0 2
    Nombre de donnees recues : 3
    Jour : 1
    Mois : 0
    Annee : 2
    Press ENTER to continue.
    Pour moi, les 3 codes sont corrects (à des détails près).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Cours Swinnen][Tkinter] bloqué à un exercice
    Par babar89 dans le forum Tkinter
    Réponses: 4
    Dernier message: 18/10/2005, 16h48
  2. [cours de G.Swinnen] exercice 66
    Par airod dans le forum Tkinter
    Réponses: 4
    Dernier message: 14/10/2005, 11h02
  3. Un cours de C/C++ avec exercices corrigés
    Par merrheim dans le forum C++
    Réponses: 65
    Dernier message: 18/01/2005, 22h30

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