Bonjour j'ai écris le programme concernant le "pendu" et j'ai compilé avec DEV C++ qui a bien fonctionné.
En voulant utiliser Code block, j'ai un résultat bizarre,
quelque pourrait m'expliquer?
voici le programme ci dessous:
le MAIN
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mesFonction.h"
int main(int argc, char * argv[])
{
int restessai = 10 ;
char mot_secret[] = "MARRON", motTrouver[] = " ";
printf("#### Bienvenue dans le Pendu ! ####\n\n\n");
char tentative = ' ';
int i = 0;
for ( i = 0 ; i < strlen(mot_secret) ; i++ )
motTrouver[i] = '*' ;
while (restessai != 0 && strcmp(motTrouver, mot_secret))
{
printf("Il vous reste %d coups a jouer \n ", restessai);
printf("Quel est le mot secret ? %s\n Proposez une lettre : ", motTrouver) ;
tentative = lireCaractere() ;
verifierMot(tentative, mot_secret, motTrouver) ;
restessai = restessai - 1;
}
printf("\n\nGagne ! Le mot secret etait bien : %s\n\n", motTrouver) ;
return 0 ;
}
les fonction:
# include<stdio.h>
# include<ctype.h>
# include<string.h>
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'au \n (pour les effacer)*/
while (getchar() != '\n');
return caractere ; // On retourne le premier caractère qu'on a lu
}
void verifierMot(char c , char *motreferant, char *mot)/*cette fonction sert à verifier si le caractere entré figure dans le mot secret elle affecte egalement le caractere dans le mot partiellement trouvé*/
{
int i = 0 ;
for (i = 0; i < strlen (motreferant); i++)
{
if (c == motreferant[i])
{
mot[i] = c ;
}
}
}
Cordialement,
- Edité par AristideRanda 26 avril 2019 à 21:57:13
Peu importe le compilateur, ce programme ne peut pas fonctionner (sauf par [mal]chance):
char motTrouver[] = " ";
Cela ne réserve que 2 octets, il y aura fatalement écrasement de données dans le for ( i = 0 ; i < strlen(mot_secret) ; i++ ) si mot_secret a plus d'un caractère.
Et, stp,
Il peut également y avoir plantage lors du printf() de mot_trouve, car tu ne le termines pas par un \0. Et quoi qu'il arrive (que le joueur ait ou non trouvé le mot), tu affiches "gagné".
- Edité par edgarjacobs 26 avril 2019 à 17:04:28
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Je vous remercie sincèrement EdgarJacobs pour m'avoir aider.
peut-être qu'il y a encore des incorrection bien que le code est déjà bien compilé.
code principale
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mesFonction.h"
#define N 23
int main(int argc, char * argv[])
{
int restessai = 10, i = 0;
char mot_secret[N] = "MARRON",tentative = ' ', motTrouver[7] = "";
printf("#### Bienvenue dans le Pendu ! ####\n\n\n");
for ( i = 0 ; i < strlen(mot_secret) ; i++ )
motTrouver[i] = '*' ;
while (restessai != 0 && strcmp(motTrouver, mot_secret))
{
printf("Il vous reste %d coups a jouer \n ", restessai);
printf("Quel est le mot secret ? %s\n Proposez une lettre : ", motTrouver) ;
tentative = lireCaractere() ;
verifierMot(tentative, mot_secret, motTrouver) ;
if (strchr(mot_secret, tentative) == NULL)
restessai = restessai - 1;
else
restessai = restessai;
}
if (!strcmp(motTrouver, mot_secret))
{
printf("\n\nGagne ! Le mot secret etait bien :") ;
int j = 0;//indice du tableau permettant d'afficher le mot secret
while (motTrouver[j] == '\0')
{
printf("%c", motTrouver[j]) ;
j++;
}
}
else
printf("\n\n Désolé!, vous n'avez pas trouvé le mot\n le mot etait %s\n\n", mot_secret) ;
return 0 ;
}
Code des fonctions:
# include<stdio.h>
# include<ctype.h>
# include<string.h>
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'au \n (pour les effacer)*/
while (getchar() != '\n');
return caractere ; // On retourne le premier caractère qu'on a lu
}
void verifierMot(char c, char *motreferant, char *mot) /*cette fonction sert à verifier si le caractere entré figure dans le mot secret elle affecte egalement le caractere dans le mot partiellement trouvé*/
{
int i = 0 ;
for (i = 0; i < strlen (motreferant); i++)
{
if (c == motreferant[i])
{
mot[i] = c ;
}
}
}
Merci encore,
Cordialement,
- Edité par AristideRanda 27 avril 2019 à 10:30:29
Conseil : s'enlever très vite de la tête l'idée que, si un code est accepté par le compilateur, c'est qu'il est "presque correct".
PS: ce genre de boucle
for (i = 0; i < strlen (mot); i++) {
...
}
est extrèmement inefficace, parce que strlen(mot) est recalculé à chaque tour de boucle. Et comment est-il recalculé ? En parcourant mot pour chercher le caractère sentinelle '\0' qui marque la fin de la chaine. Ce qui fait que le nombre d'opérations est proportionnel au carré de la taille de le chaine.
La longueur du mot ne changeant pas dans la boucle, il est préférable de calculer la taille avant :
int taille = strlen(mot);
for (i = 0; i < taille; i++) {
...
}
Ou mieux, en se décidant pour une version de C qui ne date pas de la préhistoire
for (int i = 0, taille = strlen(mot); i < taille; i++) {
...
}
(déclaration et initialisation de deux variables auxiliaires dans le for)
- Edité par michelbillaud 27 avril 2019 à 11:55:14
Et verifierMot, si elle retourne un booléen, devrait porter un nom qui reflète le resultat.
La question à se poser : ça retourne vrai quand ? Quand on moins une lettre du mot référent est égale à c, et ça en profite pour dévoiler la lettre dans mot (ces noms sont mal choisis, et maintenant size et found en anglais...).
Elle fait deux choses à la fois. On va dire qu'elle essaie de dévoiler (les occurences d') une lettre, et retourne vrai si elle a réussi ?
× 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.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent