Accueil > > > COMMENT SAVOIR QUEL JOUR ÉTAIT-ON À UNE TELLE DATE?
COMMENT SAVOIR QUEL JOUR ÉTAIT-ON À UNE TELLE DATE?
Information sur la source
Description
Ceci un simple code ( débutant ) -en mode console- pour savoir quel jour somme nous en fonction d'une certaine date. Ce programme s'utilise soit en ligne de commande soit en mode "progressif" ( je sais pas comment on dis... ) Pour utiliser en mode commande la syntaxe est : emplacement_de_l'exe <int jour> <int mois> <long int annee> voilou !
Source
- #include <stdio.h>
- #include <stdlib.h>
-
- //Ces deux macros sont utilisés pour faire un calcul, ce calcul est expliqué en bas.
- #define f(annee, mois) ( ((mois) <= 2) ? ((annee) - 1) : (annee) )
- #define g(mois) ( ((mois) <= 2) ? ((mois) + 13) : ((mois) + 1) )
-
- //Définition de la structure date contenant trois membres : le jour, le mois, et l'annee.
- struct date
- {
- int jour;
- int mois;
- long int annee;
- };
-
- //Tableaux de pointeur vers char servant à l'affichage des jours.
- const char *daysOfWeek[] = { "dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi" };
-
- //Ce calcul est plus ou moins expliqué en bas, ainsi que la raison pour laquelle
- //Deuxmacros sont utilisés au lieu d'une seule.
- #define myCalculOfDay(d) (1461 * f(d.annee, d.mois) / 4 + 153 * g(d.mois) / 5 + d.jour)
- #define myWhatDay(d_) ( (myCalculOfDay(d_) - 621049) % 7 )
-
- //Fonction affichant le jour. Cette fonction ne prend aucun argument car elle
- //est utiliséé si l'utilisateu n'utilie pas le programme en ligne de commande.
- void whatday( void )
- {
- struct date entry;
- printf("\nEntrez votre date ( jj/mm/aaaa ) : ");
- scanf("%2i/%2i/%4li", &(entry.jour), &(entry.mois), &(entry.annee));
- printf("\n\nLe %2i/%2i/%4li est un %s.\n\n", entry.jour, entry.mois, entry.annee,
- daysOfWeek[myWhatDay(entry)]);
- exit(EXIT_SUCCESS);
- }
-
- //Voici la meme fonction que celle d'au dessus, mais avec un argument de type structure date
- //Cette structure a pour caleur les trois arguments de la ligne de commande.
- void whatday2( struct date d_ )
- {
- printf("\n\nLe %2i/%2i/%4li est un %s.\n\n", d_.jour, d_.mois, d_.annee,
- daysOfWeek[myWhatDay(d_)]); //Affichage du jour grace au tableau
- exit(EXIT_SUCCESS);
- }
-
- //Fonction main, gerant "l'interface" du programme.
- int main (int argc, char *argv[])
- {
- //Si l'utilisateur n'utilise pas le programme en ligne de commande, argc a pour valeur 1.
- if (argc == 1)
- whatday(); //Lancement de la fonction whatday
- //Si l'utilisateur utilise le programme en mode ligne de commande correctement ( c'est à dire 3 arguments ) argc a pour valeur 4
- else if (argc == 4)
- {
- //Definition de la structure entry. Conversion des arguments de type char de la ligne de commande vers le type approprié
- // ( atoi -> char vers int - atol -> char vers long int )
- struct date entry = { entry.jour = atoi(argv[1]), entry.mois = atoi(argv[2]), entry.annee = atol(argv[3]) };
- whatday2( entry ); //Lancement de la fonction whatday2 avec comme argument la structure prédéfini
- }
- //Dans les autres cas ( l'utilisateur a taper des arguments de ligne de commande, mais pas le bon nombre)
- else
- {
- //Affichage d'un message d'erreur approprié
- printf("\n\nErreur, nombre d'arguments incorrect !\n\nFormat 1 : whatday <jj> <mm> <aaaa>\n");
- printf("Format 2 : whatday\n\n");
- //Exit du programme avec une valeur d'erreur
- exit(EXIT_FAILURE);
- }
-
- //Retour d'une valeur d'erreur
- return EXIT_FAILURE;
- //Cette valeur ne sera jamais utilisée car le programme quittera toujours avant.
- }
-
- /********** END *********/
#include <stdio.h>
#include <stdlib.h>
//Ces deux macros sont utilisés pour faire un calcul, ce calcul est expliqué en bas.
#define f(annee, mois) ( ((mois) <= 2) ? ((annee) - 1) : (annee) )
#define g(mois) ( ((mois) <= 2) ? ((mois) + 13) : ((mois) + 1) )
//Définition de la structure date contenant trois membres : le jour, le mois, et l'annee.
struct date
{
int jour;
int mois;
long int annee;
};
//Tableaux de pointeur vers char servant à l'affichage des jours.
const char *daysOfWeek[] = { "dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi" };
//Ce calcul est plus ou moins expliqué en bas, ainsi que la raison pour laquelle
//Deuxmacros sont utilisés au lieu d'une seule.
#define myCalculOfDay(d) (1461 * f(d.annee, d.mois) / 4 + 153 * g(d.mois) / 5 + d.jour)
#define myWhatDay(d_) ( (myCalculOfDay(d_) - 621049) % 7 )
//Fonction affichant le jour. Cette fonction ne prend aucun argument car elle
//est utiliséé si l'utilisateu n'utilie pas le programme en ligne de commande.
void whatday( void )
{
struct date entry;
printf("\nEntrez votre date ( jj/mm/aaaa ) : ");
scanf("%2i/%2i/%4li", &(entry.jour), &(entry.mois), &(entry.annee));
printf("\n\nLe %2i/%2i/%4li est un %s.\n\n", entry.jour, entry.mois, entry.annee,
daysOfWeek[myWhatDay(entry)]);
exit(EXIT_SUCCESS);
}
//Voici la meme fonction que celle d'au dessus, mais avec un argument de type structure date
//Cette structure a pour caleur les trois arguments de la ligne de commande.
void whatday2( struct date d_ )
{
printf("\n\nLe %2i/%2i/%4li est un %s.\n\n", d_.jour, d_.mois, d_.annee,
daysOfWeek[myWhatDay(d_)]); //Affichage du jour grace au tableau
exit(EXIT_SUCCESS);
}
//Fonction main, gerant "l'interface" du programme.
int main (int argc, char *argv[])
{
//Si l'utilisateur n'utilise pas le programme en ligne de commande, argc a pour valeur 1.
if (argc == 1)
whatday(); //Lancement de la fonction whatday
//Si l'utilisateur utilise le programme en mode ligne de commande correctement ( c'est à dire 3 arguments ) argc a pour valeur 4
else if (argc == 4)
{
//Definition de la structure entry. Conversion des arguments de type char de la ligne de commande vers le type approprié
// ( atoi -> char vers int - atol -> char vers long int )
struct date entry = { entry.jour = atoi(argv[1]), entry.mois = atoi(argv[2]), entry.annee = atol(argv[3]) };
whatday2( entry ); //Lancement de la fonction whatday2 avec comme argument la structure prédéfini
}
//Dans les autres cas ( l'utilisateur a taper des arguments de ligne de commande, mais pas le bon nombre)
else
{
//Affichage d'un message d'erreur approprié
printf("\n\nErreur, nombre d'arguments incorrect !\n\nFormat 1 : whatday <jj> <mm> <aaaa>\n");
printf("Format 2 : whatday\n\n");
//Exit du programme avec une valeur d'erreur
exit(EXIT_FAILURE);
}
//Retour d'une valeur d'erreur
return EXIT_FAILURE;
//Cette valeur ne sera jamais utilisée car le programme quittera toujours avant.
}
/********** END *********/
Conclusion
Voila!
Explication du calcul : Il existe une formule pour calculer le nombre de jours séparant deux dates. Il sagit de calculer N pour chacune des deux dates et d'en calculer ensuite la différence. N se calcul de la maniere suivante :
N = 1461 * f(annee, mois) / 4 + 153 * g(mois) / 5 + jour
où : f(annee, mois) renvoie annee - 1 si mois est inferieur ou egale a 2, sinon, renvoie annee. et g(mois) renvoie mois + 13 si mois est infereur ou egale a 2, sinon, renvoie mois + 1.
Si on prend la valeur N d'une date calculé comme ci dessus, qu'on lui soustrait 621 049 et qu'on garde le modulo 7 ( reste de la division de ce nombre par 7 ) on obtient une valeur comprise entre 0 et 6. Cette valeur correspond au jour de la semaine ( 1 -> lundi, donc 0 -> dimanche ).
Si j'ai donc ecris le calcul en deux macros, c'est pour pouvoir l'extraire plus facilement pour calculer la difference entre deux dates... Maintenant que vous savez faire, vous pouvez vous aussi le faire.
PS : Cette formule a été trouvé dans un ouvrage sur le C intitulé "programmation en language C", de Stephen KOCHAN.
MERCI !
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
trouver une date [ par sacredead ]
bonsoir, j'aimerais avoir un peu d'aide pour créer un sous programme (en C) qui renverrait une date en fonction d'un indice de jour. par exemple, le 1
SQL et date ! [ par Nixeus ]
Bonjour à tous !Le programme que je développe doit comptabiliser des passages ( carte magnétiques) chaque jour ( afin d'en faire des statistiques)Voic
probleme de constucteur urgent [debutant] [ par yanne1985 ]
salut class date{ int jour,mois,annee; public: date(int jour=0, int mois=0, int annee=0) { this->jour=jour; this->mois=mois; t
Retrouver le numero de semaine à partir d'une date [ par sebclick ]
Bonjour,Je recherche une fonction qui permet de retrouver le numéro de semaine à partir d'une date.Je passe en paramètre 08 12 2005 et
aide pour dvpmt C [ par Stuntfire62 ]
Bonjour,j' ai un pb pour un code en C, j'ai plusieurs choses a faire.je dois écrire une fonction permettant de comparer deux dates dans un tableau qui
Mise à jour de paramètre [ par justine684 ]
Bonjour! Alors j'ai un problème que je ne sais résoudre. Peu être que quelqu'un pourrait m'aider. Mon but est de référencer les semaines dans une anné
trouver l'algorithme [ par freyge ]
k-will salut j'ai un petit souci je veux realiser un programme apres avoir donnée la date il vous donne le jour par exemple: donnez la date: 21 08 20
Chercher code source socket [ par Booster ]
Bonsoir à tous,Dans le but d'un projet j'aimerais trouver le code source des sockets en gros je ne cherche pas le code machine, mais plutôt un code so
Pseudo-code [ par Caine10 ]
Coucou, j'ai un petit soucis avec l'éxercice suivant... j'ai grand besoin d'aide ^_^"L'utilisateur encode en une seule fois une date sous la forme AA
création de fichier [ par freeze ]
Salut à tous,je voudrais créer un fichier qui reprendrai la date du jourPar exemple 0110022.zip pour un fichier zip du 01/10/2002En fait je voudrais é
|
Derniers Blogs
WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui l'ont sagement suivi. Je profite de ce poste pour fai...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE SECOND JOURTECHDAYS PARIS 2012 : PLEINIèRE SECOND JOUR par ROMELARD Fabrice
Après une première journée dédiée aux développeurs, cette seconde journée est dédiée au monde des entreprises et de ses applications. Ainsi, cette pleinière est dédiée à faire un 360 de l'évolution des applications Business aux demandes ac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : RETOUR D'EXPéRIENCE SUR LA MISE EN PLACE D'UN CLOUD PRIVéTECHDAYS PARIS 2012 : RETOUR D'EXPéRIENCE SUR LA MISE EN PLACE D'UN CLOUD PRIVé par ROMELARD Fabrice
Speaker : Guillaume Rochette Cette session est dédiée à fournir le retour sur la mise en place d'un cloud privé (IaaS) par Osiatis pour son compte ou celui de ses clients. Ce projet s'est déroulé sur 4 mois et a permis de faire évoluer...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|