Не могу понять, почему это не работает

0

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

#include <iostream>
#include <cmath>
using namespace std;
double a, b, c, x1, x2;
char choice, response, mychar;
double disc = (b*b - 4 * a*c);

void GetCoefficients(double a, double b, double c)
{
    cout << "Enter the coefficients of your quadratic equation (a, b, c): ";
    cin >> a, b, c;
}

bool ComputeRoots(double a, double b, double c, double x1, double x2)
{

    if (disc > 0)
    {
        x1 = (-b + sqrt((b*b) - 4 * a*c)) / 2 * a;
        x2 = (-b - sqrt((b*b) - 4 * a*c)) / 2 * a;
        return true;
    }
    if(disc == 0)
    {
        x1 = x2 = (-1 * b) / (2 * a);
        return true;
    }
    else 
    {
        cout << "'a' cannot be zero. That is not a quadratic equation.";
        return false;
    }
}

char PromptToContinue()
{
    char mychar;
    cout << "Would you like to solve another quadratic equation (Y, N): ";
    cin >> mychar;
    return mychar;
}

void PrintRoots(double x1, double x2)
{
    if (disc > 0)
    {
        cout << "The roots are: " << x1 << ", " << x2;
    }

    if (disc == 0)
    {
        cout << "The single root is: " << x1;
    }
}

void main()
{

    do
    {
        GetCoefficients(a, b, c);
        if (ComputeRoots(a, b, c, x1, x2))
        {
            PrintRoots(x1, x2);
        }
        choice = PromptToContinue();
    } while (choice != 'n' || 'N');
    system("pause");
}

Я уверен, что у меня много проблем с моим кодом, но я смотрел на это часами и понятия не имею, почему он не работает. Любое понимание было бы удивительным.

Результат вывода, который я должен получить, - это (со значениями после того, как двоеточие будет пользователем):

Введите коэффициенты вашего квадратичного уравнения (a, b, c): 2 3 4
Корни сложны.

Вы хотите решить другое квадратичное уравнение (Y, N): y
Введите коэффициенты вашего квадратичного уравнения (a, b, c): 1 2 1

Единственный корень: -1

Вы хотите решить другое квадратичное уравнение (Y, N): y
Введите коэффициенты вашего квадратичного уравнения (a, b, c): 0 5 6

'a' не может быть нулем. Это не квадратичное уравнение.

Вы хотите решить другое квадратичное уравнение (Y, N): y
Введите коэффициенты вашего квадратичного уравнения (a, b, c): 5 25 5

Корни: -0.208712, -4.79129

Вы хотите решить другое квадратичное уравнение (Y, N): n
Нажмите любую клавишу для продолжения. , ,

Выход, который я получаю, таков:

Enter the coefficients of your quadratic equation (a, b, c): 2 3 4
The single root is: 0Would you like to solve another quadratic equation (Y, N):
Enter the coefficients of your quadratic equation (a, b, c): The single root is:
 0Would you like to solve another quadratic equation (Y, N):
  • 0
    Что выводит ваша программа вместо этого?
  • 3
    Что не работает? Вы должны быть более конкретными с вашим вопросом. Вы должны опубликовать вывод / ошибки. Кроме того, название вашего вопроса в основном бесполезно. Вероятно, вы сами решите проблему, если зададите правильные вопросы.
Показать ещё 1 комментарий
Теги:

4 ответа

4

Одна очевидная проблема заключается в том, что параметры void GetCoefficients(double, double, double) передаются по значению, когда вы, очевидно, хотите, чтобы они передавались по ссылке. As-is, вы копируете их внутри своей функции, читаете пользовательский ввод в эти копии, а затем бросаете их все, когда возвращаетесь.

Изменить: void main() неверно, main должен иметь тип int main(int, char**) или int main().

while (choice != 'n' || 'N'); не выполняет то, что вы ожидаете: он проверяет, отличается ли choice от 'n', затем выполняет логическое или с буквальным 'N'. Так как 'N' отличное от нуля, условие всегда верно. Правильный синтаксис: (choice != 'n' && choice != 'N').

Ваша программа также довольно странная, но я думаю, она поправит. Например, вы используете только глобальные переменные, которых следует избегать, когда это возможно. void PrintRoots() смешно в том, что он принимает половину своих параметров по списку параметров и захватывает другую половину из глобальных переменных.

  • 0
    Поэтому я изменил Cin в GetCoefficients на правильный формат, изменил основной тип, превратил disc в глобальную функцию и исправил проблему choice . У меня все еще есть проблема со значением корня, возвращающего 0 все же. Это будет вызвано тем, что диск является глобальным, или значение корней не переносится из ComputeRoots в PrintRoots ?
  • 0
    @Marcus Bingo: еще раз, ComputeRoots принимает значения x1 и x2 , когда вы хотите, чтобы они передавались по ссылке. Я предлагаю вам изучить параметры, передаваемые в C ++, или вы никогда не будете вне этих проблем :)
Показать ещё 2 комментария
2
cin >> a, b, c;

неверно и не делает то, что вы считаете (читайте о комманде).

Вы можете захотеть

cin >> a >> b >> c;

как минимум

Скомпилируйте все предупреждения и информацию об отладке (g++ -Wall -Wextra -g). Затем используйте отладчик (gdb), например, для выполнения вашей программы шаг за шагом.

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

1

Этот код:

double a, b, c, x1, x2;
double disc = (b*b - 4 * a*c);

устанавливает disc в ноль. В C++ выражения вычисляются с использованием значений переменных во время нахождения выражения. Эта строка не устанавливает формулу, которая будет использоваться для вычисления disc любое время, когда вы будете использовать disc позже в программе.

(Примечание: поскольку double a, b, c, x1, x2; global, эти значения инициализируются до 0.0, и поэтому вычисление для disc заканчивается также 0.0).

Например, вы продолжаете:

bool ComputeRoots(double a, double b, double c, double x1, double x2)
{
    if (disc > 0)

однако disc по-прежнему равен нулю, так как вы установили его в ноль в начале программы, как упоминалось ранее, и вы его не изменили.

Чтобы настроить ситуацию, когда значение вычисляется в результате других входных значений, вам нужно написать функцию, например:

double disc(double a, double b, double c) { return b*b - 4*a*c; }
  • 0
    NB. вам нужно будет изменить способ хранения своих корней, чтобы PrintRoots знал, в каком случае печатать; так как у него не будет доступа к результату disc() из другой функции.
  • 0
    Вы, вероятно, должны упомянуть, почему эти переменные установлены в ноль, поскольку это немного краевой случай, и в большинстве других контекстов вы получите неинициализированные переменные с UB сверху :)
Показать ещё 1 комментарий
0

Вероятно, вас путают с использованием локальных и глобальных переменных. Здесь вы указали всю свою переменную как глобальную, поэтому вам не нужно передавать переменные в параметр функции (имейте в виду, что использование многих глобальных переменных - плохая практика программирования). У вашего кода много семантических проблем

#include <iostream>
#include <cmath>
using namespace std;
double a, b, c, x1, x2;
char choice, response, mychar;
double disc = (b*b - 4 * a*c); // here only declare disc like 'double disc;'  create a function for calculating disc like
/* void caldisc()
{
disc = (b*b - 4 * a*c);
} call this caldisc() in main after GetCoefficients()*/

    void GetCoefficients(double a, double b, double c) // passing parameters double a, double b, double c means your creating local copy of a b and c and getting input in it not in global a b c
    {
        cout << "Enter the coefficients of your quadratic equation (a, b, c): ";
        cin >> a, b, c;   // use cin>>a>>b>>c;
    }

    bool ComputeRoots(double a, double b, double c, double x1, double x2) // dont pass parameters here and use directly it in main() like ComputeRoots();
    {

        if (disc > 0)
        {
            x1 = (-b + sqrt((b*b) - 4 * a*c)) / 2 * a;
            x2 = (-b - sqrt((b*b) - 4 * a*c)) / 2 * a;
            return true;
        }
        if(disc == 0)
        {
            x1 = x2 = (-1 * b) / (2 * a);
            return true;
        }
        else 
        {
            cout << "'a' cannot be zero. That is not a quadratic equation.";  // this block will get executed when disc<0 regardless of a. ZeroCheck of a should be done in upper blocks.
            return false;
        }
    }

    char PromptToContinue()
    {
        char mychar;       // here you're creating local copy of mychar and returning it in last line.Thus local copy of mychar will return garbage. remove this line
        cout << "Would you like to solve another quadratic equation (Y, N): ";
        cin >> mychar;
        return mychar; // remove this change function return type as void
    }

    void PrintRoots(double x1, double x2) // no need to pass x1 and x2 change function call in main too.
    {
        if (disc > 0)
        {
            cout << "The roots are: " << x1 << ", " << x2;
        }

        if (disc == 0)
        {
            cout << "The single root is: " << x1;
        }
    }

теперь в основном не используйте выбор. проверьте условие do-while с помощью mychar! = 'N'//означает, что цикл будет выполнен, если вы передадите что-либо, кроме N

Ещё вопросы

Сообщество Overcoder
Наверх
Меню