Bonjour j'ai ecrit ce petit code qui fonctionne très bien,.cepandant j'aimerai savoir si il y a un moyen de séparer ce code en deux parti: une fonction qui retourne un pointeur de type time contenant l'heure de debut. et une fonction qui compare ce pointeur avec l'heure actuel afin de calculer la difference de temp de manière séparée.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include"Ressources.h"
void add_time(int time_to_add, int *h, int *min, int *s ){
*h=(*h+(time_to_add/3600))%24;
time_to_add=time_to_add%3600;
*min=*min+(time_to_add/60);
time_to_add=time_to_add%60;
*s=*s+time_to_add;
}
void dead_line(char statut){
int h, min, s;
time_t now;
// Returns the current time
time(&now);
// Convert to local time format
printf("We are the : %s\n\n", ctime(&now));
struct tm *local = localtime(&now);
h = local->tm_hour;
min = local->tm_min;
s = local->tm_sec;
if(statut=='S'){
add_time(120,&h,&min,&s);
}
else{
add_time(180,&h,&min,&s);
}
printf("You must return the book to: %02d:%02d:%02d\n\n",h,min,s);
}
int main(){
int answer;
time_t begin = time( NULL );
char statut;
statut='S';
dead_line(statut);
do{
printf("Souhaitez vous retourner le livre?\n");
scanf("%d",&answer);
}while(answer!=1);
time_t end = time( NULL);
unsigned long time_borrow = (unsigned long) difftime( end, begin );
printf( "You borrowed this book during %ld sec\n", time_borrow );
if(statut='S'){
if(time_borrow>10){
printf("You have exceeded the time limit, you are no longer allowed to borrow books!\n\n");
}
else{
if(time_borrow>10){
printf("You have exceeded the time limit, you are no longer allowed to borrow books!\n\n");
}
}
}
return 0;
}
D'abord, tu es dans la catégorie du langage C++ et ton programme est écrit en C. Pour faire ce que tu veux faire si j'ai bien compris, il y a plus simple avec la fonction clock() time_t begin = clock(); // Code exécuté ... time_t end = clock(); // La différence est en millisecondes, je la ramêne en secondes: printf("%.3lf secondes\n", (double)(end-begin)/CLOCKS_PER_SEC);
Le Tout est souvent plus grand que la somme de ses parties.
Merci pour vos réponse. J'ai essayé avec la fonction clock(); mais j'ai pas l'impression que ca foncitonne:/
int main(){
int answer;
char statut;
statut='S';
dead_line(statut);
time_t begin = clock();
do{
printf("Souhaitez vous retourner le livre?\n");
scanf("%d",&answer);
}while(answer!=1);
time_t end = clock();
printf("You have borrowed the books during %.3lf secondes\n", (double)(end-begin)/CLOCKS_PER_SEC);
return 0;
}
J'ai essayé avec la fonction clock(); mais j'ai pas l'impression que ca foncitonne:
C'est à dire ? Que ce passe t'il ?
parce que si j'enlève la fonction dead_line que l'on ne connait pas et qui n'est pas utile dans ce test et que je mets les includes de fichiers entêtes nécessaire, normalement, ça fonctionne.
Ca me dit que j'empriente le livre pendant 0 secondes. Ce qui n'est pas logique puisque je laisse un petit délais avant de répondre a la question :souhaitez vous retourner le livre?
En programmation "ça ne fonctionne pas" ça ne veut rien dire
Aide nous. Ca ne compile pas ou ça ne s'exécute pas comme tu le veux ?
Si ça ne compile pas, donne nous l'erreur et la ligne sur laquelle l'erreur est indiquée
Si ça ne fait pas ce que tu veux, explique nous ce que tu veux faire, quel résultat tu veux obtenir en nous indiquant tes données d'entrées et indique nous ce que le programme te renvoit actuellement
C'est du C. Oui désolé ce que je voulais dire c'est que "Ca me dit que j'empriente le livre pendant 0 secondes. Ce qui n'est pas logique puisque je laisse un petit délais avant de répondre a la question :souhaitez vous retourner le livre? "
Est-ce que ton code ressemble à ceci? Moi, ça me donne plusieurs secondes (je suis allé prendre un café ...) - #include <stdio.h> #include <time.h> int main(void) { clock_t begin = clock(); int answer;
do { printf("> "); scanf("%d", &answer); } while(answer != 1); clock_t end = clock(); printf("%.3lf secondes\n", (double)(end-begin)/CLOCKS_PER_SEC); }
Le Tout est souvent plus grand que la somme de ses parties.
Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention. Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé. Pour plus d'informations, nous vous invitons à lire les règles générales du forum
Déplacement vers un forum plus approprié
Le sujet est déplacé de la section Langage C++ vers la section Langage C
Pas d'aide concernant le code par MP, le forum est là pour ça :)
Est-ce que tu pourrais remettre le programme actuel (si j'ai bien compris tu as fait quelques modifications depuis le premier que tu as posté) ?
Hypothèse : tu as peut-être mal mis en œuvre les conseils ci-dessus, et si tu postes le nouveau code, les gens pourront t'indiquer les erreurs.
(Quand quelqu'un propose une idée et que ça ne marche pas, il ne faut pas l'écarter trop vite. Ça se trouve, l'idée n'était pas mauvaise, c'est juste que tu l'as mal mise en œuvre. Ça arrive... )
OK, problème résolu ! Et c'était pas bien difficile.
Effectivement, chez moi ton code affiche 0 seconde.
Il faut donc enquêter : pourquoi 0 seconde alors que j'ai pris mon temps ? Peut-être qu'il fait la division (end-begin)/CLOCKS_PER_SEC, ce qui peut donner 0 (c'est un entier), avant de le transformer en 'double' ? J'ajoute des parenthèses pour être sûr :
À tout hasard j'affiche CLOCKS_PER_SEC : ça fait 1000000. Du coup je vais afficher tout le monde (et mettre plus de 3 chiffres dans le résultat final pour savoir si c'est vraiment zéro) :
CLOCKS_PER_SEC = 1000000
begin = 589
end = 805
différence = 216.000000
0.000216000 secondes
Et voilà : je sais maintenant d'où ça vient. Et chez toi, ça donne quoi ?
(Ça vient de ce qu'il ne faut pas utiliser CLOCKS_PER_SEC : visiblement 'begin' et 'end' sont des centièmes de seconde, ou même des cinquantièmes je dirais, parce que j'ai compté jusqu'à 4... Pourtant la doc dit d'utiliser CLOCKS_PER_SEC. Du coup c'est peut-être un problème de conversion de formats. J'ai affiché des 'long int' mais je ne suis pas sûr de moi.)
Ok c'était ca, mais je peux mettre quoi à la place CLOCS_PER_SEC? diviser par 100 ou 50??
robun a écrit:
Effectivement, chez moi ton code affiche 0 seconde.
C'est donc le début de l'enquête : pourquoi 0 seconde alors que j'ai pris mon temps ? Peut-être qu'il fait la division (end-begin)/CLOCKS_PER_SEC, ce qui peut donner 0 (c'est un entier), avant de le transformer en 'double' ? J'ajoute des parenthèses pour être sûr :
À tout hasard j'affiche CLOCKS_PER_SEC : ça fait 1000000. Du coup je vais afficher tout le monde (et mettre plus de 3 chiffres dans le résultat final pour savoir si c'est vraiment zéro) :
CLOCKS_PER_SEC = 1000000
begin = 589
end = 805
différence = 216.000000
0.000216000 secondes
Et voilà : je sais maintenant d'où ça vient. Et chez toi, ça donne quoi ?
(Ça vient de ce qu'il ne faut pas utiliser CLOCS_PER_SEC : visiblement 'begin' et 'end' sont des centièmes de seconde, ou même des cinquantièmes je dirais, parce que j'ai compté jusqu'à 4...)
Je n'utilise pas linux, mais sur linux, il me semble que clock mesure le temps processeur que le temps d'attente des fonctions de saisie utilisateur comme scanf, le temps n'est pas compté.
juste pour éviter un gros problème XY, pourrais-tu nous dire ce que tu dois faire et non ce que tu as fait …
Pour être plus clair, au lieu de nous montrer un bout de code à corriger, dis nous ce que tu veux que le code fasse en français.
J'ai commis ce message uniquement parce qu'il me semble que JalisKlingler, comme d'autres qui posent des questions ici, doit rendre un sujet portant sur la gestion d'une bibliothèque.
Ici la discussion vire sur un temps mesuré dans un programme, or il me semble, mais je peux me tromper, qu'il désirerait plus avoir des informations sur le «comment stocker et manipuler des durées» (genre pendant combien de temps un utilisateur emprunte un livre) que d'avoir une durée mesurée in situ dans le programme …
1. On ne répond pas à la question que pose JalisKlingler
Pourquoi proposer à JalisKlingler des fonctions autres que time() et difftime() qui satisfont JalisKlingler, qui ne semble pas avoir besoin d'une mesure de temps avec une résolution de temps inférieure à la seconde ?
il écrit : "j'ai ecrit ce petit code qui fonctionne très bien,.cepandant j'aimerai savoir si il y a un moyen de séparer ce code en deux parti: une fonction qui retourne un pointeur de type time contenant l'heure de debut. et une fonction qui compare ce pointeur avec l'heure actuel afin de calculer la difference de temp de manière séparée."
Pour cela, pas besoin de travailler sur des pointeurs sur time_t, on peut travailler sur le type time_t et sur le type double retourné par difftime() en secondes et une réponse à sa question est :
Pour déterminer si un délai est expiré, il peut comparer les secondes retournées par difftime() avec la quantification de son délai en secondes.
2. La question que pose JalisKlingler n'est probablement pas celle qu'il devrait se poser
Comme le suppose White Crow ... on peut se demander si JalisKlingler écrit exprès un code qu'il poste sur le forum concernant une bibliothèque dans un monde parallèle où, selon le code posté, on a le droit d'emprunter un livre pendant 10 secondes au plus à compter du début de l'exécution du programme (date et heure du début) sous peine de ne plus pouvoir emprunter de livres (et où on crée une fonction dead_line() qui ne sert à rien...) ou s'il a, en réalité, besoin d'autre chose.
C'est sans doutes à lui de nous dire s'il n'aurait pas besoin aussi, par hasard, de comparer la date actuelle par rapport à une date d'emprunt dans le passé pour vérifier qu'un délai en jours n'est pas passé.
Auquel cas, il lui faudrait sans doutes une fonction qui retourne un time_t à partir d'un jour, mois et année, par exemple.
Je ne suis pas sur que le code d'origine fonctionne très bien, quand après addition, le nombre de minutes et/ou de secondes déborde 60.
Ca me parait plus sage (et plus simple) de faire une décomposition de secondes en heures minutes secondes et inversement, dans des fonctions qui ne font que ça.
Et pendant qu'on y est, se donner une structure avec h m et s.
$ ./prog
il est 17 h, 42 m et 56 s.
dans 2 heures 32 minutes et 45 secondes
il sera 20 heures 15 minutes et 41 secondes
Dans la fonction int hms_to_sec(const hms_t *hms), on passe l'adresse de la structure plutôt qu'une copie "par économie". C'est en fait assez discutable.
$ gcc -Wall -Wextra timeadd.c
$ ./a.out
Now is: Thu Jun 9 20:58:20 2022
in 2 weeks, 2 hours 32 minutes and 45 seconds, it will be: Thu Jun 23 23:31:05 2022
et en plus, en principe, en gérant le passage à l'heure d'été ou d'hiver (si la locale est réglée), dès lors que l'on met le champ tm_isdst à une valeur négative, mktime() tentera de normaliser la date et heure avec l'information sur l'heure d'été ou d'hiver à la date et heure spécifées si elle en dispose.
Edit: coquilles
- Edité par Dlks 9 juin 2022 à 21:39:00
pointeur time
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
git is great because Linus did it, mercurial is better because he didn't.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Pas d'aide concernant le code par MP, le forum est là pour ça :)
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
git is great because Linus did it, mercurial is better because he didn't.