teycir | 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 :
- #include <stdio.h>
- #include <stdlib.h>
- int ansup (int an)
- {
- int an_bis, an_nbis;
- an_bis = an_nbis = 0;
- while (an >= 2003)
- {
- if ( an%4==0 && an%100!=0 || an%400==0 )
- an_bis+=1;
- else
- an_nbis+=1;
- an--;
- }
- 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 */
- }
- int aninf (int an)
- {
- int an_bis, an_nbis;
- an_bis = an_nbis = 0;
- while (an < 2003)
- {
- if (an%4 == 0 && an%100 !=0 || an%400 == 0)
- an_bis+=1;
- else
- an_nbis+=1;
- an++;
- }
- 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 */
- }
- 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 */
- {
- int bissextile[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
- int n_bissextile[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
- int som = 0;
- if ( an%4==0 && an%100!=0 || an%400==0 )
- {
- while (mois>0)
- {
- som = som + bissextile[mois-1];
- mois--;
- }
- }
- else
- {
- while (mois>0)
- {
- som = som + n_bissextile[mois-1];
- mois--;
- }
- }
- return som;
- }
- int main ()
- {
- int ans, ms, jr, jrs;
- char *jouri[7] = {"mardi", "lundi", "dimanche", "samedi", "vendredi", "jeudi", "mercredi"};
- char *jours[7] = {"mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche", "lundi"};
- printf("rentrer une annee (entre -2000 et 4000) :" );
- scanf("%d",&ans);
- printf("\n" );
- printf("rentrer un mois (entre 1 et 12) :" );
- scanf("%d",&ms);
- printf("\n" );
- printf("rentrer un jour (entre 1 et 31) :" );
- scanf("%d",&jr);
- printf("\n" );
- if ((ans >= -2000) && (ans <=4000) && (ms >=1) && (ms<=12) && (jr >=1) && (jr <= 31))
- {
- if(ans < 2003) /*si l'année saisie est inférieure à 2003*/
- {
- printf("\nLe (%d/%d/%d) est un %s.\n\n", jr, ms, ans, jouri[(aninf (ans) - nb_jr (ms, ans) - jr)%7]);
- }
- else if (ans >= 2003) /*si l'année saisie est sup ou égale à 2003*/
- {
- if ( ans%4==0 && ans%100!=0 || ans%400==0 )
- jrs = 366 - nb_jr (ms, ans);
- else
- jrs = 365 - nb_jr (ms, ans); /*jrs est le nombre de jours restant de l'année rentrée*/
- printf("\nLe (%d/%d/%d) est un %s.\n\n", jr, ms, ans, jours[(ansup (ans) - jrs + jr)%7]);
- }
- }
- else
- {
- printf ("\n" );
- printf ("Erreur de saisie.\n" );
- printf ("Saisir obligatoirement une date dont: \n" );
- printf ("L'annee varie de -2000 a 4000 inclus.\n" );
- printf ("Le mois varie de 1 a 12 inlus.\n" );
- printf ("Le jour varie de 1 a 31 inclus." );
- }
- return 0;
- }
|
Voici un autre code auquel je souhaite me rapprocher (prise en compte des heures) en incluant le calcul du premier:
Code :
- #include <stdio.h>
- #include <time.h>
- #include <locale.h>
- #define NB_MAX_CAR 40
- void interprete_date_en_secondes(time_t nb_secondes_Temps_Universel) ;
- time_t converion_date_en_secondes (int jour_du_mois,int mois,int annee,int heure,int minutes, int secondes) ;
- /* --------------------------- */
- /* Programme principal */
- /* --------------------------- */
- main()
- {
- time_t nb_sec_tps_univ, tp ;
- time_t tp_univ_sec1, tp_univ_sec2, difference ;
- int secondes, minutes, heure ;
- int jour_du_mois, mois, annee ;
- int num_jour_semaine, jour_de_l_annee, heure_d_ete ;
- /* --- RECUPERATION ET INTERPRETATION DE LA DATE SYSTEME --- */
- /* recuperation du nombre de secondes ecoulees */
- /* depuis 1/1/1970 a 0h 0mn 0sec */
- nb_sec_tps_univ = time(&tp);
- /* interpretation et affichage de la date */
- printf("=== DATE SYSTEME ===\n" );
- interprete_date_en_secondes(nb_sec_tps_univ);
- /* --- CONVERSION D'UNE PREMIERE DATE EN SECONDES --- */
- printf("Veuillez saisir une date (par exemple 29/03/2007): " );
- scanf("%d/%d/%d",&jour_du_mois,&mois,&annee);
- printf("Veuillez saisir une heure (par exemple 10:05:38) : " );
- scanf("%d:%d:%d",&heure,&minutes,&secondes);
- tp_univ_sec1 = converion_date_en_secondes(jour_du_mois,mois,annee,heure,minutes,secondes);
- if (tp_univ_sec1 == -1)
- {
- printf("Erreur de conversion de la date %d/%d/%d\n",jour_du_mois,mois,annee);
- }
- else
- {
- printf("=== CONVERSION EN SECONDES ===\n" );
- printf("%d/%d/%d - %d:%d:%d = %d secondes\n\n",jour_du_mois,mois,annee,heure,minutes,secondes, tp_univ_sec1);
- interprete_date_en_secondes(tp_univ_sec1);
- }
- /* --- CONVERSION D'UNE SECONDE DATE EN SECONDES --- */
- printf("Veuillez saisir une date (par exemple 29/03/2007): " );
- scanf("%d/%d/%d",&jour_du_mois,&mois,&annee);
- printf("Veuillez saisir une heure (par exemple 10:05:38) : " );
- scanf("%d:%d:%d",&heure,&minutes,&secondes);
- tp_univ_sec2 = converion_date_en_secondes(jour_du_mois,mois,annee,heure,minutes,secondes);
- if (tp_univ_sec2 == -1)
- {
- printf("Erreur de conversion de la date %d/%d/%d\n",jour_du_mois,mois,annee);
- }
- else
- {
- printf("=== CONVERSION EN SECONDES ===\n" );
- printf("%d/%d/%d - %d:%d:%d = %d secondes\n\n",jour_du_mois,mois,annee,heure,minutes,secondes, tp_univ_sec2);
- interprete_date_en_secondes(tp_univ_sec2);
- }
- /* --- CALCUL DE LA DIFFERENCE EN SECONDES --- */
- difference = (time_t) difftime(tp_univ_sec2,tp_univ_sec1);
- printf("Différence en secondes : %d \n",difference);
- printf("Différence en minutes : %d \n",difference/60);
- printf("Différence en heures : %d \n",difference/(60*60));
- printf("Différence en jours : %d \n",difference/(60*60*24));
- } /* fin de main */
- /* ----------------------------------------------------------------- */
- /* procedure d interpretation d une date exprimee en secondes */
- /* ----------------------------------------------------------------- */
- void interprete_date_en_secondes(time_t nb_secondes_Temps_Universel)
- {
- struct tm heure_jour_mois ;
- time_t resultat ;
- int secondes, minutes, heure ;
- int jour_du_mois, mois, annee ;
- int num_jour_semaine, jour_de_l_annee, heure_d_ete ;
- char nom_jour_semaine[NB_MAX_CAR] ;
- char nom_mois[NB_MAX_CAR] ;
- /* positionnement de l'environnement contenu dans la variable LANG */
- /* LANG=fr ou fr_FR pour le francais */
- setlocale(LC_ALL,"" );
-
- /* recuperation des informations */
- heure_jour_mois = *localtime(&nb_secondes_Temps_Universel);
-
- /* recuperation du nom du jour de la semaine */
- resultat = strftime(nom_jour_semaine,NB_MAX_CAR,"%A",&heure_jour_mois);
- /* recuperation du nom du mois */
- resultat = strftime(nom_mois,NB_MAX_CAR,"%B",&heure_jour_mois);
-
- /* recuperation des champs */
- secondes = heure_jour_mois.tm_sec ;
- minutes = heure_jour_mois.tm_min ;
- heure = heure_jour_mois.tm_hour ;
-
- jour_du_mois = heure_jour_mois.tm_mday ;
- mois = heure_jour_mois.tm_mon +1 ;
- annee = heure_jour_mois.tm_year +1900 ;
-
- num_jour_semaine = heure_jour_mois.tm_wday ;
- jour_de_l_annee = heure_jour_mois.tm_yday +1 ;
- heure_d_ete = heure_jour_mois.tm_isdst ;
-
-
- /* affichage de tous les champs */
-
- printf("Nombre de secondes en Temps Universel : %d\n\n",nb_secondes_Temps_Universel);
- printf("Heure : %02d:%02d:%02d\n",heure,minutes,secondes);
- printf("Date : %02d/%02d/%04d\n",jour_du_mois,mois,annee);
- printf(" -> %02d %s %04d\n",jour_du_mois,nom_mois,annee);
-
- printf("Jour de la semaine : %s\n",nom_jour_semaine);
- printf(" -> %d eme jour\n",num_jour_semaine);
- printf("Jour de l'annee : %d\n",jour_de_l_annee);
-
- if (heure_d_ete)
- printf("Heure d'ete \n" );
- else
- printf("Heure d'hiver \n" );
- printf("\n" );
- }
- /* ---------------------------------------------------- */
- /* fonction de conversion d une date en secondes */
- /* ---------------------------------------------------- */
- time_t converion_date_en_secondes (int jour_du_mois,int mois,int annee,int heure,int minutes, int secondes)
- {
- struct tm h_j_m ;
- time_t res ;
- h_j_m.tm_year = annee - 1900;
- h_j_m.tm_mon = mois - 1;
- h_j_m.tm_mday = jour_du_mois;
- h_j_m.tm_hour = heure;
- h_j_m.tm_min = minutes;
- h_j_m.tm_sec = secondes;
- /* h_j_m.tm_isdst = -1; */
- res=mktime(&h_j_m) ;
-
- return res;
- }
|
|