Le traditionnel jeu du pendu [C] - C - Programmation
Marsh Posté le 08-03-2006 à 09:47:58
Salut !
ça me paraît pas mal du tout. J'ai juste une ou deux remarques à faire :
Code :
|
Code :
|
Marsh Posté le 08-03-2006 à 12:09:07
pour la 1ere remarque, j'en deduis donc que la commande return met fin a une fonction pour retourner a celle qui l'a appelée?
dans ce cas oui je vais quivre ton conseil
sinon j'ai pas encore vraiment compris comment nommer les fonctions... en cour, on ecrit main(), dans le bouquin que j'utilise on apelle pas mal de fonctions par int fonction() comme toi, mais qu'est-ce que sa indique?
si j'ai initialisé mes chaines avec un espace, c'est parce que j'ai cru comprendre qu'il valait mieu le faire plutot que de les laisser vide, en particulier si par exemple pour "trouves" ou "lettre "cette variable est utilisée en argument avant d'avoir été definie
while ((ComparerChaine(lettre, "quit" ) != 1) && (Affichage(mot, trouves) != 1)) dans ma fonction
sinon pour el segfault, le fait est que je n'en ai pas, j'ai aussi trouvé sa bizarre que si je definisse une chaine de caractere a 1 caractere (une lettre, donc...) je puisse entrer un mot plus long sans erreur...
je peut faire un scanf("%c",lettre) mais alors je ne pourrai plus utiliser le mot 'quit' (que je devrai eventuellement replacer par un chiffre)
pour ta remarque des scanf, comme dit j'ai aussi remarqué qqs soucis dans l'entrée des variables, mais pour l'instant j'ai rien de mieu, donc je fais avec ce que j'ai lol
quoi qu'il en soit, merci bcp pour avoi pris la peine de lire mon code et de le commenter
j'ai ma petite idée d'algorythme pour afficher le pendu en ASCII, mais je m'occuperai de sa quand j'aurai le temps (c a dire pas cet apres midi lol)
@bientot
Marsh Posté le 08-03-2006 à 13:28:46
Une fonction doit porter un nom qui indique ce qu'elle fait pour plus de clareté lors de la relecture du code, Exemple mettre_a_blanc, additionner,...
Le main est une fonction particulière qui est appelée par le système pour lancer le programme, elle doit être présente pour que le programme tourne, sinon ce n'est pas un programme à part entière.
Tu as bien deduis, le return met fin à la fonction et l'exécution reprend à l'instruction suivant l'appel à la fonction.
J'espère ne pas avoir dit de bétises...
Marsh Posté le 08-03-2006 à 13:33:30
reiboul a écrit : sinon j'ai pas encore vraiment compris comment nommer les fonctions... en cour, on ecrit main(), dans le bouquin que j'utilise on apelle pas mal de fonctions par int fonction() comme toi, mais qu'est-ce que sa indique? |
A part main() dont le nom est imposé (c'est par là que commence l'exécution), les autres fonctions peuvent avoir n'importe quel nom. Il est cependant d'usage de donner un nom d'action ou un verbe.
Détails ici :
http://mapage.noos.fr/emdel/codage.htm
A lire en entier. Pose des questions si tu ne comprends pas.
Marsh Posté le 08-03-2006 à 13:41:03
ReplyMarsh Posté le 08-03-2006 à 14:26:45
Bonjour, quelques remarques sur le code :
Code :
|
tu a écrit ch1[i++] != ch2[i++], ce qui revient à
ch1[0] != ch[1] puis
ch[2] != ch[3],...
ce qui ne convient pas vraiment, peut etre que tu voulais écrire ch1[i] != ch2[i++] plutot ?
(encore faut-il etre sur que le compilo évalue l'expression de gauche avant)
Code :
|
est-ce le while mot[i] se termine ??
le minimum (pour moi) serait un while ( mot[i] != EOF ), mais les chaines de caracteres et moi ca fait 2, surtout en c.
+1 fransesco pour les scanf et return
A+
Marsh Posté le 08-03-2006 à 15:03:55
Citation : est-ce le while mot[i] se termine ?? |
une chaine est terminée par un caractere nul (0 ou '\0')
Citation : le minimum (pour moi) serait un while ( mot[i] != EOF ) |
ca n'a rien à faire ici EOF ?
Marsh Posté le 08-03-2006 à 15:31:13
Citation : ca n'a rien à faire ici EOF ? |
autant pour moi c'est '\0'
Marsh Posté le 08-03-2006 à 15:40:58
reiboul a écrit : si j'ai initialisé mes chaines avec un espace, c'est parce que j'ai cru comprendre qu'il valait mieu le faire plutot que de les laisser vide, en particulier si par exemple pour "trouves" ou "lettre "cette variable est utilisée en argument avant d'avoir été definie |
Attention, il ne faut pas confondre "chaine vide" avec "chaine non initialisée"
Tu peux tout à fait initialiser une chaine de caractères à "" (ce qui revient à dire que tu mets un zéro dans la première case du tableau) ; ça ne devrait pas poser de problèmes.
reiboul a écrit : sinon pour el segfault, le fait est que je n'en ai pas, j'ai aussi trouvé sa bizarre que si je definisse une chaine de caractere a 1 caractere (une lettre, donc...) je puisse entrer un mot plus long sans erreur... |
Le problème avec les segfaults, c'est qu'elles ne se déclenchent pas tout le temps. En fait, ton système ne génère une erreur de segmentation que lorsque tu essaies d'accéder à un morceau de mémoire qui ne t'appartient pas. En gros, il se peut tout à fait que tu dépasses les bornes de tes tableaux et corrompes des morceaux de mémoire ; tant que tu restes "chez toi", tu n'as pas de segfault et tu ne te rends pas compte que tu es en train de corrompre des données / morceaux de codes de ton programme.
Marsh Posté le 08-03-2006 à 16:01:22
franceso a écrit : |
oui mais en réalité c'est tout les éléments du tableau qui seront initialisés à 0, dans le cas de l'initialisation d'un tableau de char, "" est un sucre syntaxique (comme "hello" )
Code :
|
est équivalent à
Code :
|
et
Code :
|
est équivalent à
Code :
|
c'est pratique à savoir car ca permet d'ajouter des caracteres en fin de chaine tout en etant sur qu'elle est terminée par un caractere nul
Marsh Posté le 08-03-2006 à 16:09:13
skelter a écrit : o
|
Tu veux bien sûr dire
Code :
|
Marsh Posté le 08-03-2006 à 16:17:13
skelter a écrit : oui mais en réalité c'est tout les éléments du tableau qui seront initialisés à 0 |
C'est justement la question que je me posais dans le premier post : il me semblait bien que dans le cas d'une allocation statique + initialisation tous les caractères étaient initialisés à 0, mais je n'étais pas sûr que ce soit un comportement standard défini par la norme.
Merci pour ces précisions
Marsh Posté le 08-03-2006 à 16:27:48
Emmanuel Delahaye a écrit : Tu veux bien sûr dire
|
oui, en fait j'ai jamais utilisée cette syntaxe mais je viens de voir que ce n'est pas ansi.
par contre ca ne serait pas valide en c99 ?
Marsh Posté le 08-03-2006 à 17:05:28
skelter a écrit : oui, en fait j'ai jamais utilisée cette syntaxe mais je viens de voir que ce n'est pas ansi. |
Non, pas à ma connaissance.
Marsh Posté le 08-03-2006 à 17:05:59
LePhasme a écrit : Une fonction doit porter un nom qui indique ce qu'elle fait pour plus de clareté lors de la relecture du code, Exemple mettre_a_blanc, additionner,... |
oui sa, je connais, mais j'ai pas été assez clair dans ma question, en fait je parlai des 'int' par exemple que l'on place avant les noms des fonctions, par exemple 'int main()' sa correspond a quoi par rapport a 'main()'?
zyb a écrit : Bonjour, quelques remarques sur le code :
|
probablement correct pour le ch1[i] != ch2[i++], je vois ce que tu veut dire et je vais rectifier sa
sinon, il me semble que le while mot[i] corresponde a un while (mot[i] != '\0') tout comme par exemple
if test(a) printf("true" );
equivaut a
if (test(a)==1) printf("true" )
confirmation?
bon je v reprendre un peu mon code
par hasard y'a une fonction qui permet de vider le terminal? (comme taper 'clear' dans un terminal, quoi...)
Marsh Posté le 08-03-2006 à 17:07:46
franceso a écrit : C'est justement la question que je me posais dans le premier post : il me semblait bien que dans le cas d'une allocation statique + initialisation tous les caractères étaient initialisés à 0, mais je n'étais pas sûr que ce soit un comportement standard défini par la norme. |
http://mapage.noos.fr/emdel/notes.htm#tabchar
Marsh Posté le 08-03-2006 à 17:12:01
zyb a écrit : |
apres essai, en effet, le programme ne verifie qu'un caractere sur 2
quand je tape qeic sa me permet de quitter le programme (a cause du Q et du I qui sont comparées a 'quit' )
Marsh Posté le 08-03-2006 à 17:13:00
reiboul a écrit : oui sa, je connais, mais j'ai pas été assez clair dans ma question, en fait je parlai des 'int' par exemple que l'on place avant les noms des fonctions, par exemple 'int main()' sa correspond a quoi par rapport a 'main()'? |
http://mapage.noos.fr/emdel/notes.htm#typemain
Citation : par hasard y'a une fonction qui permet de vider le terminal? (comme taper 'clear' dans un terminal, quoi...) |
Rien de standard.
<unixoide>
essaye system ("clear" );
</unixoide>
Marsh Posté le 08-03-2006 à 17:25:11
Emmanuel Delahaye a écrit :
|
j'utilise GCC et il compile avec main() (et uassi avec int main(), ya pas de raisons )
mais donc, le int devant une fonction indique que celle si renvoie un entier?
et char fonction() dois renvoyer un caractere, etc?
Marsh Posté le 08-03-2006 à 17:33:48
reiboul a écrit : j'utilise GCC et il compile avec main() |
en ansi pas de probleme, gcc ne gueule pas par défaut mais suivant ce que dit emmanuel essay avec l'option -std=c99
Marsh Posté le 08-03-2006 à 19:02:57
je rajoute la p'tite fonction qui dessine le pendu en fonction des erreurs, et qui renvoie 0 quand on perd
Code :
|
Je cherche maintenant a entrer une base de mots a choisir au hasard pour deviner
j'ai pensé faire une sorte de tableau rempli de mots, et de stocker une case aléatoire du tableau dans une chaine de caractere a retourner
le probleme c'est que je ne sais pas du tout comment faire sa, si qqn a des pistes, je suis preneur
sa serait donc une fonction qui ne prend rien en entrée et qui renvoie une chaine de caracteres
je compte l'utiliser comme &mot[0]=ChoisirMot() par exemple
qqn a de sidées, par hasard?
Marsh Posté le 08-03-2006 à 19:22:21
printf("\n\n\n" ); -> utilises plutot puts ou fputs
printf("\n" ); -> pareil, fputc ou putchar
Citation : et qui renvoie 0 quand on perd |
ce n'est pas a cette fonction de faire ce test, il doit etre fait en amont et cette fonction doit etre appelée conditionnellement
Citation : qqn a de sidées, par hasard? |
regardes la doc sur les fonctions srand et rand pour faire du pseudo aleatoire
Marsh Posté le 08-03-2006 à 19:27:49
la difficulté est surtout de stocker les mots et de les rappeler en fonction du nombre generé aléatoirement
Marsh Posté le 08-03-2006 à 19:29:03
et en fait le pendu ne me dit pas vraiment quand je gagne/perd, il me dit juste si le pendu est complet ou non
a partir de la, si le pendu est complet, j'en deduis que le joueur a perdu
Marsh Posté le 09-03-2006 à 09:06:19
reiboul a écrit : la difficulté est surtout de stocker les mots et de les rappeler en fonction du nombre generé aléatoirement |
Tu peux stocker les mots dans un fichier texte (avec par exemple un mot par ligne), et aller chercher la ligne qu'il te faut à partir du nombre aléatoire généré
Marsh Posté le 09-03-2006 à 09:12:34
franceso a écrit : Tu peux stocker les mots dans un fichier texte (avec par exemple un mot par ligne), et aller chercher la ligne qu'il te faut à partir du nombre aléatoire généré |
+1 cf le lien donné ici:
exercice corrigé de pendu en C
Marsh Posté le 09-03-2006 à 15:17:50
je vais essayer sa mais pour l'instant, j'ai reussi a definir une liste de mots (liste de liste de caracteres) et a en selectionner une ligne (mot) selon un nombre defini aleatoirement
j'ai en plus un peit algorythme qui affiche le pendu hehe
je vous envoie l'algo complet du pendu, qui cherche un mot aleatoirement, qui affiche le nom incomplet et le pendu et qui fonctionne (du moins chez moi)
Code :
|
Marsh Posté le 09-03-2006 à 15:23:02
Au fait, quel est l'intérêt de créer plein de fonctions plutôt que d'utiliser strlen, strcpy et strcmp?
Marsh Posté le 09-03-2006 à 15:33:15
le meme que celui qui me pousse a créer mon pendu moi meme au lieu de copier/coller les sources sur internet
Marsh Posté le 09-03-2006 à 15:35:08
hum, non, aucun rapport
Marsh Posté le 09-03-2006 à 15:42:49
bah, je prefere juste m'netrainer a ecrire mes fonctions moi meme plutot qu'a les piocher dans dans le string.h
c'est sur, le jour ou j'aurai a faire des programme de plusieurs dizaines de pages, je m'embeterrai plus avec des fonctions telles que 'LongueurChaine' lol
Marsh Posté le 09-03-2006 à 16:21:13
reiboul a écrit : bah, je prefere juste m'netrainer a ecrire mes fonctions moi meme plutot qu'a les piocher dans dans le string.h |
on ne comprend jamais aussi bien le fonctionnement des chaînes de caractères en C que lorsqu'on a mis au moins une fois "les mains dans le camboui" en programmant des équivalents de strcmp,strcpy,strlen,...
Marsh Posté le 08-03-2006 à 02:55:54
Bonjour!
voila je programme un petit jeu de pendu, histoire d'apprendre un peu a manier les chaines de caracteres
c'est je pense un exercice assez banal, et je me demandai si des gens ici avaient qqs conseils a me donner pour l'amelioration du programme et de la syntaxe, parce que je l'ai fait avec mon peu de connaissances (jai meme pas encore vu les pointeurs ni les chaines de caracteres en cours, on en est encore a programmer des factorielles )
j'envoie donc le code source, commenté comme il se doit
Merci d'avance de vos reponses
---------------
Amon Amarth, Dark Tranquillity, Opeth, Dimmu Borgir, In Flames, Children of Bodom, Kreator, Metallica... pas d'la musique de paidai tout sa :o