Calcul age v2

0/5 (3 avis)

Snippet vu 13 893 fois - Téléchargée 32 fois

Contenu du snippet

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!

A voir également

Ajouter un commentaire Commentaires
iz1946 Messages postés 1 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 23 décembre 2007
23 déc. 2007 à 13:12
Je pense que la fonction "calculAge" ne fonctionne pas correctement dans la partie
else if (mois==st.wMonth && jour > st.wDay){
cAnnees=st.wYear - annee;
cMois = 0;
cJours = st.wDay - jour;
}
ainsi que
else if (jour==st.wDay){
cAnnees = st.wYear - annee;
cMois = st.wMonth - mois;
cJours = 0;
}
miximog Messages postés 34 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 14 avril 2007
15 déc. 2005 à 17:30
oui un update aurai été mieu m'enfin ....;
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
13 déc. 2005 à 17:16
Tu aurais pu faire un update plutôt

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.

Du même auteur (cs_l0gin)