Heures, minutes, secondes...
Résolu
Bonsoir,
J'ai un petit problème en C. Je souhaite que mon programme renvoie, à partir des secondes entrées par l'utilisateur, l'équivalent en jours, heures, minutes, secondes.
Tout fonctionne, sauf dans certains cas. Par exemple, lorsque j'entre
Ou lorsque j'entre
Alors que par exemple avec
Le problème viendrait-il de la capacité de stockage de long int ?
Voici le code :
Merci.
J'ai un petit problème en C. Je souhaite que mon programme renvoie, à partir des secondes entrées par l'utilisateur, l'équivalent en jours, heures, minutes, secondes.
Tout fonctionne, sauf dans certains cas. Par exemple, lorsque j'entre
6849684141698168161en secondes, j'obtiens
-23001 jours, -12 heures, -52 minutes et -47 secondes
Ou lorsque j'entre
100000000000000000000000000000000000000000secondes, j'obtiens des 0 jours, 0 heures, 0 minutes, 0 secondes...
Alors que par exemple avec
7445622j'obtiens bien
8 jours, 14 heures, 49 minutes et 22 secondes.
Le problème viendrait-il de la capacité de stockage de long int ?
Voici le code :
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void clock(int* jours, int* heures, int* minutes, int* secondes);
int main(int argc, char *argv[])
{
long int jours = 0, heures = 0, minutes = 0, secondes;
scanf("%d", &secondes);
clock(&jours, &heures, &minutes, &secondes);
printf("%d jours, %d heures, %d minutes et %d secondes",jours ,heures, minutes, secondes);
return 0;
}
void clock(int* jours, int* heures, int* minutes, int* secondes)
{
*jours = (*secondes/3600)/24;
*heures = *secondes / 3600;
*minutes = *secondes / 60;
*secondes = *secondes % 60;
*minutes = *minutes % 60;
*heures = *heures % 24;
}
Merci.
<\EchoIsON>.
4 réponses
-
Merci à tous, [Dal] je prend en compte le conseil.
En effet il y a une incohérence avec long int et int dans la fonction mais le problème était toujours présent même avant que je change int en long int.
fiddy, est-ce-que je pourrais avoir plus de précisions sur la bibliothèque BIGNUM, svp ?
Voici le code modifié :#include <stdio.h> #include <stdlib.h> #include <math.h> void heure(long int* siecles, long int* annees, long int* mois, long int* jours, long int* heures, long int* minutes, long int* secondes); int main(int argc, char *argv[]) { long int siecles = 0, annees = 0, mois = 0, jours = 0, heures = 0, minutes = 0, secondes; scanf("%d", &secondes); heure(&siecles, &annees, &mois, &jours, &heures, &minutes, &secondes); printf("%d siecles, %d ans, %d mois, %d jours, %d heures, %d minutes et %d secondes", siecles, annees, mois, jours ,heures, minutes, secondes); return 0; } void heure(long int* siecles, long int* annees, long int* mois, long int* jours, long int* heures, long int* minutes, long int* secondes) { *siecles = ((((*secondes/3600)/24)/30)/12)/100; *annees = (((*secondes/3600)/24)/30)/12; *mois = ((*secondes/3600)/24)/30; *jours = (*secondes/3600)/24; *heures = *secondes / 3600; *minutes = *secondes / 60; *secondes = *secondes % 60; *minutes = *minutes % 60; *heures = *heures % 24; *jours = *jours % 30; *mois = *mois % 12; *annees = *annees % 100; } /* J'ai rajouté certaines modifications entre temps...*/
EDIT : J'ai rajouté unsigned lont int, je pense que cela m'offre une solution partielle... Au moins je n'ai plus de valeurs négatives.
Merci, EchoIsON.-
ContributeurAs-tu regardé du côté des long long comme dit dans mon précédent post ? Ce n'est pas assez ?
Sinon, pour les bignum, cela s'éloigne du C. Je ne vais donc pas pouvoir beaucoup t'aider.
Un petit lien : http://etutorials.org/Programming/secure+programming/Chapter+7.+Public+Key+Cryptography/7.4+Manipulating+Big+Numbers/ -
-
-
Contributeur@Utilisateur anonymeOui long long = long long int.
Note, as-tu bien changé les formats ? Par exemple dans les scanf() c'est %lld, etc.
N'hésite pas à montrer ton code avec les long long, si tu souhaites qu'on jette un coup d'oeil. -
-