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).
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.
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;
}
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.
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.
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é.
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.
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
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 ?
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 ?
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 .
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.)
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.
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.
Bonhomme !! | Jeu de plateforme : Prototype.
Bonhomme !! | Jeu de plateforme : Prototype.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent