svp un programme en c qui permet de rechercher le nom du jour d'une date donnée(expiré) ,exemple :le 20/03/2007-->mardi e merci d'avance![]()
svp un programme en c qui permet de rechercher le nom du jour d'une date donnée(expiré) ,exemple :le 20/03/2007-->mardi e merci d'avance![]()
Tu peux te baser sur cet exemple.
Il faut avoir une date X arbitraire qu'on va utiliser comme référence. Soit i le numéro de jour de la semaine correspondant à cette date. Associons 0 à lundi.
Soit Y la date dont on veut déterminer le jour j correspondant. Pour faciliter l'explication et surtout les calculs, supposons que X <= Y. Donc prendre un X assez ancien. Afin de simplifier les calculs, prendre également un 1er janvier, quelle que soit l'année choisie. Dans toute la suite, il est supposé que X est un 1er janvier et que X <= Y. Pour ton info, la plupart des implémentations du langage C prennent comme référence la date du 1er janvier 1970. Tu ne peux donc pas connaître les informations concernant une date antérieure à cette référence.
Algorithme :
Terminé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Da = Annee(Y) - Annee(X) Dj = NbJoursEcoulesDepuis1erJanvier(Mois(Y), Jour(Y)) DjTotal = Da * 365 + Dj + NbAnneesBissesxtilesEntre(Annee(X), Annee(Y) - 1) Si Mois(Y) >= 2 et EstBissextile(Annee(Y)), DjTotal++ j = (i + DjTotal) % 7
Remarques :
R1 : Une année est bissextile si l'une des conditions suivantes est vérifiée :
- Elle est multiple de 4 mais pas multiple de 100
- Elle est multiple de 400
Ex :
- 2000 est bissextile car elle est multiple de 400. En s'en fiche que l'autre condition soit remplie ou non.
- 2004 est bissextile car elle est multiple de 4 mais pas multiple de 100. En s'en fiche que l'autre condition soit remplie ou non.
- 1900 n'est pas bissextile car aucune condition n'est remplie.
R2 : Jours écoulés de puis le 1er janvier si on est le 8 janvier par exemple est (8 - 1) = 7.
J'ai eu le temps de faire une implémentation en C. J'ai pris le 1er janvier 1980 comme référence, c'est un mardi.
Ce programme n'étant qu'une démo, je n'ai pas trop insisté sur la validation des entrées. Toi par contre, tu en as le droit et le devoir.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <stdio.h> #define EST_BISSEXTILE(a) ((EST_MULTIPLE((a), 4) && !EST_MULTIPLE((a), 100)) || EST_MULTIPLE((a), 400)) #define EST_MULTIPLE(A, B) (((A) % (B)) == 0) int NbJoursEcoulesDepuis1erJanvier(int mois, int jour); int NbAnneesBissesxtilesEntre(int annee1, int annee2); #define ANNEE_REF 1980 #define JOUR_REF 1 /* mardi */ int main() { int jour, mois, annee; printf("Entrez une date au format jj/mm/aaaa : "); if (scanf("%d/%d/%d", &jour, &mois, &annee) != 3) printf("Mauvais format.\n"); else { int Da, Dj, DjTotal, j; const char * days_tab[] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"}; mois--; Da = annee - ANNEE_REF; Dj = NbJoursEcoulesDepuis1erJanvier(mois, jour); DjTotal = Da * 365 + Dj + NbAnneesBissesxtilesEntre(ANNEE_REF, annee); if (mois >= 2 && EST_BISSEXTILE(annee)) DjTotal++; j = (JOUR_REF + DjTotal) % 7; printf("C'est un %s.\n", days_tab[j]); } return 0; } int NbJoursEcoulesDepuis1erJanvier(int mois, int jour) { int nbjoursmois[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int i, jours_ecoules_debmois = 0; for(i = 0; i < mois; i++) jours_ecoules_debmois += nbjoursmois[i]; return jours_ecoules_debmois + (jour - 1); } int NbAnneesBissesxtilesEntre(int annee1, int annee2) { int annee, res = 0; for(annee = annee1; annee <= annee2; annee++) if (EST_BISSEXTILE(annee)) res++; return res; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include <stdio.h> int main(void) { int j = 14, m = 7, a = 1789; int n = ((1461*(a+4800+(m-14)/12))/4+(367*(m-2-12*((m-14)/12)))/12-(3*((a+4900+(m-14)/12)/100))/4+j-32075)%7; const char *t[] = {"Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"}; printf("\n%02d/%02d/%4d => %s\n", j, m, a, t[n]); return 0; }
Salut,
Je m'était posé la question aussi, et j'avais trouvé sur le net, 4 méthodes pour déterminer le jour de la semaine :
- Brown B.H. (formule)
- Kraitchik, Maurice (formule)
- Zeller, Christian (formule)
- Eric W. Weisstein (tableaux de constantes)
(Voir pièce jointe de l'implémentation en C)
Très longtemps avant, presque 10 ans, j'avais également établi à partir de rien (plus précisément avec l'algorithme ci-dessus) exactement cette formule, mais je l'ai perdu. A l'époque et jusqu'à aujourd'hui je ne savais pas qu'elle portait le nom de Zeller. Ca ne m'a pas trop intéressé de toute façon, vu que les "ordinateurs" savaient déjà le faire ...
Partager