Outils pour utilisateurs

Outils du site


nsi:langages:c:solutions:jour_semaine

Trouver le jour de la semaine

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 <bool.h> 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 <stdio.h>

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;
}
nsi/langages/c/solutions/jour_semaine.txt · Dernière modification : de goupillwiki