Comparer un Int & Int d'une structure

Résolu
cronos aisthesis -  
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
je voudrais savoire comment comparer un entier defini comme
int maxiannee;
avec un entier defini dans une structure
typedef struct CITOYEN
 {
char nom[10] ;
char prenom[20];
int cin[8];
int jour[2];
int mois[2];
int annee[4];
}cit;


voila l'instruction de comparaison
 if ((t[i].annee > t[i+1].annee) && (t[i].annee > maxiannee))

message d'erreur
50 C:\Users\cronos aistehsis\Documents\struct.cpp ISO C++ forbids comparison between pointer and integer 

merci d'avance
Configuration: Windows Vista
Firefox 3.5.2

9 réponses

  1. java4ever
     
    Bonjour,

    Chronos a, fais attention, tu devrais potasser un peu plus les types de données et le langage avant d'essayer de faire un programme !
    la ligne for(i=0;i < max;I++); ne fait rien d'autre que mettre i à la valeur max, par exemple, à cause du point virgule final.

    Autre exemple, je pense que ta déclaration de cit n'est pas ce qu tu crois :
    je pense que quand tu mets int jour[2], int mois[2] et annee[4], tu penses que ça limite le jours et le mois à 2 digits et les années à 4 digit comme par exemple une déclaration NUMBER(4) en base de donnée ::

    Si c'est ça, tu te trompes :
    Ta déclaration signifie que tu as deux cases dans lesquelles tu peux mettre une valeur jour (qui sera un nombre compris entre -4 milliards et quelques et + 4 milliards si les int de ta machine sont sur 32 bits, idem pour les mois, et dans le cas des années tu peux stoker 4 entiers dont la valeur est celles des int.

    Je penses donc qu'il faut d'abord que tu modifie, si tu n'as besoin que d'un jour, un mois et une année par personne, ta structure CITOYEN ainsi (seul les char sont à dimensionner selon le nombre de caractères) :
    typedef struct CITOYEN
     {
      char nom[10] ;
      char prenom[20];
      int cin;
      int jour;
      int mois;
      int annee;
      int numrue ;
      char cite[15] ;
      char ville[20];
      int codp;
    }cit;
    

    du coup, tes lignes comme :
    <CODE>
          if ((t[i].annee > t[i+1].annee) && (t[i].annee > maxiannee))//comparaison selon l'annee
    


    En espérant que cela puisse t'aider, mais je t'encourage vraiment à étudier un peu plus le langage !
    1
    1. aisthesis cronos
       
      salut
      merci infiniment java4ever présk résolu :)
      mais qu'est ce que vous voulez dir par "je t'encourage vraiment à étudier un peu plus le langage !" estce que mon niveau et trés faible ?
      autre fois merci
      0
    2. aisthesis cronos
       
      SALEM
      j'ai essayé avec le tri a bull mais sa marche pas copilation 0 erreurs 0 warning
      voila mon code
      [code]#include<stdio.h>
      #include<conio.h>
      #define TRUE 1
      #define FALSE 0
      #define max 3
      typedef struct CITOYEN
      {
      char nom[10] ;
      char prenom[20];
      int cin;
      int jour;
      int mois;
      int annee;
      int numrue ;
      char cite[15] ;
      char ville[20];
      int codp;
      cit;
      cit t[max];
      cit v[1];
      void lecture(cit* t)
      {
      int i;
      for(i=0;i<=max;i++)
      {
      printf("donnez le nom :\n" );
      scanf("%s",&t[i].nom);
      printf("donnez le prenom :\n" );
      scanf("%s",&t[i].prenom);
      printf("donnez le num CIN :\n" );
      scanf("%d",&t[i].cin);
      printf("donnez le jour de naissance :\n" );
      scanf("%d",&t[i].jour);
      printf("donnez le mois de naissance :\n" );
      scanf("%d",&t[i].mois);printf("donnez l'année :\n" );
      scanf("%d",&t[i].annee);
      printf("donnez le numero de l'employé :\n" );
      scanf("%d",&t[i].numrue);
      printf("donnez la city :\n" );
      scanf("%s",&t[i].cite);
      printf("donnez la ville :\n" );
      scanf("%s",&t[i].ville);
      printf("donnez le code postal :\n" );
      scanf("%d",&t[i].codp);


      void tri(cit *t)
      {
      int j = 0; /* Variable de boucle */
      cit tmp ; /* Variable de stockage temporaire */

      /* Booléen marquant l'arrêt du tri si le tableau est ordonné */
      int en_desordre = TRUE;
      /* Boucle de répétition du tri et le test qui
      arrête le tri dès que le tableau est ordonné(en_desordre=FALSE */
      while(en_desordre)
      {
      /* Supposons le tableau ordonné */
      en_desordre = FALSE;
      /* Vérification des éléments des places j et j+1 */
      for(j = 0 ; j <= max ; j++)
      {
      /* Si les éléments sont mal triés */
      if(t[j].annee < t[j+1].annee)
      {
      /* Inversion des 2 éléments */
      tmp.annee = t[j+1].annee;
      t[j+1].annee = t[j].annee;
      t[j].annee = tmp.annee;
      tmp.mois = t[j+1].mois;
      t[j+1].mois = t[j].mois;
      t[j].mois = tmp.mois;
      tmp.jour = t[j+1].jour;
      t[j+1].jour = t[j].jour;
      t[j].jour = tmp.jour;
      /* Le tableau n'est toujours pas trié */

      else
      {
      if(t[j].mois < t[j+1].mois)
      {
      /* Inversion des éléments */
      tmp.annee = t[j+1].annee;
      t[j+1].annee = t[j].annee;
      t[j].annee = tmp.annee;
      tmp.mois = t[j+1].mois;
      t[j+1].mois = t[j].mois;
      t[j].mois = tmp.mois;
      tmp.jour = t[j+1].jour;
      t[j+1].jour = t[j].jour;
      t[j].jour = tmp.jour;


      else
      {
      if(t[j].jour < t[j+1].jour)
      {
      /* Inversion des éléments */
      tmp.annee = t[j+1].annee;
      t[j+1].annee = t[j].annee;
      t[j].annee = tmp.annee;
      tmp.mois = t[j+1].mois;
      t[j+1].mois = t[j].mois;
      t[j].mois = tmp.mois;
      tmp.jour = t[j+1].jour;
      t[j+1].jour = t[j].jour;
      t[j].jour = tmp.jour;
      }}
      en_desordre = TRUE;
      }

      }

      }
      }
      void affichage(cit *t)
      {
      int i;
      for(i=0;i<=max;i++)
      {
      printf("nom :%s\n",&t[i].nom );
      printf("prenom :%s\n" ,&t[i].prenom);
      printf("num CIN :%s\n",&t[i].cin );
      printf("date de naissance jj/mm/aaaa :%d%d%d\n",&t[i].jour,&t[i].mois,&t[i].annee);
      printf("numero de l'employé :%d\n",&t[i].numrue );
      printf("la city :%s\n",&t[i].cite );
      printf("donnez la ville :%s\n",&t[i].ville );
      printf("donnez le code postal :%d\n",&t[i].codp );



      int main ()
      {
      int pos;
      lecture(t);
      tri(t);
      getch();
      return 0;

      [/code]
      0
  2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    que veux tu qu'on te réponde, tu n'expliques pas où est ton problème.
    Pour faciliter la lecture et condenser ton code, tu devrais créer une fonction swap_elem(cit*,cit*) qui te permettra d'inverser tes deux éléments en une ligne grace à l'appel : swap_elem(&t[j],&t[j+1]);
    Je comprend mal ton algorithme, tu tri selon annee mois et jour de la même façon, j'ai l'impression qu'il manque des accolades fermantes devant les else.
    RM : la balise de code est entre <> pas entre crochet.
    1
    1. aisthesis cronos
       
      salut
      merci pour la réponse
      pour quoi tu comprend mal mon algorithme !! j'ai pas expliqué trop par ce que il est très clair est simple
      alors le programme est une structure de données nommé
      cit 

      elle va reçevoir les noms et les prénoms des employés puis je veux faire le tri sur un tableau de n employés mais le problème c'est le tri selon la date de naissance ce dernier il est sous la forme suivante
      int annee;
      int mois;
      int jours;
      se que j'arrive pas à résoudre c'est le tri selon les champs int annee,int mois,int jours
      voila un type de containte:
      si
      t[i].annee == t[i+1].annee

      alors je dois vérifier si
      t[i].mois== t[i+1].mois
      sinon
      selon les jours ,dans cet cas bien sur le plus agé celui qui à l'année ou le mois ou le jours le plus petit exemple
      14/09/1985 le t[1]et 10/09/1985 ......
      "tu tri selon année mois et jour de la même façon" voila pour qui je tri de la mm façon car le plus agé c l'Homme qui possède l'entier le plus petit autre exemple
      10/10/1985 et 10/09/1985 le deuxième plus agé que le premier tournage a la main de mon alogo
      si t[i].annee > t[i+1].annee alors
       changement de position de t[i]avec t[i+1]
      et la position de le plus agé sera i .
        sinon 
           si t[i].annee < t[i+1].annee alors
               la position de le plus agé sera i et rein a échangé .
               sinon si t[i].annee = t[i+1].annee alors 
                   en passe a faire la mème chose mais avec les mois comme le cas de 10/10/1985 et 10/09/1985
                                                 .
                                                 .
                                                 .
      sinon e passe a les jours de naissance le cas de 10/10/1985 et 09/10/1985 
      0
  3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Salut.
    Bien sur qu'il y a une erreur, annee est un tableau, donc un peu comme un pointeur.
    Il faut savoir avec quelle valeur de annee tu veux comparer.
    Le problème ici n'est pas la structure mais le tableau.
    0
  4. le père
     
    Bonjour

    D'après ta déclaration, t[i].annee n'est pas un int mais un tableau de 4 int. Normal que tu ne puisses pas le comparer avec un int simple. Par contre, t[i].annee[0],t[i].annee[1],t[i].annee[2] et t[i].annee[3] sont bien des int.
    Tu peux écrire :
    if ((t[i].annee[1] > t[i+1].annee)[1] && (t[i].annee[0] > maxiannee))

    à toi de voir selon la logique de ton programme, nous ne pouvons pas le deviner. Peut-être que la variable t n'avait pas besoin d'être un tableau et qu'en fait tu voulais :
    if ((t.annee[i] > t.annee)[i+1] && (t.annee[i] > maxiannee))
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. cronos aisthesis
     
    bonjour
    merci pour vos réponses
    @ le père:
    1)
    int annee[4];
    
    c'est comme un tableau de 4 entiers,je veux 4 comme valeur max ! sinon je t'éxpliqué pourquoi j'utilise cette instruction,moi je veux obligé le saisie de 4 entier en max se pour sela j'ai abouti a cette "solution" sinon je peux faire
    int annee;
    seulement ou pendant la comparaison je fait
    x=t[i].annee[0] + t[i].annee[1]+ t[i].annee[2]+t[i].annee[3] // j'ai pa testé !!!
    
    pffff je me suis planté ! veillez m'aidez pour terminer se programme
    @ Char Snipeur :
    pour mettre les points sur les I voila mn code :
    #include<stdio.h>
    #include<conio.h>
    #define max 10
    typedef struct CITOYEN
     {
    char nom[10] ;
    char prenom[20];
    int cin[8];
    int jour[2];
    int mois[2];
    int annee[4];
    int numrue[5] ;
    char cite[15] ;
    char ville[20];
    int codp[10] ;
    }cit;
    cit t[max];
    void lecture(cit  t[])
    {
    int i;
    for(i=0;i<max;i++);
    {
    printf("donnez le nom :\n" );
    scanf("%s",&t[i].nom);
    printf("donnez le prenom :\n" );
    scanf("%s",&t[i].prenom);
    printf("donnez le num CIN :\n" );
    scanf("%d",&t[i].cin);
    printf("donnez le jour de naissance :\n" );
    scanf("%d",&t[i].jour);
    printf("donnez le mois de naissance :\n" );
    scanf("%d",&t[i].mois);printf("donnez l'année :\n" );
    scanf("%d",&t[i].annee);
    printf("donnez le numero de l'employé :\n" );
    scanf("%d",&t[i].numrue);
    printf("donnez le city :\n" );
    scanf("%s",&t[i].cite);
    printf("donnez la ville :\n" );
    scanf("%s",&t[i].ville);
    printf("donnez le code postal :\n" );
    scanf("%d",&t[i].codp); 
    }
    int calcule(cit t[]);
    { 
        int maxiannee= -1;
         int *p;
        p=0;
        for(i=0;i<max;i++);
        {
                           if ((t[i].annee > t[i+1].annee) && (t[i].annee > maxiannee))//comparaison selon l'annee
                           {
                                          maxiannee=i;
                           }
                           else 
                             {   if (( t[i].annee < t[i+1].annee) && (t[i].annee < maxiannee))
                                        {
                                          maxiannee = i+1;
                                        }
                           else // sinon selon le jour
                             {   if (t[i].mois > t[i+1].mois) 
                                {
                                    maxiannee=i;
                                }
                           else
                               {  if ( t[i].mois < t[i+1].mois)
                                 {
                                      maxiannee=i+1;
                                 }
                           else // sinon selon le jour
                              {   if(t[i].jour < t[i+1].jour)
                                 {
                                     maxiannee=i;
                                 }
                                /* else // on cas mm annee mm mois mm jour c ad mm date de naissance !!
                                 {
                                     *(p)=i;
                                     
                                     *(p+1)=i+1;
                                 }
                                 }}}} 
                                 if ( *(p) > 0 )
                                 {
                                      return(p);
                                 }
                                   else
                                   return (maxiannee);                                                    
    }}; probleme de return on cas de mm date  !!!!!!!!!!!! */
    int main ()
    {
    int pos;
    void lecture();
    pos = calcule();
    printf("la position %d\n",pos);
    getch():
    return(0);
    }
    

    il est comme la savane
    merci d'avance
    0
  7. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Hou là..
    J'ai du mal à voir ce que tu veux faire. Du coup, difficile de te répondre...
    0
  8. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Et à écrire un peu mieux : tes messages sont à peine compréhensibles.
    0
    1. aisthesis cronos
       
      mercipour la participation
      "Et à écrire un peu mieux : tes messages sont à peine compréhensibles. " j'essay le maximum pour publié un bon message au niveau de l'explication et de code mais je suis un begginer en C en plus je suis pas un français
      0
  9. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Moi, ce n'est pas ce que je lis dans ton code.
    Je lis qu'une fois que les années sont triés tu trie selon les mois ce qui modifie tout.
    Et j'ai vraiment l'impression qu'il manque des accolades.
    0