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 :

test de la validité d'un caractere


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut test de la validité d'un caractere
    Bonjour, le probleme suivant n'en ai pas un dans l'absolu puisque j'ai des alternatives, cependant j'aimerais arriver à faire ce que j'avais initialement prévu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    do  //test si l'on a bien saisit un 'o' ou un 'n'
    {
       printf("Voulez-vous arreter la saisie ? (saisir 'o' ou 'n') ");//affichage question
       fflush(stdin);
       scanf("%c",&rep);                             //saisie reponse
       //printf("drapeau");//inutile au prog final
    }
    while(rep!='o'&&rep!='n');
    PB : LA QUESTION ("Voulez-vous arreter la saisie ?") EST POSEE 2 FOIS, POURQUOI ?
    idees de reponses : le fflush ? on ne teste pas un caractere ainsi ?

    Il faut savoir que lorsque l'on remplace les caracteres "rep" par une chaine de caractere "rep[0]", la question n'est posée qu'une fois comme voulu.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    LE PROG DANS SON INTEGRALITE, ça sert à calculer des moyennes de notes (exo cours):

    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
    73
    74
    75
    76
    77
    78
    79
    80
    #include <stdio.h> 
    #include <stdlib.h> 
    //constantes: 
    #define NB_NOTES_MAX 100 
    #define NB_ELEVES_MAX 100 
    int main(int argc, char *argv[]) 
    { 
      //variables :
      int n; //designe le n-ième élève
      int m; //curseur pour designer l'eleve n-1 
      int i; //curseur pour designer la note i de l'élève n-1 
      float notes[NB_ELEVES_MAX][NB_NOTES_MAX];//matrice regroupant les notes de chaque élève
      float cumul; //somme des notes (pour un élève)
      int nb_notes; 
      int nb_eleves; 
      char rep;  
     
      //demande, saisie, affichage du nombre d'élèves : 
      printf("nombre d eleves :"); 
      scanf("%u",&nb_eleves);   
      printf("vous avez %u eleves\n\n",nb_eleves);   
     
      //saisie des notes des n élèves
      for(m=0;m<nb_eleves;m++) 
      { 
      n=m+1;   
      cumul=0; //somme des notes raz 
            //saisie des notes de l'élève n 
            for (i=1;i<=NB_NOTES_MAX;i++) 
            {
                     //pose la question après la saisie d'une note 
                     if(i!=1) //pose la question après la saisie d'une note
                     {
                              printf("Voulez-vous arreter la saisie ? (saisir 'o' ou 'n') ");//affichage question
                              do  //test si l'on a bien saisit un 'o' ou un 'n'
                              {
                              fflush(stdin);
                              scanf("%c",&rep);                             //saisie reponse
                              //printf("drapeau");  //essayez avec ce drapeau vous serez peut-etre surpris,  
                                                              //en cherchant à resoudre ce problème  
                                                              //j'ai compris la complexité de l'utilisation des caracteres
                                                              //j'avais d'autres alternatives comme utiliser une chaine de caractere au lieu d'un caractere, ça fonctionne !
                              }
                              while(rep!='o'&&rep!='n');
                     }
                     //fin if
     
                    //l'utilisateur a saisit au moins une note et veux arreter  
                    if(i!=1&&rep!='n'){nb_notes=i-1;i=NB_NOTES_MAX;}
     
                    //sinon saisie de la note i de l'élève n
                    else  
                    {                                                                          
     
                    printf("saisir note %u de l eleve %u: ",i,n);
     
                    scanf("%f",&notes[m][i]);
     
                    cumul=cumul+notes[m][i]; //calcul de la nouvelle somme des i notes de l'élève n
     
                    }
     
           }   //fin du cycle de saisie des i notes de l'élève n 
     
           //calcul de la moyenne des i notes de l'élève n 
           notes[m][0]=cumul/nb_notes; 
           printf("\n"); //saut de ligne après saisie des notes d'un élève 
     
      } //fin du cycle de saisie des notes des n élèves   
     
      // affichage des moyennes 
      printf("Les moyennes sont :\n"); 
      for (m=0;m<nb_eleves;m++) 
      { 
          n=m+1; 
          printf("eleve %u     m = %.2f\n",n,notes[m][0]); 
      }
       system("PAUSE"); 
       return 0; 
    }

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je ne vois rien de choquant dans la boucle... (à part que fflush(stdin) ne marche que sous Windows)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  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 Re: test de la validité d'un caractere
    Citation Envoyé par pimousse92
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                              do  //test si l'on a bien saisit un 'o' ou un 'n'
                              {
                              printf("Voulez-vous arreter la saisie ? (saisir 'o' ou 'n') ");//affichage question
                              fflush(stdin);
                              scanf("%c",&rep);                             //saisie reponse
                              //printf("drapeau");//inutile au prog final
                              }
                              while(rep!='o'&&rep!='n');
    PB : LA QUESTION ("Voulez-vous arreter la saisie ?") EST POSEE 2 FOIS, POURQUOI ?
    idees de reponses : le fflush ? on ne teste pas un caractere ainsi ?

    Il faut savoir que lorsque l'on remplace les caracteres "rep" par une chaine de caractere "rep[0]", la question n'est posée qu'une fois comme voulu.
    scanf() n'est pas la bonne fonction pour faire des saisies.

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    fflush() n'est défini que pour les flux sortants.

  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 pimousse92
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define NB_NOTES_MAX 100 
    #define NB_ELEVES_MAX 100 
    int main(int argc, char *argv[]) 
    { 
      //variables :
      float notes[NB_ELEVES_MAX][NB_NOTES_MAX];//matrice regroupant les notes de chaque élève
    10 000 float en mémoire auto, t'y vas fort...

    En embarqué, ca te pète à la tronche, point.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    On est bien d'accord, l'algorithme n'est pas choquant... en revanche son execution l'est plus. L'avez vous testé ?
    J'essayerai avec autre chose que scanf pour la saisie.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Par défaut
    et sans le fflush, ça donne quoi ? (je ne suis pas chez moi, je n'ai pas accès à un compilateur).

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    sans le fflush ça donne la meme chose.

    Je précise que j'ai mes tp sous windows avec devcpp et que je travail chez moi avec le gcc de linux (ubuntu)

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par pimousse92
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define NB_NOTES_MAX 100 
    #define NB_ELEVES_MAX 100 
    int main(int argc, char *argv[]) 
    { 
      //variables :
      float notes[NB_ELEVES_MAX][NB_NOTES_MAX];//matrice regroupant les notes de chaque élève
    10 000 float en mémoire auto, t'y vas fort...

    En embarqué, ca te pète à la tronche, point.
    Je n'ai pas été sensibilisé au problème.

  10. #10
    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 pimousse92
    sans le fflush ça donne la meme chose.

    Je précise que j'ai mes tp sous windows avec devcpp et que je travail chez moi avec le gcc de linux (ubuntu)
    Très bien. Comme ça , la portabilité n'est pas une option.

    Encore mieux, PC/Windows d'un coté et Mac/OsX de l'autre, avec des échanges de données par fichiers. Ca forme la jeunesse. Les centres de formations devraient être équipés de matériels hétérogènes en réseau...

  11. #11
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut
    je proposerais un simple : Scanf est "deprecated" !!!

  12. #12
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Encore mieux, PC/Windows d'un coté et Mac/OsX de l'autre, avec des échanges de données par fichiers.
    Le bonheur, surtout lorsque l'on oublie que les retours chariot ne sont pas les mêmes; après quelques jours passé à tourner en rond on oublie plus.

    Citation Envoyé par issou
    Scanf est "deprecated" !!!
    scanf obsolète, il va être l'heure d'allez me coucher!
    scanf est juste difficile à maitriser et par conséquence déconseillé aux débutants.

  13. #13
    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 issou
    je proposerais un simple : Scanf est "deprecated" !!!
    Gné ? D'usage difficile, peu recommandée, mais pas deprecated (contrairement à ato*())

    Par contre, getch() n'est pas standard, donc non portable et non recommandé.

    Les solutions sont connues :

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    Je viens d'imprimer les "notes" d'Emmanuel, je n'ai pas encore bien saisi l'équivalent à utiliser de scanf mais ça va venir...

  15. #15
    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 pimousse92
    Je viens d'imprimer les "notes" d'Emmanuel, je n'ai pas encore bien saisi l'équivalent à utiliser de scanf mais ça va venir...
    Service minimum : fgets() + sscanf()...

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    J'ai trouvé une solution à mon problème :
    bien que scanf ne soit pas souhaitable pour une saisie au clavier, mon algo est censé marcher.
    mis à part que mon fflush(stdin); se comporte mal.
    j'utilise donc pour vider le flux une methode décrite dans la faq :
    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
     char saisir_un_caractere(void)
     
    {
     
        char car;
        int x;
     
     
     
        printf("%s saisi une lettre : ", joueur_devine);
        while ((x = getchar()) != '\n' && x != EOF); //cf le commentaire ci-dessous
     
        //fflush(stdin); //ne fonctionne pas sur mon ordinateur avec le compilateur gcc de linux
        scanf("%c",&car);
     
        return car;
     
    }
    La méthode la plus sûre pour vider le buffer clavier consiste à consommer tout les caractères présents dans ce buffer jusqu'à ce qu'il soit vide :

    #include <stdio.h> int c: while ((c = getchar()) != '\n' && c != EOF); // mange le tampon

    N.B. : certains compilateurs offre une extension proposant une méthode 'simple' pour vider ce buffer clavier en utilisant la fonction fflush.

    fflush(stdin);

    Toutefois la norme n'indiquant le fonctionnement de fflush que sur des flux sortant, cette méthode n'est pas standard et peut conduire à des résultats indéfinis, il convient donc de l'éviter.
    le probleme venait donc du fflush sous linux

  17. #17
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par pimousse92
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        //fflush(stdin); //ne fonctionne pas sur mon ordinateur avec le compilateur gcc de linux

    le probleme venait donc du fflush sous linux
    Bien evidemment.
    fflush n'est defini que pour les flux sortants, et stdin n'est pas sortant mais entrant.

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    comment expliques tu que fflush(stdin) fonctionne sous devcpp ? ce n'est pas si evident quand on a pas l'info, la preuve cela n'a sauté aux yeux de personne...

  19. #19
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par pimousse92
    ce n'est pas si evident quand on a pas l'info
    Voir ci après...
    Citation Envoyé par pimousse92
    le probleme venait donc du fflush sous linux
    Non. Le problème vient du fait que vous avez supposé que fflush() faisait quelque-chose sans lire le man. Avant d'accuser fflush(), lisez correctement :
    Citation Envoyé par man fflush
    FFLUSH(3) Manuel du programmeur Linux FFLUSH(3)

    NOM
    fflush - Vider les buffers d'un flux.

    SYNOPSIS
    #include <stdio.h>

    int fflush (FILE *flux);

    DESCRIPTION
    La fonction fflush force l'écriture de toutes les données se trouvant dans les buffers de l'espace utilisateur, et met
    à jour le flux à travers la fonction sous-jacente d'écriture. Le statut d'ouverture du flux n'est pas affecté.

    Si l'argument flux est NULL, fflush vide tous les flux en sortie.

    VALEUR RENVOYÉE
    Si elle réussit intégralement, cette fonctions renvoie 0. Sinon, elle renvoie EOF, et la variable errno contient le
    code d'erreur.

    ERREURS
    EBADF flux n'est pas ouvert, ou du moins pas en écriture.
    Est-ce que "stdin" est un flux en sortie ouvert en écriture ? Jusqu'à preuve du contraire, non.

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Par défaut
    doucement, je débute.
    j'admet mon erreur néanmoins j'ai toujours du mal à comprendre car j'ai bien vu que fflush pouvait fonctionner d'après la faq dans certaines conditions et je me rapelle bien l'avoir utiliser sous devcpp avant la saisie d'un caractere avec un stdin.
    je ne comprend pa bien man.
    comment d'après man utiliser fflush dans mon algo ?

Discussions similaires

  1. Test de la validité d'un EMAIL en VB
    Par rpedro0921 dans le forum VB.NET
    Réponses: 6
    Dernier message: 24/03/2014, 10h14
  2. [Débutant] test d'une chaine a 8 caracteres en VB.net
    Par asssmaa dans le forum VB.NET
    Réponses: 1
    Dernier message: 08/05/2012, 10h14
  3. Réponses: 5
    Dernier message: 05/07/2006, 18h54
  4. Test PostgreSQL v8 avec NAMEDATALEN = 128 caracteres
    Par hondjack dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/10/2004, 00h32
  5. [debutant][bean] test de validité d'un champs
    Par LoLoSS dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 20/05/2004, 12h16

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