Pourquoi le 'DO' 'WHILE', le 2eme .. ?
Version imprimable
Pourquoi le 'DO' 'WHILE', le 2eme .. ?
Merci d'utiliser la touche [Citer]. On ne sait pas de quoi tu parles.Citation:
Envoyé par Fl0r3nt
Pour la même raison que le 1er... Pour permettre de faire le code du corps de la boucle au moins une fois...Citation:
Envoyé par Fl0r3nt
Comme quoi j'avance peu à peu.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 #include <stdio.h> #include <time.h> int main(void) { char s[32]; // struct tm tm = {0}; time_t A; time_t B; double R; // Structure tm initialisée : tm.tm_sec = 0; // Initialisé car non demandé // tm.tm_min = 0; --> Demandé à l'utilisateur //tm.tm_hour = 0; --> Demandé à l'utilisateur // tm.tm_wday = -1; --> Calculé par mktime() // tm.tm_yday = -1; --> Calculé par mktime() tm.tm_year = 1970 - 1900; // Initialisé car non demandé tm.tm_mon = 1 - 1; // Initialisé car non demandé tm.tm_mday = 1; // Initialisé car non demandé tm.tm_isdst = -1; // Initialisé car non demandé int n; do { printf("Entrez l'heure sous la forme : (hh:mm)"); fflush (stdin); fgets (s, sizeof s, stdin); // Nombres d'arguments pour n n = sscanf (s ,"%d:%d" ,&tm.tm_hour,&tm.tm_min ); } while (n != 2 || tm.tm_hour > 23 || tm.tm_min > 59); A = mktime (&tm); do { printf("Entrez l'heure sous la forme : (hh:mm)"); fflush (stdin); fgets (s, sizeof s, stdin); // Nombres d'arguments pour n n = sscanf (s ,"%d:%d" ,&tm.tm_hour,&tm.tm_min ); } while (n != 2 || tm.tm_hour > 23 || tm.tm_min > 59); B = mktime (&tm); R = difftime(B,A); printf ("\n%d\n", R); return 0; }
Encore un petit soucis :lol:
Maintenant, quand je compile, j'ai "0" en résultat.
Quelle erreur ais-je pu faire ?
En compilant avec -Wall,Citation:
Quelle erreur ais-je pu faire ?
Mets plutôtCitation:
time.c:49: warning: format '%d' expects type 'int', but argument 2 has type 'double'
JcCode:printf("\n%f\n",R);
Ca bug plus .... ouin ... si ca bug encore.
Citation:
Entrez l'heure sous la forme : (hh:mm)12:45
Entrez l'heure sous la forme : (hh:mm)12:40
-300.000000
Quel bug ? -5 minutes x 60 = -300 secondes. Pour moi, c'est correct.Citation:
Envoyé par Fl0r3nt
T'aimes pas les 0 ? Mets "%.0f"
T'aimes pas le '-' ? Mets un test pour que la 2ème valeur soit >= à la première. Soit plus clair dans tes 'prompts'...
Supprime les 'fflush (stdin)'. fflush() n'a de sens que sur les flux sortants.
A oui, j'avais pas fait le lien, c'est le "-" qui m'a inquiété ;-) Je vais faire un test.Citation:
Quel bug ? -5 minutes x 60 = -300 secondes. Pour moi, c'est correct.
T'aimes pas les 0 ? Mets "%.0f"
T'aimes pas le '-' ? Mets un test pour que la 2ème valeur soit >= à la première. Soit plus clair dans tes 'prompts'...
Supprime les 'fflush (stdin)'. fflush() n'a de sens que sur les flux sortants.
Je vais modifier mes prompts. C'est vrai que c'est pas très clair.
Par contre, pour le fflush(), je ne comprends pas. Tu l'avais utilisé dans ton exemple page 1 de ce post. J'ai du louper qqchose ...
Exact, erreur de ma part. (corrigé).Citation:
Envoyé par Fl0r3nt
http://emmanuel-delahaye.developpez....#fflush_stdout
Voici une autre ébauche :
#include <stdio.h>
#include <time.h>
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 int main(void) { char s[32]; // struct tm tm = {0}; time_t A; time_t B; double R; // Structure tm initialisée : tm.tm_sec = 0; // Initialisé car non demandé // tm.tm_min = 0; --> Demandé à l'utilisateur //tm.tm_hour = 0; --> Demandé à l'utilisateur // tm.tm_wday = -1; --> Calculé par mktime() // tm.tm_yday = -1; --> Calculé par mktime() tm.tm_year = 1970 - 1900; // Initialisé car non demandé tm.tm_mon = 1 - 1; // Initialisé car non demandé tm.tm_mday = 1; // Initialisé car non demandé tm.tm_isdst = -1; // Initialisé car non demandé int n; do { do { printf("Entrez l'heure d'arrivee sous la forme (hh:mm) : "); fgets (s, sizeof s, stdin); // Nombres d'arguments pour n n = sscanf (s ,"%d:%d" ,&tm.tm_hour,&tm.tm_min ); } while (n != 2 || tm.tm_hour > 23 || tm.tm_min > 59); A = mktime (&tm); do { printf("Entrez l'heure de départ sous la forme (hh:mm) : "); fgets (s, sizeof s, stdin); // Nombres d'arguments pour n n = sscanf (s ,"%d:%d" ,&tm.tm_hour,&tm.tm_min ); } while (n != 2 || tm.tm_hour > 23 || tm.tm_min > 59); B = mktime (&tm); } while (B < A); R = difftime(B,A); int temps = R; int t_heu = 0; int t_min = 0; while (temps >= 60) { t_min = t_min + 1; temps = temps - 60; }; while ( t_min >= 60 ){ t_heu = t_heu + 1; t_min = t_min - 60; }; printf("\nHeures : %d -> Minutes : %d", t_heu,t_min); return 0; }
N'est pas très astucieux...Code:
1
2
3
4
5
6
7
8
9 while (temps >= 60) { t_min = t_min + 1; temps = temps - 60; }; while ( t_min >= 60 ){ t_heu = t_heu + 1; t_min = t_min - 60; };
ouCode:
1
2 t_heu = temps/3600; t_min = (temps%3600)/60;
Me semble mieux,Code:
1
2
3 t_heu = temps/3600; t_min = (temps- t_heu*3600)/60;
Jc
ah oui ... pardon .... j'y avais même pas penser.
Quel idiot ;-)
Merci.
Bien lire mes commentaires (-ed-)Citation:
Envoyé par Fl0r3nt
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 #include <stdio.h> #include <time.h> int main(void) { char s[32]; struct tm tm = { 0 }; time_t A; time_t B; /* -ed- eviter les accents dans un source C. Pas portable... */ // Structure tm initialisee : tm.tm_sec = 0; // Initialisé car non demandé tm.tm_year = 1970 - 1900; // Initialise car non demande tm.tm_mon = 1 - 1; // Initialisé car non demandé tm.tm_mday = 1; // Initialisé car non demandé tm.tm_isdst = -1; // Initialisé car non demandé int n; do { do { printf("Entrez l'heure d'arrivee sous la forme (hh:mm) : "); /* -ed- Ajoute pour la portabilite. Deja explique pourquoi... */ fflush(stdout); fgets (s, sizeof s, stdin); // Nombres d'arguments pour n n = sscanf (s , "%d:%d" , &tm.tm_hour, &tm.tm_min ); } while (n != 2 /* -ed- manque les tests '< 0'. */ || tm.tm_hour < 0 || tm.tm_hour > 23 || tm.tm_min < 0 || tm.tm_min > 59 ); A = mktime (&tm); /* -ed- repetition de code. Il faut apprendre a faire des fonctions... */ do { printf("Entrez l'heure de départ sous la forme (hh:mm) : "); fflush(stdout); fgets (s, sizeof s, stdin); // Nombres d'arguments pour n n = sscanf (s , "%d:%d" , &tm.tm_hour, &tm.tm_min ); } while (n != 2 || tm.tm_hour < 0 || tm.tm_hour > 23 || tm.tm_min < 0 || tm.tm_min > 59 ); B = mktime (&tm); } while (B < A); { double R = difftime(B, A); int temps = R; int t_heu = 0; int t_min = 0; /* -ed- voir correction de 'fearyourself' ... */ while (temps >= 60) { t_min = t_min + 1; temps = temps - 60; }; while ( t_min >= 60 ) { t_heu = t_heu + 1; t_min = t_min - 60; }; /* -ed- printf("\nHeures : %d -> Minutes : %d", t_heu,t_min); presentation horrible. Le '\n' se met en fin de ligne... */ printf("Duree : %02d:%02d\n", t_heu, t_min); } return 0; }
Merci Emmanuel , je corrige le tout, j'essaye d'améliorer et je republie mon code.
:D