
\documentclass{article}
\usepackage{alltt}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{color}

\title{Calendrier Maya}
\author{Bruno Malenfant}
\date{29 janvier 2012}


\begin{document}

\maketitle

\begin{itemize}
\item Peut être fait seul(e) ou en équipe de deux (2).
\item Date de remise~: 15 février 2012 avant 23:55.
\end{itemize}

\section{Introduction}

Pour le premier tp vous allez construire un logiciel qui traduit une date du calendrier
grégorien vers trois (3) des calendriers mayas~: compte long, Haab et Tzolk'in.

\section{Description}

\subsection{Entrées}

Le logiciel va recevoir une date grégorienne en argument sur la ligne de commande.
Il y aura donc trois valeurs en entrées~: jour, mois, année.
Par exemple~:

\begin{alltt}
  versMaya 21 12 2012
\end{alltt}

Ici l'exécutable du programme s'appel 'versMaya'.  Cet appel
va traduire la date du 21 décembre 2012 en date maya.
Ce qui donnera~:

\begin{alltt}
  compte court : 13.0.0.0.0
  haab : 3 K'ank'in
  tzolk'in : 4 Ahau
\end{alltt}


Vous devez vérifier que le logiciel reçoit bien trois arguments.
que ces arguments sont des valeurs entières légales.
Pour l'année vous devez accepter les nombres positifs et négatifs .
Il y a une ann\'ee z\'ero dans le calendrier gr\'egorien.
Les mois sont de 1 à 12.  Pour les jours cela dépend du mois~:

\medskip

\begin{tabular}{|l|r|r|} \hline
  nom & numéro & nb. jours \\ \hline \hline
  janvier   &  1 & 31 \\
  février   &  2 & 28 ou 29\\
  mars      &  3 & 31 \\ \hline
  avril     &  4 & 30 \\
  mai       &  5 & 31 \\
  juin      &  6 & 30 \\ \hline
  juillet   &  7 & 31 \\
  août      &  8 & 31 \\
  septembre &  9 & 30 \\ \hline
  octobre   & 10 & 31 \\ 
  novembre  & 11 & 30 \\
  décembre  & 12 & 31 \\ \hline
\end{tabular}

\medskip

Les dates limites sont entre le 
11 août -3113 et le 12 octobre 4772.

Une année est
bissextile si elle est divisible par 4 mais pas par 100.
Il y a exception si elle est divisible par 400 elle sera 
bissextile.


Si une valeur n'est pas correct alors vous affichez
un message d'erreur approprié et le programme se termine (exit(-1)).

\subsection{Analyse}

Il existe plusieurs calendriers mayas.  Pour ce logiciel
nous allons utiliser trois de ces calendriers~:
compte long, Haab et Tzolk'in.

\subsubsection{Compte long}

Le compte long est un système simple.  Une date est composée
de 5 nombres~: naktun . katun . tun . uinal . kin.

Un {\bf kin} est une journée.  Un {\bf uinal} est composé
de 20 {\bf kinob}.  Un {\bf tun} est composé de 18 {\bf uinalob}.
Un {\bf katun} est composé de 20 {\bf tunob} et un {\bf naktun}
est composé de 20 {\bf katunob}.

Le calendrier commence à la date 0.0.0.0.0.
le jour suivant sera le 0.0.0.0.1.  
Après le 0.0.0.0.19 se sera le 0.0.0.1.0.
Après le 0.0.0.17.19 se sera le 0.0.1.0.0.
Après le 0.0.19.17.19 se sera le 0.1.0.0.0.
Après le 0.19.19.17.19 se sera le 1.0.0.0.0.
Après le 19.19.19.17.19 (12 octobre 4772, un jeudi) se sera à nouveau le 0.0.0.0.0.

\subsubsection{Haab}

Le calendrier haab ne tient pas compte des années, il indique seulement
les jours.  Il est basé sur un cycle de 365 jours.  Il y a 18 mois de
20 jours et entre deux cycles il y a 5 jours qui n'ont pas de mois.
Les jours sont numérotés de 0 à 19.  Voici la liste des mois~:

\medskip

\begin{tabular}{|r|l|} \hline
1 & Pop \\
2 & Wo \\
3 & Sip \\ \hline
4 & Sotz' \\
5&Sek \\
6&Xul \\ \hline
7&Yaxk'in \\
8&Mol \\
9&Ch'en \\ \hline
10&Yax \\
11&Sak \\
12&Keh \\ \hline
13&Mak \\
14&K'ank'in \\
15&Muwan \\ \hline
16&Pax \\
17&K'ayab \\
18&Kumk'u \\ \hline
\end{tabular}

\medskip

La période de cinq jours qui n'a pas de mois s'appele {\bf Wayeb}
et les jours sont numérotés de 0 à 4.

Donc, après le 1 Pop il y a le 2 Pop, après le 19 Pop c'est le 0 Wo,
après le 19 Kumk'u c'est le 0 Wayeb et après le 4 Wayeb c'est le 0 Pop.

\subsubsection{Tzolk'in}

Comme le calendrier haab le calendrier Tzolk'in ne tient pas compte des
années.  Il est basé sur un cycle de 260 jours.
Les jours sont identifié par 2 valeurs. La première valeur
est un nombre de 1 à 13 et la seconde est un mot parmit
les suivants (en ordre)~:

{\bf Imix,  Ik, Akbal, Kan, Chicchan, Cimi, Manik,
 Lamat, Muluc, Oc, Chuen, Eb, Ben, Ix, Men, Cib,
 Caban, Etznab, Cauac, Ahau. }

Par contre ici les deux valeurs augmente ensemble d'un journée
à l'autre.  Le premier jour est le 1 Imix.
Le deuxième est le 2 Ik. Cela continue jusqu'au 13 Ahau.
Par exemple, après le 13 Ben se sera le 1 Ix et
après le 7 Ahau ce sera le 8 Imix.  Après le 13 Ahau ce
sera le 1 Imix à nouveau.

\subsubsection{Correspondance}

Voici quelques dates correspondantes d'un calendrier à l'autre~:

\medskip

\begin{tabular}{|l|l|l|l|} \hline
compte long    &  gregorien       & haab         & tzolk'in \\ \hline \hline
 0.0.0.0.0   &   11 aout -3113  &  8 Kumk'u    &   4 Ahau \\ \hline
 9.12.11.5.18   &   29 aout 683    & 11 Yak       &   6 Etznab  \\ \hline
12.19.6.15.2   &    1 janvier 2000& 10 K'ank'in  &  11 Ik' \\ \hline
12.19.19.2.10   &   15 février 2012& 18 Pax       &   6 Oc \\ \hline
\end{tabular}


\subsection{Sorties}

Le logiciel va afficher le résultat sur trois lignes~:

\medskip

\begin{alltt}
  compte long : 12.19.19.2.10
  haab : 18 Pax
  tzolk'in : 6 Oc
\end{alltt}

\medskip

Le logiciel doit afficher dans ce format exact et ne rien afficher
d'autre.


\section{Conception}


Chacune de vos routines doit avoir des commentaires.
Ces commentaires doivent avoir l'information suivantes~:

\medskip

\begin{itemize}
\item La routine est-elle une fonction ou une procédure ?
\item Rôle de la routine~: ce qu'elle fait, ce qu'elle retourne.
\item Argument~: Description des arguments, leurs rôles dans
  la routine, les valeurs permisent, sont-ils des entrées ou des
  sorties ?, ...
\item Les erreurs possibles.
\end{itemize}

\medskip

Votre programme doit être dans un seul fichier.

\section{Remise}

{\bf N'oubliez pas d'écrire votre nom}.
Remettez votre programme en utilisant Moodle.
Votre programme doit être dans un seul fichier.
Vous n'avez le droit d'utiliser que les librairies suivantes
pour votre logiciel~: stdio.h, stdlib.h, string.h, math.h. stdbool.h
et time.h.

\section{Évaluation}

\medskip

\begin{itemize}
\item Fonctionnalité (6 pts).
  \begin{itemize}
  \item Votre programme doit compiler avec le compilateur 'gcc' sur
  la machine chicoree.  Si le programme ne compile pas, aucun point
  n'est donné pour la fonctionnalité.
  \end{itemize}
\item Structure (2 pts).
  \begin{itemize}
  \item Le respect des critères pour les commentaires.
  \item Bonne utilisation des structures de contrôle~: if, while, ...
  \item Bonne modularité.
  \end{itemize}
\item Lisibilité (2 pts).
  \begin{itemize}
  \item Bonne indentation.
  \item Identificateur significatif.
  \end{itemize}
\item Autres critères~:
  \begin{itemize}
  \item Pas de 'goto'.
  \item Un seul 'return' par routine, à la fin de celle-ci.
  \item Pas de variables globales.
  \item Pas de ligne contenant des commentaires et du code.
  \end{itemize}
\end{itemize}

\end{document}

%% FIN
%% Local Variables: 
%% compile-command: "C:\\Progra~1\\TeXLive\\bin\\win32\\latex.exe tp1hiv2012.tex" 
%% End: 

