IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Connaître le jour correspondant à une date


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut Connaître le jour correspondant à une date
    svp un programme en c qui permet de rechercher le nom du jour d'une date donnée(expiré) ,exemple :le 20/03/2007-->mardi e merci d'avance

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Tu peux te baser sur cet exemple.

  3. #3
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut
    Citation Envoyé par Melem Voir le message
    Tu peux te baser sur cet exemple.
    merci mais je veux une solution sans utiliser la bibliothèque <time.h>

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Il faut avoir une date X arbitraire qu'on va utiliser comme référence. Soit i le numéro de jour de la semaine correspondant à cette date. Associons 0 à lundi.

    Soit Y la date dont on veut déterminer le jour j correspondant. Pour faciliter l'explication et surtout les calculs, supposons que X <= Y. Donc prendre un X assez ancien. Afin de simplifier les calculs, prendre également un 1er janvier, quelle que soit l'année choisie. Dans toute la suite, il est supposé que X est un 1er janvier et que X <= Y. Pour ton info, la plupart des implémentations du langage C prennent comme référence la date du 1er janvier 1970. Tu ne peux donc pas connaître les informations concernant une date antérieure à cette référence.

    Algorithme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Da = Annee(Y) - Annee(X)
    Dj = NbJoursEcoulesDepuis1erJanvier(Mois(Y), Jour(Y))
    DjTotal = Da * 365 + Dj + NbAnneesBissesxtilesEntre(Annee(X), Annee(Y) - 1)
    Si Mois(Y) >= 2 et EstBissextile(Annee(Y)), DjTotal++
    j = (i + DjTotal) % 7
    Terminé.

    Remarques :

    R1 : Une année est bissextile si l'une des conditions suivantes est vérifiée :
    - Elle est multiple de 4 mais pas multiple de 100
    - Elle est multiple de 400

    Ex :

    - 2000 est bissextile car elle est multiple de 400. En s'en fiche que l'autre condition soit remplie ou non.
    - 2004 est bissextile car elle est multiple de 4 mais pas multiple de 100. En s'en fiche que l'autre condition soit remplie ou non.
    - 1900 n'est pas bissextile car aucune condition n'est remplie.

    R2 : Jours écoulés de puis le 1er janvier si on est le 8 janvier par exemple est (8 - 1) = 7.

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    J'ai eu le temps de faire une implémentation en C. J'ai pris le 1er janvier 1980 comme référence, c'est un mardi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <stdio.h>
     
    #define EST_BISSEXTILE(a) ((EST_MULTIPLE((a), 4) && !EST_MULTIPLE((a), 100)) || EST_MULTIPLE((a), 400))
    #define EST_MULTIPLE(A, B) (((A) % (B)) == 0)
     
    int NbJoursEcoulesDepuis1erJanvier(int mois, int jour);
    int NbAnneesBissesxtilesEntre(int annee1, int annee2);
     
    #define ANNEE_REF 1980
    #define JOUR_REF 1 /* mardi */
     
    int main()
    {
        int jour, mois, annee;
        printf("Entrez une date au format jj/mm/aaaa : ");
        if (scanf("%d/%d/%d", &jour, &mois, &annee) != 3)
            printf("Mauvais format.\n");
        else
        {
            int Da, Dj, DjTotal, j;
            const char * days_tab[] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"};
     
            mois--;
            Da = annee - ANNEE_REF;
            Dj = NbJoursEcoulesDepuis1erJanvier(mois, jour);
            DjTotal = Da * 365 + Dj + NbAnneesBissesxtilesEntre(ANNEE_REF, annee);
            if (mois >= 2 && EST_BISSEXTILE(annee))
                DjTotal++;
            j = (JOUR_REF + DjTotal) % 7;
     
            printf("C'est un %s.\n", days_tab[j]);
        }
     
        return 0;
    }
     
    int NbJoursEcoulesDepuis1erJanvier(int mois, int jour)
    {
        int nbjoursmois[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int i, jours_ecoules_debmois = 0;
        for(i = 0; i < mois; i++)
            jours_ecoules_debmois += nbjoursmois[i];
        return jours_ecoules_debmois + (jour - 1);
    }
     
    int NbAnneesBissesxtilesEntre(int annee1, int annee2)
    {
        int annee, res = 0;
        for(annee = annee1; annee <= annee2; annee++)
            if (EST_BISSEXTILE(annee))
                res++;
        return res;
    }
    Ce programme n'étant qu'une démo, je n'ai pas trop insisté sur la validation des entrées. Toi par contre, tu en as le droit et le devoir.

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par kraeim89 Voir le message
    svp un programme en c qui permet de rechercher le nom du jour d'une date donnée(expiré) ,exemple :le 20/03/2007-->mardi e merci d'avance
    Je t'invite à regarder du côté de la formule de Zeller.

  7. #7
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut
    Citation Envoyé par gl Voir le message
    Je t'invite à regarder du côté de la formule de Zeller.
    alors tu peux le passer si ne te derange pas???

  8. #8
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par kraeim89 Voir le message
    alors tu peux le passer si ne te derange pas???

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 109
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
     
    int main(void)
    {
      int j = 14, m = 7, a = 1789;
      int n = ((1461*(a+4800+(m-14)/12))/4+(367*(m-2-12*((m-14)/12)))/12-(3*((a+4900+(m-14)/12)/100))/4+j-32075)%7;
      const char *t[] = {"Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"};
     
      printf("\n%02d/%02d/%4d => %s\n", j, m, a, t[n]);
      return 0;
    }

  10. #10
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Salut,

    Je m'était posé la question aussi, et j'avais trouvé sur le net, 4 méthodes pour déterminer le jour de la semaine :
    • Brown B.H. (formule)
    • Kraitchik, Maurice (formule)
    • Zeller, Christian (formule)
    • Eric W. Weisstein (tableaux de constantes)

    (Voir pièce jointe de l'implémentation en C)
    Fichiers attachés Fichiers attachés

  11. #11
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Très longtemps avant, presque 10 ans, j'avais également établi à partir de rien (plus précisément avec l'algorithme ci-dessus) exactement cette formule, mais je l'ai perdu. A l'époque et jusqu'à aujourd'hui je ne savais pas qu'elle portait le nom de Zeller . Ca ne m'a pas trop intéressé de toute façon, vu que les "ordinateurs" savaient déjà le faire ...

Discussions similaires

  1. Retrouver le jour de la semaine correspondant à une date
    Par christophe_halgand dans le forum MATLAB
    Réponses: 2
    Dernier message: 17/01/2008, 10h28
  2. Réponses: 1
    Dernier message: 07/08/2007, 22h49
  3. Réponses: 14
    Dernier message: 10/08/2006, 15h53
  4. Jour correspondant à une date
    Par sali dans le forum Oracle
    Réponses: 3
    Dernier message: 13/12/2004, 10h04
  5. Pb de mise à jour d'une date
    Par valerie90 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/09/2004, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo