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

Добрый день!

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

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

Многие знают, что уравнение вида 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() наши переменные

Вывод и ввод будет осуществляться с консоли, поэтому подключаем заголовок #include <iostream> для ввода\вывода в консоли, #include <cmath> для работы с математическими функциями и область using namespace std;

Просим пользователя ввести значения переменных и сохраняем каждое значение

Проверяем условие, если дискриминант больше или равен 0, то находим корни и выводим

в противном случае выводим сообщение

На этом всё, осталось скомпилировать, запустить и проверить. Запускаем и вводим данные, чтобы D был меньше 0

В этом случае D = 3*3 — 4*2*3 = -15, а это меньше 0, значит ответ программа дала верный.

Следующая проверка

Ответы тоже верны. Программа работает правильно.

Ниже представлен весь листинг программы для нахождения корней квадратного уравнения на C++

 

 

 

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

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

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

      1. Strength

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

  1. Блог программиста

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

    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. Николай Сергейчук Автор записи

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *