Создайте модуль quadratic_equation на языке C, содержащий реализацию функции solve_equation. Аргументы функции — 3 вещественных числа a, b, c. Функция решает квадратное уравнение ax^2+bx+c=0. Модуль будет использоваться в качестве расширения для многофункциональной математической системы, над которой работает несколько десятков разработчиков.
Следует понимать, что:
- предполагается, что ваша функция будет использоваться разработчиками других модулей или систем;
- код quadratic_equation впоследствии будет поддерживаться не вами;
- правила безопасности требуют наличия тестирования модулей (командой make check).
В качестве решения принимается архив с каталогом quadratic_equation.
- Чтобы обеспечить высокую точность вычислений и при этом не плодить множество функций отличающиеся только типом принимаемых аргументов, было решено, что принимаемые аргументы будут типа
long double. Возвращаемые значения корней, тоже должны обладать точностьюlong double. - Возвращаемые значения корней уравнения будут комплексными, т.к.
Модуль будет использоваться в качестве расширения для многофункциональной математической системы. Для этого использовался стандартный модульcomplex.h - Функция будет возвращать свою структуру данных. Т.к. функция должна вернуть как минимум два корня, и результат выполнения (успешно/не успешно), а фраза
Аргументы функции — 3 вещественных числа a, b, cбыла воспринята как точное указание количества аргументов функции. Поэтому вариантint solve_equation(long double a, long double b, long double c, long double complex* root1, , long double complex* root2);был отвергнут. Подробнее о структуре можно прочесть в документации. - В данной задачи необходимо указывать точность вычисления дискриминанта, т.е. задавать какие минимальные значения дискриминанта считать отличными от нуля, а какие нет. Использовать заранее определенную точность - не гибкое решение. Поэтому была предоставлена возможность пользователю модуля указывать желаемую точность.
Использовать для этого глобальные переменные - плохая практика, а увеличивать количество аргументов в функции - запрещено
Аргументы функции — 3 вещественных числа a, b, c. Поэтому была создана ещё одна функция с 4 аргументамиsolve_equation_accur, где пользователь может указывать точность. А функцияsolve_equationсчитает с точностью по-умолчанию. - Для удобства пользователя был введен макрос
SOLVE_EQUATION, который "перегружал" вызов функцийsolve_equationиsolve_equation_accurв зависимости от количества переданных параметров. - Стиль написания кода в основном соответствует google-style, кроме нейминга, т.к. в задании задано название функции
solve_equation- snake case, отличающийся от google-style. Поэтому для нейминга в основном применялся snake case. - В данной реализации была сделана ставка на скорость выполнения функций, поэтому некоторые небольшие функции были реализованы как макросы.
- Поскольку
предполагается, что ваша функция будет использоваться разработчиками других модулей или системикод quadratic_equation впоследствии будет поддерживаться не вамибыло принято решение сделать две разные документации:
- короткую для пользователей модуля;
- подробную разработчиков поддерживающих модуль.
ВАЖНО! При создании, одна документация заменяет другую
- Краткая документация написана на английском языке, чтобы обеспечить международное использование. Подробная документация написана на русском языке, потому что
меня и так достало переводить краткуюнадеюсь, что поддержкой будут заниматься русские разработчики. - При написании использовался принцип
Разработка через тестирование. - Было больше месяца на написания этого задания, поэтому решил "показать себя" по максимуму:
- несколько типов задания точности,
- перегрузка функций макросом,
- две документации,
- одна из них на английском,
- обеспечение работоспособности функции с очень большими и очень малыми значениями коэффициентов.
Может это и перебор...
Сверху лежит этот файл README.md и Makefile и папки:
- в src расположен код модуля;
- в test_src расположены файлы для юнит-тестирования;
- в docs_src расположены файлы для создания документации.
| Цель | Описание |
|---|---|
| all | билдит библиотеку и краткую документацию для пользователя |
| develop | удаляет созданные другими целями файлы, запускает создание отсчета о покрытие кода тестами (и сами тесты), создает подробную документацию |
| clean | удаляет созданные другими целями файлы, возвращает проект в исходное состояние |
| rebuild | удаляет созданные другими целями файлы, билдит библиотеку и краткую документацию для пользователя |
| check | запускает тесты |
| libquadratic_equation.a | билдит библиотеку |
| gcov_report | запускает создание отчета о покрытие модуля тестами |
| dvi | создание краткой документации |
| dvi_full | создание подробной документации |
И другие вспомогательные цели.
Работоспособность модуля тестировалась на Ubuntu 22.04 и не гарантируется на других системах.
Всё остальное указано в документации.