C программа решение квадратного уравнения

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

float solution1 = (float)(-1.0 * b) + (sqrt((b * b) — (4 * a * c))); solution1 = solution1 / (2*a); cout

Если, например, я использую уравнение: x^2 — x — 6, я правильно получаю решение 3, -2.

Мой вопрос в том, как бы я учитывал комплексные числа. например, учитывая уравнение:

Решив вручную, я бы получил -1 + 2i, -1 — 2i.

Ну, я думаю, два вопроса: могу ли я написать вышеизложенное лучше, а также учесть комплексное число?

Спасибо за любую помощь!

задан 22 мая ’09, 11:05

Другие ребята дали хорошие ответы, поэтому у меня нет причин пытаться их затмить 😉 Однако, если вам нужно более общее решение уравнения ax^2+bx+c=0, помните, что a==0 должно быть допустимым ценность. Это приведет к делению на ноль, поэтому вы должны позаботиться об этом случае отдельно. В этом случае это означало бы, что у вас осталось линейное уравнение с одним корнем. Ваше здоровье ! — ralphtheninja

Программа, определяющая корни квадратного уравнения. Язык программирования Python.

Вы подразумеваете, что вас беспокоят комплексные корни, но как насчет комплексных коэффициентов в исходном уравнении? — Jouni K. Seppänen

Комплексные коэффициенты требуют совершенно другого подхода. Так что это будет следующий вопрос 🙂 сбегает и заранее готовит ответ — ralphtheninja

6 ответы

Что-то вроде этого могло бы сработать:

struct complex < double r,i; >struct pair < T p1, p2; >pair GetResults(double a, double b, double c) < pairresult=; if(a<0.000001) // ==0 < if(b>0.000001) // !=0 result.p1.r=result.p2.r=-c/b; else if(c>0.00001) throw exception(«no solutions»); return result; > double delta=b*b-4*a*c; if(delta>=0) < result.p1.r=(-b-sqrt(delta))/2/a; result.p2.r=(-b+sqrt(delta))/2/a; >else < result.p1.r=result.p2.r=-b/2/a; result.p1.i=sqrt(-delta)/2/a; result.p2.i=-sqrt(-delta)/2/a; >return result; >

Таким образом, вы получаете одинаковые результаты как для реальных, так и для комплексных результатов (у реальных результатов просто мнимая часть установлена ​​на 0). С наддувом смотрелось бы еще красивее!

edit: исправлено для дельты и добавлена ​​проверка вырожденных случаев, таких как a=0. Бессонная ночь ftl!

Если sqrt завершается успешно, результат >= 0. А если аргумент отрицательный, ваша программа аварийно завершает работу. Сначала вы должны проверить знак, а затем вычислить sqrt. Если бы знак был отрицательным, вы бы установили result.first.i = +sqrt(4*acbб)/2/а. (Зачем определять свой собственный тип, если есть прекрасный std::pair ?) — MSalters

должно быть дельта=bб-4 * аc и брать sqrt только тогда, когда delta>=0. delta=0 или a=0 допустимы случаи, когда у нас один корень. Что, если a=b=0 и c=1? — Эрик Бейнвилл

Что если? Это не квадратичная функция, и часть /2/a не сработает. Это работает достаточно хорошо, если delta=0, за исключением того, что вы вернете один и тот же результат дважды. — MSalters

Программа для решения корней квадратного уравнения с использованием дискриминанта на языке Паскаль

Почему вы определяете пару и сложный тип? Оба уже существуют! — Харпер Шелби

Портативный? Хз.. Я написал все это в текстовом редакторе после 24 часов без сна, я удивлен, что это вообще компилируется

Важное замечание ко всему этому. Решения, показанные в этих ответах и ​​в исходном вопросе, не являются надежными.

Хорошо известное решение (-b + — sqrt (b ^ 2 — 4ac)) / 2a известно, что он неустойчив к вычислениям, когда ac очень мал по сравнению с б^2, потому что нужно вычесть два очень похожих значения. Лучше использовать менее известное решение 2c / (-b —+ sqrt(b^2 -4ac)) для другого корня.

Устойчивое решение может быть рассчитано как:

temp = -0.5 * (b + sign(b) * sqrt(b*b — 4*a*c); x1 = temp / a; x2 = c / temp;

Использование знака (b) гарантирует, что мы не вычитаем два одинаковых значения.

Для OP измените это для комплексных чисел, как показано другими плакатами.

+1 это значительно более надежно в вычислительном отношении, чем (-b +/- sqrt(b*b — 4*a*c))/(2a) . Кстати: с тех пор temp может быть 0.0, обычно требуется проверка перед делением. (например, a,b,c = 1,0,0). — chux — восстановить Монику

sign(b) можно определить как +1 для b >= 0 и -1 для b < 0 . — Quant_dev

У вас более или менее есть это, просто проверьте, является ли часть, которая находится внутри квадратного корня, отрицательной, а затем отслеживайте это отдельно в своих сокращениях.

ответ дан 22 мая ’09, 15:05

Вы могли бы просто использовать std::complex вместо float чтобы получить поддержку комплексных чисел.

ответ дан 22 мая ’09, 15:05

Никая идея от Blindy:

typedef std::complex complex; using std::pair; pair GetResults(double a, double b, double c) < double delta=(b*b-4*a*c); double inv_2a = 1/2/a; if(delta >= 0) < double root = sqrt(delta); return std::make_pair( complex((-b-root)*inv_2a), complex((-b+root)*inv_2a); >else < double root = sqrt(-delta); return std::make_pair( complex(-b*inv_2a, -root*inv_2a)), complex(-b*inv_2a, +root*inv_2a))); >>

Читайте также:
Что такое программа адванта

ответ дан 22 мая ’09, 16:05

Я пробовал программу без использования заголовка «math.h», а также пробовал другую логику . но моя программа может отвечать только на те квадратные уравнения, которые имеют коэффициент «x квадрат» как единицу . и где коэффициент «x ‘ можно выразить как сложение двух чисел, которые являются множителями постоянного члена. например. х квадрат +8х+16; х квадрат +7х+12; и т. д. здесь 8=4+4 и 16=4*4; здесь коэффициент при х может быть выражен как сложение двух чисел, которые являются множителями постоянного члена 16. Сам я им не полностью доволен, но попробовал что-то другое, не используя формулу решения квадратного уравнения. код есть;

#include #include class quadratic < int b,c ; float l,k; public: void solution(); >; void quadratic::solution() < cout>b>>c; for(l=1;l > > > void main()

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c++ math equation quadratic or задайте свой вопрос.

Источник: stackovergo.com

C программа решение квадратного уравнения

Решение квадратных уравнений на c++

/* Программа для подсчета квадратных уравнений */

#include iostream.h
//Это библиотеки , читай книгу
#include conio.h
//Включаем библиотеки
#include math.h

int main()
//Описываем главную функцию (так начинается каждая программа)
//Открываем программу тоже есть везде
int a,b,c;
//Объявляем переменные
float di,x;
//Тоже переменные тока другой тип, с плавающей точкой!
cout //Выводим сообщение «Vvedi cheres probel A,B,C »
cin>>a>>b>>c;
//Просим ввести 3 цифры через пробел это A B и C
cout //переходим на следующую строку иначе весь текст собьется в кучу!
di = (b*b)-(4*a*c);
//вычисляем дискриминант по математике формуле
cout <<«tДискриминанат = n»//Показываем чему равен дискриминант после вычисления из переменной «di»
di=sqrt(di);
//С библиотекой math.h вычисляем квадратный корень и записываем его в переменную «di»
x=(-b+di)/(2*a);
//Считаем x1, помни что всегда нужно учитывать приоритет операций! Что в скобках вычисляется по матем правилам!
cout <<«x1 = n»//Выводим чему оно равно
x=(-b-di)/(2*a);
//Считаем x2
cout <<«x2 = n»//Выводим чему оно равно
getch();
//Запрос на ввод любого символа чтобы программа сама сразу не закрылась!
return 0;
//Значение которое возвратит функция (здесь не обязательно)
>
//Закрываем программу тоже есть во всех программах

/*
В конце каждой строки ставится ;
все пишется только маленькими буквами
Комментарий обозначается как //
endl тоже самое что n переход на
позицию вниз только удобнее

//Комментарии они не компилируются!
//Однострочный
*/

Квадратное уравнение: 8 комментариев

Добрый день! А как быть со случаями, когда а == 0; b == 0 c > 0; b == 0 C !=0 и т.д.?

При a == 0 уравнение перестает называться квадратным. Проблемы также возникают, когда, например, пользователь ввел букву вместо числа. Такие случаи называются аномалиями.
Все аномалии рассмотреть нельзя. Если требуется, то можно, например, рассмотреть аномалию a == 0, добавив после 11-й строки:
if (a == 0)
> a >> b >> c;
/*(D = b*b minus 4*a*c) — считаем дискриминант*/
double d = (b*b) — 4 * a * c;
double x1, x2, d1;
d1=sqrt(d);/*корень из дискриминанта — заготовка для решения решаемого квадратного уравнения*/
/*1. группируем все исключения — когда решение вообще или через дискриминант невозможно*/
/*2. в каждое исключение сливаем все условия и для этих условий пишем вывод*/
/*3. оставшиеся случаи решаем через дискриминант*/
if ((a==0 b == 0 ) || ( b==0 ((c> 0 a>0) || (c

Про аномалии это я переделал. Лучше говорить аномалии, а не исключения.
Задачу читайте внимательно: квадратное уравнение. Подразумевается, что коэффициент a не равен 0.
Посмотрите математическую энциклопедию.

Ещё раз повторю: Вы не сможете сделать универсальное решение, которое будет работать всегда.

Ваше решение просто лучше моего, оно не работает, если вместо a, я ввожу rrr или другие символы.

Аномалии про оторванные руки и кровь тоже рассматривают, есть даже задачи и модели математические про ситуацию, когда 0 взял так и случайно стал 1 в памяти ЭВМ. Про глупость, ну а что, так и есть, глупость это нормально. Ваша программа умнее моей.

Это не ерунда, а программирование. Первый этап, который всегда должен происходить, это спецификация (уточнение) задачи. Пишется такая бумага, в которой как раз и есть «Сюда — смотри, сюда — не смотри, а здесь — рыбу заворачивали. «.

Вопрос у Вас фактически про спецификацию (уточнение). Те пять пунктов, которые я в предыдущем комментарии написал — совершенно адекватные требования преподавателя, заказчика, сайта с хранилищем программного обеспечения. Часто преподаватели говорят — составить отчёт с инструкциями даже по такой программе как решение квадратного уравнения, это нормально. Про оторванные руки я не писал как раз как про первоочередную задачу.

Но по минимуму решение именно то, что я написал. Оно, бывает, проходит, при быстром ответе на вопрос экзамена. Если требуют уточнить, нужно уметь уточнять. Да и ещё раз замечу, Ваше решение умнее моего, но оно не универсально.

Математической энциклопедии под рукой не нашлось.
«Лучше говорить аномалии, а не исключения.»
Не помню из курса алгебры (в рамках которой изучается решение квадратных уравнений) такого термина — аномалии, но допускаю, что Вы правы и такой математический термин существует и его можно применить к квадратному уравнению.
«Задачу читайте внимательно: квадратное уравнение. Подразумевается, что коэффициент a не равен 0.»
Прочитал внимательно. «ax2 + bx + c = 0» — где сказано, что а не равен нулю?
«Но по минимуму решение именно то, что я написал. Оно, бывает, проходит, при быстром ответе на вопрос экзамена.»
Когда я пытался пропихнуть код, который не учитывает исключений — не приняли, хотя вот текст моего задания:
«На вход вашей программы в стандартном потоке ввода подаются действительные коэффициенты A, B и C уравнения Ax² + Bx + C = 0. Выведите все его различные действительные корни в поток вывода в любом порядке, при этом разделяя корни пробелами. Гарантируется, что хотя бы один из коэффициентов уравнения не равен нулю.»
«Вы не сможете сделать универсальное решение, которое будет работать всегда.» и «Да и ещё раз замечу, Ваше решение умнее моего, но оно не универсально.»
Позвольте, Вы настаиваете, что невозможно написать код, который будет решать квадратное уравнение при любых действительных a, b и c? Как-то можете теоретически аргументировать? Пока что только не подкрепленные утверждения, не готов принимать их на веру.
При каких действительных значениях а, b и c мой, реально корявый, код не работает?

Читайте также:
При запуске программ вылетает синий экран

Страницы математических энциклопедий доступны через Яндекс. Только внимательнее, там есть поясняющие материалы в результатах поиска, не перепутайте.

Квадратное уравнение — алгебраическое уравнение 2-й степени. Общий вид К. у. ax^ +bx+c=0, a != 0.

Что такое аномалия?
В тестировании программного обеспечения под аномалией понимается результат, отличный от ожидаемого. Такое поведение может быть результатом документа а также представлений и опыта тестировщиков.

Аномалия может также относиться к проблеме удобства использования, поскольку тестовое программное обеспечение может вести себя в соответствии со спецификацией, но удобство его использования все же можно улучшить. Иногда аномалия также может быть названа дефектом / ошибкой.

Перед тем как разрабатывать программу проводят формальную спецификацию (уточнение) задания.

В информатике формальная спецификация — это математическое описание программной или аппаратной системы, которая может быть реализована в соответствии с этим описанием. Специфицируется, что должна делать система, но не то, как она должна это делать.

Если система огромная — длительное обсуждение, анализ и т.д. Для небольших программ, вот как решение квадратного уравнения, можно на бумаге составить. Вот на этой бумаге пишется задача, ИД — исходные данные, ВД — выходные данные, реакция на аномалии и т.д. В пункте реакция на аномалии рисуется таблица, по крайней мере с двумя столбцами: название аномалии, то что программа будет в этом случае делать.

У Вас в задании слова квадратное как раз нет и аккуратно написано, что подаются только действительные числа. Формальная спецификация выполнена в задании в основном.

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

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

Программа для решения квадратных уравнений на C++

Довольно часто в пособиях по программированию встречаются задания по нахождению решений каких-нибудь математических уравнений. Задача нахождения корней квадратного уравнения — это довольно тривиальная задача, как и многие другие задачи. Решается она очень просто при помощи листа бумаги и ручки, но решение можно автоматизировать посредством написания прикладной программы и её использования. В этой статье мы напишем такую программу.

Алгоритм решения квадратного уравнения

Многие знают, что уравнение вида ax 2 + bx + c = 0 , где a не равно 0, называют квадратным уравнением.

Существуют различные способы решения квадратных уравнений, но мы рассмотрим решение через дискриминант.

Обозначается дискриминант буквой D . Из школьного курса знаем, что D = b 2 — 4ac .

Существует несколько условий:

  • Если D > 0, то решение имеет 2 различных вещественных корня.
  • Если D = 0, то оба вещественных корня равны.
  • Если D для вводавывода в консоли, #include для работы с математическими функциями и область using namespace std;

Для вас это может быть интересно:

Программа для решения квадратных уравнений на C++ : 24 комментария

  1. Nicknixer Автор записи 15.10.2016

Не так сложно, как Вам кажется! Немного литературы, немного практики и смотреть на код решения такой задачи Вы будете по-другому.

Доброго времени суток! Помогите пожалуйста написать программу, которая считает сколько символов в ряде двумерного массива. То есть , например массив 5 на 5, сколько символов в 1 ряде, сколько во 2 и т.д.

Ответил вам по электронной почте

Критику принимаете?
Программа дырявая как сито.

Если число очень маленькое, но положительное, например 10^(-20) — у вас будет переполнение или типо того. Оператор > проверяет знак числа (это отдельный бит), а оператор == для дробных чисел не имеет смысла, т.к. в младших разрядах числа обычно находится какой-нибудь мусор, который при таком сравнении дает false.

x = ( -1*b + sqrt(b*b — 4*a*c) ) / (2 * a);
x = ( -1*b — sqrt(b*b — 4*a*c) ) / (2 * a);

Тут есть три вопроса:
1) зачем два раза вычислять одно и тоже (я про корень)
2) что делать если мне корни надо как-то использовать, а не просто вывести (тут есть проблема, ведь у меня то один корень — то два). Чтобы лучше понять в чем проблема — попробуйте вынести вычисление корней в отдельную функцию. У вас то вообще, если корень один — то их выведется все равно два, одинаковых.
3) в переменной «a» может быть ноль (или близкое к нулю число) — при этом мы получим деление на ноль (а точнее, переполнение).

Читайте также:
В какой программе сделать видео на выпускной

Но это ведь еще не все. Что будет если и «a» и «b» равны нулю? — тебе надо рассмотреть два варианта — если c = 0 (условно, близко к нулю), то корней бесконечно много. А если c != 0, то корней нет.

Вообще, эта задача — прекрасный пример для юнит-тестирования и демонстрации принципов разработки через тестирование. Именно его я рассматривал в своей статье по теме тестирования: Юнит-тестирование. Пример. Boost Unit Test.

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

  1. Николай Сергейчук Автор записи 09.02.2017

Принимаем
Согласен с вами во всём! Программу можно реализовать намного лучше, используя различные проверки и валидацию входных данных.
Однако, статья рассчитана на аудиторию, которая только начинает познавать программирование или делает лабораторную. Чтобы людям легче было понять, реализация данной программы упрощена до невозможности. И, возможно, несправедливо было с моей стороны не предупредить их о возможных ошибках в работе программы, которые могут вскрыться позже, если подать на вход определенные значения.
Кстати, у вас интересная статья по тестированию!

Николай, доброго времени суток! Можете помочь с написанием програмки в с++? 1-1/2!+1/3!-1/4!+1/5! и так до 1/100! ? Чтобы при заднии в строке номера члена последовательности выдавал сумму до него по такой вот формуле? Буду очень благодарен!

Пожалуйста подскажите как ввести экран правильный ответ дискриминанта

Помогите решить в Dev C++
Sqrt x^2+1+sqrt|x|,x0

Здравствуйте, можете помочь с решением биквадратного и триквадратного уравнения?

#include
using namespace std;
int main()
b;
cout <> c;
D = pow(b, 2) — 4 * a * c;
cout

ну и? если даже тупо скопировать код и вставить его в cpp.sh , ничего не работает. поебота какая то этот с++

Уважаемая, Лена! Я, надеюсь, вы знаете, что код программы, написанной на языке программирования C++ нельзя тупо вставить в блокнот и сохранить под названием «cpp.sh»? Если не знали, то я, видимо, открыл для вас Америку!

помогите решить. заданы 3 перемены a.b.c записать вы радение на С
b,
b и а не равно != с

iconcerts где забыл
#include

Я ради интереса написал программу нахождения корней квадратного уравнения на С++, с выводом корней как в десятичном виде, так и в виде простой дроби (причём уже сокращённой), потому что выводя корни в десятичном виде программа их одновременно сокращает и округляет и 1/3 превращается в 0.333333 хотя на самом деле 0.333333 (3), то есть для проверки правильно ли нашёл корни ваш ребёнок, вы с получите что-то типа: X1= 0.285714; X2=0.214286, а на самом деле это будет X1=2/7; X2=3/14, кроме того, если корень из дискриминанта не получается целым числом, вы уже получите двойную неточность: сначала при извлечении корня программа отсечёт значение до 4-6 цифр после запятой с округлением, а затем сделает то же самое при делении числителя на знаменатель. Я и здесь сделал вывод корней в двух значениях: в десятичном и в виде выражения X1= (-b + sqrt(D))/(2*a); X2= (-b — sqrt(D))/(2*a), то есть выводится примерно вот так X1=-5+sqrt(21)/2; X2=-5-sqrt(21)/2 с одновременным разложением дискриминанта под корнем на множители, вынесением этих множителей из-под корня, если они выносятся нацело, их перемножением и дальнейшим сокращением. Вот, например, имеем a=3, b=15, c=3, при решении получаем D=189 программа выдаёт десятичные корни X1= -0.208712 и X2= -4.79129, а в виде выражения имеем: X1= -5+sqrt(21)/2, то есть первоначально получаем: X1= -15+sqrt(189)/6, -> 189=21*9 -> -15+3sqrt(21)/6 далее идёт сокращение на 3 и итог -5+sqrt(21)/2

День добрый.
Недавно начал изучать C++. Решил попробовать написать решение квадратного уравнения именно через оператор вида «условие ? выполняется : не выполняется». Т.е. если условие выполняется, то имеем два решения (даже если d = 0, то тоже должно быть два решения x1 = x2), если d a;
std::cout <> b;
std::cout <> c;
d = pow(b, 2) — 4 * a*c;
d >= 0 ? xfst = ((-b + sqrt(d)) / double(2 * a)) , xscd = ((-b — sqrt(d)) / double(2 * a)) : std::cout

  1. Николай Сергейчук Автор записи 12.02.2020

if (d >= 0) = 0 ) = 0) = 0, y2 >= 0)

Свежие записи

  • Сера — химические свойства, получение, соединения.
  • Нитрат кальция: способы получения и химические свойства
  • Кальций: способы получения и химические свойства
  • Гидроксид натрия: способы получения и химические свойства
  • Гидроксид кальция: способы получения и химические свойства

Источник: al-shell.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru