Accueil > Forum > > > > J'aimerais que quelqun vérifi ce petit code :)
J'aimerais que quelqun vérifi ce petit code :)
vendredi 17 avril 2009 à 23:10:50 |
J'aimerais que quelqun vérifi ce petit code :)

ownagedx
|
Bonjours, j'aimerais que quelqun m'aide un peu avec ce code, et me donne quelques suggestion... parcontre, soyer indulgent, j'ai commencer a apprendre le c++ hier..:p ___________________________________________________________________________________________ #include <iostream> #include <math.h> using namespace std; // Prototype fonction pythagore float carre(float x); float squareroot(float x); int main() { int choixMenu,choixrecommencer; // Variables pour Pythagore float catheteAsquare, catheteA, catheteB, sommecathete, hypotenuse, catheteBsquare; cout << " Bonjours! Choisissez quelle fonction vous voulez utiliser aujourd'hui!"<<endl<<endl; cout << "1 = Pythagore"<<endl; cout << "\n Veuillez entrer votre choix et appuyer sur Enter"<<endl<<endl; cin >> choixMenu; /* FONCTION POUR PYTHAGORE */ while(choixMenu != 1) { cout << endl << endl<< "Je ne possede pas encore cette fonction!"<<endl<<endl; cout << " Veuillez entrer a nouveau un choix"<<endl<<endl<<"1 = Pythagore"<<endl; cin >> choixMenu; } if(choixMenu == 1) { cout<< " Veuillez entrer les 2 mesure des cathetes\n"; cout <<"cathete a: "; cin >> catheteA; cout <<"cathete b: "; cin >> catheteB; catheteAsquare = carre(catheteA); catheteBsquare = carre(catheteB); sommecathete = (catheteBsquare + catheteAsquare); cout <<"\n a(au carre) + b(au carre) ="<< sommecathete<<"(au carre)"<<endl; cout <<endl<<" Maintenant on fait la racine carree de "<<sommecathete<<endl<<" pour connaitre la valeur de l'hypotenuse"<<endl; hypotenuse = squareroot(sommecathete); cout<<"\n\n\n L'hypotenuse vaut:" <<hypotenuse<<endl; } char response; cin >> response; return 0; } /* FONCTIONS */ float carre(float x) { return (x*x) ; } float squareroot(float x) { return sqrt(x); } Oh, et aussi j'étais entrain de lire a propos des classes et je me demandait l'utilité que sa pourrait avoir dans ce programme.. d'ailleur je ne comprend pas vraiment a quoi sa sert ? merci:)
|
|
dimanche 19 avril 2009 à 21:19:23 |
Re : J'aimerais que quelqun vérifi ce petit code :)

CptPingu
|
Réponse acceptée !
C'est assez rare que quelqu'un demande conseil sur le code qu'il a pondu. Je vais donc t'en faire une revue exhaustive, pas à pas.
1) Tout d'abord: #include <math.h> Tu es en C++, donc pas d'include tiré du langage C. Préfère: #include <cmath>.
2) using namespace std; Immonde. Le pire c'est que je le vois souvent. Ca ne sert à rien d'avoir crée les namespace en C++ si c'est pour les faire sauter... Mieux vaut écrire quelques caractères en plus, que d'introduire des ambiguïtés de portée de nom, ce qui arrive régulièrement, passé un code d'une certaine taille. Toutefois, si tu veux réellement marquer "cout" au lieu de "std::cout", alors préfère la syntaxe suivante: "using std::cout;" qui est déjà beaucoup plus propre. Ce genre d'instruction, devrait avoir sa place dans une portée limitée, comme par exemple dans une fonction ou dans un namespace, mais jamais, au grand jamais sur une portion de programe importante (par exemple, ne met jamais de using qqchose dans un .h !).
Au niveau de ton code, tu ne découpes pas assez celui-ci. Il faut toujours modulariser son code au maximum. Il est plus facile de coder plein de petites fonctions aisées, qu'une seule grosse bien difficile. C'est le principe de diviser pour mieux regner.
De plus, tu n'es pas obligé de réécrire std::cout à chaque ligne, tu peux directement tout "pousser" dans un seul.
Plutôt que d'écrire les prototypes de tes fonctions en haut du fichier, met directement celle-ci.
Lorsque des fonctions n'ont pas vocations à être exporté, c'est à dire à être utilisé en dehors du fichier dans lequelle elles sont, on les mets dans un namespace anonymes. Celui-ci sert à limité la visibilité de celles-ci a cet unique fichier.
Essaie de coder en anglais, même si les messages destiné à l'utilisateur sont en francais. Pense à commenter tes fonctions, regarde notamment la norme "Doxygen".
Voila, ton code mis au propre, avec quelques petites améliorations, notamment au niveau de variables locales dont on pouvait se passer aisément:
#include <iostream> #include <cmath>
namespace { /*! ** Compute the square of the given number. ** ** @param x The given number ** ** @return Square of the given number */ float square(float x) { return x * x; }
/*! ** Compute the square root of the given number. ** ** @param x The given number ** ** @return Square root of the given number */ float squareroot(float x) { return sqrt(x); }
/*! ** Display the menu, and ask the user, what to do. ** ** @return Choice made by the user. */ int get_choice() { int choixMenu = -1;
while(choixMenu == -1) { std::cout << " Bonjour ! Choisissez quelle fonction vous voulez " "utiliser aujourd'hui !" << std::endl << std::endl << "0 = Quitter" << std::endl << "1 = Pythagore" << std::endl << "\n Veuillez entrer votre choix et appuyez sur Enter" << std::endl << std::endl; std::cin >> choixMenu; if (choixMenu < 0 || choixMenu > 1) { std::cout << std::endl << std::endl << "Je ne possede pas encore cette fonction !" << std::endl << std::endl; choixMenu = -1; } }
return choixMenu; }
/*! ** Display interactive computing off pythagore. */ void pythagore() { float catheteA, catheteB, sommecathete;
std::cout << " Veuillez entrer les 2 mesure des cathetes\n"; std::cout << "cathete a: "; std::cin >> catheteA; std::cout << "cathete b: "; std::cin >> catheteB; sommecathete = square(catheteA) + square(catheteB); std::cout <<"\n a(au carre) + b(au carre) =" << sommecathete << "(au carre)" << std::endl << std::endl << " Maintenant on fait la racine carree de " << sommecathete << std::endl << " pour connaitre la valeur de l'hypotenuse" << std::endl << "\n\n\n L'hypotenuse vaut:" << squareroot(sommecathete) << std::endl; } }
/*! ** Main function. ** ** @return 1 on unexpective error, 0 else. */ int main() { bool continuer = true;
while (continuer) { switch (get_choice()) { case 0: continuer = false; break; case 1: pythagore(); break; default: std::cerr << "Erreur inattendue !" << std::endl; return 1; } }
return 0; }
Pour répondre à ta dernière question: Ici, l'utilisation d'une classe n'aurait pas grand intérêt. Tu découvriras au fur et à mesure que tu avanceras dans le langage objet, à quoi sert une classe.
|
|
dimanche 19 avril 2009 à 21:23:00 |
Re : J'aimerais que quelqun vérifi ce petit code :)

CptPingu
|
Ne fait pas attention au fautes d'orthographe françaises et anglaises que j'ai laissée :S (même dans le code d'ailleurs !).
|
|
dimanche 19 avril 2009 à 22:01:49 |
Re : J'aimerais que quelqun vérifi ce petit code :)

ownagedx
|
d'accord, merci pour tout ces conseils :P Je suis entrain de refaire un code avec plus de chose a faire, c'est un peu plus organisé. Est-ce une bonne idée de créer une classe pour le menu ?
|
|
dimanche 19 avril 2009 à 22:19:52 |
Re : J'aimerais que quelqun vérifi ce petit code :)

Chouchou182
|
Bonjour à tous,
Ce fil a l'air intéressant, alors je me permets de poser quelques questions qui me passent par la tête.
1/ Pourquoi utiliser le type float ? On n'a pas, semble-t-il, de problèmes cruciaux d'occupation de la mémoire. Les calculs ne sont-ils pas plus précis et peut-être plus rapides sur des doubles ? 2/ Les fonctions square et squareroot ne méritent-elles pas d'être « inline » explicitement ? 3/ Le point intéressant : std::cin. Si, lorsque c'est un entier qui est attendu, je saisis des caractères quelconques, le programme boucle. Comment détecter cette erreur ? En d'autres termes, quelles précautions peut-on prendre avec std::cin pour se méfier des saisies inadéquates de l'utilisateur, ou comment se passer de std::cin ?
Merci d'avance, -- Chouchou.
|
|
dimanche 19 avril 2009 à 22:42:45 |
Re : J'aimerais que quelqun vérifi ce petit code :)

ownagedx
|
J'ai fait un nouveau code en respectant plus tes conseil, cependant, j'ai mit un peu moin de commentaire, je trouvais qu'il y en avait trop pour que le code soit bien lisible, deplus, jai créer 2 classe avec les 2 chose que je voulait faire et je les ai mises dans des fichier.h, sa donne ceci: j'aimerais simplement savoir si mes commentaires sont O.K et si ma fonction main() est ok, je serait méchant de vous demander une inspection complete :P MAIN.CPP#include <iostream> #include <string.h> #include <cmath> #include "Pythagore.h" #include "Heron.h" using std::cout; using std::endl; using std::cin; //----------> FONCTIONS PROTOTYPES AT THE END OF MAIN.CPP<----------- void CallPythagore(); void CallHeron(); void CallMenu(); //variables relatives au menu int choixMenu; string retour=("m"); string retour1="m"; bool try1; ////////////////////////////MAIN////////////////////////////////// ////////////////////////////MAIN////////////////////////////////// ////////////////////////////MAIN////////////////////////////////// int main() { while (choixMenu<=2||choixMenu>=1) { CallMenu(); if(choixMenu==1) { CallPythagore(); } if(choixMenu==2) { CallHeron(); } } return 0; } ////////////////////////////MAIN////////////////////////////////// ////////////////////////////MAIN////////////////////////////////// ////////////////////////////MAIN////////////////////////////////// //FONCTION PYTHAGORE--------------------------------------- void CallPythagore() { Pythagore pyt; pyt.setcatheteA(); pyt.setcatheteB(); pyt.calculatehypotenuse(); pyt.displayhypotenuse(); cout<<"\nPour retourner au menu, appuyer sur M ou pour quitter appuyer sur Q: "; cin >> retour1; system("cls"); } // FONCTION HERON------------------------------------------- void CallHeron() { Heron heron1; heron1.getCotes(); heron1.changerVariable(); heron1.calculHeron(); heron1.calculHauteur(); cout<<endl<<"Entrer M pour retourner au menu et Q pour quitter: "; cin>>retour1; } //------------------------------------------------------ //--------------MENU FONCTION-------------------------- void CallMenu() { system("cls"); cout<<" --------MENU-------"<<endl; cout <<" 1: Pythagore\n"; cout <<" 2: Formule de Heron\n"; cout<<"Veuillez entrer un choix\n"; cin >> choixMenu; // Show menu again if user didn't made a correct choice. while(choixMenu >2 || choixMenu<1) { system("cls"); cout<<"1: Pythagore\n"; cout<<"2: Formule de Heron"; cout<<"\n\nDesole, je ne possede pas cette fonction, veuillez entrer un autre choix :"; cin >> choixMenu ; } } Pythagore.h#ifndef DEF_PYTHAGORE #define DEF_PYTHAGORE using namespace std; class Pythagore { public: void setcatheteA() { system("cls"); cout<<" Entrez la valeur de la cathete A : "; cin>> m_mcatheteA; } void setcatheteB() { system("cls"); cout<< "Entrez la valeur de la cathete B : "; cin >> m_mcatheteB; } void calculatehypotenuse() { float a= m_mcatheteA; float b= m_mcatheteB; m_mhypotenuse = (sqrt)((a*a) + (b*b)); } void displayhypotenuse() { system("cls"); cout<<"l'hypotenuse a une valeur de : "<<m_mhypotenuse<<endl<<"\n\n\n\n\n\n"; } protected: float m_mhypotenuse; float m_mcatheteA; float m_mcatheteB; }; #endif Heron.h
#ifndef DEF_HERON #define DEF_HERON using namespace std;
class Heron { public:
void getCotes() { system("cls"); cout<<" \nEntrez la valeur du premier cote: "; cin>>m_coteA; cout<<" \nEntrez la valeur du deuxieme cote: "; cin>>m_coteB; cout<<" \nEntrez la valeur du troisieme cote: "; cin>>m_coteC; }
void calculHeron() { float p= (m_coteA+m_coteB+m_coteC)/2; if(p<m_coteA||p<m_coteB||p<m_coteC) { m_try1=0; cout<<"\n ERREUR ! Ce triangle n'existe pas\n\n"; } else { m_aireHeron = (sqrt)(p*(p-m_coteA)*(p-m_coteB)*(p-m_coteC)); cout<<endl<<endl<<"l'aire du triangle vaut" <<m_aireHeron; } }
void changerVariable() { float temp,temp1; if (m_coteA>m_coteB) { temp=m_coteB; m_coteB=m_coteA; m_coteA=temp; } if (m_coteB>m_coteC) { temp1=m_coteC; m_coteC=m_coteB; m_coteB=temp1; } }
void calculHauteur() {
if(m_try1!=0) { m_calculhauteur = (2*m_aireHeron)/m_coteC; cout<<endl<<endl<<"La hauteur vaut : "<<m_calculhauteur<<"\n\n\n"; } else {cout<<"\n ERREUR";}
}
protected: float m_try1; float m_coteA; float m_coteB; float m_coteC; float m_aireHeron; float m_calculhauteur; }; #endif
|
|
dimanche 19 avril 2009 à 22:45:51 |
Re : J'aimerais que quelqun vérifi ce petit code :)

CptPingu
|
Je ne vois pas l'utilité de créer une classe pour ton menu.
|
|
lundi 20 avril 2009 à 00:35:49 |
Re : J'aimerais que quelqun vérifi ce petit code :)

CptPingu
|
Je réponds d'abord à ownagedx, je te répondrais après chouchou182.
Tout plein de remarques: #include <string.h> Non, #include <string>.
Au niveau de l'extension des fichiers. .cc ou .cpp pour les fichiers de code du C++ .hh ou .hpp pour les fichiers headers du C++ .hxx pour les templates et fonctions inlinés du C++ (tu verras ça bien plus tard) .h pour les fichiers header du C .c pour les fichiers de code du C
Donc, il faut éviter d'utiliser .h pour des headers, c'est une mauvaise habitude. Tous projets sérieux n'utilisent pas l'extension .h (voir le projet boost).
De plus, jamais de code dans un header. Tu dois avoir une description de ta classe dans un header et le code associé dans un fichier de code.
Ex: test.hpp class Test { public: void pouet(); };
test.cpp void Test::pouet() { }
Jamais, jamais de "using namespace std;" dans un header. Si tu bosses en collaboration avec d'autre personne, ils auront envie de tuer (tu leurs fait sauter tout les namespaces dès qu'ils incluent l'une des tes classes, alors qu'ils n'ont rien demandés !).
La commande "system" est à éviter, c'est pas génial pour la portabilité. Par exemple, chez moi : system("cls"); ne fait rien, puisque je suis sous linux.
Enfin, ne fait jamais de variables globales. On peut toujours éviter d'en faire. Un code qui possède des variables globales devient rapidement inmaintenable. De plus, tu brises la "réentrance". Si tu as du code multi-threadé, tu seras bien emmerdé ! (Bon ici, ce n'est pas ton cas).
|
|
lundi 20 avril 2009 à 00:45:00 |
Re : J'aimerais que quelqun vérifi ce petit code :)

ownagedx
|
D'accord, mais les variable globales que j'ai int choixMenu; string retour=("m"); string retour1="m";
Ou puis-je les mettres, si je les met dans la fonction du menu, mes autres fonction n'y aurons pas acces et je ne pourrai plus revenir au menu. Est-ce que les pointeurs, que je ne comprend pas encore tout a fait, seraient la solution? Je pointerait la valeur de la variable et ensuite je l'extrait ?
|
|
lundi 20 avril 2009 à 00:48:35 |
Re : J'aimerais que quelqun vérifi ce petit code :)

CptPingu
|
> 1/ Les calculs ne sont-ils pas plus précis et peut-être plus rapides sur des doubles ? http://www.digitalmars.com/ctg/ctgNumerics.html
> 2/ Les fonctions square et squareroot ne méritent-elles pas d'être « inline » explicitement ? Absolument, mais l'inlining n'est pas triviale à comprendre. Je ne lui ai donc volontairement pas expliqué.
3/ Le point intéressant : std::cin. Si, lorsque c'est un entier qui est attendu, je saisis des caractères quelconques, le programme boucle. Comment détecter cette erreur ? C'est parce que tout est bufferisé, donc quand tu tapes plusieurs caractères, il les gardes en mémoire. Il faut donc "flusher" le flux entre chaque appel pour éviter cela.
Ex: std::cin.clear(); std::cin.get(); std::cin >> choixMenu;
|
|
Cette discussion est classée dans : cout, float, carre, cin, choixmenu
Répondre à ce message
Sujets en rapport avec ce message
Pas De Solution??? [ par PsyCaDi ]
Bonjour,Voilà, je veux faire un truc tout con avec des tableaux mais ça ne marche pas. Quelqu'un peut-il me dire ce qui n'est pas bon (sauf moi, ça je
prob avec cin.getline(); [ par yafuka ]
salut!j''essai de rentrer des chaines de caracteres de la misere a boucler le cin.getline.ma fonction ajouteevoid book::Ajouter(){ cout cout
help me !!! [ par pascal13 ]
j arrive pas a compiler mon programme...je sais que g qlq que souccis au niveau de la sauvegarde des données sur le fichier toutes remarques seront le
cout et cin sous visual c++ [ par darunia ]
Salut, je suis debutant en c++ et e voudrais savoir si il est possible de faire fonctionner les fonctions cout et cin sous visual c++.Ca ne marche pas
cin.getline(str, 256) [ par ronandmcdonald ]
Salut je voulais savoir comment cela se fess que je peux pas utiliser cin.getline dans une fonction que voila :bool RS232::Write_RS232(){DWORD dwWritt
Question à la con sur un getline() [ par Killvador ]
Salut tt le monde,G un petit problème:dans ce petit prog le début marche jusqu'a la getline() qu'on dirait que le prog l'a complétement zapé.(y passe
J'ai un problème avec cin.getline!! [ par Chap71 ]
Voici mon prgm:#pragma hdrstop#pragma argsused#include#include#include#includeusing namespace std; void main(void){ struct Planete
cin.getline dans un Case : Marche pas !!! [ par Sixpion ]
bonjour a tous !!on a un petit pb avec l'insertion de cin.getline dans des Case (voir code) il semblerai que le cin.getline fct bien dans le main mais
cin et cout [ par cabarrus ]
je sais je suis une larve en programmation, c'est normale je suis un débutant. pouvez vous résoudre le problème suivant:Ecrire un programme qui demand
Debug de source à la con [ par PsyCaDi ]
Bon voilà, je commence en C++ et j'ai envie de faire un petit prog pour faire des calculs avec des matrice enfin bref mon PB c'est que le code que j'a
Livres en rapport
|
Derniers Blogs
[HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE)[HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE) par Gio
Je m'y prends un peu tard je sais, mais bon je suis développeur web et donc hyper fainéant ! Toujours dans le cadre des technologies émergentes, ici HTML5, parce qu'on aime HTML5 chez Wyg , nous seront présent, le vieux ( Aurélien V.) et moi, pour pr...
Cliquez pour lire la suite de l'article par Gio [WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|