Avis sur mon premier programme abouti ?

Messages postés
359
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
21 octobre 2019
- - Dernière réponse : cptpingu
Messages postés
3800
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
14 novembre 2019
- 8 oct. 2014 à 16:55
Bonjour, pour la première fois que je vais jusqu'au bout d'un programme, j'aimerais avoir vos avis.
C'est un petit programme, mais très utile. Il sert en fait à faire des calculs de mécaniques (les gaz parfaits si quelqu'un connait, avec la seule formule "p1v1/p2v2=t1/t2) j'ai testé avec les exercices de mon cours et j'obtiens bien les bonnes réponses.
Quelqu'un veut-il tester ?
Afficher la suite 

7 réponses

Messages postés
16074
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 novembre 2019
88
0
Merci
Bonjour,

Sur CodeS-SourceS on ne s'intéressera pas à ton programme (le .exe) mais uniquement à son code. Tu peux éventuellement mettre ce code ici, en réponse, et on pourra te faire un retour dessus (selon le langage utilisé).

Pour des programmes plus volumineux tu pourrais également déposer un code source ici, mais ça ne concerne pas les programmes qui font trois fois rien.
Commenter la réponse de KX
Messages postés
359
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
21 octobre 2019
0
Merci
Je peux mettre mon code source ici.
Je tiens bien à préciser que je suis débutant, d'ailleurs si vous pouvez me guider où je pourrais apprendre correctement (c++) :)
Commenter la réponse de Joey16
Messages postés
359
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
21 octobre 2019
0
Merci
#include <iostream>

using namespace std;

double pConst(double p1R, double v1R, double v2R, double T1R, double T2R)
{
    double result;
    result=(p1R*v1R*T2R)/(v2R*T1R);
    return result;
}
double vConst(double p1R, double p2R, double v1R, double T1R, double T2R)
{
    double result;
    result=(p1R*v1R*T2R)/(p2R*T1R);
    return result;
}
double TConst(double p1R, double p2R, double v1R, double v2R, double T1R)
{
    double result;
    result=(p2R*v2R*T1R)/(p1R*v1R);
    return result;
}


int main()
{
    double p1(101300.), p2(1.), v1(20.), v2(30.), T1(3.), T2(252.);
    double resultat(1.), cMerc(1.),  mrPa(1.);
    int i(1), j(1);
    string constant("a"), recherche("a"), mrcr("a"), continuer("a");
    cout << "Bienvenue dans le programme de Mecanique Appliquee Release V1.1! " << endl;
    cout << "1. Les Gaz Parfaits" << endl;



   do
   {//1dowhile gen
        do
    {
      do
      {
    cout << "Transformer des cm de mercure en Pa?" << endl;
    cout << "a. oui" << endl;
    cout << "b. non" << endl;
    cin >> mrcr;
      }while (mrcr!="a" and mrcr!="b");
      if (mrcr=="a")
      {
          cout << "Combien de cm?"; cin >> cMerc;
          mrPa=101300*(cMerc/76);
          cout << cMerc << " cm de mercure = " << mrPa << " Pa. Veuillez notez cette valeur." << endl;
      }
    cout << "Entrez a, b, c ou d.?" << endl;
    cout << "a) La pression reste constante (p1=p2) " << endl;
    cout << "b) Le volume reste constant (v1=v2)" << endl;
    cout << "c) La temperature reste constante" << endl;
    cout << "d) Ni la pression, le volume, la temperature ne reste constant." << endl;
    cin >> constant;
    if (constant=="a" or constant=="b" or constant=="c" or constant=="d")
    j=2;
    } while ((constant!="a" and constant!="b" and constant!="c" and constant !="d")and(j!=2));

while (((constant=="a" and recherche=="a") or (constant=="b" and recherche=="b") or (constant=="c" and recherche=="c")) or (i==1))
{


         do
     {
      cout << "Quelles valeurs recherchez-vous? (Entrez la lettre correspondante)" << endl;
      if (constant!="a")
      cout << "a. La pression" << endl;
      if (constant!="b")
      cout << "b. Le volume" << endl;
      if (constant!="c")
       cout << "c. La temperature" << endl;
      cin >> recherche;
       } while(recherche !="a" and recherche!="b" and recherche!="c");
       i=2;
}


    cout << "Entrez les valeurs : (Si une valeur est constante, et inconnue, entrez 1)." << endl;
    cout << "p1 : "; cin >> p1;
    if ((constant!="a")and(recherche!="a"))
    {cout << "p2 : "; cin >> p2; }
    if (constant=="a")
    p2=p1;
    cout << "v1 : "; cin >> v1;
    if ((constant!="b")and(recherche!="b"))
    {cout << "v2 : "; cin >> v2;}
    if (constant=="b")
    v2=v1;
    cout << "T1 (en °K, t en °C+273): "; cin >> T1;
    if ((constant!="c")and(recherche!="c"))
    {cout << "T2 (en °K, t en °C+273): "; cin >> T2;}
    if (constant=="c")
    T2=T1;
    if (recherche=="a")
    {

    resultat=pConst(p1, v1, v2, T1, T2);
    cout << "La pression recherchee p2 = " << resultat << "(L'unite depend des unites utilisees dans la formule)" << endl;
    }
    if (recherche=="b")
    {
    resultat=vConst(p1, p2, v1, T1, T2);
    cout << "Le volume recherche v2 = " << resultat << "(L'unite depend des unites utilisees dans la formule)" << endl;
    }
    if (recherche=="c")
    {
    resultat=TConst(p1, p2, v1, v2, T1);
    cout << "La temperature recherchee T2 = " << resultat << "(L'unite depend des unites utilisees dans la formule)" << endl;
    }
    cout << "----------------" << endl;
    cout << "Relancer le programme? " << endl;
    cout << "a. oui" << endl;
    cout << "b. non merci" << endl;
    cin >> continuer;
   }while (continuer=="a");//2dowhilegen
   cout << "A bientot." << endl;

    return 0;
}
Commenter la réponse de Joey16
Messages postés
16074
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 novembre 2019
88
0
Merci
J'ai rajouté les balises de code, penses y la prochaines fois.

http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
Commenter la réponse de KX
Messages postés
359
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
21 octobre 2019
0
Merci
d'accord, sinon vous avez pu analyser mon code ? (test) merci :)
Commenter la réponse de Joey16
Messages postés
16074
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 novembre 2019
88
0
Merci
Je ne suis pas vraiment expert en C++ mais voici quelques remarques (liste non exhaustive) :

1) Les trois fonctions pConst, vConst et TConst font exactement la même chose, alors pourquoi en avoir fait trois ? Une seule suffisait...

2) La structure suivante est verbeuse pour rien :
double result;
result=(p1R*v1R*T2R)/(v2R*T1R);
return result;

Tu pourrais directement écrire :
return (p1R*v1R*T2R)/(v2R*T1R);

De plus le C++ permet de faire des optimisations pour ce genre de calculs, voir les fonctions inline

3) L'écriture d'initialisation
type variable(valeur);
se réfère normalement à une construction d'objet, pour les types primitifs l'écriture
type variable = valeur;
est plus correcte, il en va de même pour les objets qui redéfinirait l'opérateur
=
comme c'est le cas pour std::string.

4) Dans ton main on se retrouve avec trois boucles do/while imbriquées, un bon code devrait utiliser plus intensivement les fonctions intermédiaires pour éviter d'avoir à se retrouver avec de telle complexité cyclomatique. En particulier, sépare la partie interaction avec l'utilisateur ,de la partie calculs.

5) Tu n'as aucun contrôle sur tes entrées. Lorsque par exemple tu fais
cin >> cMerc;
avec cMerc un double, que se passera-t-il si tu rentres un string quelconque (pas un double) ? Ou si tu rentres une valeur négative alors que l'on sait pertinemment que la valeur attendue est positive ?

6) Je trouves fastidieux d'avoir des conditions de boucles à rallonge du genre (x!=a and x!=b and x!=c and ...). Quand tu en as 2 ou 3 ça va, mais si tu en as 15...

7) On ne dit pas "degré kelvin (°K)" mais juste "kelvin (K)".
Commenter la réponse de KX
Messages postés
3800
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
14 novembre 2019
90
0
Merci
Bonjour.

J'arrive un peu tard, mais j'ai plein de choses à dire ^^. C'est très bien de demander à être critiqué sur son code. Peu sont ceux qui ont l'humilité (ou l'idée) de le faire, c'est pourtant comme cela qu'on avance.

Tout d'abord quelques remarques:
- Evite les using namespace ! Voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- On utilise "&&" et "||" et non "and" et "or".
- Au lieu de pré-déclarer des variables de partout, déclare une variable juste au moment de son utilisation. C'est plus propre (plus la zone d'existence d'une variable est réduite, mieux c'est. C'est qu'on appelle un "scope").
- Si tu as X variables, utilises dans ce cas un petit tableau de taille X, plutôt que X variables.
- Attention au code spaghetti ! On découpe son code en petite fonction, on évite d'imbriquer trop de boucle, et on nomme bien ses variables. Sinon, c'est très rapidement illisible.
- Même si ton application est en français, essaie de coder en anglais.

Je n'en rajoute pas plus, car KX a déjà bien pointé les faiblesses de ton code.
@KX: En revanche, je ne lui aurais pas parlé de l'inlining, car derrière une apparente simplicité, se cache une étonnante complexité. Notamment, l'exemple que tu donnes est déjà inliné automatiquement. (Inline n'est pas un mot clé absolu, mais un simple indice, très souvent ignoré par le compilateur. Comprendre ce qui est vraiment inliné ou non, demande de très solides bases).

Histoire de t'aider un peu, je me suis permis de réécrire ton code en "propre", en appliquant les conseils qui t'ont déjà été donné (par KX ou moi-même).

(Attention, j'ai réécris techniquement, j'espère ne pas avoir introduit d'erreurs fonctionnelles. Si c'est le cas, n'hésite pas à corriger et à poster les corrections):
#include <iostream>
#include <sstream>
#include <limits>
#include <cassert>

double compute(double p1R, double v1R, double v2R, double t1R, double t2R)
{
  return (p1R * v1R * t2R) / (v2R * t1R);
}

int menu(const std::string& content, int nbChoice)
{
  while (true)
  {
    char choice = 0;
    std::cout << content;
    bool valid = std::cin >> choice;
    if (valid)
    {
      for (int i = 0; i < nbChoice; ++i)
 if (choice - 'a' == i)
   return i;
    }
    std::cout << "Choix invalide !" << std::endl;
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  }

  return -1;
}

double askDouble(const std::string& content)
{
  double res = 0;
  bool valid = true;

  do
  {
    std::cout << content;
    valid = std::cin >> res;
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    if (!valid)
      std::cout << "Valeur invalide ! Entrez un décimal correcte." << std::endl;
  }
  while (!valid);

  return res;
}

char askComputeType(const std::string& content, bool const_tab[3])
{
  char res = 0;

  do
  {
    std::cout << content;
    std::cin >> res;
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  }
  while (res < 'a' || res > 'c' || const_tab[res - 'a']);

  return res;
}

void mercureToPa()
{
  switch (menu("Transformer des cm de mercure en Pa?\n"
        "a. oui\n"
        "b. non\n", 2))
  {
    case 0:
      {
 const double cMerc = askDouble("Combien de cm ? ");
 std::cout << cMerc << " cm de mercure = " << 101300 * (cMerc / 76) << " Pa."
   " Veuillez notez cette valeur." << std::endl;
      }
    case 1:
      return;
    default:
      assert(false); // Should not be reachable
  }
}

void computePerfectGas()
{
  bool const_tab[3] = {false, false, false};

  switch (menu("Entrez a, b, c ou d.\n"
        "a) La pression reste constante (p1=p2)\n"
        "b) Le volume reste constant (v1=v2)\n"
        "c) La temperature reste constante\n"
        "d) Ni la pression, le volume, la temperature ne reste constant.\n", 4))
  {
    case 0:
      const_tab[0] = true;
      break;
    case 1:
      const_tab[1] = true;
      break;
    case 2:
      const_tab[2] = true;
      break;
    case 3:
      break;
    default:
      assert(false); // Should not be reachable
  }

  // Construction de la question, en fonction des constantes
  std::ostringstream buff;
  buff << "Quelles valeurs recherchez-vous? (Entrez la lettre correspondante)" << std::endl;
  if (!const_tab[0])
    buff << "a. La pression" << std::endl;
  if (!const_tab[1])
    buff << "b. Le volume" << std::endl;
  if (!const_tab[2])
    buff << "c. La temperature" << std::endl;

  const char type = askComputeType(buff.str(), const_tab);

  std::cout << "Entrez les valeurs : (Si une valeur est constante, et inconnue, entrez 1)." << std::endl;
  const double p1 = askDouble("p1 : ");
  double p2 = p1;
  if (!const_tab[0])
    p2 = askDouble("p2 : ");
  const double v1 = askDouble("v1 : ");
  double v2 = v1;
  if (!const_tab[1])
    v2 = askDouble("v2 : ");
  const double t1 = askDouble("T1 (en °K, t en °C+273): ");
  double t2 = t1;
  if (!const_tab[2])
    v2 = askDouble("T2 (en °K, t en °C+273): ");

  switch (type)
  {
    case 'a':
      std::cout << "La pression recherchee p2 = " << compute(p1, v1, v2, t1, t2)
  << "(L'unite depend des unites utilisees dans la formule)" << std::endl;
      break;
    case 'b':
      std::cout << "Le volume recherche v2 = " << compute(p1, p2, v1, t1, t2)
  << "(L'unite depend des unites utilisees dans la formule)" << std::endl;
      break;
    case 'c':
      std::cout << "La temperature recherchee T2 = " << compute(p1, p2, v1, v2, t1)
  << "(L'unite depend des unites utilisees dans la formule)" << std::endl;
      break;
    default:
      assert(false); // Should not be reachable
  }
}

int main()
{
  bool stop = false;

  std::cout << "Bienvenue dans le programme de Mecanique Appliquee Release V1.1 !\n"
     << "1. Les Gaz Parfaits" << std::endl;

  while (!stop)
  {
    mercureToPa();
    computePerfectGas();
    if (menu("----------------\n"
      "Relancer le programme ?\n"
      "a. oui\n"
      "b. non merci\n", 2) != 0)
      stop = true;
  }
  std::cout << "A bientot." << std::endl;

  return 0;
}


__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu