Calendrier perpétuel de l'an 0 à l'an 2499

Description

Ce programme utilise un algorithme permettant de définir le jour d'une date précise.
Le mode de fonctionnement de l'algorithme utilisé permet de ne pas dépendre de la date entrée par l'utilisateur.
En effet le programme mettra le même temps à résoudre la date que celle-ci soit proche de l'année 0 ou proche de 2499, et même si elle était noyée entre ces deux limites.

J'ai programmé sous Borland C++ 5, mais il ne devrait pas y avoir de pb d'utilisation même sur les autres compilateurs, je m'en suis tenu au Turbo C, pour le langage.

Source / Exemple :


/*
	Cool Mouse, le 13.12.2005
		CALENDRIER PERPETUEL
	  DE L'AN  0 A L'AN 2499

				Version 1.2

  • /
#include <stdio.h> #include <conio.h> void erreurs (void); int cherche_jour (int jour, int _code_mois); int cherche_mois (int mois_n, int bisextile, int _code_annee); int cherche_annee (int annee, int avant); void erreurs () { puts ("<<< DATE NON VALIDE >>>"); } int cherche_jour (int jour, int _code_mois) { int tab_jour[5][7] = {{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,0,0,0,0}}, tab_code_jour[7][7] = {{5,6,0,1,2,3,4},{6,0,1,2,3,4,5},{0,1,2,3,4,5,6}, {1,2,3,4,5,6,0},{2,3,4,5,6,0,1},{3,4,5,6,0,1,2},{4,5,6,0,1,2,3}}, ligne, colonne; ligne = colonne = 0; while (tab_jour[ligne][colonne] != jour) { if (colonne == 6) { colonne = 0; ligne ++; } else colonne ++; } ligne = _code_mois; return (tab_code_jour[ligne][colonne]); } int cherche_mois (int mois_n, int bisextile, int _code_annee) { int //tab_mois1[3][7] = {{5,7,3,6,9,4,10},{0,2,11,0,12,7,0},{0,0,0,0,0,1,0}}, tab_mois1[3][7] = {{5,2,3,6,9,1,10},{0,8,11,0,12,7,0},{0,0,0,0,0,4,0}}, //tab_mois0[3][7] = {{5,7,2,6,9,4,1},{0,0,3,0,12,7,10},{0,0,0,11,0,0,0}}, tab_mois0[3][7] = {{5,8,2,6,9,4,1},{0,0,3,0,12,7,10},{0,0,11,0,0,0,0}}, tab_code_mois[7][7] = {{1,2,3,4,5,6,0},{2,3,4,5,6,0,1},{3,4,5,6,0,1,2}, {4,5,6,0,1,2,3},{5,6,0,1,2,3,4},{6,0,1,2,3,4,5},{0,1,2,3,4,5,6}}, ligne, colonne; ligne = colonne = 0; if (bisextile == 1) while (tab_mois1[ligne][colonne] != mois_n) { if (colonne == 6) { colonne = 0; ligne ++; } else colonne ++; } else while (tab_mois0[ligne][colonne] != mois_n) { if (colonne == 6) { colonne = 0; ligne ++; } else colonne ++; } ligne = _code_annee; return (tab_code_mois[ligne][colonne]); } int cherche_annee (int annee, int avant) { int tab_centaines[7][5] = { {0,7,14,17,21},{1,8,-1,-1,-1},{2,9,-1,18,22}, {3,10,-1,-1,-1},{4,11,-1,19,23},{5,12,16,20,24},{26,13,-1,-1,-1}}, tab_dizaines[18][7] = {{0,1,2,3,-1,4,5},{6,7,-1,8,9,10,11}, {-1,12,13,14,15,-1,16},{17,18,19,-1,20,21,22}, {23,-1,24,25,26,27,-1},{28,29,30,31,-1,32,33}, {34,35,-1,36,37,38,39},{-1,40,41,42,43,-1,44}, {45,46,47,-1,48,49,50},{51,-1,52,53,54,55,-1}, {56,57,58,59,-1,60,61},{62,63,-1,64,65,66,67}, {-1,68,69,70,71,-1,72},{73,74,75,-1,76,77,78}, {79,-1,80,81,82,83,-1},{84,85,86,87,-1,88,89}, {90,91,-1,92,93,94,95},{-1,96,97,98,99,-1,-1}}, tab_code_annee[7][7] = {{6,0,1,2,3,4,5},{5,6,0,1,2,3,4},{4,5,6,0,1,2,3},{3,4,5,6,0,1,2}, {2,3,4,5,6,0,1},{1,2,3,4,5,6,0},{0,1,2,3,4,5,6}}, ligne, colonne, centdiz; ligne = colonne = 0; centdiz = 0; // variable travaillant avec les tableaux des centaines et // des dizaines. Variable prenant en 1er les 2 chiffres des // centaines puis en 2nd les dizaines de l'annee recherchee if (avant == 1) tab_centaines[1][2] = 15; else tab_centaines[4][2] = 15; centdiz = annee / 100; while (tab_centaines[ligne][colonne] != centdiz) { if (colonne == 4) { colonne = 0; ligne ++; } else colonne ++; } avant = ligne; ligne = colonne = 0; centdiz = annee % 100; while (tab_dizaines[ligne][colonne] != centdiz) { if (colonne == 6) { colonne = 0; ligne ++; } else colonne ++; } ligne = avant; return (tab_code_annee[ligne][colonne]); } void affiche_resultat (int code_jour, int jour_n, int mois_n, int annee) { // initialise les tableaux de mois et de jours char *mois[12] = {"janvier","fevrier","mars","avril","mai","juin","juillet", "aout","septembre","octobre","novembre","decembre"},
  • jour[7] = {"lundi","mardi","mercredi","jeudi","vendredi","samedi",
"dimanche"}; printf ("%s %d %s %d", jour[code_jour], jour_n, mois[mois_n -1], annee); } void main () { char choix = ' '; int jour_n, mois_n, annee, bisextile, avant, validite, code_jour, code_mois, code_annee; long controle; jour_n = mois_n = annee = 0; // initialise les variables de date a 0 controle = avant = -1 ; // Test la date pour savoir si elle est avant // le 4.10.1582 ou apres le 15.10.1582 bisextile = 0; // Test l'annee, pour savoir si elle est bisextile ou non validite = 0; // Test la validité de la date saisie par l'utilisateur code_jour = code_mois = code_annee = 0; // Initialise les variables // permettant de definir le jour precis d'une date clrscr (); puts ("\n\t\t\tBienvenue sur le calendrier perpetuel.\n\n Vous allez " "enfin connaitre le jour correspondant a la date que vous saisirez." "\n\n\n\tAttention a l'annee que vous entrerez, ce calendrier perpetuel\n" "\t prend en compte une echelle allant de l'an 0 a l'an 2499\n\n\n\n"); while (1) { do { printf ("\nEntrez la date (jj/mm/aaaa): "); scanf ("%d/%d/%d",&jour_n, &mois_n, &annee); // Test de la bisextilité de l'année if ( (annee % 100 == 0 && annee % 400 == 0) || (annee % 100 != 0 && annee % 4 == 0) ) bisextile = 1 ; else bisextile = 0 ; // Test de la validité de la date entrée par l'utilisateur if ( (jour_n < 1 || jour_n > 31) || (mois_n < 1 || mois_n > 12) || (annee < 0 || annee >= 2500) || (jour_n > 30 && (mois_n == 4 || mois_n == 6 || mois_n == 9 || mois_n == 11)) || (mois_n == 2 && (jour_n > 29 || (bisextile == 0 && jour_n > 28))) ) { validite = 1; // DATE NON VALIDE erreurs (); } else validite = 0; // Date Valide } while (validite); controle = (annee * 10000) + (mois_n * 100) + jour_n ; // sonde de contrôle printf ("controle = %u\n", controle); // contrôle de changement de calendrier if (controle <= 15821004) avant = 1; if (controle > 15821015) avant = 0; if (controle > 15821004 && controle <= 15821015) puts ("Desole! Le jour est impossible a determiner pour cette date."); else { code_annee = cherche_annee (annee, avant); code_mois = cherche_mois (mois_n, bisextile, code_annee); code_jour = cherche_jour (jour_n, code_mois); affiche_resultat (code_jour, jour_n, mois_n, annee); } puts ("\n\n\t\tS: Saisir une nouvelle date\n\t\tQ: Quitter l'application"); printf ("\n\t\t\tVotre Choix........: "); choix = getche (); if (choix == 'S' || choix == 's') puts (" "); // printf ("\nla touche tapee est S ou s, normalement: %c\n", choix); else break; // { printf ("\nla touche tapee est: %c\n", choix); break; } } printf ("\n\n\tAppuyer sur une touche pour quitter........"); getch (); }

Conclusion :


Actuellement le code est écrit pour DOS, mais je compte le mettre sous format graphique (j'ai la flemme pour l'instant) et le porter sur d'autres langues que le français. De même, il n'est pas très commenté pour le moment, mais dans une mise à jour prochaine, vous aurez tous les détails eur l'algorithme utilisé.

Un petit bémol, vous vous en apercevrez en regardant le code, et si vous taper une certaine date... En l'an 1582, le programme ne peut définir le jour entre le 5/10/1582 et le 15/10/1582... pour cause de changement de calendrier.

A part cela, le programme convertit automatiquement les semaines de l'antiquité ou d'autres périodes, en semaines de 7 jours (d'aujourd'hui).

Si vous avez des remarques, ou des suggestions elle sont les bienvenues.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.