Получение двойной функции C ++ для сообщения о сообщении вместо возврата числового значения при выполнении определенного условия - PullRequest
2 голосов
/ 03 апреля 2020

Я очень новичок в C ++ и пытаюсь создать пару функций, которые сообщат о двух возможных реальных решениях квадратного уравнения c. Я также пытаюсь ввести сообщение в эти функции, которое будет отображать вместо решения, если реального решения не существует.

Функции правильно сообщают о реальных решениях, но когда появляется нереальное решение, программа будет return "Два возможных реальных решения этой проблемы - это nan и nan", и мое сообщение об ошибке ("Нет реального решения для этого квадратного уравнения c. Пожалуйста, введите другой набор чисел") не отображается в терминал вообще.

Вот мой код. Заранее благодарю за помощь!

 #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"; 

}
}

Ответы [ 5 ]

2 голосов
/ 03 апреля 2020

Функция sqrt никогда не вернет отрицательное значение *, поэтому ваш тест (sqrt((b*b)-(4*a*c))) < 0 никогда не будет ИСТИННЫМ. Что вы вероятно хотите сделать, это проверить, является ли аргумент sqrt отрицательным:

    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 {
        //...

В качестве альтернативы, если этот аргумент равен отрицательно, sqrt функция вернет NaN, которую вы можете проверить с помощью функции isnan():

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

Не стесняйтесь просить дальнейших разъяснений и / или объяснений.

Примечание: Строго говоря, любое (положительное) число имеет два квадратных корня, одно положительное и одно отрицательное: 2 x 2 = 4, но также -2 x -2 = 4.

0 голосов
/ 03 апреля 2020
cout << ("There is no real solution to that quadratic equation. Please enter a different set of numbers;/n");

Эта строка должна заканчиваться символом "\ n", а не "/ n". "<< endl;" может быть использован </p>

0 голосов
/ 03 апреля 2020

Косвенным ответом является то, что в C ++ есть исключения , именно тогда, когда вы не можете вернуть значение. Вы можете определить свои собственные классы исключений, но здесь std::out_of_range имеет смысл.

Исключения генерируются как throw std::out_of_range("There is no real solution to that quadratic equation."); и перехватываются с try { ... } catch (std::exception& e) { std::cerr << e.what() << " Please enter a different set of numbers";}

0 голосов
/ 03 апреля 2020

Я бы предложил несколько изменений в программе, которые устранят возникшие проблемы.

#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;
    }
} 

Прежде всего, как уже упоминалось выше @Adrian, вам нужно проверить, является ли b*b-4*a*c отрицательным или не и не его квадрат root.

Во-вторых, функция должна возвращать что-либо во всех случаях. Следовательно, вы должны иметь инструкцию возврата, когда нет реальных решений. В этих случаях вы можете просто вернуть NaN. Один из способов сделать это - вернуть sqrt(-1) как я. Фактически, вы можете просто вернуть решение в уравнение квадратичного c, которое будет равно NaN, если никакие реальные решения невозможны, поскольку задействован квадрат root из b*b-4*a*c.

Теперь в main вы можете проверить, является ли возвращаемое значение NaN. Чтобы проверить это, вы можете использовать isnan() или проверить, равно ли оно себе, что я и сделал здесь. Я надеюсь, что это решит вашу проблему.

0 голосов
/ 03 апреля 2020

Вы можете просто вернуть само NaN в следующих случаях:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...