Création d'une Structure (débutant)
Résolu/Fermé
Xifly
Messages postés
44
Date d'inscription
vendredi 3 janvier 2014
Statut
Membre
Dernière intervention
8 décembre 2017
-
Modifié par pijaku le 3/01/2014 à 13:20
Xifly Messages postés 44 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 8 décembre 2017 - 23 janv. 2014 à 22:33
Xifly Messages postés 44 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 8 décembre 2017 - 23 janv. 2014 à 22:33
A voir également:
- Création d'une Structure (débutant)
- Creation compte gmail - Guide
- Création compte google - Guide
- Media creation tool - Télécharger - Systèmes d'exploitation
- Création site web - Guide
- Création groupe whatsapp - Guide
4 réponses
[Dal]
Messages postés
6200
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 janvier 2025
1 097
Modifié par [Dal] le 3/01/2014 à 12:53
Modifié par [Dal] le 3/01/2014 à 12:53
Bonjour Xifly,
Ta struct ne peut utiliser la valeur de l'entier qu'elle contient qu'une fois que tu as déclaré une variable ayant pour type cette struct.
Alors, une façon de faire est de définir lettres comme étant un pointeur sur char et d'allouer dynamiquement l'espace nécessaire à la chaîne C, une fois que la struct existe.
Par exemple, comme cela :
Dal
Ta struct ne peut utiliser la valeur de l'entier qu'elle contient qu'une fois que tu as déclaré une variable ayant pour type cette struct.
Alors, une façon de faire est de définir lettres comme étant un pointeur sur char et d'allouer dynamiquement l'espace nécessaire à la chaîne C, une fois que la struct existe.
Par exemple, comme cela :
#include <stdio.h> #include <stdlib.h> #include <string.h> struct Mot { int nbLettres; char * lettres; }; int main(void) { struct Mot un_mot; un_mot.nbLettres = 3; un_mot.lettres = malloc(un_mot.nbLettres + 1); strcpy(un_mot.lettres, "abc"); printf("un_mot.nbLettres = %d - un_mot.lettres = %s\n", un_mot.nbLettres, un_mot.lettres); free(un_mot.lettres); return 0; }
Dal
[Dal]
Messages postés
6200
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 janvier 2025
1 097
Modifié par [Dal] le 3/01/2014 à 13:20
Modifié par [Dal] le 3/01/2014 à 13:20
Le code ci-dessus est compatible C89.
Si tu veux utiliser une structure telle que tu l'avais envisagée au départ, et que tu peux utiliser du C99, tu peux définir un tableau de longueur variable et te passer d'utiliser malloc / free. Ta struct contenant ton tableau de longueur variable devra alors être définie dans une fonction (main, ou une autre), et utiliser une autre variable (non contenue dans la struct elle-même) pour définir la longueur variable souhaitée à la déclaration.
Voilà un exemple en C99 illustrant cet usage :
C'est plus "opaque" pour la compréhension du code, mais c'est toi qui vois ce que tu veux (peux) faire.
Dal
Si tu veux utiliser une structure telle que tu l'avais envisagée au départ, et que tu peux utiliser du C99, tu peux définir un tableau de longueur variable et te passer d'utiliser malloc / free. Ta struct contenant ton tableau de longueur variable devra alors être définie dans une fonction (main, ou une autre), et utiliser une autre variable (non contenue dans la struct elle-même) pour définir la longueur variable souhaitée à la déclaration.
Voilà un exemple en C99 illustrant cet usage :
#include <stdio.h> #include <string.h> int main(void) { int n = 0; struct Mot { int nbLettres; char lettres[n]; }; n = 4; struct Mot un_mot; strcpy(un_mot.lettres, "abc"); un_mot.nbLettres = n - 1; printf("un_mot.nbLettres = %d - un_mot.lettres = %s\n", un_mot.nbLettres, un_mot.lettres); printf("strlen un_mot.lettres = %d\n", strlen(un_mot.lettres)); return 0; }
C'est plus "opaque" pour la compréhension du code, mais c'est toi qui vois ce que tu veux (peux) faire.
Dal
Xifly
Messages postés
44
Date d'inscription
vendredi 3 janvier 2014
Statut
Membre
Dernière intervention
8 décembre 2017
Modifié par Xifly le 3/01/2014 à 17:05
Modifié par Xifly le 3/01/2014 à 17:05
J'ai réussi a comprendre le deuxième programme;
Le problème est qu'il ne marche que pour un seul mot puisque n=4 ne convient que pour "abc"
J'ai donc fait ainsi :
ça a l'air de convenir.
Merci
Le problème est qu'il ne marche que pour un seul mot puisque n=4 ne convient que pour "abc"
J'ai donc fait ainsi :
#include <stdio.h>
#include <string.h>
int main(void)
{
int n = 0;
struct Mot
{
int nbLettres;
char lettres[n];
};
struct Mot MARRON;
strcpy(MARRON.lettres, "MARRON");
n = strlen(MARRON.lettres);
MARRON.nbLettres = n;
printf("MARRON.nbLettres = %d - MARRON.lettres = %s\n", MARRON.nbLettres, MARRON.lettres);
printf("strlen MARRON.lettres = %d\n", strlen(MARRON.lettres));
return 0;
}
ça a l'air de convenir.
Merci
Xifly
Messages postés
44
Date d'inscription
vendredi 3 janvier 2014
Statut
Membre
Dernière intervention
8 décembre 2017
3 janv. 2014 à 17:00
3 janv. 2014 à 17:00
Le problème est qu'ici je dois changer le n pour chaque structure mot ... or j'aimerais que cela se fasse automatiquement ...
Ici je voudrais que ce soit le uniquement le n du mot marron qui soit égale à strlen(MARRON.lettres
Ici je voudrais que ce soit le uniquement le n du mot marron qui soit égale à strlen(MARRON.lettres
[Dal]
Messages postés
6200
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 janvier 2025
1 097
Modifié par [Dal] le 3/01/2014 à 17:08
Modifié par [Dal] le 3/01/2014 à 17:08
Les prototypes de strcpy() et strlen() sont définis dans string.h. Dans ce code c'est juste utilisé pour mettre quelque chose dans la chaîne C et illustrer ce qui se passe.
Si tu ne veux pas utiliser les pointeurs mais que tu peux faire du C99 (avec gcc ajoute -std=c99 à tes options de compilation), alors utilise un code selon les indications ci-dessus https://forums.commentcamarche.net/forum/affich-29423778-creation-d-une-structure-debutant#2 et documentes que tu fais du C99.
Je ne peux pas te dire si cela répond à ce que demande ton prof car je ne connais pas l'énoncé de la question et je me suis contenté de répondre à ta question.
Cela dit, je ne vois pas l'intérêt, dans la vie réelle, de créer une structure contenant la longueur d'un mot pour faire un jeu de pendu, alors qu'il est si simple de déterminer la longueur avec strlen(). Le seul intérêt de ce genre de choses serait pour des applications ayant intensivement et répétitivement besoin de tester la taille de chaînes, et pour lesquelles précalculer et stocker la taille en mémoire permettrait d'améliorer les performances en temps d'exécution.
Pour un dictionnaire de mots à utiliser pour un "pendu", si tu as plusieurs mots à gérer, le plus simple est de faire un tableau de chaînes C et de calculer leur taille avec strlen lorsque tu en as besoin, et de laisser tomber ta struct.
Dal
Si tu ne veux pas utiliser les pointeurs mais que tu peux faire du C99 (avec gcc ajoute -std=c99 à tes options de compilation), alors utilise un code selon les indications ci-dessus https://forums.commentcamarche.net/forum/affich-29423778-creation-d-une-structure-debutant#2 et documentes que tu fais du C99.
Je ne peux pas te dire si cela répond à ce que demande ton prof car je ne connais pas l'énoncé de la question et je me suis contenté de répondre à ta question.
Cela dit, je ne vois pas l'intérêt, dans la vie réelle, de créer une structure contenant la longueur d'un mot pour faire un jeu de pendu, alors qu'il est si simple de déterminer la longueur avec strlen(). Le seul intérêt de ce genre de choses serait pour des applications ayant intensivement et répétitivement besoin de tester la taille de chaînes, et pour lesquelles précalculer et stocker la taille en mémoire permettrait d'améliorer les performances en temps d'exécution.
Pour un dictionnaire de mots à utiliser pour un "pendu", si tu as plusieurs mots à gérer, le plus simple est de faire un tableau de chaînes C et de calculer leur taille avec strlen lorsque tu en as besoin, et de laisser tomber ta struct.
Dal
Xifly
Messages postés
44
Date d'inscription
vendredi 3 janvier 2014
Statut
Membre
Dernière intervention
8 décembre 2017
Modifié par Xifly le 3/01/2014 à 17:05
Modifié par Xifly le 3/01/2014 à 17:05
Finalement ça a l'air de convenir :
#include <stdio.h>
#include <string.h>
int main()
{
int n = 0;
struct Mot
{
int nbLettres;
char lettres[n];
};
struct Mot MARRON;
strcpy(MARRON.lettres, "MARRON");
n = strlen(MARRON.lettres);
MARRON.nbLettres = n;
printf("MARRON.nbLettres = %d - MARRON.lettres = %s\n", MARRON.nbLettres, MARRON.lettres);
printf("strlen MARRON.lettres = %d\n", strlen(MARRON.lettres));
struct Mot CACAHUETE;
strcpy(CACAHUETE.lettres, "CACAHUETE");
n = strlen(CACAHUETE.lettres);
CACAHUETE.nbLettres = n;
printf("CACAHUETE.nbLettres = %d - CACAHUETE.lettres = %s\n", CACAHUETE.nbLettres, CACAHUETE.lettres);
printf("strlen CACAHUETE.lettres = %d\n", strlen(CACAHUETE.lettres));
return 0;
}
[Dal]
Messages postés
6200
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 janvier 2025
1 097
3 janv. 2014 à 17:10
3 janv. 2014 à 17:10
Xifly
Messages postés
44
Date d'inscription
vendredi 3 janvier 2014
Statut
Membre
Dernière intervention
8 décembre 2017
7 janv. 2014 à 00:31
7 janv. 2014 à 00:31
Voilà à peu près à quoi ressemblera mon programme, merci de m'avoir aidé ! :D
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { //Initialisation int i = 0; char lettre; int coupsRestants = 10; int bonneLettre = 0; FILE* fichier = NULL; #define TAILLE_MAX 1000 char motAtrouver[TAILLE_MAX] = ""; fichier = fopen("dictionnaire.txt", "r"); int nombre_mots = 0; int caractereActuel = 0; int nombre_aleatoire = 0; if (fichier != NULL) { do { caractereActuel = fgetc(fichier); if (caractereActuel == '\n') { nombre_mots = nombre_mots + 1; //on comptabilise le nombre de mots dans le dictionnaire } } while (caractereActuel != EOF); fseek(fichier, 0, SEEK_SET); //On remet le pointeur au début du fichier int nombre_aleatoire = rand() % nombre_mots; //On choisi un nombre aléatoire compris entre 0 et le nombre de mots while (nombre_aleatoire > 0) { caractereActuel = fgetc(fichier); if (caractereActuel == '\n') { nombre_aleatoire = nombre_aleatoire - 1; } } fgets(motAtrouver, TAILLE_MAX, fichier); //on va chercher le mot aléatoire motAtrouver[strlen(motAtrouver) - 1] = '\0'; //on supprime le retour à la ligne et on ferme la chaine fclose(fichier); //on referme le dictionnaire } else { printf("Impossible d'ouvrir le dictionnaire"); } //initialisation char lettresTrouvees[strlen(motAtrouver) + 1]; int resteAtrouver = strlen(motAtrouver); //Initialisation de lettresTrouvees for (i=0 ; i < strlen(motAtrouver); i++) { lettresTrouvees[i]= '*'; } lettresTrouvees[strlen(motAtrouver)] = '\0'; while (coupsRestants > 0 & resteAtrouver > 0) { system("cls"); printf("\nVoici le mot a trouver : %s \n\n", lettresTrouvees); printf("Il vous reste %d chance(s)\n\n", coupsRestants); printf("Quelle lettre choississez-vous ? "); //scanf(" %c",&lettre); lettre = getchar(); //mémorise la lettre tapée lettre = toupper(lettre); //mise en majuscule while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée for (i=0 ; i < strlen(motAtrouver); i++) { if (lettre == motAtrouver[i]) { lettresTrouvees[i] = motAtrouver[i]; bonneLettre = bonneLettre + 1; //permet de savoir si le joueur a trouvé au moins une lettre à cette manche resteAtrouver = resteAtrouver - 1;//permet de comptabiliser le nombre de lettre qu'il lui reste à trouver } } if (bonneLettre == 0) { coupsRestants = coupsRestants - 1; } bonneLettre = 0; //on remet le compteur a zéro pour chaque manche } if (resteAtrouver == 0) { system("cls"); printf("\nVoici le mot a trouver : %s \n\n", lettresTrouvees); printf("Vous avez gagn\202 ! :D \n"); } else { if (coupsRestants == 0) { printf("Vous avez perdu, le mot à trouver \202t\202 %s \n",motAtrouver); } else { system("cls"); } } return 0; }
[Dal]
Messages postés
6200
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 janvier 2025
1 097
Modifié par [Dal] le 7/01/2014 à 14:11
Modifié par [Dal] le 7/01/2014 à 14:11
Avant d'utiliser rand, tu devrais l'initialiser en appelant srand au début de ton programme (pas dans ta boucle). Vois cet exemple : http://www.cplusplus.com/reference/cstdlib/rand/ qui utilise de façon classique time pour l'initialisation.
Tu devras faire #include <time.h> pour utiliser time et tu as oublié #include <ctype.h> pour toupper.
Tu as déclaré nombre_aleatoire deux fois. Tu peux supprimer l'une des deux déclarations.
Ton
Quelques petites remarques.
Tu comptes le nombre de mots disponibles dans dictionnaire.txt en décomptant le nombre de '\n' qu'il contient. Cela décomptera un nombre exact si tous les mots, y compris le dernier, sont terminés par un retour à la ligne (ce qui veut dire que dictionnaire.txt doit se terminer par une ligne vide).
Ton dictionnaire doit être en lettres majuscules. C'est un choix, mais s'il contient des caractères accentués, toupper ne les transformera pas et tu devras les inclure en minuscules dans dictionnaire.txt (par exemple : éCOLE).
Dal
Tu devras faire #include <time.h> pour utiliser time et tu as oublié #include <ctype.h> pour toupper.
Tu as déclaré nombre_aleatoire deux fois. Tu peux supprimer l'une des deux déclarations.
Ton
while (coupsRestants > 0 & resteAtrouver > 0)est faux, car tu veux certainement dire
while ( (coupsRestants > 0) && (resteAtrouver > 0) )(avec "&&", donc).
Quelques petites remarques.
Tu comptes le nombre de mots disponibles dans dictionnaire.txt en décomptant le nombre de '\n' qu'il contient. Cela décomptera un nombre exact si tous les mots, y compris le dernier, sont terminés par un retour à la ligne (ce qui veut dire que dictionnaire.txt doit se terminer par une ligne vide).
Ton dictionnaire doit être en lettres majuscules. C'est un choix, mais s'il contient des caractères accentués, toupper ne les transformera pas et tu devras les inclure en minuscules dans dictionnaire.txt (par exemple : éCOLE).
Dal
Xifly
Messages postés
44
Date d'inscription
vendredi 3 janvier 2014
Statut
Membre
Dernière intervention
8 décembre 2017
22 janv. 2014 à 22:17
22 janv. 2014 à 22:17
Voici le rendu final :
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <ctype.h> char flettre (char lettre) { int ascii = 0; lettre = toupper(lettre); //mise en majuscule while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée ascii = lettre; while ( (ascii < 65) || (ascii > 90) ) { printf("\nVotre caract\212re n'est pas valide.\nVous devez entrer une lettre.\nLes accents ne sont pas pris en compte.\n\nVeuillez saisir une nouvelle lettre : "); lettre = getchar(); //mémorise la lettre tapée lettre = toupper(lettre); //mise en majuscule while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée ascii = lettre; } return (lettre); } int main(void) { //Initialisation int i = 0; char lettre; int coupsRestants = 10; int bonneLettre = 0; int ascii = 0; FILE* fichier = NULL; #define TAILLE_MAX 1000 char motAtrouver[TAILLE_MAX] = ""; fichier = fopen("dictionnaire.txt", "r"); int nombre_mots = 0; int caractereActuel = 0; char lettre_utilisees[26]; //Initialiser la graine aléatoire: srand (time (NULL)); if (fichier != NULL) { do { caractereActuel = fgetc(fichier); if (caractereActuel == '\n') { nombre_mots = nombre_mots + 1; //on comptabilise le nombre de mots dans le dictionnaire } } while (caractereActuel != EOF); fseek(fichier, 0, SEEK_SET); //On remet le pointeur au début du fichier int nombre_aleatoire = rand() % nombre_mots; //On choisi un nombre aléatoire compris entre 0 et le nombre de mots while (nombre_aleatoire > 0) { caractereActuel = fgetc(fichier); if (caractereActuel == '\n') { nombre_aleatoire = nombre_aleatoire - 1; } } fgets(motAtrouver, TAILLE_MAX, fichier); //on va chercher le mot aléatoire motAtrouver[strlen(motAtrouver) - 1] = '\0'; //on supprime le retour à la ligne et on ferme la chaine fclose(fichier); //on referme le dictionnaire } else { printf("Impossible d'ouvrir le dictionnaire"); } //initialisation char lettresTrouvees[strlen(motAtrouver) + 1]; int resteAtrouver = strlen(motAtrouver); //Initialisation de lettresTrouvees for (i=0 ; i < strlen(motAtrouver); i++) { lettresTrouvees[i]= '*'; } lettresTrouvees[strlen(motAtrouver)] = '\0'; //Initialisation de lettre_utilises for (i=0 ; i < strlen(lettre_utilisees); i++) { lettre_utilisees[i]= '-'; } lettre_utilisees[strlen(lettre_utilisees)] = '\0'; while ( (coupsRestants > 0) && (resteAtrouver > 0) ) { system("cls"); switch(coupsRestants) { case 1 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | /( )\\ |\n"); printf("| | / |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 2 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | /( )\\ |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 3 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | /( ) |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 4 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | ( ) |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 5 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 6: printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | |\n"); printf("| | |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 7: printf("___________________\n"); printf("| |\n"); printf("| |\n"); printf("| | |\n"); printf("| | |\n"); printf("| | |\n"); printf("| | |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 8: printf("___________________\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| ___ ___ |\n"); printf("|_________________|\n"); break; case 9: printf("___________________\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("|_________________|\n"); break; case 10: printf("___________________\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("|_________________|\n"); break; } printf("\nVoici le mot a trouver : %s \n\n", lettresTrouvees); printf("Il vous reste %d chance(s)\n\n", coupsRestants); printf("Vous avez déja utilisé les lettres suivantes :"); for (i=0 ; i < strlen(lettre_utilisees) ; i++) { if (lettre_utilisees[i] != '-') { printf("%c",lettre_utilisees[i]); } } printf("\n\nQuelle lettre choississez-vous ? "); lettre = getchar(); //mémorise la lettre tapée lettre = flettre(lettre); ascii = lettre; lettre_utilisees[ascii-65] = lettre; for (i=0 ; i < strlen(motAtrouver); i++) { if (lettre == motAtrouver[i]) { lettresTrouvees[i] = motAtrouver[i]; bonneLettre = bonneLettre + 1; //permet de savoir si le joueur a trouvé au moins une lettre à cette manche resteAtrouver = resteAtrouver - 1;//permet de comptabiliser le nombre de lettre qu'il lui reste à trouver } } if (bonneLettre == 0) { coupsRestants = coupsRestants - 1; } bonneLettre = 0; //on remet le compteur a zéro pour chaque manche if (resteAtrouver == 0) { printf("\nVous avez gagn\202 ! :D \n"); } } if (coupsRestants ==0) { system("cls"); printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | /( )\\ |\n"); printf("| | / \\ |\n"); printf("| ___|___ |\n"); printf("|_________________|\n\n"); printf("Vous avez perdu, le mot \205 trouver \202t\202 %s \n",motAtrouver); } return 0; }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
22 janv. 2014 à 22:44
22 janv. 2014 à 22:44
C'est mieux, mais c'est loin d'être le top. D'une manière générale, tu n'utilises pas assez de fonctions(). Du coup ton programme n'est pas lisible.
Ci-dessous quelques remarques pour améliorer ton code. Ce n'est pas exhaustif, j'ai pas lu jusqu'à la fin (ne sachant pas si t'allais tenir compte des remarques ;-)).
#define TAILLE_MAX 1000
C'est moche de mettre ça dans le main. La place est plutôt après les #include.
On aurait préféré plus de fonctions pour l'affichage de pendu (printf()). C'est beaucoup plus propre, et cela allège le main(). Une autre fonction aussi aurait dû être faite pour compter le nombre de lignes dans le fichier.
if (caractereActuel == '\n')
{
nombre_mots = nombre_mots + 1; //on comptabilise le nombre de mots dans le dictionnaire
}
} while (caractereActuel != EOF);
Attention, à bien compter le dernier mot si le fichier ne se termine pas par une ligne vide. T'aurais pu utiliser des fgets(), plus performant pour lire une ligne.
while (nombre_aleatoire > 0)
{
caractereActuel = fgetc(fichier);
if (caractereActuel == '\n')
{
nombre_aleatoire = nombre_aleatoire - 1;
}
}
Pas très lisible fonctionnellement.
fseek(fichier, 0, SEEK_SET);
Ou rewind(); tout simplement :-).
int nombre_aleatoire
Généralement, on met les déclarations en début de bloc.
char lettresTrouvees[strlen(motAtrouver) + 1];
Même remarque, plutôt à mettre en début de bloc. La syntaxe que tu utilises n'est pas conseillé (fonctionnalité C99...). Utilise plutôt malloc().
motAtrouver[strlen(motAtrouver) - 1] = '\0'; //on supprime le retour à la ligne et on ferme la chaine
Bof. Cela ne supprime pas le retour à la ligne mais le dernier caractère. La différence se fera ressentir pour le dernier mot du fichier (sauf s'il y a une ligne vide après).
Généralement, on utilise char *p; if ((p = strchr(motAtrouver,'\n')) != NULL) *p='\0';
Bien sûr, dans une fonction, c'est encore mieux :-).
Bon courage,
Cdlt,
Ci-dessous quelques remarques pour améliorer ton code. Ce n'est pas exhaustif, j'ai pas lu jusqu'à la fin (ne sachant pas si t'allais tenir compte des remarques ;-)).
#define TAILLE_MAX 1000
C'est moche de mettre ça dans le main. La place est plutôt après les #include.
On aurait préféré plus de fonctions pour l'affichage de pendu (printf()). C'est beaucoup plus propre, et cela allège le main(). Une autre fonction aussi aurait dû être faite pour compter le nombre de lignes dans le fichier.
if (caractereActuel == '\n')
{
nombre_mots = nombre_mots + 1; //on comptabilise le nombre de mots dans le dictionnaire
}
} while (caractereActuel != EOF);
Attention, à bien compter le dernier mot si le fichier ne se termine pas par une ligne vide. T'aurais pu utiliser des fgets(), plus performant pour lire une ligne.
while (nombre_aleatoire > 0)
{
caractereActuel = fgetc(fichier);
if (caractereActuel == '\n')
{
nombre_aleatoire = nombre_aleatoire - 1;
}
}
Pas très lisible fonctionnellement.
while(nombre_aleatoire >= 0 && fgets(motAtrouver, TAILLE_MAX, fichier) != NULL) { nombre_aleatoire--; }
fseek(fichier, 0, SEEK_SET);
Ou rewind(); tout simplement :-).
int nombre_aleatoire
Généralement, on met les déclarations en début de bloc.
char lettresTrouvees[strlen(motAtrouver) + 1];
Même remarque, plutôt à mettre en début de bloc. La syntaxe que tu utilises n'est pas conseillé (fonctionnalité C99...). Utilise plutôt malloc().
motAtrouver[strlen(motAtrouver) - 1] = '\0'; //on supprime le retour à la ligne et on ferme la chaine
Bof. Cela ne supprime pas le retour à la ligne mais le dernier caractère. La différence se fera ressentir pour le dernier mot du fichier (sauf s'il y a une ligne vide après).
Généralement, on utilise char *p; if ((p = strchr(motAtrouver,'\n')) != NULL) *p='\0';
Bien sûr, dans une fonction, c'est encore mieux :-).
Bon courage,
Cdlt,
Xifly
Messages postés
44
Date d'inscription
vendredi 3 janvier 2014
Statut
Membre
Dernière intervention
8 décembre 2017
Modifié par Xifly le 22/01/2014 à 23:32
Modifié par Xifly le 22/01/2014 à 23:32
Ah oui ça j'ai remarqué que j'utilisé pas assez de fonctions ... mais j'avoue avoir un peu de mal encore avec celà :S
Sinon oui oui, toutes remarques sont bonnes à prendre, surtout à mon niveau :)
J'essaie de corriger tout ceci ;)
Merci pour tout
Et sinon oui, mon dictionnaire se termine par une ligne vide
Sinon oui oui, toutes remarques sont bonnes à prendre, surtout à mon niveau :)
J'essaie de corriger tout ceci ;)
Merci pour tout
Et sinon oui, mon dictionnaire se termine par une ligne vide
Xifly
Messages postés
44
Date d'inscription
vendredi 3 janvier 2014
Statut
Membre
Dernière intervention
8 décembre 2017
22 janv. 2014 à 23:43
22 janv. 2014 à 23:43
Mettre la lecture du dictionnaire en fonction donnerais qqch comme ceci ? (sachant qu'il dois y avoir une erreur quelque part) :
char fmotAtrouver (FILE* fichier, char motAtrouver) { int caractereActuel = 0; int nombre_mots = 0; char *p; int nombre_aleatoire = 0; if (fichier != NULL) { do { caractereActuel = fgetc(fichier); if (caractereActuel == '\n') { nombre_mots = nombre_mots + 1; //on comptabilise le nombre de mots dans le dictionnaire } } while (caractereActuel != EOF); rewind(fichier); //On remet le pointeur au début du fichier int nombre_aleatoire = rand() % nombre_mots; //On choisi un nombre aléatoire compris entre 0 et le nombre de mots while(nombre_aleatoire >= 0 && fgets(motAtrouver, TAILLE_MAX, fichier) != NULL) { nombre_aleatoire--; } fgets(motAtrouver, TAILLE_MAX, fichier); //on va chercher le mot aléatoire if ((p = strchr(motAtrouver,'\n')) != NULL) *p='\0'; //on supprime le retour à la ligne et on ferme la chaine fclose(fichier); //on referme le dictionnaire } else { printf("Impossible d'ouvrir le dictionnaire"); } return motAtrouver; }
[Dal]
Messages postés
6200
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 janvier 2025
1 097
23 janv. 2014 à 10:48
23 janv. 2014 à 10:48
Salut Xifly,
Le prototype de ta fonction sera plutôt
Tu passes motAtrouver qui est un tableau de char. Lorsqu'il est passé à la fonction de cette façon
Tu n'as pas retiré la double déclaration de nombre_aleatoire que je te signalais. Supprime, par exemple la première
Personnellement, je n'incluerai pas dans la fonction la vérification de l'ouverture correcte du fichier si la fonction n'a pas pour tâche d'ouvrir le fichier. Cela disperse le code pertinent.
Dal
Le prototype de ta fonction sera plutôt
void fmotAtrouver(FILE* fichier, char * motAtrouver)
Tu passes motAtrouver qui est un tableau de char. Lorsqu'il est passé à la fonction de cette façon
fmotAtrouver(fichier, motAtrouver);, ce que tu passes, c'est le pointeur vers le premier élément du tableau. Vu que tu passes un pointeur, ta fonction va pouvoir directement modifier la variable et tu n'as pas besoin de return.
Tu n'as pas retiré la double déclaration de nombre_aleatoire que je te signalais. Supprime, par exemple la première
int nombre_aleatoire = 0;, qui n'est, en fait, pas utilisée dans ton code.
Personnellement, je n'incluerai pas dans la fonction la vérification de l'ouverture correcte du fichier si la fonction n'a pas pour tâche d'ouvrir le fichier. Cela disperse le code pertinent.
Dal
Xifly
Messages postés
44
Date d'inscription
vendredi 3 janvier 2014
Statut
Membre
Dernière intervention
8 décembre 2017
23 janv. 2014 à 14:55
23 janv. 2014 à 14:55
Donc ma fonction est la suivante :
J'appelle ma fonction en faisant ainsi :
Mais la console m'indique encore une erreur ... J'avoue que là je suis un peu dépassé, je ne comprend pas trop où est l'erreur
void fmotAtrouver(FILE* fichier, char * motAtrouver) { int caractereActuel = 0; int nombre_mots = 0; char *p; do { caractereActuel = fgetc(fichier); if (caractereActuel == '\n') { nombre_mots = nombre_mots + 1; //on comptabilise le nombre de mots dans le dictionnaire } } while (caractereActuel != EOF); rewind(fichier); //On remet le pointeur au début du fichier int nombre_aleatoire = rand() % nombre_mots; //On choisi un nombre aléatoire compris entre 0 et le nombre de mots while(nombre_aleatoire >= 0 && fgets(motAtrouver, TAILLE_MAX, fichier) != NULL) { nombre_aleatoire--; } fgets(motAtrouver, TAILLE_MAX, fichier); //on va chercher le mot aléatoire if ((p = strchr(motAtrouver,'\n')) != NULL) *p='\0'; //on supprime le retour à la ligne et on ferme la chaine fclose(fichier); //on referme le dictionnaire return motAtrouver; }
J'appelle ma fonction en faisant ainsi :
if (fichier != NULL) { fmotAtrouver(motAtrouver); } else { printf("Impossible d'ouvrir le dictionnaire"); }
Mais la console m'indique encore une erreur ... J'avoue que là je suis un peu dépassé, je ne comprend pas trop où est l'erreur