извинения за стену текста.
Из книги, над которой я работаю, мне было дано следующее задание:
«Квадратные уравнения имеют вид: a x ^ 2 + b x + c = 0
Для их решения используется квадратичная формула: (-b ± √ (b ^ 2-4ac)) / 2a
Однако есть проблема: если b ^ 2-4ac меньше нуля, то он потерпит неудачу.
Напишите программу, которая может вычислить х для квадратного уравнения. Создайте функцию, которая выводит корни квадратного уравнения с учетом a, b, c.
Когда программа обнаружит уравнение без реальных корней, распечатайте сообщение. Откуда ты знаешь, что твои результаты правдоподобны? Можете ли вы проверить, что они верны?«
Я написал свою программу. Но все результаты, которые я получаю, странные числа. Например: 7.08141e + 268. Это использует 4, так что sqrt должно быть 2, я считаю.
РЕДАКТИРОВАТЬ: я изменил код и получаю правильные значения для sqrt a, b, c сейчас. Но, x1 и x2 выдают nan, что просто неправильно. Надеюсь, этот код будет немного чище и лучше оформлен.
double quad_x1(double b, double a, double c) {
double x1 = (-b + sqrt(b * b - 4 * a * c)) / (2 *a);
return x1;
}
double quad_x2(double b, double a, double c) {
double x2 = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);
return x2;
}
double square_root_a(double a) {
double sq_a=sqrt(a);
if(sq_a<0){
throw invalid_argument("Input is less than zero.");
}
else {
return sq_a;
}
}
double square_root_b(double b) {
double sq_b=sqrt(b);
if(sq_b<0) {
throw invalid_argument("Input is less than zero.");
}
else {
return sq_b;
}
}
double square_root_c(double c) {
double sq_c=sqrt(c);
if(sq_c<0) {
throw invalid_argument("Input is less than zero.");
}
else {
return sq_c;
}
}
int main ()
{
try{
double a=4;
double b=4;
double c=4;
double sq_a = square_root_a(a);
double sq_b = square_root_b(b);
double sq_c = square_root_c(c);
double x1 = quad_x1( b, a, c);
double x2 = quad_x2( b, a, c);
cout<<"The square roots are: a = "<<sq_a<<" b = "<<sq_b<<" c = "<<sq_c<<'\n';
cout<<"The answer to the quadratic is:\n";
cout<<"x1 = "<<x1<<'\n';
cout<<"x2 = "<<x2<<'\n';
}
catch (invalid_argument) {
cerr<<"Invalid Input - Less than zero"<<'\n';
return 1;
}
return 0;
}
Вы не вызываете свои функции.
double square_root(double a, double b, double c); //send values to sqrt check double quad_x1(double b, double a, double c); //send values to get x1 double quad_x2(double b, double a, double c); //send values to get x2
Это объявления функций для функций, уже определенных выше. Они абсолютно не влияют. Функции не называются.
Это как если бы вы сделали это:
#include <iostream>
void f()
{
std::cout << "global\n";
}
int main()
{
void f(); // just a declaration, f() is not called
}
Другая проблема в том, что вы не инициализируете main
«s sq_a
, sq_b
, sq_c
, x1
а также x2
переменные. Эти переменные имеют тип double
, Поэтому пытаться читать с них неопределенное поведение, что означает, что вся ваша программа недействительна.
Похоже, у вас неправильное представление о том, что имена переменных в C ++ всегда глобальны. Но это далеко от истины. Ваш x1
в main
не имеет абсолютно никакого отношения к x1
в quad_x1
, Вы, вероятно, хотели сделать что-то вроде:
x1 = quad_x1(b, a, c);
И так далее…
Вы должны начать с многого более простые программы изучать C ++. Вызов функции и сохранение результата в локальной переменной — это самое основное, что вы можете сделать. Не занимайтесь квадратными уравнениями, пока не поймете это правильно. Начните с программы, которая использует функцию для добавления двух чисел.
Других решений пока нет …