Comparaison de structures [Résolu]

mal0506 7 Messages postés mercredi 9 juin 2010Date d'inscription 28 février 2012 Dernière intervention - 26 févr. 2012 à 22:30 - Dernière réponse : mal0506 7 Messages postés mercredi 9 juin 2010Date d'inscription 28 février 2012 Dernière intervention
- 28 févr. 2012 à 19:00
Salut à tous!

Je veux écrire une fonction post(t1,t2) de deux arguments de type struct temps testant si le temps t1 est postérieur au temps t2. Elle renverra un entier:
1 si t1 est postérieur à t2
0 si les temps sont exactement égaux
-1 si t2 est postérieur à t1

le programme principal permettant de tester et d'afficher un message indiquant l'antériorité des temps et ci-dessous. Le resultat que j'attends n'est pas ça. Si quelqu'un pouvait m'aider. Merci

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

struct temps
{
int heure;
int minute;
int seconde;
};
struct temps t1, t2;

void entree(struct temps *a)
{
a->heure=0; a->minute=0; a->seconde=0;

do
{

scanf("%d:%d:%d", &a->heure, &a->minute, &a->seconde);
if ((a->heure>23)||(a->minute>59)||(a->seconde>59))
printf("Temps invalide...Veuillez recommencer...\n");
else
printf("\n");

}
while ((a->heure>23)||(a->minute>59)||(a->seconde>59));
}
int post(t1,t2)
{

int test=0;

if(memcmp(&t1,&t2,sizeof(struct temps))==0)
test=0;
if(memcmp(&t1,&t2,sizeof(struct temps))==1)
test=1;
if(memcmp(&t1,&t2,sizeof(struct temps))==-1)
test=-1;
return test;
}
int main()
{
int test2=0;
struct temps t1 = {0,0,0};
struct temps t2 = {0,0,0};
printf("Entrez un temps t1:\n");
entree(&t1);
printf("Entrez un temps t2:\n");
entree(&t2);
test2=post(t1,t2);
if(test2==0)
printf("Les temps sont egaux\n");
if(test2==1)
printf("Le temps t1 est posterieur au temps t2\n");
if(test2==-1)
printf("le temps t2 est posterieur au temps t1\n");
return 0;
}
Afficher la suite 

11 réponses

Répondre au sujet
mal0506 7 Messages postés mercredi 9 juin 2010Date d'inscription 28 février 2012 Dernière intervention - 28 févr. 2012 à 10:25
+3
Utile
Salut!

Merci, j'ai retrouver mon erreur. Plus d'erreur de compilation. Le resultat est bon. Encore une fois merci. Mais j'aurai encore votre aide pour finaliser mon problème sans abuser de votre gentillesse.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de mal0506
cs_patatalo 1466 Messages postés vendredi 2 janvier 2004Date d'inscription 14 février 2014 Dernière intervention - 27 févr. 2012 à 01:37
0
Utile
salut,

Tu ne peux pas comparer une structure de cette manière avec le processeur intel (little endian). Cette architecture impose que les bits les plus éloignés de l'adresse de depart sont ceux qui ont le plus d'importance (poids fort) dans la comparaison.

Tu es obligé de tester valeur par valeur comme tu as fait pour les limites.

@++
Commenter la réponse de cs_patatalo
mal0506 7 Messages postés mercredi 9 juin 2010Date d'inscription 28 février 2012 Dernière intervention - 27 févr. 2012 à 10:15
0
Utile
Salut!
Comment tester valeur par valeur?
Commenter la réponse de mal0506
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 27 févr. 2012 à 10:43
0
Utile
Bonjour.

Au lieu d'utiliser un memcmp, tu vérifies chacun des membres, un par un.

Par exemple ceci:
if (memcmp(&t1,&t2,sizeof(struct temps))==0)

deviendrait:
if (t1.heure t2.heure && t1.minute t2.minute && t1.seconde == t2.seconde)


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 27 févr. 2012 à 13:30
0
Utile
Salut,

c'est peut être hors sujet si tu ne veux que du C, mais en c++ on peut faire simplement ceci afin d'utiliser les opérateurs:

struct temps 
{ 
int heure; 
int minute; 
int seconde; 

int operator==(temps& t)
{
return (heure==t.heure && minute==t.minute && seconde==t.seconde);
}
int operator<(temps& t)
{
return( heure<t.heure || (heure==t.heure && minute<t.minute) || (heure==t.heure && minute==t.minute && seconde<t.seconde) );
}
int operator>(temps& t)
{
return( heure>t.heure || (heure==t.heure && minute>t.minute) || (heure==t.heure && minute==t.minute && seconde>t.seconde) );
}
}; 




t1.heure=12; t1.minute=55; t1.seconde=13;
t2.heure=12; t2.minute=56; t2.seconde=13;

if(t1 == t2)
puts("temps égaux");
else if( t1<t2 )
puts("t1 < t2");
else if( t1>t2 )
puts("t1 > t2");
Commenter la réponse de yann_lo_san
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 27 févr. 2012 à 16:23
0
Utile
On réorganise correctement, ET avec struct = 32 bits.
struct temps 
{ 
  BYTE seconde;
  BYTE minute;
  WORD heure;
};

DWORD A, B;
A = *(DWORD*) &t1);
B = *(DWORD*) &t2);
Maintenant toutes comparaisons peuvent se faire en 1 cycle.
if(A != B) ...
if(A > B) ...

etc...


ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 27 févr. 2012 à 16:24
0
Utile
OUPS, manque 1 '('

A = *((DWORD*) &t1);
B = *((DWORD*) &t2);

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
mal0506 7 Messages postés mercredi 9 juin 2010Date d'inscription 28 février 2012 Dernière intervention - 28 févr. 2012 à 00:01
0
Utile
Salut!

Encore merci de votre aide qui me met sur la voie. Mais j'ai quelques soucis. J'ai suivi vos conseils de comparaison champ par champ dans la fonction post(t1,t2) mais le compilateur me renvoie des erreurs.Que faire?


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


struct temps
{
int heure;
int minute;
int seconde;
};
struct temps t1, t2;

void entree(struct temps *a)
{
a->heure=0; a->minute=0; a->seconde=0;

do
{

scanf("%d:%d:%d", &a->heure, &a->minute, &a->seconde);
if ((a->heure>23)||(a->minute>59)||(a->seconde>59))
printf("Temps invalide...Veuillez recommencer...\n");
else
printf("\n");

}
while ((a->heure>23)||(a->minute>59)||(a->seconde>59));
}
int post(t1,t2)
{

int test=0;

if((t1.heure==t2.heure)&&(t1.minute==t2.minute)&&(t1.seconde==t2.seconde))
test=0;
if((t2.heure<t1.heure)||(t2.minute<t1.minute)||(t2.seconde<t1.seconde))
test=-1;
if((t1.heure<t2.heure)||(t1.minute<t2.minute)||(t1.seconde<t2.seconde))
test=1;
return test;
}
int main()
{
int test2=0;
struct temps t1 = {0,0,0};
struct temps t2 = {0,0,0};
printf("Entrez un temps t1:\n");
entree(&t1);
printf("Entrez un temps t2:\n");
entree(&t2);
test2=post(t1,t2);
if(test2==0)
printf("Les temps sont egaux\n");
if(test2==1)
printf("Le temps t1 est posterieur au temps t2\n");
if(test2==-1)
printf("le temps t2 est posterieur au temps t1\n");
return 0;
}
Commenter la réponse de mal0506
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 28 févr. 2012 à 01:18
0
Utile
int post(t1,t2)

Où sont les types des arguments de ta fonction ?

Par exemple plus haut dans ton code, tu as:
void entree(struct temps *a) 


Tu as maintenant suffisamment d'indices pour remarquer ton erreur :).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
mal0506 7 Messages postés mercredi 9 juin 2010Date d'inscription 28 février 2012 Dernière intervention - 28 févr. 2012 à 12:30
0
Utile
SALUT!

Maintenant je doit écrire une fonction diff(t1,t2)renvoyant une valeur de type struct temps calculant un troisième temps t3 différence de t1 et t2. Comment faire? Merci d'avnce.
Commenter la réponse de mal0506
mal0506 7 Messages postés mercredi 9 juin 2010Date d'inscription 28 février 2012 Dernière intervention - 28 févr. 2012 à 19:00
0
Utile
Salut!

Je suis à terme de mon code en c qui a pour objectif de calculer la différence entre deux temps. Voici le code final ci-dessous. Le test est bon pour certains temps mais mauvais pour d'autres(testez-le vous même pour voir). Je demande votre aide quant à la modification de mon code. Merci d'avance.




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


struct temps
{
int heure;
int minute;
int seconde;
};


void entree(struct temps *a)
{
a->heure=0; a->minute=0; a->seconde=0;

do
{

scanf("%d:%d:%d", &a->heure, &a->minute, &a->seconde);
if ((a->heure>23)||(a->minute>59)||(a->seconde>59)||(a->heure<0)||(a->minute<0)||(a->seconde<0))
printf("Temps invalide...Veuillez recommencer...\n");
else
printf("\n");

}
while ((a->heure>23)||(a->minute>59)||(a->seconde>59)||(a->heure<0)||(a->minute<0)||(a->seconde<0));
}

void sortie(struct temps b)
{
printf("\nLa difference entre les deux temps est:\n");
printf("%d:%d:%d", b.heure, b.minute, b.seconde);
}

int post(struct temps *t1, struct temps *t2)
{

int test=0;

if((t1->heure==t2->heure)&&(t1->minute==t2->minute)&&(t1->seconde==t2->seconde))
test=0;
else if((t2->heure<t1->heure)||(t2->minute<t1->minute)||(t2->seconde<t1->seconde))
test=-1;
else if((t1->heure<t2->heure)||(t1->minute<t2->minute)||(t1->seconde<t2->seconde))
test=1;
return test;
}
struct temps diff(struct temps t1, struct temps t2)
{
struct temps t3={};
struct temps temps1={}, temps2={};

if(t1.heure < t2.heure)
{
temps1 = t1;
temps2 = t2;
}
else
{
temps1 = t2;
temps2 = t1;
}

if(t1.seconde<t2.seconde)
{
t3.seconde=(60+t1.seconde)-t2.seconde;
t1.minute=t1.minute-1;
}
else
{
t3.seconde=t1.seconde-t2.seconde;
}

if(t1.minute<t2.minute)
{
t3.minute=(60+t1.minute)-t2.minute;
t1.heure=t1.heure-1;
}
else
{
t3.minute=t1.minute-t2.minute;
t3.heure=t1.heure-t2.heure;
}
return t3;

}
int main()
{
int test2=0;
struct temps t1 = {};
struct temps t2 = {};
struct temps t3 = {};
printf("Entrez un temps t1 (heure:minute:seconde):\n");
entree(&t1);
printf("Entrez un temps t2 (heure:minute:seconde):\n");
entree(&t2);
test2=post(&t1,&t2);
if(test2==0)
printf("Les temps sont egaux\n");
if(test2==1)
printf("Le temps t1 est posterieur au temps t2\n");
if(test2==-1)
printf("le temps t2 est posterieur au temps t1\n");
t3=diff(t1,t2);
sortie(t3);
getch();
return 0;
}
Commenter la réponse de mal0506

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.