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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
/* quelques valeurs pour éviter les "nombres magiques"
Toutes ces valeurs ne changeront normalement jamais... mais bon,
Ca a une valeur hautement documentaire ;)*/
/* nombre de jours d'une année bisextile */
#define ABISEXTILE 366
/* nombre de jours d'une année non bisextile */
#define ANONBISEXTILE 365
/* numéro du jour du 01/01/2000 (un samedi, mais avec lundi==0) */
#define REFERENCE 5
/* L'année de référence */
#define REFANNEE 2000
/* les prototypes des fonctions */
int Bisextile(int annee);
void Calendar(int ref, int mois, int bisextile);
/* la fonction principale */
int main()
{
/* notre jour de référence: le 01/01/2000 était un samedi */
int ref=REFERENCE;
/* l'année qui devrait etre introduite par l'utilisateur */
int annee=1968;/* pour l'exemple */
/* le mois qui devrait etre introduit par l'utiliateur */
int mois=8;/* pour l'exemple... représente septembre */
/* il faut travailler différemment selon que l'on cherche
le calendrier d'une année avant ou apres notre année de référence*/
int isbisextile;
if(annee>REFANNEE)
{
int i;
/* on passe toutes les années entre 2000 et annee en revue */
for(i=REFANNEE;i<annee;i++)
{
if(Bisextile(i)==1)
{
ref+=ABISEXTILE;
}
else
{
ref+=ANONBISEXTILE;
}
/* on remet ref dans une fourchette [0,7[ */
ref=ref%7;
}
}
else
{
/* si l'année recherchée date d'avant l'an 2000, il faut soustraire
mais comme on se base sur le 01/01/2000, il faut commencer à
partir de 1999 pour la soustraction des jours, et soustraire
également le nombre de jours de l'année recherchée ;) */
int i;
for(i=REFANNEE-1;i>=annee;i--)
{
if(Bisextile(i)==1)
ref-=(ABISEXTILE%7);
else
ref-=(ANONBISEXTILE%7);
/* probleme: ref peut etre devenu négatif (il se trouve dans une
fourchette [-7,7[)... ajouter 7 permet de récupérer une valeur
correcte */
if(ref<0)
ref+=7;
}
}
/* arrivé ici, ref correspond au jour de la semaine du 01/01/annee
Il faut arriver au premier du mois recherché*/
/* le nombre de jours des mois */
int nbmois[]={31,0,31,30,31,30,31,31,30,31,30,31};
/* dont on adapte février en fonction du fait que l'année soit bisextile
ou non */
if(Bisextile(annee)==1)
nbmois[1]=29;
else
nbmois[1]=28;
/* on rajoute les mois précédant celui qu'on recherche */
int i;
for(i=0;i<mois;i++)
ref+=(nbmois[i]%7);
/* et on remet la valeur dans la fourchette [0,7[ */
ref=ref%7;
/* pour, enfin, appeler la fonction d'affichage du calendrier */
Calendar(ref,mois,annee);
return 0;
}
/* fonction qui calcule si l'année est bisextile ou non
@in: année recherchée
@out: 1 si oui, 0 si non
*/
int Bisextile(int annee)
{
if(annee%4==0)
{
if(annee%100==0)
{
if(annee%400==0)
return 1;
return 0;
}
return 1;
}
return 0;
}
/* fonction qui affiche le calendrier...
@ in: ref: numéro du jour du premier du mois
mois: numéro du mois à afficher(avec janvier==0)
annee: année affichée
*/
void Calendar(int ref, int mois, int annee)
{
/* il nous faut quelques tableaux utiles...
celui des nombres de jour de l'année */
int nbmois[]={31,0,31,30,31,30,31,31,30,31,30,31};
/* que l'on adapte directement */
if(Bisextile(annee)==1)
nbmois[1]=29;
else
nbmois[1]=28;
/* celui avec les noms en toutes lettres des mois */
char nommois[12][10]={"janvier","fevrier","mars","avril","mai","juin",
"juillet","aout","septembre","octobre","novembre",
"decembre"};
/* celui des jours de la semaine (4 caracctères utiles chaque fois, dont
le dernier est un espace */
char nomsem[7][5]={"lun ","mar ","mer ","jeu ","ven ","sam ","dim "};
/* on affiche d'abord le mois impliqué et une "entete" */
printf("Calendrier du mois de %s %d\n",nommois[mois],annee);
int i;
for(i=0;i<7;i++)
printf("%s",nomsem[i]);
printf("\n");
/* ensuite, on affiche autant d'espace que nécessaire pour que le jour du
premier du mois soit à la bonne position */
for(i=0;i<ref;i++)
printf(" ");
/* et on termine en affichant les jours du mois...
un petit calcul (ref+jour)%7 permet de savoir quel jour de la semaine
c'est ;) */
for(i=1;i<=nbmois[mois];i++)/* nous, on compte à partir de 1 :P */
{
printf(" %2d ",i);
if((ref+i)%7==0)
printf("\n");
}
} |
Partager