Comparaison de structures [Résolu]

mal0506
Messages postés
7
Date d'inscription
mercredi 9 juin 2010
Dernière intervention
28 février 2012
- 26 févr. 2012 à 22:30 - Dernière réponse : mal0506
Messages postés
7
Date d'inscription
mercredi 9 juin 2010
Dernière intervention
28 février 2012
- 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 

Votre réponse

11 réponses

Meilleure réponse
mal0506
Messages postés
7
Date d'inscription
mercredi 9 juin 2010
Dernière intervention
28 février 2012
- 28 févr. 2012 à 10:25
3
Merci
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.

Merci mal0506 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de mal0506
cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Dernière intervention
14 février 2014
- 27 févr. 2012 à 01:37
0
Merci
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
Messages postés
7
Date d'inscription
mercredi 9 juin 2010
Dernière intervention
28 février 2012
- 27 févr. 2012 à 10:15
0
Merci
Salut!
Comment tester valeur par valeur?
Commenter la réponse de mal0506
cptpingu
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
5 novembre 2018
- 27 févr. 2012 à 10:43
0
Merci
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
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 27 févr. 2012 à 13:30
0
Merci
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
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 27 févr. 2012 à 16:23
0
Merci
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
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 27 févr. 2012 à 16:24
0
Merci
OUPS, manque 1 '('

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

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
mal0506
Messages postés
7
Date d'inscription
mercredi 9 juin 2010
Dernière intervention
28 février 2012
- 28 févr. 2012 à 00:01
0
Merci
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
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
5 novembre 2018
- 28 févr. 2012 à 01:18
0
Merci
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
Messages postés
7
Date d'inscription
mercredi 9 juin 2010
Dernière intervention
28 février 2012
- 28 févr. 2012 à 12:30
0
Merci
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
Messages postés
7
Date d'inscription
mercredi 9 juin 2010
Dernière intervention
28 février 2012
- 28 févr. 2012 à 19:00
0
Merci
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.