Faire un classement en C

nico -  
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   12
 
essai (*e1)->nom
0
acyd Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   3
 
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   Statut Membre Dernière intervention   12
 
moi je dirai plutot

match ( &(c.e[0]) , &(c.e[1]) );
0
nico
 
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   Statut Membre Dernière intervention   12
 
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
nico
 
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   Statut Membre Dernière intervention   12
 
oui mais ca t'enleve deja la 2eme erreur c'est deja ca
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12
 
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
nico
 
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
nico
 
bien joué c'est ca
mon classement marche maintenant
enfin je dois quand même l'ameliorer
0
nico
 
j'ai oublié de dire c'était la premiere solution qui était bonne
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12
 
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
nico
 
c'est exactement ce que j'ai fait
0
nico
 
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   Statut Membre Dernière intervention   12
 
moi je te conseil un write dans un fichier .txt
0
nico
 
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   Statut Membre Dernière intervention   12
 
les concaténation de chaine se font très bien avec STRCONCAT et le write y'a pas plus simple
0
nico
 
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   Statut Membre Dernière intervention   12
 
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
nico
 
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