JOUR DE NAISSANCE

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 5 déc. 2011 à 10:36
fredg19 Messages postés 11 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 16 mars 2015 - 24 janv. 2012 à 18:15
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53813-jour-de-naissance

fredg19 Messages postés 11 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 16 mars 2015
24 janv. 2012 à 18:15
@CptPingu dans mon code, au début, quand l'on choisis oui pour commencer ou non pour mettre fin au programme (ce qui me sert de sentinelle), si je fais une faute d'entrée, le programme va entré dans une boucle infinie, comment je peux remédier à ça?
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
24 janv. 2012 à 10:19
>> je crois que ça ne marche qu'avec les chiffres et les nombres, pas avec les caractères
Je ne comprends pas ta question. Un caractère est un nombre, donc pas de souci avec ça. Si tu parles d'une chaîne de caractère, le problème ne se pose pas non plus.
fredg19 Messages postés 11 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 16 mars 2015
24 janv. 2012 à 01:38
@CptPingu, je suis d'accord avec les fameuses améliorations que tu as emmené, mais pour ce qui est de ta manière d'empêcher les boucles infinies avec les erreurs d'entrées, je crois que ça ne marche qu'avec les chiffres et les nombres, pas avec les caractères, enfin, je ne sais pas si ça peut marcher aussi pour les caractères. Merci de ton aide!
fredg19 Messages postés 11 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 16 mars 2015
6 déc. 2011 à 17:41
tout à fais exact Pasokoniidesuka, j'ai appris les bases de C++ dans les salles de cours
Pasokoniidesuka Messages postés 20 Date d'inscription mercredi 21 juillet 2010 Statut Membre Dernière intervention 17 janvier 2012
6 déc. 2011 à 13:56
@CptPingu ; J'ai lu le tuto et jusqu'à la moitié je me suis dit : "Ouais c'est un choix perso." Mais bon à lire jusqu'à la fin on fini par comprendre mieux. Je n'ai pas fait de C/C++ depuis un bail et a mon avis c'est pas près de recommencer mais moi le using namespace std je l'ai appris dans les livres de C++ (donc comme tu dis à peu près : dans les salles de cours).
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
5 déc. 2011 à 16:28
Bonjour.

Très sympathique comme programme. J'ai tout de même quelques petites remarques.

Remarques techniques:
- C'est un grand classique :), mais évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Évite aussi les "system", tu perds en portabilité pour une fonctionnalité très limitée.
- Tu ne vérifies pas les erreurs d'entrées, ce qui fait qu'on peut entrer dans une boucle infinie si on tapes quelque chose dont ton programme ne s'attend pas. Ex: "Inscrivez le jour de votre naissance" => 01/01/1900 => boucle infinie :(. Pour gérer ça correctement, utilise la technique décrite sur cette page du forum: http://www.cppfrance.com/forum/sujet-VERIFICATION-ENTREE-CIN_1544419.aspx
- Pense à bien activer tout les flags de warning quand tu codes, en compilant j'ai trouvé pas mal de soucis potentiels, je te les copie colle:
jour.cpp: In function ‘void EnregistrerInfoJourNaissance(std::vector<TypeDateNaissance>)’:
jour.cpp:488:44: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
jour.cpp: In function ‘bool RecupererInfoJourNaissance(std::vector<TypeDateNaissance>&)’:
jour.cpp:505:46: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
jour.cpp: In function ‘void AfficherDernieresRecherches(const std::vector<TypeDateNaissance>&)’:
jour.cpp:523:45: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
jour.cpp: In function ‘bool ValiderDateNaissance(TypeDateNaissance&, int&)’:
jour.cpp:238:2: warning: control reaches end of non-void function [-Wreturn-type]

En gros, tu mélanges entiers signés et non signés, et dans l'une des fonctions, il manque un return.
- Il y a quelques petites inélégances:
* Par exemple, un else n'est pas nécessaire après un return (puisque le return est débranchant).
* Utilise directement return dans tes cases, lorsque tu n'as qu'une valeur à retourner.
Ex:
int DeterminerCodeMoisNaissance(int& p_mois_naissance)
{
switch(p_mois_naissance)
{
case 1: return 1;
case 2: return 4;
// etc...
}
}
* Inutile de passer un type pod (int, float, char, etc...) en référence si tu ne le modifies pas. Donc int& => int (En plus sizeof(int&) >= sizeof(int)).
* De même, si tu passes une structure en référence (cette fois la référence est justifiée) mais que tu ne la modifies pas, alors il faut ajouter un "const" devant.
* Un std::vector devrait normalement être passé en référence (sinon bonjour les copies dans "EnregistrerInfoJourNaissance").
* Il manque un return 0 à la fin de ton main.

Remarques conceptuelles:
- Pourquoi demander à l'utilisateur s'il veut "commencer" ? Autant commencer directement. S'il veut quitter il le peut. En revanche, à l'usage, c'est assez lourd de devoir dire à chaque fois "oui je veux utilise le programme, sinon je ne l'aurais pas lancé".
- Ne pourrais-tu pas demander la date entière à l'utilisateur ? Tu détectes ensuite le jour, mois et année et s'il celui-ci n'a pas tout entrée, tu lui demandes les informations restantes. Ça serait plus agréable.
- Si l'idée du dessus est peu compliqué à mettre en place, précise au moins le format attendu dans la question (Ex: Jour (DD), Mois, (MM), Année (YYYY)).
- Pour le format du fichier, une ligne par entrée aurait été plus pratique, non ?

Remarques facultatives:
- Si tu utilises vraiment Dev-C++, attention ce projet est abandonné depuis des années, et le compilateur embarqué avec est trèèès vieux. Met à jour le compilateur embarqué ou utilise un IDE plus récent (Visual studio express, Qt Creator, Code::Blocks, ...).
- Essaie de coder en anglais (tu auras des noms plus courts et ça évitera le mélange anglais/français entre ton code et la STL par exemple). Si tu cherches à travailler professionnellement en informatique, tu verras que l'anglais est la langue à utiliser.
- Commente ton code. Par exemple avec doxygen. Voir: http://0217021.free.fr/portfolio/axel.berardino/articles/ecrire-de-bons-commentaires
- Utilise des "assert" dès que tu le peux. Ce sont de véritables barrières de sécurité pour ton code.

En espérant que ces remarques constructives te soient utiles.
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
5 déc. 2011 à 14:18
Je m'en doute, sinon tu ne le posterais pas. ;)
Après, ce sont juste des remarques, à prendre ou pas.
fredg19 Messages postés 11 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 16 mars 2015
5 déc. 2011 à 12:55
En réponse à votre message Buno, je trouve mon code parfait comme il l'est.
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
5 déc. 2011 à 10:36
Hello,
ça manque beaucoup de commentaires je trouve.
De plus, je trouve tes fonctions de "recherche astrale" un peu longue. Tu peux t'inspirer de ce snippet par exemple: http://codyx.org/snippet_connaitre-signe-astrologique_947.aspx pour faire la même chose avec le signe chinois et la pierre, non?
Après, par la suite, tu peux rajouter l'arbre, le "chiffre clé" (je ne sais plus comment il s'appelle),...
Rejoignez-nous