====== 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; }