Добрый день!
Довольно часто в пособиях по программированию встречаются задания по нахождению решений каких-нибудь математических уравнений. Задача нахождения корней квадратного уравнения — это довольно тривиальная задача, как и многие другие задачи. Решается она очень просто при помощи листа бумаги и ручки, но решение можно автоматизировать посредством написания прикладной программы и её использования. В этой статье мы напишем такую программу.
Алгоритм решения квадратного уравнения
Многие знают, что уравнение вида ax2 + bx + c = 0, где a не равно 0, называют квадратным уравнением.
Существуют различные способы решения квадратных уравнений, но мы рассмотрим решение через дискриминант.
Обозначается дискриминант буквой D. Из школьного курса знаем, что D = b2 — 4ac.
Существует несколько условий:
- Если D > 0, то решение имеет 2 различных вещественных корня.
- Если D = 0, то оба вещественных корня равны.
- Если D < 0, то оба корня являются комплексными числами.
Алгоритм решения довольно прост. Вычисляется дискриминант, если он больше или равен 0, то вычисляются корни по следующей формуле
Также можно объединить две предыдущие формулы в одну
Алгоритм решения квадратного уравнения на C++
Для написания программы, решающей квадратное уравнение, мы прибегнем к тому же алгоритму, но реализуем его на языке программирования C++.
Определимся с переменными. Нам понадобиться всего 4 переменных a, b, x, c. Корни и коэффициенты всегда вещественного типа, поэтому переменные a, b, x, c будут иметь тип double.
Определимся интерфейсом. Пользователь будет вводить в консоль значения для для переменных a, b, c, а после получать на вывод корни уравнения, либо сообщение «Дискриминант меньше 0, корни невещественные.»
Итак, определим в программе в функции main() наши переменные
7 8 9 10 |
double a; double b; double c; double x; |
Вывод и ввод будет осуществляться с консоли, поэтому подключаем заголовок #include <iostream> для ввода\вывода в консоли, #include <cmath> для работы с математическими функциями и область using namespace std;
1 2 3 |
#include <iostream> #include <cmath> using namespace std; |
Просим пользователя ввести значения переменных и сохраняем каждое значение
12 13 14 15 16 17 |
cout << "Введите значение a: "; cin >> a; cout << "Введите значение b: "; cin >> b; cout << "Введите значение c: "; cin >> c; |
Проверяем условие, если дискриминант больше или равен 0, то находим корни и выводим
17 18 19 20 21 22 23 |
if((b*b - 4*a*c) >= 0) //Если дискриминант больше или равен 0 { x = ( -1*b + sqrt(b*b - 4*a*c) ) / (2 * a); cout << "Первый корень равен " << x << endl; x = ( -1*b - sqrt(b*b - 4*a*c) ) / (2 * a); cout << "Второй корень равен " << x << endl; } |
в противном случае выводим сообщение
24 25 26 27 |
else { cout << "Дискриминант меньше 0, корни невещественные." << endl; } |
На этом всё, осталось скомпилировать, запустить и проверить. Запускаем и вводим данные, чтобы D был меньше 0
1 2 3 4 5 |
Введите значение a: 2 Введите значение b: 3 Введите значение c: 3 Дискриминант меньше 0, корни невещественные. Для закрытия данного окна нажмите <ВВОД>... |
В этом случае D = 3*3 — 4*2*3 = -15, а это меньше 0, значит ответ программа дала верный.
Следующая проверка
1 2 3 4 5 6 |
Введите значение a: 2 Введите значение b: 6 Введите значение c: 4 Первый корень равен -1 Второй корень равен -2 Для закрытия данного окна нажмите <ВВОД>... |
Ответы тоже верны. Программа работает правильно.
Ниже представлен весь листинг программы для нахождения корней квадратного уравнения на C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <iostream> #include <cmath> using namespace std; int main() { double a; double b; double c; double x; cout << "Введите значение a: "; cin >> a; cout << "Введите значение b: "; cin >> b; cout << "Введите значение c: "; cin >> c; if((b*b - 4*a*c) >= 0) //Если дискриминант больше или равен 0 { x = ( -1*b + sqrt(b*b - 4*a*c) ) / (2 * a); cout << "Первый корень равен " << x << endl; x = ( -1*b - sqrt(b*b - 4*a*c) ) / (2 * a); cout << "Второй корень равен " << x << endl; } else { cout << "Дискриминант меньше 0, корни невещественные." << endl; } return 0; } |
Программировать так сложно…
Не так сложно, как Вам кажется! Немного литературы, немного практики и смотреть на код решения такой задачи Вы будете по-другому.
Доброго времени суток! Помогите пожалуйста написать программу, которая считает сколько символов в ряде двумерного массива. То есть , например массив 5 на 5, сколько символов в 1 ряде, сколько во 2 и т.д.
Ответил вам по электронной почте
да братан
Критику принимаете? 🙂
Программа дырявая как сито.
if((b*b - 4*a*c) >= 0
Если число очень маленькое, но положительное, например 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-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()
{
/*Решение квадратных уравнений*/
setlocale(0, «»);
cout << "Квадратное уравнение." << '\n';
double a;
double b;
double c;
double D;
double x;
double x1;
double x2;
cout <> a;
cout <> b;
cout <> c;
D = pow(b, 2) — 4 * a * c;
cout << "Дискриминант равен: " << D < 0) {
cout << "Уравнение содержит два корня. " << '\n';
x1 = (-b + sqrt(D)) / 2 * a;
cout << "Первый корень равен: " << x1 << '\n';
x2 = (-b — sqrt(D)) / 2 * a;
cout << "Второй корень равен: " << x2 << '\n';
}
if ((D) == 0) {
cout << "Уравнение содержит один корень. " << '\n';
x = -b / 2 * a;
cout << "Корень равен: " << x << '\n';
}
if ((D) < 0) {
cout << "Уравнение не имеет корней. " << '\n';
}
system("pause");
return 0;
}
ну и? если даже тупо скопировать код и вставить его в cpp.sh , ничего не работает. поебота какая то этот с++
Уважаемая, Лена! Я, надеюсь, вы знаете, что код программы, написанной на языке программирования C++ нельзя тупо вставить в блокнот и сохранить под названием «cpp.sh»? Если не знали, то я, видимо, открыл для вас Америку!
помогите решить. заданы 3 перемены a.b.c записать вы радение на С
{ 7a/b+2a, если a=b,
Х= { -34, если a>b,
{ 3a/(2b-100), если a>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 < 0, то просто выводится "нет решения", но компилятор выдает, что что-то не так со вторым условием. Подскажите пожалуйста, что именно. Спасибо.
#include "pch.h"
#include
#include «math.h»
int main()
{
double a, b, c, d, xfst, xscd;
std::cout <> 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 << "no solution";
std::cout << "x1 = " << xfst << "" << std::endl;
std::cout << "x2 = " << xscd << "" << std::endl;
return 0;
if (d >= 0) {
xfst = ((-b + sqrt(d)) / double(2 * a));
xscd = ((-b — sqrt(d)) / double(2 * a));
std::cout << "x1 = " << xfst << "" << std::endl; std::cout << "x2 = " << xscd << "" << std::endl; } else { std::cout << "no solution"; }
Создать программу для решения квадратного уравнения.
У меня не получаеться, но и копифейсом я не хочу заниматься.
Прошу помогите. Заранее спасибо.