Partage
  • Partager sur Facebook
  • Partager sur Twitter

Calculateur

Equations du Second Degres

    9 mai 2007 à 17:02:56


    Bonjour à toutes, z'et à tous :)

    Je viens, ici, pour vous présenter, un mini programme que j'ai conçu sur consol Windows, suite à la première partie du Tuto C / C++ présent sur le site.

    Il permet, de calculer le Discriminant Delta d'une équation du second degré ( ax² + bx + c = 0 par exemple ) Puis d'en calculer les solutions ( Apellées aussi racines ) s'il y en a.

    A toutes les personnes qui sont en classe de 1Ere S, STI, STG etc ... J'espère que ça vous servira pour vos exercices :lol:

    Néanmoins, j'attends, des avis, des critiques :euh:




    Straika.

    Ps : Merci de ne pas mettre le programme à votre nom si il vous plait, tralala et trilouluou :p Copyright machin ... :-°
    • Partager sur Facebook
    • Partager sur Twitter
      9 mai 2007 à 17:13:46

      Comment peux-tu attendre des critiques d'un exécutable ?

      Ici, c'est un forum de programmation. Moi, ce que je vois, c'est un bête (normal, ce sont tes débuts ;) ) programme de calcul de racines de polynômes du second degré.

      Si tu veux des avis ou critiques, poste ton code. Cela te permettra de progresser, et non de récolter des posts du genre "Ah merci, ça m'évitera de le faire moi-même"...

      Edit: Au fait, c'est un résolveur, et non un calculateur d'équations du second degré...
      • Partager sur Facebook
      • Partager sur Twitter
        9 mai 2007 à 17:19:22

        Voila les codes: Codes-Calculateur

        Et, bon j'accepte tes conseils à conditions qu'il soit sur un ton un peu moins " Quel newbie " :)

        Strai
        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2007 à 17:33:16

          C'est pas mal, quelques remarques toutefois:
          Tu n'es pas obligé de déclarer une variable pour chaque calcul. Comme en mathématique, tu as des priorités d'opérateurs, et des parenthèses.
          Tu peux utiliser le signe - sans passer par b = b * (-1)
          • Partager sur Facebook
          • Partager sur Twitter
            9 mai 2007 à 18:03:06

            Ok, bon à savoir ça :D
            • Partager sur Facebook
            • Partager sur Twitter
              9 mai 2007 à 18:28:19

              Désolé pour ce ton, ce n'est pas intentionnel ;)

              En ce qui concerne le code, je plussoie ce qu'a dit NewbiZ. En plus, j'ajoute :
              • <string.h> et <stdlib.h> n'ont aucune utilité ici (ainsi que <math.h> dans main.c)
              • D'une manière générale, les #include des bibliothèques sont effectués dans les headers
              • Tu n'as pas besoin de nommer les variables dans tes prototypes
              • L'indentation est mauvaise...
              • A quoi sert i ?
              • Protège ton header contre les inclusions multiples (il vaut mieux que cela devienne une habitude)
              • Tu n'as pas besoin de
                <puce>Utilise le mot-clé "const" dans tes paramètres de fonctions...
              • Tu ne proposes pas à l'utilisateur de sortir de la boucle ?
              • Essaie de ne pas dépasser la ligne des 80 caractères, c'est une convention à respecter.
              Le code devient ainsi :

              main.c :
              #include <stdio.h>
              #include "fonction-solution.h"

              //Pourl a condition de "continuation"
              #define RECOMMENCER ((getchar)() == '1')

              //Histoire de gérer le multi-plateforme...

              #define WINDOWS_COMPILING
              //#define LINUX_COMPILING

              //Pour effacer l'écran
              #ifdef WINDOWS_COMPILING
                  #define CLS system("CLS");
              #elif defined LINUX_COMPILING
                  #define CLS system("clear");
              #endif

              int main(int argc, char *argv[])
              {
                  double a = 0, b = 0, c = 0, deltA = 0;

                  printf ("\n\t\t*** RESOLUTION EQUATION DU SECOND DEGRES ***\n\n\n");

                  do
                  {
                      CLS

                      printf ("Saisissez la valeur de a :\n");
                      scanf ("%lf", &a);
                      printf ("\nSaisissez la valeur de b :\n");
                      scanf ("%lf", &b);
                      printf ("\nSaisissez la valeur de c :\n");
                      scanf ("%lf", &c);

                      deltA = calculDelta(a, b, c);
                      printf ("\nDelta = %lf\n", deltA);

                      if (deltA < 0)
                      {
                          printf (
                                  "Delta < 0, par consequent l'equation n'admet aucune "
                                  "racine\n\n\n"
                                 );
                      }
                      else if (deltA == 0)
                      {
                          printf (
                                  "Delta = 0, par consequent l'equation admet une seule "
                                  "racine double : \nX0 = %lf\n\n\n", calculX0(a, b)
                                 );
                      }
                      else
                      {
                          printf (
                                  "Delta > 0, par consequent l'equation admet deux racines"
                                  " distinctes : \nX = %lf et X' = %lf\n\n\n",
                                  calculX1(deltA, a, b), calculX2(deltA, a, b)
                                 );
                      }
                      printf("Voulez-vous recommencer ? (1 pour oui) ");
                  }while(RECOMMENCER);

                  return 0;
              }


              fonction-solution.c :
              #include "fonction-solution.h"

              double calculDelta(const double a, const double b, const double c)
              {
                  return pow(b, 2) - 4*a*c;
              }

              double calculX0(const double a, const double b)
              {
                  return (-b)/(2*a);
              }

              double calculX1(const double delta, const double a, const double b)
              {
                  return ((-b)-sqrt(delta))/(2*a);
              }


              double calculX2(const double delta, const double a, const double b)
              {
                  return ((-b)+sqrt(delta))/(2*a);
              }


              fonction-solution.h :
              #ifndef FONCTION_SOLUTION_H
              #define FONCTION_SOLUTION_H

              #include <math.h>

              double calculDelta(const double, const double, const double);
              double calculX0(const double, const double);
              double calculX1(const double, const double, const double);
              double calculX2(const double, const double, const double);

              #endif


              Cordialement :)
              • Partager sur Facebook
              • Partager sur Twitter
                9 mai 2007 à 18:37:02

                J'entame à peine le grand II du tutoriel :D
                Je n'ai pas encore assimilé en profondeur les Directives de Préprocesseur :(

                Pour sortir de la boucle j'y avais pensé, je suis donc allé au chapitre correspondant sur les chaines de caractères, mais je n'ai pas trouvé la solution :-°

                Citation : kidpaddle

                L'indentation est mauvaise...



                C'est quoi une indentation ? o_O Imbrication ?

                C'est quoi aussi le " CIS " ? o_O

                Sinon, le code est beaucoup plus propre comme ça c'est clair :D

                Merci ^^
                • Partager sur Facebook
                • Partager sur Twitter
                  9 mai 2007 à 18:44:28

                  Ici, RECOMMENCER ou CLS sont tout simplement remplacés lors de la compilation par leurs valeurs définies par les #define.

                  CLS sert (comme dit dans le code) à effacer l'écran. Seulement, sous Linux et Windows, la manière de le faire est différente. Ainsi, j'ai paré à l'éventualité d'une compilation sous Nux avec des #define (sans valeurs) : si on compile sous Windows, on définit WINDOWS_COMPILING (auquel cas system("CLS"); est utilisé), ou sous Linux LINUX_COMPILING (auquel cas system("clear") est utilisé).

                  Sinon, demande à Wikipédia pour l'indentation, c'est plus précis (et plus rapide pour moi ^^ )
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 mai 2007 à 19:20:09

                    double a = 0, b = 0, c = 0, deltA = 0;

                    Heu... Tu voudrais pas mettre un commentaire pour expliquer ce que sont A, B et C ? Parceque, pour des noms de variable, on peut difficilement imaginer pire... Alors OK, une fois qu'on à compris à quoi elle servent, ça paraît logique, mais c'est pas forcément évident.

                    Tout à l'heure j'ai éteint KDE, j'en avais pas besoin. Et j'ai lu ton code en console (100%console, sans fenêtres derrière). Et y'avait des lignes qui étaient coupées... C'est assez lourd.

                    Dans l'interface, tu devrais préciser que l'equation est du type ax² + bx + c = 0...

                    Je propose que tu nous affiches la valeur de delta, qui peut être utile (et qui fait style qu'on à fait le truc nous même quand on fait l'exo :p ).

                    Je comprends pas CalCulX2. Pourquoi ne pas le coder exactement comme CalCulX1 en remplaçant

                    numerateur = moinsB + racineDelta;

                    par

                    numerateur = moinsB - racineDelta;


                    D'ailleurs la variable moinsB sert un peut à rien :

                    numerateur = (-1)*b - racineDelta

                    Tant qu'on y est, numerateur et denominateur aussi servent un peu à rien :

                    return (-1*b+sqrt(delta))/(2*a);

                    Pourrait très bien marcher comme fonction calculX1, non ? (enfin c'est non testé).

                    C'est comme pour calculDelta. Pourquoi abuser de sous-variables ?

                    return (b*b)-(4*a*c);

                    Ne marche pas ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
                      9 mai 2007 à 19:36:37

                      Oui, je me suis beaucoup compliqué la tache :D
                      Je ne savais pas ( Ou alors, je ne me rapellais pas :-° ) que le C possédais les propriétées mathématique des réels ^^ ( Priorité aux paranthèse etc ... ) Et donc moi dans ma tête d'apprentit, je me suis dis " Un seul calcul par ligne ! "

                      Et puis pour a, b et c je vois pas trop comment les apeller autrement o_O
                      Puisque même da,s le théorème écrit noir sur blanc, ya pas de nom ( enfin je crois :p ) Si, ce n'est " facteur " a, b, c ... Dans ce cas j'aurais pu écrire facteurA, facteurB etc en effet ^^

                      Et pour l'histoire des lignes, coupées j'ai pas compris :euh:
                      Et Delta est affiché dans la console :)

                      deltA = calculDelta(a, b, c);
                      printf ("\nDelta = %lf\n", deltA);
                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 mai 2007 à 19:44:16

                        Alors, abc => Mets un commentaire dans le code pour expliquer leur utilité.

                        Ligne coupée : les lignes de plus de 80 caractères, quand tu les lis dans une console, ça les coupe, c'est très ch*** => essayer de faire des lignes de 80 caracètres max (t'as pas une petite barre grise dans l'éditeur de code de ton IDE, qui te signale le 80e caractère de chaque ligne ?)
                        • Partager sur Facebook
                        • Partager sur Twitter
                        J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
                          9 mai 2007 à 19:49:16

                          Oui en effet, j'avais jamais compris son utilité XD
                          Mais moi ça coupait pas les lignes :euh: ( Quand je lançait mon exe )

                          *continue le tutoriel*

                          Merci à vous tous, des petits détails que je garde en mémoire, qui à coup sur vont améliorer mes furturs programmes ( Ben oui j'espère bien coder autre chose qu'un calculateur :D )

                          Strai'
                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 mai 2007 à 19:57:08

                            Je parlais d'une -vraie- console, quand tu n'a plus d'interface graphique, de bureau ni rien.
                            D'ailleurs, la ligne est quand même coupée, mais elle continue en dessus hein. Mais ça gêne quand même pas mal la lisibilité du code.

                            Bon apprentissage :)
                            • Partager sur Facebook
                            • Partager sur Twitter
                            J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
                              9 mai 2007 à 20:48:10

                              j'ai pas regardé le code, je voudrai juste réagir à ça

                              Citation : kidpaddle2


                              • Tu n'as pas besoin de nommer les variables dans tes prototypes



                              On est plus à l'age d'ENIAC, Le Go de disque dur coute environ 0.03 €, voir moins, le Go de RAM est aussi en chute libre...

                              Effectivement nommer les paramètres des fonction dans les prototypes n'est pas une obligation, mais je conseille très fortement de le faire, nommer un paramètre ça ne coute strictement rien et ça peut éviter aux utilisateurs de la fonction de faire de grosses bêtises, et surtout ça leur fait gagner un temps précieux. Avec juste le prototype enrichi, ils peuvent utiliser la fonction sans avoir besoin de se reporter systématiquement à la doc, en devinant comment elle doit être utilisée. Cela peut paraitre idiot, mais


                              char * strcpy(char *, char *);


                              et


                              char * strcpy(char * destination, char * source);


                              Change radicalement l'approche, dans le premier cas j'ai besoin de la doc pour savoir comment je dois mettre mes chaines de caractères, dans le second cas le prototype me donne l'information. Dans le premier cas je perds une minute à regarder dans la doc, dans le second cas j'ai ma réponse tout de suite. Pour ceux qui deviendront professionnels, rappelez vous toujours que le temps c'est de l'argent...

                              Vos patrons accepteront toujours que vous perdiez quelques minutes pour bien choisir les noms de vos paramètres, si vos collègues ne perdent pas de temps à chercher dans les docs...
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                                9 mai 2007 à 20:55:40

                                double calculDelta(const double a, const double b, const double c)
                                {
                                    return pow(b, 2) - 4*a*c;
                                }



                                Ne serait 'il pas mieux niveau performance de mettre ?

                                inline double calculDelta(const double a, const double b, const double c)
                                {
                                    return (b*b) - 4*a*c;
                                }



                                Ah des scanf mal utilisé , utilise fgets .
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  9 mai 2007 à 22:35:47

                                  GuilOoo -> La remarque a déjà été donnée, mais n'a apparemment pas été prise en compte... en ce qui concerne les noms de variable, je suis d'accord, mais bon, là, étant donné que l'utilisation du programme en lui-même demande la connaissance de ce type de polynôme (et donc les noms des coefficients), on ne peut lui en tenir rigueur.

                                  int21h -> Intéressant, mais hors sujet. Les prototypes ne comportent que le strict nécessaire pour renvoyer à la fonction définie plus loin dans le code, donc inutile de nommer. Après, c'est une question de compréhension : le comportement que tu décris n'est valable que pour une bibliothèque, or ici il est sujet d'un programmme.

                                  scriptoff -> je ne pense pas que les performances en soient amputées pour autant... (mais il est effectivement nécessaire de ne pas être négligent)

                                  Scanf (même s'il n'est pas sécurisé... je renvoie au site de -ed- et developpez.com pour une meilleure utilisation) est plus adapté pour des saisies de nombres que fgets...

                                  Edit: Pas de inline en C (non C99)...
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    9 mai 2007 à 22:50:57

                                    Citation : int21h

                                    Effectivement nommer les paramètres des fonction dans les prototypes n'est pas une obligation, mais je conseille très fortement de le faire, nommer un paramètre ça ne coute strictement rien et ça peut éviter aux utilisateurs de la fonction de faire de grosses bêtises, et surtout ça leur fait gagner un temps précieux. Avec juste le prototype enrichi, ils peuvent utiliser la fonction sans avoir besoin de se reporter systématiquement à la doc, en devinant comment elle doit être utilisée.


                                    Je ne sais pas si c'est une bonne idée de faire un cas général de cas particuliers.
                                    Personellement, je ne mets jamais le nom des arguments dans mes prototypes de méthodes. Je trouve que celà nuit à la lisibilité. Mais par contre, je documente systématiquement méthode, attributs, classe, fichier avec un commentaire doxygen, situé juste au dessus, il n'y a donc pas besoin de se reporter à la doc.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      10 mai 2007 à 0:03:29

                                      @NewBiz

                                      Je ne vois pas de différence, si le fait est bon pour des méthodes de classe, je ne vois pas la moindre raison pour ne pas le faire pour des fonctions globales. Si tu le fais pour les méthodes de classes, ne pas le faire pour les fonctions globales est totalement absurde. partant de là ce qui est bon pour une interface de classe l'est aussi pour une interface de langage^^

                                      @kidpaddle

                                      Que les prototypes de fonction ne comportent que le strict minimum et une idée d'un autre age, j'ai écris mes premiers programmes quand j'avais à peine 10 ans, c'était sur zx81. La nécessité de restreindre la taille des noms de variable et l'information disponible pour le programmeur j'ai connu, à l'époque j'avais 1Ko de ram, et ce n'est pas du tout une contrainte qui me manque. Donner des noms aux paramètres des fonctions, aussi idiot que cela puisse te paraitre ça permet de définir un référentiel que tous les programmeurs qui participent au projet comprendront, utiliseront et appliqueront. A première vu ça peu paraitre idiot mais c'est la base du développement coopératif...


                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                                        10 mai 2007 à 8:03:37

                                        Et ben je suis un peu largué la moi :lol:

                                        *observe la conversation*
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Calculateur

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown