Calcul l'age en fonction des saisies utilisateur (année, mois, jour naissance)
Prend en compte les années bissextiles, les mois à 30 et 31 jours.
Cependant à l'affichage, un mois reste un mois (28, 29, 30 ou 31 peut importe), une année reste une année (365 ou 366 peu importe). J'ai pris cette décision car quand on donne son age, on se moque des années bissextiles.
Quand on dit qu'on a 20 ans et 6 mois, on se moque que les 3 premiers soient de 30 ou 31 jours.
Par ontre si vous voulez comptabiliser le nombre de jours vécus, je vous l'accorde c'est une autre histoire (voir source
Calcul Age, la variable ageT_jours contient cette information).
Source / Exemple :
/*
TP7 Exercice Facultatif
Nom : ERARD
Prenom : Stéphane
Fichier : main.cpp
Date : dim 11 dec 2005
#include <iostream>
#include <windows.h>
using namespace std;
void calculAge(int, int, int, SYSTEMTIME);
void AfficherResultats(int, int, int);
int retourneNbJoursMois(int, int, SYSTEMTIME);
bool estBissextile(int);
//rSaisieValide[...] pour recevoirSaisieValide
int rSaisieValideAnnee(SYSTEMTIME);
int rSaisieValideMois(int, SYSTEMTIME);
int rSaisieValideJour(int, int, SYSTEMTIME);
int rSaisieValideJours31(int, int, SYSTEMTIME);
int rSaisieValideJours30(int, int, SYSTEMTIME);
int rSaisieValideJoursBi(int, int, SYSTEMTIME);
int main(){
int sAnnee, sMois, sJour; //saisies utilisateur
SYSTEMTIME st;
GetSystemTime(&st);
sAnnee = rSaisieValideAnnee(st);
sMois = rSaisieValideMois(sAnnee, st);
sJour = rSaisieValideJour(sAnnee, sMois, st);
calculAge(sAnnee, sMois, sJour, st);
return 0;
}
/* **** FONCTIONS **** */
void calculAge(int annee, int mois, int jour, SYSTEMTIME st){
int cAnnees=0, cMois=0, cJours=0;
if (annee==st.wYear && mois==st.wMonth){
cAnnees=0;
cMois=0;
cJours=st.wDay - jour;
}
else if (mois==st.wMonth && jour < st.wDay){
cAnnees = st.wYear - annee;
cMois = 0;
cJours = st.wDay - jour;//jour - st.wDay;
}
else if (mois==st.wMonth && jour > st.wDay){
cAnnees=st.wYear - annee;
cMois = 0;
cJours = st.wDay - jour;
}
else if (mois==st.wMonth && jour == st.wDay){
cAnnees = st.wYear - annee;
cMois = 0;
cJours = 0;
}
else if (jour==st.wDay){
cAnnees = st.wYear - annee;
cMois = st.wMonth - mois;
cJours = 0;
}
else if (annee==st.wYear){
cAnnees=0;
cMois = mois - st.wMonth + 1;
cJours =retourneNbJoursMois(annee, mois, st) - jour;
}
else {
cJours = retourneNbJoursMois(annee, mois, st) - jour;
cMois = 12 - mois - 1;
cAnnees = st.wYear - annee;
}
if (cJours < 0){
//int nbJoursMaxMois = retourneNbJoursMois(annee, mois, st);
int nbJoursMax = retourneNbJoursMois(annee, mois, st);
cJours = nbJoursMax + cJours;
cMois = cMois - 1;
cAnnees -=1;
}
if (cMois < 0){
cMois = 12 + cMois;
}
AfficherResultats(cAnnees, cMois, cJours);
}
/* void AfficherResultats(int annees, int mois, int jours){
@params: int annee, int mois, int jours
@return: void
Description: Cette fonction formatte l'affichage des parametres en
fonction de ceux-ci.
void AfficherResultats(int annees, int mois, int jours){
if (jours == 0){
if (mois == 0){
if (annees==1)
cout << "\nVous avez 1 an! Noyeux Janniversaire !";
else
cout << "\nVous avez " << annees << " ans!";
}
else
{
if (annees==0)
cout << "\nVous avez " << mois << " mois!";
else if (annees==1)
cout << "\nVous avez 1 an et " << mois << " mois!";
else
cout << "\nVous avez " << annees << " et " << mois << "!";
}
}
else
{
if (jours == 1){
if (mois ==0){
if (annees==0)
cout << "\nVous avez 1 jour!";
else if (annees==1) cout << "\nVous avez 1 an et 1 jour!";
else cout << "\nVous avez " << annees << " et 1 jour!";
}
else
{
if (annees==0)
cout << "\nVous avez " << mois << " mois et 1 jour!";
else if (annees==1) cout << "\nVous avez 1 an, " << mois
<< " mois et 1 jour!";
else cout << "\nVous avez " << annees << " ans, " << mois
<< " mois et 1 jour!";
}
}
else
{
if (mois==0){
if (annees==0)
cout << "\nVous avez " << jours << " jours!";
else if (annees==1)
cout << "\nVous avez 1 an et " << jours << " jours:";
else
cout << "\nVous avez " << annees << " ans et " << jours
<< " jours!";
}
else
{
if (annees==0)
cout << "\nVous avez " << mois << " mois et " << jours
<< " jours!";
else if (annees==1)
cout << "\nVous avez 1 an, " << mois << " mois et "
<< jours << " jours!";
else
cout << "\nVous avez " << annees << " ans, " << mois
<< " mois et " << jours << " jours!";
}
}
}
}
/* int retourneNbJoursMois(int annee, int mois,SYSTEMTIME st_){
@params: int annee, int mois
@return: int nombre de jours restants dans le mois de l'année spécifiée.
Description: Cette fonction a besoin de l'année car si le mois est 2
il faut savoir si l'année est bissextile ou pas.
int retourneNbJoursMois(int annee, int mois,SYSTEMTIME st_){
switch(mois){
case 1: return 31;break;
case 2: if (estBissextile(annee)) return 29; else return 28;break;
case 3: return 31;break;
case 4: return 30;break;
case 5: return 31;break;
case 6: return 30;break;
case 7: return 31;break;
case 8: return 31;break;
case 9: return 30;break;
case 10: return 31;break;
case 11: return 30;break;
case 12: return 31;break;
}
}
/* bool estBissextile(int annee){
@params: int annee
@return: bool
Description: Si l'année fournit en parametre est bissextile
renvoi TRUE, sinon FALSE
bool estBissextile(int annee){
//Une année bisextile est une année divisible par 4
//sauf si elle est divisible par 100 auquel cas elle doit être divisible par 400.
if (annee%100==0 && annee%400==0) return false;
else if (annee%4==0) return true;
}
/* int rSaisieValideAnnee(SYSTEMTIME st)
@param: SYSTEMTIME st
@return:int annee
Description: renvoi une saisie utilisateur valide (l'année ici)
int rSaisieValideAnnee(SYSTEMTIME st){
int annee;
do {
cout << "Veuillez saisir votre annee de naissance (inferieur a " << st.wYear << "):";
cin >> annee;
}while (!(annee <= st.wYear ));
return annee;
}
/* int rSaisieValideMois(int annee, SYSTEMTIME st)
@param: int annee, SYSTEMTIME st
@return: int mois
Description: renvoi une saisie utilisateur valide (ici le mois)
valide dans le sens ou si l'année specifiée avant EST
l'année en cours, l'utilisateur ne peut renseigner un mois
supérieur au mois actuel
int rSaisieValideMois(int annee, SYSTEMTIME st){
int mois;
do {
cout << "Veuillez saisir votre mois de naissance ";
if (annee == st.wYear) cout << "(inferieur a " << st.wMonth << ")";
cout << ":";
cin >> mois;
if (annee==st.wYear && mois > st.wMonth) mois = 13;
}while (!(mois<=12 && mois>=1));
return mois;
}
/* int rSaisieValideJour(int annee, int mois, SYSTEMTIME st)
@param: int annee, int mois, SYSTEMTIME st
@return: int jour
Description: renvoi une saisie utilisateur valide (ici le jour)
valide dans le sens où la fonction prête attention au nombre de
jours dans le mois, et si l'année est bissextile pour le mois de
fevrier
int rSaisieValideJour(int annee, int mois, SYSTEMTIME st){
int jour=0, limit=0;
if (annee == st.wYear && mois == st.wMonth){
do{
cout << "Veuillez saisir votre jour de naissance (inferieur a " << st.wDay << "):";
cin >> jour;
}while (!(jour > 0 && jour < st.wDay));
}
else{
switch (mois){
//mois à 31
case 1:jour=rSaisieValideJours31(annee, mois, st);break;
case 3:jour=rSaisieValideJours31(annee, mois, st);break;
case 5:jour=rSaisieValideJours31(annee, mois, st);break;
case 7:jour=rSaisieValideJours31(annee, mois, st);break;
case 8:jour=rSaisieValideJours31(annee, mois, st);break;
case 10:jour=rSaisieValideJours31(annee, mois, st);break;
case 12:jour=rSaisieValideJours31(annee, mois, st);break;
//mois à 30
case 4:jour=rSaisieValideJours30(annee, mois, st);break;
case 6:jour=rSaisieValideJours30(annee, mois, st);break;
case 9:jour=rSaisieValideJours30(annee, mois, st);break;
case 11:jour=rSaisieValideJours30(annee, mois, st);break;
//mois de fevrier verifie si année bissextile
case 2:
jour=rSaisieValideJoursBi(annee, mois, st);break;
}
}
return jour;
}
/* int rSaisieValideJours31(int annee, int mois, SYSTEMTIME st)
@param: int annee, int mois, SYSTEMTIME st
@return: int jour
Description: renvoi une saisie utilisateur valide (ici le jour)
comprise entre 1 et 31
int rSaisieValideJours31(int annee, int mois, SYSTEMTIME st){
int jour;
do {
cout << "Veuillez saisir votre jour de naissance (entre 1 et 31):";
cin >> jour;
}while(!(jour>=1 && jour<=31));
return jour;
}
/* int rSaisieValideJours30(int annee, int mois, SYSTEMTIME st)
@param: int annee, int mois, SYSTEMTIME st
@return: int jour
Description: renvoi une saisie utilisateur valide (ici le jour)
comprise entre 1 et 30
int rSaisieValideJours30(int annee, int mois, SYSTEMTIME st){
int jour;
do {
cout << "Veuillez saisir votre jour de naissance (entre 1 et 30):";
cin >> jour;
}while(!(jour>=1 && jour<=30));
return jour;
}
/* int rSaisieValideJoursBi(int annee, int mois, SYSTEMTIME st)
@param: int annee, int mois, SYSTEMTIME st
@return: int jour
Description: renvoi une saisie utilisateur valide (ici le jour)
comprise entre 1 et 28/29 suivant si année bissextile.
int rSaisieValideJoursBi(int annee, int mois, SYSTEMTIME st){
int jour;
if (estBissextile(annee)){
do{
cout << "Veuillez saisir votre jour de naissance (entre 1 et 29):";
cin >> jour;
}while(!(jour>=1 && jour<=29));
return jour;
}
else {
do{
cout << "Veuillez saisir votre jour de naissance (entre 1 et 28):";
cin >> jour;
}while(!(jour>=1 && jour<=28));
return jour;
}
}
/* **** FIN FONCTIONS **** */
Conclusion :
si bugs, suggestions, ... n'hésitez pas!
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.