Faire un classement en C

Fermé
nico - 18 juin 2008 à 14:58
kazouu Messages postés 466 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 - 19 juin 2008 à 09:45
Bonjour,
je suis en train d'essayer de faire un programme qui classe des equipes.
Le problème c'est que je n'arrive pas à utiliser des pointeurs de structure qui me permettrait de changer des valeurs en appelant certaines fonctions

#include <stdio.h>
#include <stdlib.h>

typedef struct classement c;
struct Equipe
{
char* nom;
int classement;
int point;
int gagne;
int nul;
int perdu;
int butpour;
int butcontre;
};

struct classement
{
struct Equipe e[2];
int journee;
};

void match(struct Equipe* e1,struct Equipe* e2) {
int score1,score2;
printf("match %s contre %s",*e1.nom,*e2.nom);
scanf("%d",&score1);
scanf("%d",&score2);
*e1.butpour+=score1;
*e1.butcontre+=score2;
*e2.butpour+=score2;
*e2.butcontre+=score1;
}

int main()
{
struct classement c;
//struct classement* c = (struct classement *) malloc(sizeof(struct classement));
c.e[0].point=0;
c.e[1].point=0;
c.e[0].nom="a";
c.e[1].nom="b";
match(&c.e[0],&c.e[1]);
if((c.e[0].point>c.e[1].point)||((c.e[0].point==c.e[1].point)&&((c.e[0].butpour-c.e[0].butcontre)>(c.e[1].butpour-c.e[1].butcontre)))) {
printf("%s %d\n",c.e[0].nom,c.e[0].point);
printf("%s %d\n",c.e[1].nom,c.e[1].point);
}
else {
printf("%s %d\n",c.e[1].nom,c.e[1].point);
printf("%s %d\n",c.e[0].nom,c.e[0].point);
}
}

Il me met comme erreur

request for member «nom» in something not a structure or union dans la fonction match
incompatible type for argument 2 of «match» dans le main en appelant la fonction

22 réponses

kazouu Messages postés 466 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
18 juin 2008 à 15:01
essai (*e1)->nom
0
acyd Messages postés 11 Date d'inscription mercredi 18 juin 2008 Statut Membre Dernière intervention 19 juin 2008 3
18 juin 2008 à 15:05
Bonjour, apparemment vous passez à la fonction match un pointeur vers la structure classement (&c.e[0]) alors qu'elle attend un pointeur vers une équipe (&e[0]).

Pas sur, mais je crois que c'est autour de cela qu'il faut chercher...

A+
0
kazouu Messages postés 466 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
18 juin 2008 à 15:10
moi je dirai plutot

match ( &(c.e[0]) , &(c.e[1]) );
0
Non on peut pas faire ca, le compilateur ne vas pas reconnaitre e appartenant à c;
Le mieux c'est peut d'être de mettre c en entrée sortie et le numero des équipes en entrée.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kazouu Messages postés 466 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
18 juin 2008 à 15:17
je pense que tu peux le faire comme ca

match attend une equipe*
void match(struct Equipe* e1,struct Equipe* e2)


or
c.e[0] est une équipe donc il faut lui passer l'adresse
0
il me met toujours
request for member «nom» in something not a structure or union dans la fonction match
si je fais ca kazzouu
0
kazouu Messages postés 466 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
18 juin 2008 à 15:18
oui mais ca t'enleve deja la 2eme erreur c'est deja ca
0
kazouu Messages postés 466 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
18 juin 2008 à 15:20
pour la fonction match ca doit etre soit

printf("match %s contre %s",(*e1).nom,(*e2).nom);
soit

printf("match %s contre %s",(*e1)->nom,(*e2)->nom);

pas trop envi de sortir le compilateur =)
0
en fait j'ai pas mis toute les erreurs c'est à chaque fois que j'utilise *e1 dans la fonction match que ca marque cette erreur
comme si il reconnait pas que c'est une structure
0
bien joué c'est ca
mon classement marche maintenant
enfin je dois quand même l'ameliorer
0
j'ai oublié de dire c'était la premiere solution qui était bonne
0
kazouu Messages postés 466 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
18 juin 2008 à 15:27
essai comme ca alors ce devrai marcher niquel

void match(struct Equipe* e1,struct Equipe* e2) {
int score1,score2;
printf("match %s contre %s",(*e1).nom,(*e2).nom);
scanf("%d",&score1);
scanf("%d",&score2);
(*e1).butpour+=score1;
(*e1).butcontre+=score2;
(*e2).butpour+=score2;
(*e2).butcontre+=score1;
}
0
c'est exactement ce que j'ai fait
0
par contre j'aurais une question pratique
que me conseillez vous pour garder en mémoire tout les résultats de tout les matchs.

J'ai pensé à rajouter 1 tableau adversaire(pour savoir contre qui une equipe a déjà joué)
et une matrice pour enregistrer tout les resultats

j'ai pour but de tout enregistrer dans une base de donnée pour regarder à tout moment les scores des anciennes rencontres et comme j'ai jamais fait d'uml je sais pas trop comment faire.
0
kazouu Messages postés 466 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
18 juin 2008 à 15:53
moi je te conseil un write dans un fichier .txt
0
ouai ca sera pas trop lourd, un peu chiant à programmer avec des concatenations et deconcatenations de chaine
mais après ca ira
et c'est pas trop embettant non plus si j'ai envie de modifier mon programme, par exemple en faisant un tirage au sort pour savoir contre qui vont jouer les equipes.
0
kazouu Messages postés 466 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
18 juin 2008 à 16:24
les concaténation de chaine se font très bien avec STRCONCAT et le write y'a pas plus simple
0
ca à l'air de marcher.
je dois juste me concentrer sur l'algorithme qui va s'occuper de calculer la position des equipes au classement selon les vrais regles de football et l'afficher.
0
kazouu Messages postés 466 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
18 juin 2008 à 16:32
tu as juste a comparer le score que tu rentre dans la fonction match et a incrementer les points de chacune des deux equipes en fonction du score :)

void match(struct Equipe* e1,struct Equipe* e2) {
int score1,score2;
printf("match %s contre %s",(*e1).nom,(*e2).nom);
scanf("%d",&score1);
scanf("%d",&score2);
(*e1).butpour+=score1;
(*e1).butcontre+=score2;
(*e2).butpour+=score2;
(*e2).butcontre+=score1;

if(score1>score2)(*e1).score+=3;
if(score1<score2)(*e2).score+=3;
else {(*e1).score+=1;(*e1).score+=1;}
}
0
pour calculer les points et la difference de but c'est simple
mais pour dire si le club est 1er,2eme,3eme...c'est pas si simple
dans ma tête je vois que des if else pour le savoir
doit y avoir autre chose de plus simple
0