Faire un classement en C

nico -  
kazouu Messages postés 466 Statut Membre -
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
Configuration: Linux
Firefox 3.0

22 réponses

  • 1
  • 2
  1. kazouu Messages postés 466 Statut Membre 12
     
    essai (*e1)->nom
    0
  2. acyd Messages postés 11 Statut Membre 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
  3. kazouu Messages postés 466 Statut Membre 12
     
    moi je dirai plutot

    match ( &(c.e[0]) , &(c.e[1]) );
    0
  4. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. kazouu Messages postés 466 Statut Membre 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
  7. 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
  8. kazouu Messages postés 466 Statut Membre 12
     
    oui mais ca t'enleve deja la 2eme erreur c'est deja ca
    0
  9. kazouu Messages postés 466 Statut Membre 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
  10. 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
  11. nico
     
    bien joué c'est ca
    mon classement marche maintenant
    enfin je dois quand même l'ameliorer
    0
  12. nico
     
    j'ai oublié de dire c'était la premiere solution qui était bonne
    0
  13. kazouu Messages postés 466 Statut Membre 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
  14. 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
  15. kazouu Messages postés 466 Statut Membre 12
     
    moi je te conseil un write dans un fichier .txt
    0
  16. 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
  17. kazouu Messages postés 466 Statut Membre 12
     
    les concaténation de chaine se font très bien avec STRCONCAT et le write y'a pas plus simple
    0
  18. 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
  19. kazouu Messages postés 466 Statut Membre 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
  20. 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
  • 1
  • 2