Avis sur mon premier programme abouti ?

Joey16 Messages postés 366 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 21 octobre 2019 - 4 oct. 2014 à 14:52
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 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 ?

7 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
4 oct. 2014 à 14:56
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.
0
Joey16 Messages postés 366 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 21 octobre 2019
Modifié par Joey16 le 4/10/2014 à 15:11
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++) :)
0
Joey16 Messages postés 366 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 21 octobre 2019
Modifié par KX le 4/10/2014 à 15:11
#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;
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
4 oct. 2014 à 15:11
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Joey16 Messages postés 366 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 21 octobre 2019
4 oct. 2014 à 15:23
d'accord, sinon vous avez pu analyser mon code ? (test) merci :)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
4 oct. 2014 à 18:03
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)".
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 8/10/2014 à 17:13
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
0
Rejoignez-nous