Я студент, берущий 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):
Одна очевидная проблема заключается в том, что параметры 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()
смешно в том, что он принимает половину своих параметров по списку параметров и захватывает другую половину из глобальных переменных.
GetCoefficients
на правильный формат, изменил основной тип, превратил disc
в глобальную функцию и исправил проблему choice
. У меня все еще есть проблема со значением корня, возвращающего 0 все же. Это будет вызвано тем, что диск является глобальным, или значение корней не переносится из ComputeRoots
в PrintRoots
?
ComputeRoots
принимает значения x1
и x2
, когда вы хотите, чтобы они передавались по ссылке. Я предлагаю вам изучить параметры, передаваемые в C ++, или вы никогда не будете вне этих проблем :)
cin >> a, b, c;
неверно и не делает то, что вы считаете (читайте о комманде).
Вы можете захотеть
cin >> a >> b >> c;
как минимум
Скомпилируйте все предупреждения и информацию об отладке (g++ -Wall -Wextra -g
). Затем используйте отладчик (gdb
), например, для выполнения вашей программы шаг за шагом.
В более общем плане, прочитайте намного больше документации (на C++) о функциях и операторах, которые вы используете (например, это)
Этот код:
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; }
PrintRoots
знал, в каком случае печатать; так как у него не будет доступа к результату disc()
из другой функции.
Вероятно, вас путают с использованием локальных и глобальных переменных. Здесь вы указали всю свою переменную как глобальную, поэтому вам не нужно передавать переменные в параметр функции (имейте в виду, что использование многих глобальных переменных - плохая практика программирования). У вашего кода много семантических проблем
#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