Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP : PENDU

Je ne comprends pas l'interêt d'une instruction...

    27 mars 2006 à 20:19:20

    Donc voilà, je veux faire le TP du pendu, et je vois que la fonction scanf() ne va pas fonctionner, car en appuyant sur entrée, le programme s'arrêtera. Mateo demande donc de créer la fonction suivante:

    char lireCaractere()
    {
        char caractere = 0;

        caractere = getchar(); // On lit le premier caractère
        caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà

        // On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
        while (getchar() != '\n') ;

        return caractere; // On retourne le premier caractère qu'on a lu
    }


    Mais là-dedans, je ne comprends pas l'interêt du while(getchar() != '\n')

    Quel interêt de lire tous les autres caractères ? Enlever le \n, et ainsii, ne pas faire s'arrêter le programme ?
    • Partager sur Facebook
    • Partager sur Twitter
      27 mars 2006 à 20:59:31

      En fait, quand tu rentres une valeur dans ton programme, tu appuies sur ENTER pour la valider.
      Le problème c'est que scanf garde cet entrée en mémoire, et des que tu refais un scanf il compte que tu as déjà rentré ENTER(donc \n) et donc ton prog continue sans pause et sans que l'utilisateur puisse rentrer la valeur (la deuxieme lettre.

      le "while(getchar() != '\n')" veut dire que le prog fait un boucle qui efface les caracteres tant quil ne lit pas une entrée. (donc tant que ce que l'utilisateur a rentré n'est pas égal à '\n').

      Donc ensuite ce que l'utilisateur a rentré avant (le buffer) sera complétement vide.

      Voilà j'éspere avoir été clair mais j'en doute.
      • Partager sur Facebook
      • Partager sur Twitter
        27 mars 2006 à 21:59:09

        Ben ptilu, merci beaucoup, j'ai compris :)

        Bon, j'ai fait ce TP, et voilà ce que je propose comme code... si vous avez un avis, n'hésitez pas, il paraît que c'est comme ça qu'on progresse.

        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <ctype.h>

        char lireCaractere();
        void placerLettres(char lettre, char motSecret[], char motActuel[]);

        int main(){

            //définition des variables initiales
            char motSecret[] = "HELLO", motActuel[] = "*****", suiteDuMot;
            long nombreVies = 10;


            printf("Bienvenue DanlPenduDlaMorkitue !\n \n");

            while( nombreVies > 0 && strcmp(motSecret, motActuel) != 0){
                printf("Alors min'nant, on rigole plus, MWAHAHAHAHAH ! Tu vas me donner la lettre que tu penses elle est d'dans. Fais gaffe t'as que %ld vies !\n %s \n", nombreVies, motActuel);
                suiteDuMot = lireCaractere();
                if(strchr(motSecret, suiteDuMot) != NULL){ // si la lettre est dans le mot secret
                    placerLettres(suiteDuMot, motSecret, motActuel);
                    }
                else{
                    nombreVies --;
                    if(nombreVies == 0){
                        printf("lose");
                        break;
                    }
                }

            }
            if(strcmp(motSecret, motActuel) == 0){
                printf("Bravo !");
            }
            else{
                printf("Loser... le mot était %s", motSecret);
            }
        }

        char lireCaractere()
        {
            char caractere = 0;

            caractere = getchar(); // On lit le premier caractère
            caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà

            // On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
            while (getchar() != '\n') ;

            return caractere; // On retourne le premier caractère qu'on a lu
        }

        void placerLettres(char lettre, char motSecret[], char motActuel[]){
            long i;
            for( i = 0; i < strlen(motSecret); i++){
                if(lettre == motSecret[i]){
                    motActuel[i] = lettre;
                }
            }
        }


        EDIT: Je tiens à préciser que mon code est pas super propre, et que je rajouterai quelques fonctions par-ci par là...
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          28 mars 2006 à 16:58:01

          bonjour a tous moi aussi je un probleme avec le pendu
          quand je compile, le compilateur s'arrete sur cette ligne

          int gagne(int *lettreTrouvee[]‚ long tailleMot);

          pouvez vous m'aider merci d'avance.
          • Partager sur Facebook
          • Partager sur Twitter
            28 mars 2006 à 17:20:23

            Jord, tu ne dois pas mettre de [] après ton paramètre, si tu mets déjà un " * ". int* lettreTrouvee est pareil que int lettreTrouvee[]. Si j'ai bien compris le cours :p
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              29 mars 2006 à 10:38:37

              merci mon pendu marche enfin
              merci a toi crevette
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                11 avril 2006 à 9:36:45

                moi aussi le compilateur s arrete sur cette ligne je ne sais pas pourquoi ...
                int gagne(int lettreTrouvee[] ‚ long tailleMot);
                • Partager sur Facebook
                • Partager sur Twitter

                TP : PENDU

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown