This repository has been archived on 2019-08-09. You can view files and clone it, but cannot push or open issues or pull requests.
s4-c/DS2-2015/E2.c

107 lines
2.3 KiB
C
Raw Normal View History

/* Dates */
#include <stdio.h>
int horos(int J, int M, int A);
int bissextile(int A);
int zeller(int J, int M, int A);
int horos(int J, int M, int A) {
switch (M) {
case 1:
return J < 20 ? 9 : 10;
case 2:
return J < 19 ? 10 : 11;
case 3:
return J < 21 ? 11 : 0;
case 4:
return J < 20 ? 0 : 1;
case 5:
return J < 21 ? 1 : 2;
case 6:
return J < 21 ? 2 : 3;
case 7:
return J < 22 ? 3 : 4;
case 8:
return J < 23 ? 4 : 5;
case 9:
return J < 23 ? 5 : 6;
case 10:
return J < 23 ? 6 : 7;
case 11:
return J < 22 ? 7 : 8;
case 12:
return J < 22 ? 8 : 9;
default:
return -1;
}
}
int bissextile(int A) {
if (A % 4) { // Pas divisible
return 0;
} else { // Divisible
if (A % 100) {
return 1;
} else {
if (A % 400) {
return 0;
} else {
return 1;
}
}
}
}
int zeller(int J, int M, int A) {
double X, Y, Z, B;
if (M <= 2) {
X = M + 10;
B = A - 1;
} else {
X = M - 2;
B = A;
}
Z = (int) (B / 100);
Y = B - 100 * Z;
return (int) (J + (int) (2.6 * X - 0.2) + Y + (int) (Y / 4) + (int) (Z / 4) + 5 * Z) % 7;
}
int main() {
int J, M, A;
printf("Saisissez l'année : ");
scanf("%d", &A);
if (A <= 1582) {
printf("À cette date là, le calendrier grégorien n'était pas encore établi, les résultats suivants ne sont donc peut-être pas exacts.\n");
}
printf("Saisissez le mois : ");
scanf("%d", &M);
if (M < 1 || M > 12) {
printf("Les mois vont de 1 à 12 !\n");
return 2;
}
printf("Saisissez le jour : ");
scanf("%d", &J);
if (J < 1 || M > 31) {
printf("Les jours vont de 0 à 31 (et encore) !\n");
return 2;
}
if (M == 2) {
if (J > 29) {
printf("Les mois de février ont au maximum 29 jours !\n");
return 2;
} else if (J == 29 && !bissextile(A)) {
printf("Cette année n'est pas bissextile, le mois de février n'a donc que 28 jours !\n");
return 2;
}
}
// TODO
return 0;
}