Je suis très nouveau en C ++ et j'essaie de créer une paire de fonctions qui rapporteront deux solutions réelles possibles à une équation quadratique. J'essaie également de saisir un message dans ces fonctions qui s'affichera à la place d'une solution si aucune solution réelle n'existe.

Les fonctions rapportent correctement des solutions réelles, mais lorsqu'une solution non réelle apparaît, le programme retournera "Les deux vraies solutions possibles à ce problème sont nan et nan", et mon message d'erreur ("Il n'y a pas de vraie solution à cette équation quadratique . Veuillez saisir un autre ensemble de nombres ") n'apparaît pas du tout dans le terminal.

Voici mon code. Merci d'avance pour votre aide!

 #include <iostream>
#include "std_lib_facilities.h" // from a Github page by Bjarne Stroustrup that corresponds with the Programming: Practices and Principles book. Note that I am learning this on my own; it is not for homework.
#include <cmath>


        double quafo1 (double a, double b, double c)
        {

if ((sqrt((b*b)-(4*a*c))) < 0)
{
cout << ("There is no real solution to that quadratic equation. Please enter a different set of numbers;/n");

}
else {
    double x1 = ((b * -1) + sqrt((b * b) - (4 * a * c))) / (2 * a);
            return x1;
            }

    }

        double quafo2 (double a, double b, double c)
        {

         if ((sqrt((b*b)-(4*a*c))) < 0) 
         cout << ("There is no solution to that quadratic equation. Please enter a different set of numbers;");

else {
    double x2 = ((b * -1) - sqrt((b * b) - (4 * a * c))) / (2 * a);

        return x2;
        }


    }

double a;
double b;
double c;
int main()
{
    cout << "This program will solve a quadratic equation as long as one or more real solutions are possible. Please enter values for a, b, and c (separated by spaces and followed by enter, e.g. 3 5 4), after which both possible answers for x will be provided. Please note that a cannot equal 0.\n";
while (cin >> a >> b >> c)
{       
     cout << "The two possible real solutions to this problem are " << quafo1(a, b, c) << " and " << quafo2(a,b,c) << ".\n"; 

}
}
2
KBurchfiel 3 avril 2020 à 06:20

5 réponses

Meilleure réponse

La fonction sqrt ne retournera jamais une valeur négative *, donc votre test (sqrt((b*b)-(4*a*c))) < 0 ne sera jamais VRAI. Ce que vous voulez probablement faire est de tester si l'argument de sqrt est négatif:

    if (((b*b)-(4*a*c))) < 0) {
        cout << ("There is no solution to that quadratic equation. Please enter a different set of numbers;");
        return nan("");
    }
    else {
        //...

Sinon, si cet argument est négatif, la fonction sqrt renverra NaN, que vous pouvez tester avec isnan() fonction:

    if (isnan(sqrt((b*b)-(4*a*c)))) {
        cout << ("There is no solution to that quadratic equation. Please enter a different set of numbers;");
        //...

N'hésitez pas à demander des éclaircissements et / ou des explications supplémentaires.

Remarque: à proprement parler, tout nombre (positif) a deux racines carrées, une positive et une négative: 2 x 2 = 4 mais aussi -2 x -2 = 4.

2
Adrian Mole 3 avril 2020 à 03:59
cout << ("There is no real solution to that quadratic equation. Please enter a different set of numbers;/n");

Cette ligne doit se terminer par "\ n" et non par "/ n". "<< endl;" peut être utilisé

0
Saint-Martin 3 avril 2020 à 10:58

Je suggérerais quelques changements au programme pour résoudre les problèmes que vous rencontrez.

#include <iostream>
#include "std_lib_facilities.h" 
// from a Github page by Bjarne Stroustrup that corresponds with the Programming: Practices and Principles book. Note that I am learning this on my own; it is not for homework.
#include <cmath>

double quafo1(double a, double b, double c) {
if ((b*b-4*a*c) < 0)
    return sqrt(-1);
else
    return ((b * -1) + sqrt((b * b) - (4 * a * c))) / (2 * a);
}

double quafo2(double a, double b, double c) {
    if ((b*b-4*a*c) < 0)
        return sqrt(-1);
    else
        return ((b * -1) - sqrt((b * b) - (4 * a * c))) / (2 * a);
}

double a;
double b;
double c;

int main()
{
    cout << "This program will solve a quadratic equation as long as one or more real solutions are possible. Please enter values for a, b, and c (separated by spaces and followed by enter, e.g. 3 5 4), after which both possible answers for x will be provided. Please note that a cannot equal 0.\n";
    while (cin >> a >> b >> c) {    
     double s1 = quafo1(a,b,c),
         s2 = quafo2(a,b,c);
     if (s1==s1 && s2==s2)
         cout << "The two possible real solutions to this problem are " << s1 << " and " << s2 << '.' << endl; 
     else
         cout << "There is no real solution to that quadratic equation. Please enter a different set of numbers." << endl;
    }
} 

Tout d'abord, comme @Adrian l'a mentionné ci-dessus, vous devez vérifier si b*b-4*a*c est négatif ou non et non sa racine carrée.

Deuxièmement, la fonction doit renvoyer quelque chose dans tous les cas. Par conséquent, vous devez avoir une déclaration de retour lorsqu'il n'y a pas de vraies solutions. Dans ces cas, vous pouvez simplement renvoyer NaN. Une façon de faire serait de renvoyer sqrt(-1) comme je l'ai fait. En fait, vous pouvez simplement renvoyer la solution à l'équation quadratique, qui serait NaN si aucune solution réelle n'est possible car la racine carrée de b*b-4*a*c est impliquée.

Maintenant, dans main, vous pouvez vérifier si la valeur renvoyée est NaN. Pour vérifier cela, vous pouvez utiliser isnan(), ou vérifier s'il est égal à lui-même, ce que j'ai fait ici. J'espère que cela résoudra votre problème.

0
Param Siddharth 3 avril 2020 à 03:56

Une réponse indirecte est que C ++ a des exceptions , précisément lorsque vous ne pouvez pas renvoyer une valeur. Vous pouvez définir vos propres classes d'exceptions, mais std::out_of_range est parfaitement logique ici.

Les exceptions sont lancées comme throw std::out_of_range("There is no real solution to that quadratic equation."); et interceptées avec try { ... } catch (std::exception& e) { std::cerr << e.what() << " Please enter a different set of numbers";}

0
MSalters 3 avril 2020 à 10:14

Vous pouvez simplement renvoyer NaN lui-même dans ces cas:

https://en.cppreference.com/w/cpp/numeric/math/nan

0
Buddy 3 avril 2020 à 03:28