Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1251 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Perfectionnement d'un calendrier perpetuel en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Perfectionnement d'un calendrier perpetuel en C

n°1536862
teycir
Posté le 01-04-2007 à 10:50:33  profilanswer
 

Bonjour;
J'ai amélioré un code de calendrier perpétuel en C (de -2000 à 4000): affichage du jour de la semaine (lundi, mardi,mercredi...) en fonction de la date, mais il reste perfectible.
- Par exemple il y a des jours qui n'existent pas comme les 29 févriers des années non bissextiles qui sont affichées. Je voudrais que ces jours ne soient pas affichées (message d'erreur à la place).  
- Il y a également un problème d'absence des heures et dates système à rajouter.
Je suis en train de plancher sur le code, si vous avez des solutions ou des astuces ou même des remarques quant à l'analyse, n'hésitez pas à me les communiquer.
Merci. :)
 
Voici le code du programme principal à perfectionner (rajout d'heure et de date système + élimination des jours n'ayant jamais existé comme les 29 févriers des années non bissextiles):
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int ansup (int an)
  4. {
  5. int an_bis, an_nbis;
  6. an_bis = an_nbis = 0;
  7. while (an >= 2003)
  8.  {
  9.   if ( an%4==0 && an%100!=0 || an%400==0 )
  10.   an_bis+=1;
  11.  else
  12.   an_nbis+=1;
  13.  an--;
  14. }
  15.     return(an_bis * 366  + an_nbis * 365);  /* c'est le nombre de jours entre le 01/01/2003 et le 01/01 de l'année rentrée */
  16. }
  17. int aninf (int an)
  18. {
  19. int an_bis, an_nbis;
  20. an_bis = an_nbis = 0;
  21. while (an < 2003)
  22. {
  23.  if (an%4 == 0 && an%100 !=0 || an%400 == 0)
  24.   an_bis+=1;
  25.  else
  26.   an_nbis+=1;
  27.  an++;
  28. }
  29.  return(an_bis * 366 + an_nbis * 365); /* c'est le nombre de jours entre le 01/01 de l'année rentrée et le 01/01/2003 */
  30. }
  31. int nb_jr (int mois, int an) /* calcul du nombre de jours passés en fonction de l'année (bissextile ou non) et du mois rentrés */
  32. {
  33. int bissextile[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
  34. int n_bissextile[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
  35. int som = 0;
  36. if ( an%4==0 && an%100!=0 || an%400==0 )
  37. {
  38.  while (mois>0)
  39.  {
  40.   som = som + bissextile[mois-1];
  41.   mois--;
  42.  }
  43. }
  44. else
  45. {
  46.  while (mois>0)
  47.  {
  48.   som = som + n_bissextile[mois-1];
  49.   mois--;
  50.  }
  51. }
  52. return som;
  53. }
  54. int main ()
  55. {
  56. int ans, ms, jr, jrs;
  57. char *jouri[7] = {"mardi", "lundi", "dimanche", "samedi", "vendredi", "jeudi", "mercredi"};
  58. char *jours[7] = {"mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche", "lundi"};
  59.  printf("rentrer une annee (entre -2000 et 4000) :" );
  60. scanf("%d",&ans);
  61. printf("\n" );
  62. printf("rentrer un mois (entre 1 et 12) :" );
  63. scanf("%d",&ms);
  64. printf("\n" );
  65.     printf("rentrer un jour (entre 1 et 31) :" );
  66. scanf("%d",&jr);
  67. printf("\n" );
  68.     if ((ans >= -2000) && (ans <=4000) && (ms >=1) && (ms<=12) && (jr >=1) && (jr <= 31))
  69.     {
  70.     if(ans < 2003)   /*si l'année saisie est inférieure à 2003*/
  71.     {
  72.         printf("\nLe (%d/%d/%d) est un %s.\n\n", jr, ms, ans, jouri[(aninf (ans) - nb_jr (ms, ans) - jr)%7]);
  73.     }
  74.     else if (ans >= 2003) /*si l'année saisie est sup ou égale à 2003*/
  75.     {
  76.      if ( ans%4==0 && ans%100!=0 || ans%400==0 )
  77.       jrs = 366 - nb_jr (ms, ans);
  78.      else
  79.       jrs = 365 - nb_jr (ms, ans); /*jrs est le nombre de jours restant de l'année rentrée*/
  80.             printf("\nLe (%d/%d/%d) est un %s.\n\n", jr, ms, ans, jours[(ansup (ans) - jrs + jr)%7]);
  81.     }
  82.     }
  83.     else
  84.     {
  85.     printf ("\n" );
  86.     printf ("Erreur de saisie.\n" );
  87.     printf ("Saisir obligatoirement une date dont: \n" );
  88.     printf ("L'annee varie de -2000 a 4000 inclus.\n" );
  89.     printf ("Le mois varie de 1 a 12 inlus.\n" );
  90.     printf ("Le jour varie de 1 a 31 inclus." );
  91.     }
  92. return 0;
  93. }


 
 
Voici un autre code auquel je souhaite me rapprocher (prise en compte des heures) en incluant le calcul du premier:

Code :
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <locale.h>
  4. #define NB_MAX_CAR 40
  5. void interprete_date_en_secondes(time_t nb_secondes_Temps_Universel) ;
  6. time_t converion_date_en_secondes (int jour_du_mois,int mois,int annee,int heure,int minutes, int secondes) ;
  7. /* --------------------------- */
  8. /* Programme principal         */
  9. /* --------------------------- */
  10. main()
  11. {
  12.   time_t nb_sec_tps_univ, tp ;
  13.   time_t tp_univ_sec1, tp_univ_sec2, difference ;
  14.   int secondes, minutes, heure ;
  15.   int jour_du_mois, mois, annee ;
  16.   int num_jour_semaine, jour_de_l_annee, heure_d_ete ;
  17.   /* --- RECUPERATION ET INTERPRETATION DE LA DATE SYSTEME --- */
  18.   /* recuperation du nombre de secondes ecoulees */
  19.   /* depuis 1/1/1970 a 0h 0mn 0sec */
  20.   nb_sec_tps_univ = time(&tp);
  21.   /* interpretation et affichage de la date */
  22.   printf("=== DATE SYSTEME ===\n" );
  23.   interprete_date_en_secondes(nb_sec_tps_univ);
  24.   /* --- CONVERSION D'UNE PREMIERE DATE EN SECONDES  --- */
  25.   printf("Veuillez saisir une date (par exemple 29/03/2007): " );
  26.   scanf("%d/%d/%d",&jour_du_mois,&mois,&annee);
  27.   printf("Veuillez saisir une heure (par exemple 10:05:38) : " );
  28.   scanf("%d:%d:%d",&heure,&minutes,&secondes);
  29.   tp_univ_sec1 = converion_date_en_secondes(jour_du_mois,mois,annee,heure,minutes,secondes);
  30.   if (tp_univ_sec1 == -1)
  31.   {
  32.      printf("Erreur de conversion de la date %d/%d/%d\n",jour_du_mois,mois,annee);
  33.   }
  34.   else
  35.   {
  36.      printf("=== CONVERSION EN SECONDES ===\n" );
  37.      printf("%d/%d/%d - %d:%d:%d = %d secondes\n\n",jour_du_mois,mois,annee,heure,minutes,secondes, tp_univ_sec1);
  38.      interprete_date_en_secondes(tp_univ_sec1);
  39.   }
  40.   /* --- CONVERSION D'UNE SECONDE DATE EN SECONDES  --- */
  41.   printf("Veuillez saisir une date (par exemple 29/03/2007): " );
  42.   scanf("%d/%d/%d",&jour_du_mois,&mois,&annee);
  43.   printf("Veuillez saisir une heure (par exemple 10:05:38) : " );
  44.   scanf("%d:%d:%d",&heure,&minutes,&secondes);
  45.   tp_univ_sec2 = converion_date_en_secondes(jour_du_mois,mois,annee,heure,minutes,secondes);
  46.   if (tp_univ_sec2 == -1)
  47.   {
  48.      printf("Erreur de conversion de la date %d/%d/%d\n",jour_du_mois,mois,annee);
  49.   }
  50.   else
  51.   {
  52.      printf("=== CONVERSION EN SECONDES ===\n" );
  53.      printf("%d/%d/%d - %d:%d:%d = %d secondes\n\n",jour_du_mois,mois,annee,heure,minutes,secondes, tp_univ_sec2);
  54.      interprete_date_en_secondes(tp_univ_sec2);
  55.   }
  56.   /* --- CALCUL DE LA DIFFERENCE EN SECONDES  --- */
  57.   difference = (time_t) difftime(tp_univ_sec2,tp_univ_sec1);
  58.   printf("Différence en secondes : %d \n",difference);
  59.   printf("Différence en minutes  : %d \n",difference/60);
  60.   printf("Différence en heures   : %d \n",difference/(60*60));
  61.   printf("Différence en jours    : %d \n",difference/(60*60*24));
  62. } /* fin de main */
  63. /* ----------------------------------------------------------------- */
  64. /* procedure d interpretation d une date exprimee en secondes        */
  65. /* ----------------------------------------------------------------- */
  66. void interprete_date_en_secondes(time_t nb_secondes_Temps_Universel)
  67. {
  68.     struct tm heure_jour_mois ;
  69.     time_t resultat ;
  70.     int secondes, minutes, heure ;
  71.     int jour_du_mois, mois, annee ;
  72.     int num_jour_semaine, jour_de_l_annee, heure_d_ete ;
  73.     char nom_jour_semaine[NB_MAX_CAR] ;
  74.     char nom_mois[NB_MAX_CAR] ;
  75.     /* positionnement de l'environnement contenu dans la variable LANG */
  76.     /* LANG=fr ou fr_FR pour le francais */
  77.     setlocale(LC_ALL,"" );
  78.  
  79.     /* recuperation des informations */
  80.     heure_jour_mois = *localtime(&nb_secondes_Temps_Universel);
  81.  
  82.     /* recuperation du nom du jour de la semaine */
  83.     resultat = strftime(nom_jour_semaine,NB_MAX_CAR,"%A",&heure_jour_mois);
  84.     /* recuperation du nom du mois */
  85.     resultat = strftime(nom_mois,NB_MAX_CAR,"%B",&heure_jour_mois);
  86.  
  87.     /* recuperation des champs */
  88.     secondes = heure_jour_mois.tm_sec  ;
  89.     minutes  = heure_jour_mois.tm_min  ;
  90.     heure    = heure_jour_mois.tm_hour ;
  91.  
  92.     jour_du_mois = heure_jour_mois.tm_mday       ;
  93.     mois         = heure_jour_mois.tm_mon +1     ;
  94.     annee        = heure_jour_mois.tm_year +1900 ;
  95.  
  96.     num_jour_semaine = heure_jour_mois.tm_wday     ;
  97.     jour_de_l_annee  = heure_jour_mois.tm_yday +1  ;
  98.     heure_d_ete      = heure_jour_mois.tm_isdst    ;
  99.  
  100.  
  101.     /* affichage de tous les champs */
  102.  
  103.     printf("Nombre  de secondes en Temps Universel : %d\n\n",nb_secondes_Temps_Universel);
  104.     printf("Heure : %02d:%02d:%02d\n",heure,minutes,secondes);
  105.     printf("Date  : %02d/%02d/%04d\n",jour_du_mois,mois,annee);
  106.     printf("     -> %02d %s %04d\n",jour_du_mois,nom_mois,annee);
  107.  
  108.     printf("Jour de la semaine : %s\n",nom_jour_semaine);
  109.     printf("                  -> %d eme jour\n",num_jour_semaine);
  110.     printf("Jour de l'annee    : %d\n",jour_de_l_annee);
  111.  
  112.     if (heure_d_ete)
  113.           printf("Heure d'ete \n" );
  114.     else
  115.           printf("Heure d'hiver \n" );
  116.     printf("\n" );
  117. }
  118. /* ---------------------------------------------------- */
  119. /* fonction de conversion d une date en secondes        */
  120. /* ---------------------------------------------------- */
  121. time_t converion_date_en_secondes (int jour_du_mois,int mois,int annee,int heure,int minutes, int secondes)
  122. {
  123.     struct tm h_j_m ;
  124.     time_t res ;
  125.     h_j_m.tm_year  = annee - 1900;
  126.     h_j_m.tm_mon   = mois - 1;
  127.     h_j_m.tm_mday  = jour_du_mois;
  128.     h_j_m.tm_hour  = heure;
  129.     h_j_m.tm_min   = minutes;
  130.     h_j_m.tm_sec   = secondes;
  131.     /* h_j_m.tm_isdst = -1; */
  132.     res=mktime(&h_j_m) ;
  133.  
  134.     return res; 
  135. }


mood
Publicité
Posté le 01-04-2007 à 10:50:33  profilanswer
 

n°1537043
Sve@r
Posté le 01-04-2007 à 22:56:35  profilanswer
 

teycir a écrit :

Bonjour;
J'ai amélioré un code de calendrier perpétuel en C (de -2000 à 4000): affichage du jour de la semaine (lundi, mardi,mercredi...) en fonction de la date, mais il reste perfectible.
- Par exemple il y a des jours qui n'existent pas comme les 29 févriers des années non bissextiles qui sont affichées. Je voudrais que ces jours ne soient pas affichées (message d'erreur à la place).  
- Il y a également un problème d'absence des heures et dates système à rajouter.
Je suis en train de plancher sur le code, si vous avez des solutions ou des astuces ou même des remarques quant à l'analyse, n'hésitez pas à me les communiquer.
Merci. :)
 
Voici le code du programme principal à perfectionner (rajout d'heure et de date système + élimination des jours n'ayant jamais existé comme les 29 févriers des années non bissextiles):
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int ansup (int an)
  4. {
  5. int an_bis, an_nbis;
  6. an_bis = an_nbis = 0;
  7. while (an >= 2003)
  8.  {
  9.   if ( an%4==0 && an%100!=0 || an%400==0 )
  10.   an_bis+=1;
  11.  else
  12.   an_nbis+=1;
  13.  an--;
  14. }
  15.     return(an_bis * 366  + an_nbis * 365);  /* c'est le nombre de jours entre le 01/01/2003 et le 01/01 de l'année rentrée */
  16. }
  17. int aninf (int an)
  18. {
  19. int an_bis, an_nbis;
  20. an_bis = an_nbis = 0;
  21. while (an < 2003)
  22. {
  23.  if (an%4 == 0 && an%100 !=0 || an%400 == 0)
  24.   an_bis+=1;
  25.  else
  26.   an_nbis+=1;
  27.  an++;
  28. }
  29.  return(an_bis * 366 + an_nbis * 365); /* c'est le nombre de jours entre le 01/01 de l'année rentrée et le 01/01/2003 */
  30. }
  31. int nb_jr (int mois, int an) /* calcul du nombre de jours passés en fonction de l'année (bissextile ou non) et du mois rentrés */
  32. {
  33. int bissextile[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
  34. int n_bissextile[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
  35. int som = 0;
  36. if ( an%4==0 && an%100!=0 || an%400==0 )
  37. {
  38.  while (mois>0)
  39.  {
  40.   som = som + bissextile[mois-1];
  41.   mois--;
  42.  }
  43. }
  44. else
  45. {
  46.  while (mois>0)
  47.  {
  48.   som = som + n_bissextile[mois-1];
  49.   mois--;
  50.  }
  51. }
  52. return som;
  53. }
  54. int main ()
  55. {
  56. int ans, ms, jr, jrs;
  57. char *jouri[7] = {"mardi", "lundi", "dimanche", "samedi", "vendredi", "jeudi", "mercredi"};
  58. char *jours[7] = {"mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche", "lundi"};
  59.  printf("rentrer une annee (entre -2000 et 4000) :" );
  60. scanf("%d",&ans);
  61. printf("\n" );
  62. printf("rentrer un mois (entre 1 et 12) :" );
  63. scanf("%d",&ms);
  64. printf("\n" );
  65.     printf("rentrer un jour (entre 1 et 31) :" );
  66. scanf("%d",&jr);
  67. printf("\n" );
  68.     if ((ans >= -2000) && (ans <=4000) && (ms >=1) && (ms<=12) && (jr >=1) && (jr <= 31))
  69.     {
  70.     if(ans < 2003)   /*si l'année saisie est inférieure à 2003*/
  71.     {
  72.         printf("\nLe (%d/%d/%d) est un %s.\n\n", jr, ms, ans, jouri[(aninf (ans) - nb_jr (ms, ans) - jr)%7]);
  73.     }
  74.     else if (ans >= 2003) /*si l'année saisie est sup ou égale à 2003*/
  75.     {
  76.      if ( ans%4==0 && ans%100!=0 || ans%400==0 )
  77.       jrs = 366 - nb_jr (ms, ans);
  78.      else
  79.       jrs = 365 - nb_jr (ms, ans); /*jrs est le nombre de jours restant de l'année rentrée*/
  80.             printf("\nLe (%d/%d/%d) est un %s.\n\n", jr, ms, ans, jours[(ansup (ans) - jrs + jr)%7]);
  81.     }
  82.     }
  83.     else
  84.     {
  85.     printf ("\n" );
  86.     printf ("Erreur de saisie.\n" );
  87.     printf ("Saisir obligatoirement une date dont: \n" );
  88.     printf ("L'annee varie de -2000 a 4000 inclus.\n" );
  89.     printf ("Le mois varie de 1 a 12 inlus.\n" );
  90.     printf ("Le jour varie de 1 a 31 inclus." );
  91.     }
  92. return 0;
  93. }




 
Bon, je vais faire des remarques générales :
1) je crois qu'il y a trop de commentaires dans ton code
2) pourquoi utiliser 2 tableaux de mois "bissextile" et "n_bissextile" alors qu'ils sont identiques (à l'exception du 2° mois qui peut se gérer par un test)
3) essaye de penser au ternaire "? :" qui peut t'économiser parfois des lignes pour un résultat identique
Ex: Remplacer

   if ( ans%4==0 && ans%100!=0 || ans%400==0 )
     jrs = 366 - nb_jr (ms, ans);
    else
     jrs = 365 - nb_jr (ms, ans);


 

jrs = ((ans%4==0 && ans%100!=0 || ans%400==0) ?366 :365) - nb_jr (ms, ans);


4) Tu peux optimiser ton test "bissextile". En effet, tel que tu l'as écris, tu fais à chaque test deux comparaisons "X ou Y" donc sur 1000 ans tu fais 2000 tests.
Si tu l'écris ainsi:  "ans%4==0 && (ans%100!=0 || ans%400==0)" dès que l'année ne sera pas divisible par 4, l'évaluateur booléen arrêtera son évaluation donc sur 1000 ans tu ne feras que 1250 tests
5) Tu devrais mettre ton test "bissextile" en macro plus facile à intégrer dans le code. Et réfléchir aussi à l'inverser complètement car une année est plus souvent "non bissextile" que bissextile
6) t'as pensé aux 10 jours qui ont été enlevés au XVII° siècle par le pape Grégoire afin que notre calendrier rattrappe le soleil ?
 
Voilà - Pas évident comme algo...

Message cité 1 fois
Message édité par Sve@r le 01-04-2007 à 22:57:24

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1537305
teycir
Posté le 02-04-2007 à 14:10:31  profilanswer
 

Merci sve@r;

 


Effectivement; les jours à éliminer sont:
1- les 29 févriers des années non bissextiles
2- l'année 0
3- le 4, 5, 6, 6, 8, 9, 10, 11, 12, 13, 14, 15 octobre 1582 : le décalage grégorien qui supprima dix jours du calendrier, entre le 4 octobre 1582 et le 15 octobre 1582 pour les pays ayant immédiatement suivi Rome, ce qui permit de fixer de nouveau l%u2019équinoxe de printemps le 21 mars, comme ce fut le cas au début de l%u2019ère chrétienne

 

Les cas 2 et 3 semblent relativement faciles à supprimer, il suffit de rajouter des conditions à la ligne 80 du code : if ((ans >= -2000) && (ans <=4000) && (ms >=1) && (ms<=12) && (jr >=1) && (jr <= 31)).
Par contre les 29 févriers sont plus compliqués à supprimer.
J'ai pensé à tranformer les 3 conditions en booléens puis les insérer dans le if de la ligne 80 du code. Par ex mettre en place la fonction calcul année non bissextile + jour 29 + mois 2 en true (1), me semble être une solution pour le cas 1. Qu'en pensez-vous? Est-ce faisable?
A+

Message cité 1 fois
Message édité par teycir le 02-04-2007 à 15:09:46
n°1537390
Sve@r
Posté le 02-04-2007 à 15:28:19  profilanswer
 

teycir a écrit :

Merci sve@r;
 
 
Effectivement; les jours à éliminer sont:
1- les 29 févriers des années non bissextiles
2- l'année 0
3- le 4, 5, 6, 6, 8, 9, 10, 11, 12, 13, 14, 15 octobre 1582 : le décalage grégorien qui supprima dix jours du calendrier, entre le 4 octobre 1582 et le 15 octobre 1582 pour les pays ayant immédiatement suivi Rome, ce qui permit de fixer de nouveau l%u2019équinoxe de printemps le 21 mars, comme ce fut le cas au début de l%u2019ère chrétienne
 
Les cas 2 et 3 semblent relativement faciles à supprimer, il suffit de rajouter des conditions à la ligne 80 du code : if ((ans >= -2000) && (ans <=4000) && (ms >=1) && (ms<=12) && (jr >=1) && (jr <= 31)).
Par contre les 29 févriers sont plus compliqués à supprimer.
J'ai pensé à tranformer les 3 conditions en booléens puis les insérer dans le if de la ligne 80 du code. Par ex mettre en place la fonction calcul année non bissextile + jour 29 + mois 2 en true (1), me semble être une solution pour le cas 1. Qu'en pensez-vous? Est-ce faisable?
A+


 
Moi, je commencerais par créer une structure spéciale pour gérer la date (un truc contenant jj/mm/aa). Comme ça, si on doit transmettre la date à une fonction, on lui passe un pointeur sur la structure et la fonction reçoit d'un coup le jj/mm/aa. Après-tout, ça sert à ça les structures.
 
Ensuite, je mettrais en place une fonction spéciale qui teste si la date rentrée est valide et qui renvoie V/F comme ça, l'algo de saisie est beaucoup plus simple à gérer. Ca pourrait être par exemple un truc comme ça

while (1) {
    ... saisie de la date...
    if (date_correcte(&date))
        break;
    printf("Date incorrecte - Recommencez\n" );
}


 
Ensuite, la fonction qui gère la date pourra être programmée comme on veut, avec tous les algo imaginables et surtout évolutifs facilement. Si un jour t'as envie de passer de -6000 à +8000, la modif se fera dans la fonction en une seule fois.
 
Autre truc: Intéresse-toi aux structures "struct_tm" et aux fonctions associées => http://bat710.univ-lyon1.fr/~jcieh [...] ime.3.html. Il peut y avoir des trucs utiles dedans...

Message cité 1 fois
Message édité par Sve@r le 02-04-2007 à 15:29:27

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1537412
teycir
Posté le 02-04-2007 à 15:46:15  profilanswer
 

Sve@r a écrit :

Moi, je commencerais par créer une structure spéciale pour gérer la date (un truc contenant jj/mm/aa). Comme ça, si on doit transmettre la date à une fonction, on lui passe un pointeur sur la structure et la fonction reçoit d'un coup le jj/mm/aa. Après-tout, ça sert à ça les structures.
 
Ensuite, je mettrais en place une fonction spéciale qui teste si la date rentrée est valide et qui renvoie V/F comme ça, l'algo de saisie est beaucoup plus simple à gérer. Ca pourrait être par exemple un truc comme ça

while (1) {
    ... saisie de la date...
    if (date_correcte(&date))
        break;
    printf("Date incorrecte - Recommencez\n" );
}


 
Ensuite, la fonction qui gère la date pourra être programmée comme on veut, avec tous les algo imaginables et surtout évolutifs facilement. Si un jour t'as envie de passer de -6000 à +8000, la modif se fera dans la fonction en une seule fois.
 
Autre truc: Intéresse-toi aux structures "struct_tm" et aux fonctions associées => http://bat710.univ-lyon1.fr/~jcieh [...] ime.3.html. Il peut y avoir des trucs utiles dedans...


 
 
Oui, je pense que c plus clean de faire comme cela. Par contre pourquoi while (1) et non pas if (1) ?

n°1537483
Sve@r
Posté le 02-04-2007 à 18:15:39  profilanswer
 

teycir a écrit :

Oui, je pense que c plus clean de faire comme cela


Décomposition du problème en opérations de bases. Plus souple comme moyen de faire...
 

teycir a écrit :

Par contre pourquoi while (1) et non pas if  
(1) ?


while(1) => boucle infinie => tant que le gars ne rentre pas une date correcte, le bouzier lui repose la question
 
if (1) => super utile comme test...


Message édité par Sve@r le 02-04-2007 à 18:28:41

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1584578
Lizardo
Posté le 10-07-2007 à 14:14:08  profilanswer
 

Bonjour
 
Je ne commenterai pas la programmation car je suis un dinosaure, je programme en Basic!
 
Cependant j'ai réalisé un calendrier perpétuel qui me donne satisfaction, mon commentaire concerne les dates de réforme, qui sont différentes selon les pays et les religions:
 
 Pour la France : 9 12 1582,  le lendemain du 9 décembre étant le 20 décembre 1582.
 
Pour l'Angleterre : 2 9 1752, le lendemain du 2 septembre 1752 étant le 14 septembre 1752, l'écart entre calendriers ayant atteint 11 jours.  
 
Pour la Russie, réforme en 1918 (je n'ai pas la date exacte) et la Grèce en 1923.
 
Le but de la réforme était effectivement de rétablir l'équinoxe de printemps à la date du 21 Mars, mais non pas comme elle était au début de l'ère chrétienne, ce que j'avais cru moi-même au départ, mais telle qu'elle était à je ne sais plus quel concile vers l'an 300 (pourquoi faire simple si on peut faire compliqué) cela pour le calcul de la date de Pâques.
 
Etablir le jour de la semaine d'une date, calculer la différence entre deux dates, c'est bien. A l'usage vient le désir d'ajouter ou soustraire un nombre de jours à une date pour en obtenir une nouvelle.
 
Ce n'est pas évident, je procède par approximations successives, une date "raisonnable" est évaluée, puis controlée (par exemple un 29 février est transformé en premier mars si l'année n'est pas bissextile) ensuite le module de différences de dates est appelé, un éventuel décalage est "rattrapé", avec contrôle secondaire.
 
Vous pourrez vérifier ainsi que le millionème jour de l'ère chrétienne sera le Samedi 26 Novembre 2738. Et vous ne passerez pas à côté de cet anniversaire. Ca serait dommage, non ?

Message cité 1 fois
Message édité par Lizardo le 10-07-2007 à 15:52:16
n°1584955
Sve@r
Posté le 10-07-2007 à 20:13:56  profilanswer
 

Lizardo a écrit :

Je ne commenterai pas la programmation car je suis un dinosaure, je programme en Basic!


Ouaiiiiis !!! J'ai commencé comme ça. J'avais même réussi à implémenter la récursivité en Basic à coup de fichier que j'écris et que je vais relire ensuite  :D  :D  :D  
 

Lizardo a écrit :

Le but de la réforme était effectivement de rétablir l'équinoxe de printemps à la date du 21 Mars, mais non pas comme elle était au début de l'ère chrétienne, ce que j'avais cru moi-même au départ, mais telle qu'elle était à je ne sais plus quel concile vers l'an 300 (pourquoi faire simple si on peut faire compliqué) cela pour le calcul de la date de Pâques.


Ouaip. Rattrapper le décalage bissextile qui n'est pas vraiment tous les 4 ans mais tous les 4 ans, sauf tous les 100 ans mais quand-même tous les 400...
 

Lizardo a écrit :

Ce n'est pas évident, je procède par approximations successives, une date "raisonnable" est évaluée, puis controlée (par exemple un 29 février est transformé en premier mars si l'année n'est pas bissextile)


Oui. J'ai vu des fonctions php qui faisaient ça. En rentrant par exemple le 00/mm/yyyy, il ressort comme résultat <dernier jour>/mm -1/yyyy
 

Lizardo a écrit :

Vous pourrez vérifier ainsi que le millionème jour de l'ère chrétienne sera le Samedi 26 Novembre 2738. Et vous ne passerez pas à côté de cet anniversaire. Ca serait dommage, non ?


SUPAIRE !!!  :bounce:


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Perfectionnement d'un calendrier perpetuel en C

 

Sujets relatifs
inserer un calendrier modifiable sur page web[php] Creer un calendrier
incrementer un calendrier avec une precision double.[C#] [Résolu] Comment communiquer avec une dll c++
calendrier[C] Des accolades "just pour le fun" ?
Calendrier perpétuelRecherche composant calendrier
calendrier ical sous mac 
Plus de sujets relatifs à : Perfectionnement d'un calendrier perpetuel en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR