Qu'es ce qui marche pas la dedans, program c
Fermé
frimeman
-
6 juin 2009 à 15:40
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 6 juin 2009 à 20:55
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 6 juin 2009 à 20:55
A voir également:
- Qu'es ce qui marche pas la dedans, program c
- Invalid configuration information please run setup program ✓ - Forum Windows XP
- Program files - Forum Windows 10
- This program cannot be run in dos mode ✓ - Forum Programmation
- Program files (x86) ? - Forum Windows
- Windows ne trouve pas c program - Forum Windows 8 / 8.1
4 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
6 juin 2009 à 17:03
6 juin 2009 à 17:03
Salut,
Voici déjà les quelques erreurs que je vois à première vue :
T'as oublié d'inclure stdlb.h (pour srand et rand) et time.h (pour time()).
main ()
Tu dois spécifier que main renvoie un int. Donc int main(void)
int rand;
N'appelle pas tes variables avec un nom de fonction sinon le compilateur grognera lorsque tu devras appeler la fonction.
scanf("%s",&reponse);
Ne mets pas d'esperluette (&) puisque reponse désignera l'adresse dans ce contexte.
Attention, tu as mal déclaré ta variable reponse. Tu dois l'allouer. Ce qui donne : char reponse[50] (50 signifie que tu alloues un tableau de 50 char).
fflush(stdin);
Cette instruction a un comportement indéfini. Si tu veux vider l'entrée, tu dois utiliser :
int c; while((c=getchar())!='\n' && c!=EOF)
if(reponse=tvp[rand].province)
L'opérateur égale fera complètement autre chose (soit un bug si reponse est un tableau, soit une affectation si reponse est un pointeur). De plus, je tiens à rappeler que l'opérateur d'égalité en C est le double égal (==).
En C, pour comparer deux tableaux de caractères, on utilise la fonction strcmp (ou strncmp)
if(strcmp(reponse,tvp[varRand].province)==0) { //si c'est égale ...
Corrige déjà ça, le compilateur devrait voir beaucoup moins d'erreurs.
Cdlt
Voici déjà les quelques erreurs que je vois à première vue :
T'as oublié d'inclure stdlb.h (pour srand et rand) et time.h (pour time()).
main ()
Tu dois spécifier que main renvoie un int. Donc int main(void)
int rand;
N'appelle pas tes variables avec un nom de fonction sinon le compilateur grognera lorsque tu devras appeler la fonction.
scanf("%s",&reponse);
Ne mets pas d'esperluette (&) puisque reponse désignera l'adresse dans ce contexte.
Attention, tu as mal déclaré ta variable reponse. Tu dois l'allouer. Ce qui donne : char reponse[50] (50 signifie que tu alloues un tableau de 50 char).
fflush(stdin);
Cette instruction a un comportement indéfini. Si tu veux vider l'entrée, tu dois utiliser :
int c; while((c=getchar())!='\n' && c!=EOF)
if(reponse=tvp[rand].province)
L'opérateur égale fera complètement autre chose (soit un bug si reponse est un tableau, soit une affectation si reponse est un pointeur). De plus, je tiens à rappeler que l'opérateur d'égalité en C est le double égal (==).
En C, pour comparer deux tableaux de caractères, on utilise la fonction strcmp (ou strncmp)
if(strcmp(reponse,tvp[varRand].province)==0) { //si c'est égale ...
Corrige déjà ça, le compilateur devrait voir beaucoup moins d'erreurs.
Cdlt
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
6 juin 2009 à 17:49
6 juin 2009 à 17:49
Salut,
Il reste quelques erreurs (t'as toujours pas supprimé la variable rand).
Voici une correction de ton code :
Il reste quelques erreurs (t'as toujours pas supprimé la variable rand).
Voici une correction de ton code :
#include <stdio.h> #include <stdlib.h> #include <time.h> int alea() { int jeu; jeu=rand()%10+1; return jeu; } struct vp { char ville[50]; char province[50]; }; int main(void) { int varRand; int c; srand(time(NULL)); char reponse[50]; int p,resultat=0; struct vp tvp[100]={"Wavre","Brabant Wallon","Charleroi","Hainaut","Bruxelle","Bruxelle capitale","Bruges","Flandre-Occidentale","Louvain","Brabant Flamand","Namur","Namur","Liege","Liege","Arlon","Luxembourg","Anvers","Anvers","Hasselt","Limbourg","Gand","Flandre-Orientale"}; for(p=0;p<5;p++) { varRand=alea(); printf("Quel est la province de la ville de %s \n",tvp[varRand].ville); scanf("%s",reponse); while((c=getchar())!='\n' && c!=EOF); if(strcmp(reponse,tvp[varRand].province)==0) { resultat=resultat+1; } } printf("Vous avez eu %d \n",resultat); system("pause"); return 0; }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
6 juin 2009 à 18:30
6 juin 2009 à 18:30
Normal, puisque tu tires des pseudo-aléatoires à chaque itération sans vérifier s'il a déjà été choisi ou pas.
Pour avoir unicité, je te conseille de créer un tableau choix défini comme suit : int tab[10]; for(p=0;p<10;p++) tab[p]=p;
Ensuite, il ne te reste plus qu'à mélanger les cases (inversion d'éléments du tableau) lors de plusieurs itérations (5 environs). Et le tour est joué, il ne te reste plus qu'à prendre les 5 premiers éléments. Tu seras sûr d'avoir unicité des valeurs pseudo-aléatoires.
J'avais pas vu mais lorsque tu fais rand()%10+1 (hormis le fait que le modulo ce n'est pas terrible et qu'il vaut mieux utiliser la multiplication et division), je ne comprends pas pourquoi tu mets + 1 ? N'oublie pas qu'un tableau en C commence à l'indice 0.
Pour avoir unicité, je te conseille de créer un tableau choix défini comme suit : int tab[10]; for(p=0;p<10;p++) tab[p]=p;
Ensuite, il ne te reste plus qu'à mélanger les cases (inversion d'éléments du tableau) lors de plusieurs itérations (5 environs). Et le tour est joué, il ne te reste plus qu'à prendre les 5 premiers éléments. Tu seras sûr d'avoir unicité des valeurs pseudo-aléatoires.
J'avais pas vu mais lorsque tu fais rand()%10+1 (hormis le fait que le modulo ce n'est pas terrible et qu'il vaut mieux utiliser la multiplication et division), je ne comprends pas pourquoi tu mets + 1 ? N'oublie pas qu'un tableau en C commence à l'indice 0.
Merci encore mais je ne sais pas trop ou mettre le tableau pour l'unicité, en fait je suis occupé a faire un programme plus compliqué que ca, j'ai fusionné deux programme, celui que je t'ai montré, et un autre qui gere le nom de joueurs, pour finir pas pouvoir avoir un jeu de question ou plusieurs personne peuvent jouer et finissant par afficher leurs resultat trié par leur nom. Et mnt il me reste deux soucis, le premier celui de l'unicité des question, le 2ie c'est l'affichage des resultats, le programme tourne mais a la fin il affiche un seul résultat, le meme pour tout les joueurs... Ha oui et a la fin j'ai envie de faire une moyenne globale de tout les joueurs.. ha ha je crois que je vais trop loin pour mes capacités. Pour se qui est du 10+1, c'est ma prof qui nous a dis de faire comme ca, il y'a 11 question réponse et apparement c'est pour ca!
Sympa ton site ;)
je te met ci dessous l'entiereté du programme:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct questionnaire
{
char prenom[20];
};
int alea()
{
int jeu;
jeu=rand()%10+1;
return jeu;
}
struct vp
{
char ville[50];
char province[50];
};
int main(void)
{
int varRand,p,resultat=0,c,i=0,nbjoueur=0;
srand(time(NULL));
char reponse[50];
struct questionnaire t[20];
printf("Combien de joueurs y'a t'il? \n");
fflush(stdin);
scanf("%d",&nbjoueur);
for(i=0;i<nbjoueur;i++)
{
printf("Quel est le prenom du joueur? \n");
fflush(stdin);
gets(t[i].prenom);
struct vp tvp[100]={"Wavre","Brabant Wallon","Charleroi","Hainaut","Bruxelle","Bruxelle Capitale","Bruges","Flandre-Occidentale","Louvain","Brabant Flamand","Namur","Namur","Liege","Liege","Arlon","Luxembourg","Anvers","Anvers","Hasselt","Limbourg","Gand","Flandre-Orientale"};
for(p=0;p<5;p++)
{
varRand=alea();
printf("Quel est la province de la ville de %s \n",tvp[varRand].ville);
scanf("%s",reponse);
while((c=getchar())!='\n' && c!=EOF);
if(strcmp(reponse,tvp[varRand].province)==0)
{
resultat=resultat+1;
}
}
}
for(i=0;i<nbjoueur;i++)
{
printf("Prenom : %s \n",t[i].prenom);
printf("Vous avez eu %d \n",resultat);
}
system("pause");
return 0;
}
Sympa ton site ;)
je te met ci dessous l'entiereté du programme:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct questionnaire
{
char prenom[20];
};
int alea()
{
int jeu;
jeu=rand()%10+1;
return jeu;
}
struct vp
{
char ville[50];
char province[50];
};
int main(void)
{
int varRand,p,resultat=0,c,i=0,nbjoueur=0;
srand(time(NULL));
char reponse[50];
struct questionnaire t[20];
printf("Combien de joueurs y'a t'il? \n");
fflush(stdin);
scanf("%d",&nbjoueur);
for(i=0;i<nbjoueur;i++)
{
printf("Quel est le prenom du joueur? \n");
fflush(stdin);
gets(t[i].prenom);
struct vp tvp[100]={"Wavre","Brabant Wallon","Charleroi","Hainaut","Bruxelle","Bruxelle Capitale","Bruges","Flandre-Occidentale","Louvain","Brabant Flamand","Namur","Namur","Liege","Liege","Arlon","Luxembourg","Anvers","Anvers","Hasselt","Limbourg","Gand","Flandre-Orientale"};
for(p=0;p<5;p++)
{
varRand=alea();
printf("Quel est la province de la ville de %s \n",tvp[varRand].ville);
scanf("%s",reponse);
while((c=getchar())!='\n' && c!=EOF);
if(strcmp(reponse,tvp[varRand].province)==0)
{
resultat=resultat+1;
}
}
}
for(i=0;i<nbjoueur;i++)
{
printf("Prenom : %s \n",t[i].prenom);
printf("Vous avez eu %d \n",resultat);
}
system("pause");
return 0;
}
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
6 juin 2009 à 20:55
6 juin 2009 à 20:55
Attention au fflush(stdin). En aucun cas, il ne faut l'employer. Oublie complètement cette instruction.
Avant un scanf, tu n'as pas besoin de flusher l'entrée, par contre après un scanf, il vaut mieux le faire. Dans ce cas, tu dois utiliser la commande que je t'ai donnée plus haut (while....).
Sinon, pour l'utilisation du tableau contenant les différents indices des questions à mélanger par permutation, tu peux t'entraîner sur un autre projet en guise d'exercice (très formateur).
Tu peux t'inspirer du pseudo-code que j'ai laissé lors de ce post : http://www.commentcamarche.net/forum/affich 12760824 tableau aleatoire?#6
Cdlt
Avant un scanf, tu n'as pas besoin de flusher l'entrée, par contre après un scanf, il vaut mieux le faire. Dans ce cas, tu dois utiliser la commande que je t'ai donnée plus haut (while....).
Sinon, pour l'utilisation du tableau contenant les différents indices des questions à mélanger par permutation, tu peux t'entraîner sur un autre projet en guise d'exercice (très formateur).
Tu peux t'inspirer du pseudo-code que j'ai laissé lors de ce post : http://www.commentcamarche.net/forum/affich 12760824 tableau aleatoire?#6
Cdlt
6 juin 2009 à 17:38
Encore merci :)
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
int alea()
{
int jeu;
jeu=rand()%10+1;
getch();
return jeu;
}
struct vp
{
char ville[50];
char province[50];
};
int main(void)
{
int rand;
int varRand;
int c;
srand(time(0));
char reponse[50];
int p,resultat=0;
struct vp tvp[100]={"Wavre","Brabant Wallon","Charleroi","Hainaut","Bruxelle","Bruxelle capitale","Bruges","Flandre-Occidentale","Louvain","Brabant Flamand","Namur","Namur","Liege","Liege","Arlon","Luxembourg","Anvers","Anvers","Hasselt","Limbourg","Gand","Flandre-Orientale"};
for(p=0;p<5;p++)
{
rand=alea();
printf("Quel est la province de la ville de %s \n",tvp[rand].ville);
scanf("%s",reponse);
while((c=getchar())!='\n' && c!=EOF)
if(strcmp(reponse,tvp[varRand].province)==0)
{
resultat=resultat+1;
}
}
printf("Vous avez eu %d \n",resultat);
system("pause");
return 0;
}