Ajouter un jour puis généraliser, ça veut dire : faire la fonction qui ajoute un seul jour, puis l'appeler n fois, dans une autre fonction qui a pour but d'ajouter n jours :
#include<stdio.h>
// j'ai enlever conio.h (sur mon compilo j'en ai pas besoin)
typedef struct
{
int jour;
int mois;
int annee;
} date;
void ajouteJour (date *date_struct) // Fonction qui ajoute un seul jour
{
if (date_struct->mois 12 && date_struct->jour 31) // Si on est le dernier jour de l'annee,
{
date_struct->annee++; // on change d'annee,
date_struct->mois = 1; // et on passe au 1er janvier.
date_struct->jour = 1;
return;
}
if (date_struct->mois == 2) // Sinon, si on est en Février,
{
if ((date_struct->annee % 4) == 0) // lors d'une année bissextile,
{
if (date_struct->jour == 29) // et le 29 du mois,
{
date_struct->mois++; // on change de mois
date_struct->jour = 1; // et on repasse au 1er du mois.
return;
}
}
else
{
if (date_struct->jour == 28) // sinon, c'est le 28 que
{ // s'effectue ce changement.
date_struct->mois++;
date_struct->jour = 1;
return;
}
}
date_struct->jour++; // Et si on est pas à la fin du mois, on change tout simplement de jour.
return;
}
else if (date_struct->mois < 8) // Si c'est un autre mois mois, inferieur à Août,
{
if ((date_struct->mois % 2) == 1) // alors s'il est multiple de 2,
{
if (date_struct->jour == 31) // il a 31 jours, et si on est le 31ème,
{
date_struct->mois++; // on passe au mois suivant,
date_struct->jour = 1; // et on remet le jour à 1.
return;
}
}
else
{
if (date_struct->jour == 30) // sinon, il a 30 jours, et si on est le 30ème
{
date_struct->mois++; // on passe au mois suivant,
date_struct->jour = 1; // et on change de jour.
return;
}
}
date_struct->jour++; // Et si on est pas à la fin du mois, on change juste de jour.
return;
}
else // Sinon, si le mois est supérieur ou égal à Août, c'est l'inverse :
{
if ((date_struct->mois % 2) == 0) // ceux qui sont multiple de 2
{
if (date_struct->jour == 30) // ont 30 jours,
{
date_struct->mois++;
date_struct->jour = 1;
return;
}
}
else
{
if (date_struct->jour == 31) // et les autres 31.
{
date_struct->mois++;
date_struct->jour = 1;
return;
}
}
date_struct->jour++;
return;
}
return;
}
void ajoutPlrsJours(date *date_struct, int nb_jours) // Ajoute plusieurs jours.
{
int i;
for(i=0; i < nb_jours; i++) // ajoute un jour après l'autre.
ajouteJour(date_struct);
}
int main ()
{
date test_date;
test_date.annee = 2011;
test_date.mois = 12;
test_date.jour = 28;
printf("%02d/%02d/%04d\n", test_date.jour, test_date.mois, test_date.annee);
ajoutPlrsJours(&test_date,5);
printf("%02d/%02d/%04d\n", test_date.jour, test_date.mois, test_date.annee);
return 0;
}
L'algo est simple, c'est comme avec les bosses des mains : bosse->31 jours, creux->30 jours. Il en ressort un motif de 1 sur 2 qui a 30 jour, sauf en Août qui lui a 31 jours aussi.
Pour Février je le traite à part, si l'année est bissextile -> 29 jours, sinon 28 (d'où modulo 4).
C++dialement,
Pop70