====== Trouver le jour de la semaine ======
[[nsi:tds:jour_et_date|Fiche de l'exercice]]
====== Variante 1 =====
C n'a pas de type booléen. On utilise généralement le type ''int'' avec ''1'' pour //true// et ''0'' pour //false//. Pour être plus formel on peut inclure '''' qui définit ''true'' et ''false'' comme égaux à ''1'' et ''0''. Cela revient au même mais nous permet d'écrire ''true'' et ''false'' ce qui est plus clair.
#include
const int mois[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const char* jours[] = {"samedi", "dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi"};
int is_bissextile(int annee) {
// renvoie 1 pour bissextile, 0 sinon
if (annee % 1000 == 0) {
return 1;
}
if (annee % 100 == 0) {
return 0;
}
if (annee % 4 == 0) {
return 1;
}
return 0;
}
int days_in_month(int month, int annee) {
int n = mois[month - 1]; // j pour janvier correspond à l'indice 0
if ((month == 2) && is_bissextile(annee)) {
return n + 1;
}
return n;
}
int days_in_year(int annee) {
if (is_bissextile(annee)) {
return 366;
} else {
return 365;
}
}
int nombre_jours(int jour, int mois, int annee) {
// Renvoie le nombre de jour par rapport
// en partant du jour donné vers le
// 1 janvier 2001
// commençons par calculer le nombre de jour
// pour atteindre le 1er janvier de l'année d'après
int days = days_in_month(mois, annee) - (jour-1);
for (int m=mois+1; m<= 12; m++){
days += days_in_month(m, annee);
}
annee++;
// recherchons maintenant à revenir à 2000,
// notre année de référence
while (annee != 2000) {
if (annee < 2000){
days += days_in_year(annee);
annee++;
} else {
days -= days_in_year(annee - 1);
annee--;
}
}
return days;
}
int main(void) {
int jour;
int mois;
int annee;
printf("Entrez le jour : ");
scanf("%d", &jour);
printf("Entrez le mois : ");
scanf("%d", &mois);
printf("Entrez l'année : ");
scanf("%d", &annee);
// comptons le nombre de jour à partir du 01/01/2001
int days = -nombre_jours(jour, mois, annee);
int delta = days % 7;
if (delta < 0) {
delta += 7;
}
printf("Le %02d-%02d-%04d était un %s\n", jour, mois, annee, jours[delta]);
return 0;
}
===== Variante 2 =====
Plutôt que demander 3 saisies, on peut n'en demander qu'une :
int main(void) {
int jour;
int mois;
int annee;
printf("Entrez la date au format JJ/MM/AAAA : ");
scanf("%d/%d/%d", &jour, &mois, &annee);
// comptons le nombre de jour à partir du 01/01/2001
int days = -nombre_jours(jour, mois, annee);
int delta = days % 7;
if (delta < 0) {
delta += 7;
}
printf("Le %02d-%02d-%04d était un %s\n", jour, mois, annee, jours[delta]);
return 0;
}
===== Variante 3 =====
On peut également préférer éviter le input et passer par un argument lors de l'appel de la fonction.
Notez l'utilisation de ''fscanf'' qui prend le contenu de ''argv[1]'' pour en extraire les quantités utiles.
int main(int argc, char* argv[]) {
if (argc != 2) {
printf("Vous devez indiquer la date au format JJ/MM/AAAA.\nPar exemple %s 18/03/2003\n", argv[0]);
return 1;
}
int jour;
int mois;
int annee;
sscanf(argv[1], "%d/%d/%d", &jour, &mois, &annee);
// comptons le nombre de jour à partir du 01/01/2001
int days = -nombre_jours(jour, mois, annee);
int delta = days % 7;
if (delta < 0) {
delta += 7;
}
printf("Le %02d-%02d-%04d était un %s\n", jour, mois, annee, jours[delta]);
return 0;
}