Calendar [code c] [gcc]

Contenu du snippet

Ce petit programme de clendrier est un clone de la
celebre application cal des systeme Unix, pour le moment calendar est moins performant car il faut lui indiquer le mois et l'annee que l'on veut, et aussi les annees sont restreintes de 1800 a 3000 ni plus ni moins.

Source / Exemple :


/*
 Programme: calendar.c
 Auteur: Joel Matteotti <joel.matteotti@free.fr>
 Version: 1.0
 Description: Ce petit programme de calendrier est un clone de la celebre application cal des systeme Unix
 pour le moment il n'est pas aussi performent car il faut lui indiquer le mois et l'annee dont les annees sont
 restreinte de 1800 a 3000 ni plus ni moins

  • /
#include <stdio.h> void usage(void); int isBissextile(unsigned); static unsigned month_to_days(unsigned); static long years_to_days(unsigned); long ymd_to_scalar(unsigned, unsigned, unsigned); int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; char *month[12] = {"Janvier", "Fevrier", "Mars", "Avril", "Mais", "Juin", "Juillet", "Aout", "Septembre", "Octembre", "Novembre", "Decembre"}; char *daynames[8] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim"}; const char *line = ""; int main(int argc, char *argv[]) { int day, day_1, numdays, i, j; unsigned yr, mo; /*si les argument passer en parametre sont incorrect ou pas assez nombreux pour eviter d'avoir des fichier core on affihe un message d'aide plutot que de continuer le reste du programme*/ if (argc < 3 && argc > 1) usage(); if (argc < 3) usage(); //si le nombre d'argument est correct if (argc >= 3) { yr = atoi(argv[2]); mo = atoi(argv[1]); } //verification si le mois de fevrier est a 28 jours ou 29 jours numdays = days[mo - 1]; if (2 == mo && isBissextile(yr)) ++numdays; //Cela sert a faire demarrer le calendrier par le Lundi day_1 = (int)((ymd_to_scalar(yr, mo, 1) - (long)1) % 7L); fputs(line, stdout); //on affiche la valeur de line dnas la sortie stndard printf("\nMois de %s de l'annee %d\n\n", month[mo - 1], yr); //On affiche tous les jours (lundi, mardi, mercredi, ect...) for (j = 0; j < 7; ) { fputs(daynames[1 + j], stdout); //verifie la norme ISO pour savoir ou commencer if (7 != ++j) //on veriifie pas que notre semaine fait plus de 7 jours :o) fputc(' ', stdout); //affiche un espace entre chacque jours } printf("\n%s", line); //on vas a la ligne //on affiche un espace jusqu'a ce que l'on tombe sur le premier jour du mois for (day = 0; day < day_1; ++day) fputs(" ", stdout); //t bein ici on affiche les jours tous simplment :-) for (day = 1; day <= numdays; ++day, ++day_1, day_1 %= 7) { if (!day_1 && 1 != day) printf("\b%s\n%s", line, line); printf("%3d ", day); } /*on met des epasce dans les jorus de la semaine si par exemple le 31 est un jeudi et bien le vendredi, samedi et dimanche seront remplacer par des espace*/ for ( ; day_1; ++day_1, day_1 %= 7) fputs(" ", stdout); fputc('\n', stdout); return 0; } //Fonction affichant une petite aide :-p void usage(void) { puts("Usage: ./cal [m y]"); puts("where: m = mois (1 - 12)"); puts(" y = annee (1800 - 3000)"); exit(-1); } //Fonction calculant la probailite que ce soint uen annee bissextile ou non int isBissextile (unsigned annee) { return annee % 400 == 0 || (annee % 4 == 0 && annee % 100 != 0); //c'est vrai que les 2 sont super util enssemble mais au moins ca evite certains de problemes } //Bon et bien pour la suite je ne pense pas qu'il y est besoin d'explication ? static unsigned months_to_days (unsigned mois) { return (mois * 3057 - 3007) / 100; } static long years_to_days (unsigned annee) { return annee * 365L + annee / 4 - annee / 100 + annee / 400; } long ymd_to_scalar (unsigned annee, unsigned mois, unsigned jour) { long scalaire; scalaire = jour + months_to_days(mois); if ( mois > 2 ) /* Verification si c'est uen annee bissextile ou non*/ scalaire -= isBissextile(annee) ? 1 : 2; annee--; scalaire += years_to_days(annee); return scalaire; }

Conclusion :


Ensuite il n'y a plus qu'a compiler:
gcc calendar.c -o calendar

Voila un exemple d'utilisation:
./calendard 12 1999

cela donnera le calendrier du mois de decembre de 1999

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.