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
Bonjour,

Voila je suis paumé avec un programme, j'apprend l'informatique et je n'arrive pas à finir se truc!
Le programme tourne en C mais il calcule pas le resultat correctement. Suis pas un as alors je vous demande vôtre aide...

Merci d'avance, je vous met se mon programme ci dessous:

# include <stdio.h>

int alea()
{
int jeu;
jeu=rand()%10+1;
getch();
return jeu;
}

struct vp
{
char ville[50];
char province[50];
};

main ()

{
srand(time(0));
char reponse;
int p,rand,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);
fflush(stdin);

if(reponse=tvp[rand].province)
{
resultat=resultat+1;
}
}

printf("Vous avez eu %d \n",resultat);
system("pause");
return 0;
}

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
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
0
Merci de ta réponse, j'ai fais se que j'ai pu mais je suis pas trés doué, le programme veut bien s'executer mais mnt j'ai tjs 0... Je continue à me casser la tete. Je te laisse se dessous se que j'ai changé.

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;
}
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 à 17:49
Salut,
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;
}
0
Super, merci beaucoup.. Mais il me reste un soucis, il pose plusieurs fois la meme question et quand ca arrive il compte qu'une fois le bon point se qui fais que avec un doublon j'obtiens que 4 ou lieu de 5...

Je vois pas comment empecher les doubons :(
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
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.
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;
}
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
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
0