Comparer un Int & Int d'une structure

Résolu/Fermé
cronos aisthesis - 12 août 2009 à 07:02
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 21 sept. 2009 à 08:39
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
A voir également:

9 réponses

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
aisthesis cronos
28 août 2009 à 02:09
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
aisthesis cronos
2 sept. 2009 à 04:36
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
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
4 sept. 2009 à 08:29
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
aisthesis cronos
4 sept. 2009 à 19:08
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
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
12 août 2009 à 07:44
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
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

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

Posez votre question
cronos aisthesis
12 août 2009 à 09:08
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
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
12 août 2009 à 11:34
Hou là..
J'ai du mal à voir ce que tu veux faire. Du coup, difficile de te répondre...
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
12 août 2009 à 14:43
Et à écrire un peu mieux : tes messages sont à peine compréhensibles.
0
aisthesis cronos
28 août 2009 à 02:12
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
aisthesis cronos
4 sept. 2009 à 00:44
aucun ne me répond ?
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
21 sept. 2009 à 08:39
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