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 :

[toFAQ]calendrier perpetuel


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut [toFAQ]calendrier perpetuel
    bonjour!!
    je suis à la recherche d'un prog en c qui permet de réaliser un calendrier perpetuel(on tape une date et il doit nous renvoyer le jour de la semaine qui lui correspond!)
    si,en plus,ce prog fonctionne pour les dates d'avant le calendrier julien,c'est vraiment génial!!!!
    merci!!!et bonne journée à tous!

  2. #2
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Il existe une methode pour determiner a partir d'une date le jour de la semaine, qui s'appelle la formule de Zeller

    Formule de Zeller :

    z = (E(2.6 *mz -0.2) +jj + az + (az div 4) + (sz div 4) - 2* sz) modulo 7)

    si z = 0, alors la date saisie est un dimanche,
    si z = 1, alors la date saisie est un lundi
    ...
    avec

    mz => mois de l'année de Zeller
    az => N° de l'année dans le siècle
    sz => le millénaire
    L'année de Zeller commence au mois de Mars et finit au mois de Février. Elle n'est valable qu'après la date du 15 Octobre 1582 car la date précédant le 15 est le 4 Octobre 1582.

  3. #3
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    4 octobre ? kel hasard, c'est le jour de mon anniversaire lol ...
    Je connaissais pas ca... c'est super et bien compliqué... comment Zeller (c'est son nom ?) a pensé à faire ca ?? Enfin ... tant mieux

    Nas'

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    merci beaucoup pour ce élément de réponse!!!!!
    bonne journée!!

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par NASKY
    4 octobre ? kel hasard, c'est le jour de mon anniversaire lol ...
    Je connaissais pas ca... c'est super et bien compliqué... comment Zeller (c'est son nom ?) a pensé à faire ca ?? Enfin ... tant mieux

    Nas'
    Non, en fait cette date (passage du calendrier Julien au calendier Gregorien) depend des pays...
    les pays anglo-saxon on fait le changement en dans la nuit du 2 au 14 spetembre 1752...

    Les Russes l'ont fait apres les revolutions de 1917...

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 19
    Points : 25
    Points
    25
    Par défaut
    voici un exemple de code (traduit d'un code en java) :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <stdio.h>
    #include <conio.h>
     
    int main (int argc, char **argv) {
    	int jour ;
    	int mois ;
    	int annee ;
          	int res ; 	// res est le resultat de la formule de base de Zeller
    	int centaine; 	// centaine represente les centaines d'annees , 
    	                // si l'annee est 1789 alors centaine = 17
    	int dizaine; 	// dizaine represente les dizaines d'annees , 
                            // si l'annee est 1789 alors dizaine  =89
    	int jourSemaine;// jourSemaine represente le jour dans la semaine 
                            // numerote de 0 a 6 en partant du dimanche
    	int sauveAnnee; // annee represente l'annee corrigee
    	int moisD; 	// moisD represente le mois decale
     
    	printf("entrez le jour\n");
            scanf("%d", &jour) ;
    	while(getchar() != '\n');
            printf("entrez le mois\n");
            scanf("%d", &mois) ;
    	while(getchar() != '\n');
            printf("entrez l'annee\n");
            scanf("%d", &annee);
    	while(getchar() != '\n');
     
            //permet de memoriser la veritable annee avant manipulation
            sauveAnnee = annee ;
     
            //decalage des mois
     
    	if (mois >= 3)  {
    	    moisD = mois - 2;
    	} else {
    	    moisD = mois+10;
    	    annee = annee -1;
    	}
     
    	//decoupage en centaine et dizaine
     
    	centaine = annee / 100;
    	dizaine = annee % 100;
     
    	//calcul
    	res = ((26*moisD - 2)/10) + jour + dizaine + dizaine / 4 +
    	       centaine / 4 - 2*centaine   ;
     
     
    	//prise en compte du rattrapage de calendrier
     
    	if ((annee <1582 || 
                (annee == 1582 && mois <10) || 
                (annee == 1582 && mois == 10 && jour <= 4))){
    	    res = res+3;
    	}
     
    	jourSemaine = res %  7;
     
    	//rectificatif modulo d'un nbre negatif 
     
    	if (jourSemaine < 0){
    	    jourSemaine += 7;
    	}
     
    	//affichage du resultat
    	printf("le %d/%d/%d est un " ,jour, mois, sauveAnnee);
    	switch (jourSemaine) {
    		case 0: printf("dimanche\n");break;
    		case 1: printf("lundi\n");break;
    		case 2: printf("mardi\n");break;
    		case 3: printf("mercredi\n");break;
    		case 4: printf("jeudi\n");break;
    		case 5: printf("vendredi\n");break;
    		case 6: printf("samedi\n");break;
    		default: printf("Erreur %d\n", jourSemaine);
    	}
    	return 0 ;
    }
    source : http://etna.int-evry.fr/cours/java/E...cicesAlgo.html

  7. #7
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    compilé et testé avec BCC5.5, le programme de boubou33 marche
    très bien avec ma date de naissance

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    merci beaucoup pour toutes ces informations!
    sans vouloir abuser de votre temps qui je n'en doute pas est précieux,existerait-il une autre solution sans passer par la formule de zeller?
    Et merci encore?

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 19
    Points : 25
    Points
    25
    Par défaut
    si tu es dans un environnement unix, tu peux utiliser les fonctions time et localtime. La fonction localtime te renvoie une structure dans laquelle un int représente le jour de la semaine. Je n'ai pas le temps de faire un exemple pour le moment mais si tu veux, ce soir je te montrerais un prog exemple

    boubou

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Effectivement,je suis sous unix(novice en la matière!)
    En tout cas,je te remercie beaucoup du temps que tu consacres à m'aider et j'accepte volontiers ta proposition de me montrer un prog qui tourne sous unix.
    Bonne soirée Boubou!!

  11. #11
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Voici un truc qui semble marcher :
    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
    #include <time.h>
    int main(void){
        char *jour[]={"dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"};
        int y,m,d;
        struct tm t;
        time_t tt;
        /* 17/04/2002 */
        y=32; /* +1970 = 2002 */
        m=4;  
        d=17; 
        t.tm_sec=0;
        t.tm_min=0;
        t.tm_mday=d;
        t.tm_mon=m;
        t.tm_year=y;
        tt=mktime(&t);
        t=*localtime(&tt);
        printf("alors jours : %s\n",jour[t.tm_wday]);
        return 0;
    }

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    merci beaucoup pour cette réponse!
    comme je suis vraiment novice en c ,mes questions vont peut être paraître stupides mais est ce que programme fonctionne uniquement depuis 1970?si non,comment l'adapter afin qu'il puisse tourner depuis n'importe quelle date,même avant le calendrier grégorien?

    Merci infiniment!

    Philippe

  13. #13
    Nouveau membre du Club
    Inscrit en
    Avril 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 19
    Points : 25
    Points
    25
    Par défaut
    oups!!
    j'ai carrément oublié de faire l'exemple mais heureusement il y a D[r]eadLock !!

    bon alors le problème c'est que sous unix, toutes les fonctions d'heures sont basées sur le 1er janvier 1970, date de création (je crois) de Unix. par exemple, la fonction time te renvoie en fait le nb de secondes écoulées depuis cette date et la fonction ctime calcule la date a partir de ce nb et te remplit la structure.
    En reprenant le code de D[r]eadLock, je me suis aperçu que tm_year correspond au nombre d'années écoulées depuis 1900 et non 1970. Le prog devient alors :

    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
    #include <stdio.h> // important pour le printf !!
    #include <time.h>
     
    int main()
    {
    	char *jour[]={"dimanche", "lundi","mardi","mercredi","jeudi","vendredi","samedi"};
    	int y,m,d;
    	struct tm t;
    	time_t tt;
    	/* 17/04/2003*/
    	y=103; // 2003-1900
    	m=4;
    	d=17;
    	t.tm_sec=0;
    	t.tm_min=0;
    	t.tm_mday=d;
    	t.tm_mon=m;
    	t.tm_year=y;
    	tt=mktime(&t) ;
    	t=*localtime(&tt) ;
    	printf("date : %s %.2d/%.2d/%.4d\n", jour[t.tm_wday], d, m, (y+1900));
    	return 0;
    }
    J'ai testé pour une date avant 1900 et ça fonctionne . ex : pour 1875,

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    d'accord!!!
    et si je souhaite que ce soit l'utilisateur qui entre la date de son choix,comment adapter ce programme à celui que tu m'avais traduit le 10 avril !!!
    merci beaucoup pour ton aide,ainsi qu'à toi D[r]eadLock !!!
    bonne journée!

  15. #15
    Nouveau membre du Club
    Inscrit en
    Avril 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 19
    Points : 25
    Points
    25
    Par défaut
    et si je souhaite que ce soit l'utilisateur qui entre la date de son choix,comment adapter ce programme à celui que tu m'avais traduit le 10 avril
    c'est ce que fait ce prog ! je pense que tu voulais dire celui du 17.
    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
    #include <stdio.h> // important pour le printf !!
    #include <time.h>
     
    int main()
    {
       char *jour[]={"dimanche", "lundi","mardi","mercredi","jeudi","vendredi","samedi"};
       int y,m,d;
       struct tm t;
       time_t tt;
       printf("date ? (ex : 25/12/2003) ") ;
       scanf("%d/%d/%d", &d, &m, &y) ;
       y = y - 1900 ;
       t.tm_sec=0;
       t.tm_min=0;
       t.tm_mday=d;
       t.tm_mon=m;
       t.tm_year=y;
       tt=mktime(&t) ;
       t=*localtime(&tt) ;
       printf("date : %s %.2d/%.2d/%.4d\n", jour[t.tm_wday], d, m, (y+1900));
       return 0;
    }
    le pb, c'est que ça affiche toujours jeudi et là je ne comprends pas !

  16. #16
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Effectivement, y'avait des bugs !!
    - il manque un t.tm_hour=0; (sinon, ca prend un valeur au pif, et donc le mktime marche pas)
    - il manque le test du mktime : if (tt==-1) exit(1)
    - il manque un -1 pour le mois (on commence a partir de 0)

    Ce qui donne :
    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
    #include <stdio.h> // important pour le printf !! 
    #include <time.h> 
     
    int main() 
    { 
      char *jour[]={"dimanche", "lundi","mardi","mercredi","jeudi","vendredi","samedi"}; 
      int y,m,d; 
      struct tm t; 
      time_t tt; 
      printf("date ? (ex : 25/12/2003) ") ; 
      scanf("%d/%d/%d", &d, &m, &y) ; 
      y = y - 1900 ; 
      t.tm_sec=0; 
      t.tm_min=0; 
      t.tm_hour=0;
      t.tm_mday=d; 
      t.tm_mon=m-1; 
      t.tm_year=y; 
      tt=mktime(&t) ; 
      if (tt==-1){
          fprintf(stderr,"Error mktime, cannot consider this date\n");
          exit(1);
      }
      t=*localtime(&tt) ; 
      printf("date : %s %.2d/%.2d/%.4d\n", jour[t.tm_wday], d, m, (y+1900)); 
      return 0; 
    }
    J'avais fait un seul test qui etait tombe juste . Et moi, ca mettait tjrs mercredi.

    Citation Envoyé par Enfin un test plus complet
    [D[r]eadLock@cyann ~/test/exper]> ./bou
    date ? (ex : 25/12/2003) 21/04/2003
    date : lundi 21/04/2003
    [D[r]eadLock@cyann ~/test/exper]> ./bou
    date ? (ex : 25/12/2003) 22/04/2003
    date : mardi 22/04/2003
    [D[r]eadLock@cyann ~/test/exper]> ./bou
    date ? (ex : 25/12/2003) 21/04/2003
    date : lundi 21/04/2003
    [D[r]eadLock@cyann ~/test/exper]> ./bou
    date ? (ex : 25/12/2003) 10/12/1875
    Error mktime, cannot consider this date
    Donc pour les dates avant 1970, ca va pas marcher, mktime ne peut pas donner le nombre de secondes depuis cette date.

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    en fait,quand je faisais référence au programme précédent,c'était celui du 10 avril,traduit depuis le code java!!!!j'aurais souhaité savoir comment faire pour qu'il fonctionne sans se servir de la formule de Zeller!!!
    En tout cas,merci beaucoup pour votre aide!ça m'aide énormémént!!!

  18. #18
    Nouveau membre du Club
    Inscrit en
    Avril 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 19
    Points : 25
    Points
    25
    Par défaut
    bien vu pour les erreurs D[r]eadLock !!

    philippe -> je crois bien qu'il n'y ait que deux manieres d'obtenir le jour à partir d'une date : zeller et structure tm
    si tu veux utiliser l'exemple du 10 avril, il te suffit de le combner avec celui de D[r]eadLock !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 58
    Dernier message: 27/04/2015, 14h09
  2. [XL-2002] RP et Feriés dans Calendrier perpetuel
    Par freddy80 dans le forum Excel
    Réponses: 3
    Dernier message: 22/04/2014, 09h35
  3. Réponses: 14
    Dernier message: 03/04/2007, 11h00
  4. Réaliser calendrier perpetuel avec EXEL
    Par Perdus dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 20/10/2005, 08h05
  5. Calcul des numéros de semaine d'un calendrier
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 21h29

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