Partage

poster du code

23 mars 2018 à 1:44:06

bonjour. pour la question tout est dans le titre , je souhaiterais savoir comment poster du code. 

certains me l'ont expliqué mais je n'ai jamais vu les touches en question  qu'ils m'ont décrit.

Vous êtes demandeur d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur web junior

Je postule
Formation
certifiante
Financée
à 100%
23 mars 2018 à 1:54:09

Bonjour ! Utilises-tu l'éditeur « Éditeur » ou bien l'éditeur « Markdown » ? (c'est indiqué en haut à droite de la fenêtre d'édition)

Si tu utilises l'éditeur « Markdown », le bouton d'édition de code n'existe pas.

Si tu utilises l'éditeur « Éditeur », c'est l'avant-dernier des boutons situés au-dessus de la fenêtre d'édition (on ne les voit pas bien car ils sont en gris très clair ; si tu ne les vois pas, une solution possible est d'afficher la navigateur en négatif si cette option est disponible).

-
Edité par robun 23 mars 2018 à 1:54:41

23 mars 2018 à 12:39:18

Bonjour. Je suis sur codeblocks en fait.

Est ce par rapport à codeblocks que tu décris ?

23 mars 2018 à 18:28:13

Ah, je n'avais jamais pensé à ça ! Et c'est vrai que ce n'est pas forcément évident.

Tu pensais que pour afficher le code dans un message du forum, il fallait utiliser une option de ton éditeur (par exemple Code::Block). Alors que c'est le contraire : c'est une option du forum.

Je le note pour la prochaine fois que quelqu'un demandera comment faire : d'abord lui expliquer que c'est une option du forum, pas de son éditeur.

-
Edité par robun 23 mars 2018 à 18:29:12

26 mars 2018 à 22:12:24

bonjour et merci pour vos réponses. en fait effectivement j'ai toujours cru qu'on me parlait d'une option se trouvant sur codeblocks en fait.

on ne m'a jamais précisé qu'il s'agissait d'une touche du forum de discussion.

voilà mon code, il compile mais y a un probleme.

lors du décompte des coups restants , il me retire 2 coups à chaque fois en 1 fois!

c'est à dire que de 10 coups , il m'en retire 2 et je me retrouve à 8 coups et ainsi de suite . je pense avoir peu etre mal placé le compteur, mais ça me parait impossible, je suis sur de la'avoir bien fait.

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


int main()
{
    char MotSecret[] = "MARRON" , LettreEntree = 0 , LettreSecrete = 0 ;
    int i ;
    int coups = 10;

    for (i=0 ; i<coups ; i++)
    {
      printf("choississez une lettre\n");
      scanf("%c",&LettreEntree);


      if (LettreEntree != MotSecret[i])
      {
        printf("rate\n");
        printf("il vous reste %d coups\n", coups);
        coups--;
      }

      else if (LettreEntree == MotSecret[i])
      {
         printf("bravo, vous avez trouve une lettre");
         printf("%c",MotSecret[i]);
      }


    }
      return 0;

}
26 mars 2018 à 23:21:29

Salut,

C'est très certainement à cause du scanf() qui passe 2 fois.

scanf("%c",...) va lire un code entré dans l'entrée standard (stdin). Comme il faut bien appuyer sur return, stdin contient ta lettre et un code pour return ('\n'). Au premier tour, scanf prend bien le caractère, mais au second il sort le "return".

Pour éviter cela, il faut purger stdin après le scanf().

Tu peux te renseigner là dessus en faisant une recherche sur "flush + stdin", il y a plusieurs moyens.

Pour l'instant tu peux te dépanner en ajoutant :

while(getchar() != '\n'){}

à la ligne 16.

Bonne continuation.

-
Edité par drx 26 mars 2018 à 23:27:45

Nouveaux Modules pour la CEV_lib : éditeur de map (tiles) + météo. Testez le rendu ici. w pour alterner météo.
27 mars 2018 à 18:05:02

Bonjour. Bon, j'ai rien compris à ton explication qui relève pour moi plus du chinois mélangé à du russe japonais, mais je te remercie beaucoup pour la dite explication.

C'était gentil merci.

27 mars 2018 à 22:36:12

Je vais essayer de détailler (mais c'est vrai que c'est un problème compliqué). C'est peut-être un peu approximatif, c'est surtout pour expliquer l'idée générale.

En langage C, la lecture au clavier se fait à l'aide d'un zone en mémoire qu'on appelle un tampon (en anglais : « buffer »). Lorsqu'on entre un caractère au clavier, celui-ci est stocké dans le tampon. La fonction 'scanf' a pour mission de piocher les données du tampon en respectant le format (%c pour caractère par exemple).

Exemple : tu saisis la lettre 'e'. Pour ça, tu dois taper un 'e', suivi d'un '\n' (rappel : la touche Entrée correspond à un caractère noté '\n')). Dans le tampon, il y a donc un 'e' suivi d'un '\n'. La fonction 'scanf' intervient : on lui demande de lire une donnée de format %c, donc de lire un catactère. Un, pas deux. Eh bien elle pioche le premier caractère du tampon : le 'e'. Mais le tampon contient toujours le '\n'.

Mettons qu'il y ait une deuxième saisie à effectuer. Tu tapes un 'd', suivi de '\n' (la touche Entrée). Le tampon contient donc à présent : '\n', 'd' et '\n'. La fonction 'scanf a pour mission d'aller y piocher un caractère, donc elle pioche le '\n' (elle les pioche dans l'ordre). Résultat : on coyait avoir saisi un 'd', mais le programme a retenu un '\n'. Par ailleurs il reste toujours un 'd' et un '\n' dans le tampon, qui seront disponibles pour le prochain appel de 'scanf' (probablement à la grande surprise de l'utilisateur...)

La solution, c'est de purger le tampon après son utilisation. La ligne de code donnée par drx signifie « tant qu'il y a un \n', pioche-le », il faut donc l'utiliser après chaque utilisation de 'scanf' : le '\n' qu'il n'a pas pioché est ainsi supprimé.

En gros.

28 mars 2018 à 1:25:08

ha , merci je comprend mieux à présent .

par contre mon code suis une logique que je n'avais pas remarqué . 

en procédant ainsi tant que je tape les lettres dans l'ordre , j'ai tout bon ; mais dès que je tape la bonne lettre mais dans le désordre, le compilateur me dit que j'ai manqué mon coup! de toute évidence , il n'a pas compris , que tant que les lettres se ressemblent , et bien c'est que j'ai trouvé la lettre . 

c'est certainement à cause du [i] pres de motsecret.  le compilateur suit la logique de la condition on dirtait mais pas comme je voudrais.

-
Edité par DavidBerger2 28 mars 2018 à 22:53:33

29 mars 2018 à 17:17:10

par contre mon code suis une logique que je n'avais pas remarqué . 

en procédant ainsi tant que je tape les lettres dans l'ordre , j'ai tout bon ; mais dès que je tape la bonne lettre mais dans le désordre, le compilateur me dit que j'ai manqué mon coup! de toute évidence , il n'a pas compris , que tant que les lettres se ressemblent , et bien c'est que j'ai trouvé la lettre . 

c'est certainement à cause du [i] pres de motsecret.  le compilateur suit la logique de la condition on dirtait mais pas comme je voudrais

29 mars 2018 à 17:21:42

Re,

normal, dans ta boucle for tu prends i comme référent pour le nombre de coup à jouer. dans ta compraison de lettres tu utilises de nouveau i.

La lettre à vérifier et le nombre de coups joués n'ont pas de lien, tu dois utiliser une autre méthode.

Nouveaux Modules pour la CEV_lib : éditeur de map (tiles) + météo. Testez le rendu ici. w pour alterner météo.
29 mars 2018 à 22:55:44

MERCI .

pour l'exercice du pendu , je n'ai pas tres bien compris.  est ce que je dois faire une allocation dynamique dans cet exercice pour la premiere partie avec le mot secret "marron" ou quoi , je ne comprend pas. 

parce que j'eesaye de faire une allocation dynamique avec ce tableau  en suivant le principe de l'exemple pour les tableau mais je crois qu'il manque une autre variable non ?

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


int main()
{
    char MotSecret[] = "MARRON" ;
   


    MotSecret[] = malloc(sizeof(char));
    if (MotSecret[] == NULL)
    {
        exit(0);
    }
    free(MotSecret[]);

    return 0;

}

en plus dans la condition , je met "NULL " OU BIEN "MARRON" ? l'égalite doit se faire avec l'initialisation ou on doit obligatoirement mettre "null" dans la condition ?

2 avril 2018 à 1:58:50

salut. j'ai essayé de faire une allocation dynamique avec le tableau "marron" mais il y a un truc qui cloche. dans l'exemple au dessus , je ne sais pas si le tableau "marron" peut etre alloué vu que  sa valeur est égale à marron.

malheureusement l'exemple d'openclassroom ( AgeAmis)n'a donné un exemple qu'avec un tableau de chiffres et sans aucune valeur  en sortie , alors que là c'est un tableau de char avec la valeur "marron" en sortie .

vu qu'il y a une valeur en sortie est il utile d'allouer ce tableau . j'ai essayé de l'allouer malgré tout mais il y a un probleme à la ligne 12 ; peut etre que l'allocation  est incomplète .

qu'en pensez vous ?

2 avril 2018 à 7:28:50

La compilateur accepte ta ligne 12 ?????

Il y a une grosse confusion. Quand tu déclares :

char MotSecret[] = "Marron";

la variable s'appelle 'MotSecret', pas 'MotSecret[]'. Les deux crochets servent, dans la déclaration, à dire que MotSecret n'est pas de type 'char' mais de type tableau de 'char'. Mais cette variable s'appelle 'MotSecret' sans les crochets !

Donc pour l'utiliser, il faut faire :

if (MotSecret == NULL)

sans les crochets ! (Et, comme tu le soupçonnais, ça ne sert à rien d'allouer sa mémoire avec 'malloc' puisque tu as déjà initialisé la variable.)

Les crochets servent pour accéder à une case. Par exemple pour savoir si le mot commence par un 'a' on testera :

if (MotSecret[0] == 'a')

Bref, je vois trois erreurs dans ligne 12 :

− Tu as mis des crochets, c'est une erreur de syntaxe.

− Tu alloues de la mémoire alors qu'elle est déjà allouée.

− Tu alloues de la mémoire pour seulement un caractère, et non plusieurs. (*)

Ces notions sont compliques (moi j'ai toujours du mal avec les chaînes de caractères...) donc ne va pas trop vite ! :)

Dernière chose : un tableau n'a pas de valeur en sortie. Tu fais une confusion de vocabulaire qui rend difficile la compréhension de ton message. (Pour dire que le pointeur pointe sur quelque chose, on dit qu'il pointe sur quelque chose.)

----

(*) En C, la seule chaîne de caractère pouvant être définie par un tableau de 1 caractère, c'est la chaîne vide (l'unique case contient le '\0' terminal.)

-
Edité par robun 2 avril 2018 à 7:34:21

9 avril 2018 à 21:50:49

DavidBerger2 a écrit:

lors du décompte des coups restants , il me retire 2 coups à chaque fois en 1 fois!

    for (i=0 ; i<coups ; i++)
    {

      if (LettreEntree != MotSecret[i])
      {
        printf("rate\n");
        printf("il vous reste %d coups\n", coups);
        coups--;                            // <---------------------
      }
     ....
    }


Le problème, c'est que

  • la variable i compte les coups déjà joués, et augmente à chaque fois
  • la variable coups diminue aussi, de temps en temps

alors forcément, il arrive que la différence entre les deux, diminue de 2.

Donc il faudrait se décider à faire les choses en rebranchant les neurones.  Si on a une variable qui compte les coups restants à jouer, y a pas besoin d'une autre.

int coups_restants = 10;

while (coups_restants != 0) {
   ....

   if (on n'a pas trouvé) {
       coups_restants --;
   }
}

Ta variable i, elle est là pour autre chose, puisque tu t'en sers pour comparer la i-ième lettre du mot mystere avec la lettre tapée. Donc là tu es en pleine confusion mentale (ça arrive) entre deux boucles : faire jouer un certain nombre de coups, et comparer avec les lettres du mot.

Conseil : sous-traiter systématiquement toutes les tâches identifiables à de petites fonctions.

whil( (coups_restants != 0) {
   ....

   if (lettre_dans_mot(lettre_entree, mot_secret)) {
      // hourra
   } else {
      // raté
      coups_restants--;
   }

}


découper le boulot en petits morceaux, y a que comme ça qu'on y arrive.



-
Edité par michelbillaud 9 avril 2018 à 22:00:24

9 avril 2018 à 23:39:30

Merci pour ton explication. Par contre ton : if (lettre_dans mot ( .......)); Mot à mot , que veut dire ceci ?
9 avril 2018 à 23:47:31

Hello,

Cela se lit

if(lettre_dans_mot() != 0) {
    // hourra
}
else {
    // raté
}
10 avril 2018 à 8:50:35

il n'y a pas de comparaison à faire avec zero., ça se lit comme ça s'écrit

si la lettre est dans le mot 
alors
   ceci
sinon
   cela

Le prototype de la fonction est

#include <stdbool.h>                 

bool lettre_dans_mot(char lettre, const char mot[]);


une fonction qui retourne un bool indique directement que quelque chose est vrai ou faux. Alors on n'écrit pas

si il est vrai que la lettre est dans le mot
alors
  ...
sinon

et encore moins

si le fait que la lettre est dans le mot n'est pas faux
alors
   ...
sinon 
   ...


qui est exactement la traduction de la tournure

if (foo() != 0) {
  ...
} else {
  ...
}

en C du moyen-age, où on représentait faux par la constante 0, et vrai par n'importe quoi d'autre.

Faut quand même avoir l'esprit redoutablement tordu pour continuer à faire avec, alors qu'il y a un type "bool" et les constantes "true" et "false"



PS: à compiler bien sur avec les options pour C11.

-
Edité par michelbillaud 10 avril 2018 à 8:58:09

11 avril 2018 à 22:01:49

bonjour tout le monde . j'espere que vous allez tous bien .

je vous montre ce que j'ai fais : 

int main()
{
    char MotSecret[] = "MARRON" , LettreSecrete = 0  ,  MotCopie = NULL ;
    int i = 0 , coups = 10 ;


    printf("bienvenue dans le jeu du pendu\n");
    printf("vous devez deviner le mot cache en 10 coups ou moins\n");

    for (i = 0; i<10; i++)
    {
        printf(" choisissez une lettre\n");
        scanf("%c" , &LettreSecrete);
        while(getchar()!= '\n'){}
        LettreSecrete = strchr(MotSecret,'%c');


        if(LettreSecrete =)
        {

            MotCopie = malloc(sizeof(char));
            if(MotCopie = NULL)
             {
                exit(0);
             }
             {
                printf("bravo ! vous avez trouve une lettre\n");
                printf("%c",LettreSecrete);
             }

        }
        else
        {
            printf("rate , il vous reste %d coups\n", coups);
            coups--;
        }

    }
 

le compli accepte toutes les lettre entrées comme vraies , meme celle qui ne font pas partie du mot .

j'ai laissé la ligne 18 incomplète car honnetement je vois pas quelle condition mettre icije pense que le probleme se trouve dans cette ligne . quoi que je mette le probleme reste le meme le compli accepte toutes les lettres.

-
Edité par DavidBerger2 11 avril 2018 à 22:04:30

11 avril 2018 à 23:55:48

Hello,

Ligne 15,tu a dû avoir deux warning (si pas des erreurs).:

1) le second paramètre de strchr() est un caractère, '%c' en fait deux

2) strchr() renvoie un pointeur, pas un char

Il faudrait lire le man

Corrige ça, et reposte ton code.

-
Edité par edgarjacobs 11 avril 2018 à 23:56:54

12 avril 2018 à 23:21:45

salut tt le monde. 

finalement j'ai remplacé lettre secrete par mot copie car je veux récupérer chaque lettre entrée dans le tableau motcopie:

int main()
{
    char MotSecret[] = "MARRON" , LettreSecrete = NULL  ,  *MotCopie = NULL ;
    int i = 0 , coups = 10 ;


    printf("bienvenue dans le jeu du pendu\n");
    printf("vous devez deviner le mot cache en 10 coups ou moins\n");

    for (i = 0; i<10; i++)
    {
        printf(" choisissez une lettre\n");
        scanf("%c" , &LettreSecrete);
        while(getchar()!= '\n'){}
        MotCopie = strchr(MotSecret,'%c');


        if(LettreSecrete != NULL)
        {

            MotCopie = malloc(sizeof(char));
            if(MotCopie == NULL)
             {
                exit(0);
             }
             {
                printf("bravo ! vous avez trouve une lettre\n");
                printf("%c",*MotCopie);
             }

        }
        else
        {
            printf("rate , il vous reste %d coups\n", coups);
            coups--;
        }

    }



    return 0;

}

par contre , moi j'arrive toujours pas à aider le compilateur à différencier les lettre semblables et différentes .

16 avril 2018 à 21:08:02

bonjour.  vous avez juste posté une ligne qui m'intrigue : 

if(lettre_dans_mot(lettre_entree, mot_secret).

j'aimerais savoir comment dire ceci  en language français pour mieux comprendre .

16 avril 2018 à 21:24:10

Si 'lettre_entree' est une lettre du mot 'mot_secret'.
17 avril 2018 à 3:24:50

merci à toi je comprend mieux , merci .
18 avril 2018 à 21:22:04

lettre_entrée représente certainement  la lettre à taper , Mot_Secret , j'ai compris aussi 

mais que représente Lettre_Dans_Mot ? la lettre affichée par le compilateur en cas de résussite ?

18 avril 2018 à 21:24:53

'lettre_dans_mot' est le nom de la fonction qui, lorsqu'on lui fournit une lettre et un mot, retourne vrai ou faux.

18 avril 2018 à 21:25:15

me manquerait il une autre variable alors ?
18 avril 2018 à 21:26:21

Ben non.

(Tu peux stocker le retour de la fonction dans une variable booléenne, mais ici c'est inutile puisqu'on utilise ce retour directement dans le 'if'.)

-
Edité par robun 18 avril 2018 à 21:28:38

poster du code

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown