begin process at 2012 02 13 13:42:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Maths

 > 

J'aimerais que quelqun vérifi ce petit code :)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
> 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;


1 2

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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,482 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales