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 :

Problème Progamme pour affichage


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Par défaut Problème Progamme pour affichage
    Bonjour à tous, cela fait un bout de temps que je cherche une solution sur le forum dans des sujets déjà traités, mais je n'ai rien trouvé.

    J'ai un souci tout bête, mais je ne sais pas le régler : Je pose un entier a égal à 1 au début. Tant que a<5, je demande une lettre et un chiffre. Je sais c'est bête mais en fait c'est la simplification de ce que j'ai dans un autre programme car après j'utilise ces données, et j'en redemande d'autres pour les traiter à nouveau.

    J'écris donc en C (normal, on est sur un forum concernant le C), j'utilise Dev-C++ 4.9.9.2.

    Voici mon code :

    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
     
    #include <stdio.h>
     
    main ()
     
    {  int a,chiffre;
       char lettre1;
     
       a=1;
     
       while (a<5)
       {  
         printf("lettre \n");
         fflush(stdout); 
         scanf("%c*c",&lettre1);
         printf("%c \n",lettre1); // pour vérification
     
         printf("chiffre \n");
         fflush(stdout); 
         scanf("%d",&chiffre);
         printf("%d \n \n",chiffre); // pour vérification
     
         a++;
      } 
     
    system("PAUSE");
     
    }
    Pourriez-vous me dire où se trouve mon erreur ? Pour "fflush(stdout);", je l'ai trouvé sur le forum, ça a corrigé un peu le problème mais pas entièrement.

    Merci à vous.

  2. #2
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2006
    Messages : 54
    Par défaut
    Alors, j'ai pas lu le code à fond (je suis trop fatigué pour ça même si il parait très simpliste) mais j'en vois deux :
    la première qui empèche de compilé: le return de la fonction main
    la deuxième qui empèche pas de compiler, mais qui est quand même bien si on l'évite: main peut-ètre remplacée par int main(void)
    je répondrai plus en détails si personne ne l'a fait d'ici la demain matin, mais je pense que emanuele sera passer par la...

    ps: allé quand même deux ou trois conseils, pour commencer le scanf qui est cencé capturé le charactère de la variable lettre aurai pu etre remplacé par un getchar parce que personnelement j'ai appris à ne pas faire confiance à scanf et puis je ne comprend pas l'utilité du systeme-pause parce que habituelement ceci est utilisé pour empecher le programme de se fermer immédiatement après son exécution dans ce cas soit on utilise ça soit un getchar pour permettre de voir ce qui s'affiche à l'écran, mais la tu le met juste après la boucle while qui contient des scanf et qui donc ne pourras pas terminer le proggramme immédiatement après son exécution, donc je pense que tu peux l'enlever...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Par défaut
    Il compile, y'a pas de soucis, seulement la 1ère boucle fonctionne, la 2ème j'arrive à entrer la lettre, mais le chiffre, c'est plus compliqué. Pour la "int main(void)", ça ne change rien, car dans mon programme d'origine (trop long pour être écrit ici) je n'en ai pas besoin.

  4. #4
    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
    Citation Envoyé par mystix5987
    Il compile, y'a pas de soucis, seulement la 1ère boucle fonctionne, la 2ème j'arrive à entrer la lettre, mais le chiffre, c'est plus compliqué. Pour la "int main(void)", ça ne change rien, car dans mon programme d'origine (trop long pour être écrit ici) je n'en ai pas besoin.
    C'est la norme, ce n'est pas une question d'avoir le choix ou pas.

    Ensuite, comme toujours, c'est scanf le problème... Il faut utiliser fgets.

    Voici un exemple de comment s'en servir :

    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
    #include <stdlib.h>
    #include <stdio.h>
     
    int main ()
    {
        char buf[128], *end;
        int a,chiffre;
        char lettre1;
     
        a=1;
     
        while (a<5)
        {
            printf("lettre \n");
            if(fgets(buf,sizeof(buf),stdin)==NULL) {
                fprintf(stderr,"Erreur avec fgets\n");
                return EXIT_FAILURE;
            }
     
            /* Recuperation de la premiere lettre */
            lettre1 = buf[0];
            printf("%c \n",lettre1); /* pour verification */
     
            printf("chiffre \n");
            if(fgets(buf,sizeof(buf),stdin)==NULL) {
                fprintf(stderr,"Erreur avec fgets\n");
                return EXIT_FAILURE;
            }
     
            /* Recuperation du nombre */
            chiffre = strtol(buf,&end,0);
     
            /* Verification */
            if(buf==end) {
                fprintf(stderr,"Erreur de conversion\n");
                return EXIT_FAILURE;
            }
            printf("%d \n \n",chiffre); /* pour verification */
     
            a++;
        }
     
        return EXIT_SUCCESS;
    }

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Par défaut
    Merci beaucoup ça fonctionne, mais j'aimerai comprendre à quoi sert ce "buf", car je ne comprends pas trop.

    pour le main, comme tu me dis, c'est dans la norme, oui, pour des programmes de la sorte, le programme d'où sort ce mini-prorgamme fonctionne sans comme d'autres programmes que j'ai pu programmé pendant mes TP (et ce sont les profs qui nous corrigent).

  6. #6
    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 mystix5987
    Merci beaucoup ça fonctionne, mais j'aimerai comprendre à quoi sert ce "buf", car je ne comprends pas trop.
    Tu parles de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        char buf[128];
    <...>
            if(fgets(buf,sizeof(buf),stdin)==NULL) {
    fgets() attend l'adresse du premier élément d'un tableau de char suffisament grand pour pourvoir y stocker la ligne de texte lue.

    Une des façons de faire est de définir un tableau de char et de lui passer son nom.
    pour le main, comme tu me dis, c'est dans la norme, oui, pour des programmes de la sorte, le programme d'où sort ce mini-prorgamme fonctionne sans comme d'autres programmes que j'ai pu programmé pendant mes TP (et ce sont les profs qui nous corrigent).
    Ne pas se fier au comportement apparent, il ne prouve rien. Pour qu'un programme soit correct, son comportement doit être défini.

    Vu du langage C, un programme qui n'est pas conforme à la norme a un comportement indéfini. C'est un bug grave.

    Maintenant, certaines implémentations du langage C peuvent définir un comportement autre que celui de la norme, mais ce n'est pas portable.

    Si ton prof ne comprend pas ça, change d'école et fait toi rembourser.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Par défaut
    changer d'école ça va être dur !! c'est une école d'ingé !

    ok, j'ai compris ce que tu m'as dis, mais dans ce cas, il lit une ligne entière ? c'est bien ça ? car la, j'ai demandé une lettre et une colonne séparément, mais dans mon autre programme je demande d'entrer par exemple "B4" (c'est un jeu de déplacement de pions, projet à rendre pour la fin du mois).

  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 fearyourself
    Ensuite, comme toujours, c'est scanf le problème... Il faut utiliser fgets.

    Voici un exemple de comment s'en servir :
    Je ne sais pas si c'est plus clair, mais je ferais comme ç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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    static void fclean (char *s, FILE *fp)
    {
       char *p = strchr (s, '\n');
     
       if (p != NULL)
       {
          *p = 0;
       }
       else
       {
          int c;
     
          while ((c = getc(fp)) != '\n' && c != EOF)
          {
          }
       }
    }
     
    int main (void)
    {
       int ret = EXIT_SUCCESS;
       int a;
     
       for (a = 1; a < 5 && ret == EXIT_SUCCESS; a++)
       {
          /* saisie d'une lettre */
          {
             char buf[4];
     
             printf ("lettre\n");
             if (fgets (buf, sizeof (buf), stdin) == NULL)
             {
                fprintf (stderr, "Erreur avec fgets\n");
                ret = EXIT_FAILURE;
             }
             fclean(buf, stdin);
     
             /* Recuperation de la premiere lettre */
             {
                int lettre1 = buf[0];
                printf ("'%c'\n", lettre1); /* pour verification */
             }
          }
     
          /* saisie d'un entier */
          {
             char buf[32];
     
             printf ("nombre\n");
             if (fgets (buf, sizeof (buf), stdin) == NULL)
             {
                fprintf (stderr, "Erreur avec fgets\n");
                ret = EXIT_FAILURE;
             }
             fclean(buf, stdin);
     
             /* Recuperation de la valeur */
             {
                char *end;
                int chiffre = (int) strtol (buf, &end, 0);
     
                /* Verification */
                if (end && *end != 0)
                {
                   fprintf (stderr, "Erreur de conversion\n");
                }
                printf ("%d\n\n", chiffre); /* pour verification */
             }
          }
       }
     
       return ret;
    }

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Par défaut
    Je comprends mieux oui. Si je l'écris comme ç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
     
       while ((pb>5)&&(pn>5))
       {  printf("Joueur %c : \n",joueur);
     
          printf("Quel pion souhaitez-vous deplacer ? Veuillez taper la lettre de sa ligne et le  numero de sa colonne \n");
     
             /* Pour eviter le probleme de scanf */
     
          if (fgets(buf,sizeof(buf),stdin)==NULL) 
             { fprintf(stderr,"Erreur avec fgets\n");
               return EXIT_FAILURE;
             }
     
             /* Recuperation de la premiere lettre */
     
          lettre1 = buf[0];
     
             /* Recuperation du nombre */
     
          chiffre = strtol(buf,&end,0);
     
             /* Verification */
     
          if (buf==end) 
             { fprintf(stderr,"Erreur de conversion\n");
               return EXIT_FAILURE;
             }
     
          return EXIT_SUCCESS;
       }
    c'est correct ? car ça marche pas dans mon programme (c'est le jeu Hasami Shogi en version simplifiée).

  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 mystix5987
    ok, j'ai compris ce que tu m'as dis, mais dans ce cas, il lit une ligne entière ? c'est bien ça ? car la, j'ai demandé une lettre et une colonne séparément, mais dans mon autre programme je demande d'entrer par exemple "B4" (c'est un jeu de déplacement de pions, projet à rendre pour la fin du mois).
    Oui. Une ligne, c'est une séquence de caractères terminée par un \n.

    Quand tu tapes 1<enter>, ça fait une ligne "1\n".

    Si tu tapes B4<enter>, ça fait "B4\n"

    Le 'entière' de 'ligne entière' est qualitatif. Il signifie que le '\n' est présent dans la chaine.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Par défaut
    donc le tout est que je demande à l'utilisateur de mettre un <enter> après qu'il ait tapé la lettre ? sinon, mon code est correct ?

  12. #12
    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 mystix5987
    car ça marche pas dans mon programme (c'est le jeu Hasami Shogi en version simplifiée).
    Si tu tiens à convertir le deuxième caractère en valeur numérique, il faut convertir à partir de ligne+1 et non ligne+0 (ou ligne).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          chiffre = strtol (buf + 1, &end, 0);
    Mais tu devrais mieux exposer le problème afin qu'on trouve la meilleure solution. Là, on ne fait que bricoler sur des bribes de specs et de code.

    Je ne suis pas censé savoir ce qu'est "le jeu Hasami Shogi en version simplifiée".

    Autrement dit, je ne sais pas exactement ce qu'il y a à saisir.

    Pour un jeu d'échec, par exemple, on dirait a-h1-8. Pour un jeu de dames, a-j, 1-10. Ici, je n'en sais rien.

    Connaitre cette information permet de déterminer la solution la plus adaptée.

    Je rappelle le principe de tout projet quelque soit sa taille :

    1. définir (quoi ?)
    2. concevoir (comment ?)
    3. réaliser (codage et tests).

  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 mystix5987
    donc le tout est que je demande à l'utilisateur de mettre un <enter> après qu'il ait tapé la lettre ? sinon, mon code est correct ?
    oui, non.

    Les saisies en C standard sont toujours terminées par <enter> (ou l'équivallent sur ta machine)

    http://emmanuel-delahaye.developpez.com/notes.htm#fgetc

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Par défaut
    J'ai un plateau de 9 par 9 avec 18 pions blancs et 18 pions noirs. Les 18 pions noirs sont placés en haut, les blancs en bas (en ligne)

    Fin de la partie : elle intervient dès qu'un joueur n'a plus que 5 pions ou moins sur le plateau. Son adversaire a alors gagné la partie.

    Déplacements : Les pions se déplacent d'un nombre quelconque de cases horizontalement ou verticalement, mais jamais en diagonale. un pion peut sauter au dessus d'un pion adjacent afin de se rendre sur la cse inoccupée juste derrière (sans capturer le pion sauté)

    Captures : un joueur capture un pion ou une série de pions de son adversaire par encadrement entre 2 de ses pions.

    Avec ça, je dois faire la modélisation du problème (fait, l'analyser (fait), et effectuer la conception d'un programme pour y jouer (en cours).

    Côté conception :
    J'ai créé des sous programmes pour l'initialisation du plateau, l'affichage du plateau, pour les déplacements, et là je travaille sur le programme de captures de pions (en cours, mais ne fonctionne pas encore).

  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 mystix5987
    J'ai un plateau de 9 par 9 <...>

    je travaille sur le programme de captures de pions (en cours, mais ne fonctionne pas encore).
    OK. Il faut donc une saisie qui accepte par exemple une ligne "<x><y>\n"

    avec
    x ::= a-iA-I
    et
    y ::= 1-9

    De là, il suffit de définir une fonction de saisie qui accepte ces caractères, vérifie qu'ils sont corrects, et éventuellement converti la paire de caractères en une paire de coordonnées x, y, non ?

    Pour faire une bonne conception, je conseille de partir de l'utilisation. Ici, on a une fonction, donc mettons la en situation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       struct coord coord;
       int err;
       do
       {
          err = get_coord (&coord);
          if (err)
          {
              puts ("erreur de saisie");
          }
       }
       while (err);
    Ensuite, on détaille les éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct coord
    {
       int x;
       int y;
    };
     
    int get_coord (struct coord *p_coord);
    et qui retourne 0 si la saisie est correcte et 1 si elle est incorrecte (ça permet de prévenir l'utilisateur).

    Ca ne me parait pas extraordinairement compliqué... Il faut fixer la ligne directrice, y aller par étapes et s'y tenir.

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Par défaut
    c'est vrai qu'on peut fonctionner comme ça, je n'ai pas traiter le sujet comme cela, j'ai utilisé un tableau. bon désolé, je ne pourrais pas répondre avant demain maintenant, je pars travailler.

Discussions similaires

  1. Problème de dimension pour affichage sur graph
    Par Marc29 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 17/06/2008, 10h55
  2. Réponses: 2
    Dernier message: 19/03/2008, 11h58
  3. problème pour affichage de données
    Par FraK dans le forum Langage
    Réponses: 6
    Dernier message: 07/03/2007, 15h38
  4. Problème de jointure pour affichage "speciale"
    Par webjeux dans le forum Requêtes
    Réponses: 3
    Dernier message: 22/06/2006, 12h23
  5. Réponses: 3
    Dernier message: 11/01/2006, 17h44

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