Skip to content

denismalchenko/quadratic_equation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Текст тестового задания

Создайте модуль quadratic_equation на языке C, содержащий реализацию функции solve_equation. Аргументы функции — 3 вещественных числа a, b, c. Функция решает квадратное уравнение ax^2+bx+c=0. Модуль будет использоваться в качестве расширения для многофункциональной математической системы, над которой работает несколько десятков разработчиков.

Следует понимать, что:

  1. предполагается, что ваша функция будет использоваться разработчиками других модулей или систем;
  2. код quadratic_equation впоследствии будет поддерживаться не вами;
  3. правила безопасности требуют наличия тестирования модулей (командой make check).

В качестве решения принимается архив с каталогом quadratic_equation.

Принятые решения

  1. Чтобы обеспечить высокую точность вычислений и при этом не плодить множество функций отличающиеся только типом принимаемых аргументов, было решено, что принимаемые аргументы будут типа long double. Возвращаемые значения корней, тоже должны обладать точностью long double.
  2. Возвращаемые значения корней уравнения будут комплексными, т.к. Модуль будет использоваться в качестве расширения для многофункциональной математической системы. Для этого использовался стандартный модуль complex.h
  3. Функция будет возвращать свою структуру данных. Т.к. функция должна вернуть как минимум два корня, и результат выполнения (успешно/не успешно), а фраза Аргументы функции — 3 вещественных числа a, b, c была воспринята как точное указание количества аргументов функции. Поэтому вариант int solve_equation(long double a, long double b, long double c, long double complex* root1, , long double complex* root2); был отвергнут. Подробнее о структуре можно прочесть в документации.
  4. В данной задачи необходимо указывать точность вычисления дискриминанта, т.е. задавать какие минимальные значения дискриминанта считать отличными от нуля, а какие нет. Использовать заранее определенную точность - не гибкое решение. Поэтому была предоставлена возможность пользователю модуля указывать желаемую точность. Использовать для этого глобальные переменные - плохая практика, а увеличивать количество аргументов в функции - запрещено Аргументы функции — 3 вещественных числа a, b, c. Поэтому была создана ещё одна функция с 4 аргументами solve_equation_accur, где пользователь может указывать точность. А функция solve_equation считает с точностью по-умолчанию.
  5. Для удобства пользователя был введен макрос SOLVE_EQUATION, который "перегружал" вызов функций solve_equation и solve_equation_accur в зависимости от количества переданных параметров.
  6. Стиль написания кода в основном соответствует google-style, кроме нейминга, т.к. в задании задано название функции solve_equation - snake case, отличающийся от google-style. Поэтому для нейминга в основном применялся snake case.
  7. В данной реализации была сделана ставка на скорость выполнения функций, поэтому некоторые небольшие функции были реализованы как макросы.
  8. Поскольку предполагается, что ваша функция будет использоваться разработчиками других модулей или систем и код quadratic_equation впоследствии будет поддерживаться не вами было принято решение сделать две разные документации:
  • короткую для пользователей модуля;
  • подробную разработчиков поддерживающих модуль.
    ВАЖНО! При создании, одна документация заменяет другую
  1. Краткая документация написана на английском языке, чтобы обеспечить международное использование. Подробная документация написана на русском языке, потому что меня и так достало переводить краткую надеюсь, что поддержкой будут заниматься русские разработчики.
  2. При написании использовался принцип Разработка через тестирование.
  3. Было больше месяца на написания этого задания, поэтому решил "показать себя" по максимуму:
  • несколько типов задания точности,
  • перегрузка функций макросом,
  • две документации,
  • одна из них на английском,
  • обеспечение работоспособности функции с очень большими и очень малыми значениями коэффициентов.
    Может это и перебор...

Файлы проекта

Сверху лежит этот файл README.md и Makefile и папки:

  • в src расположен код модуля;
  • в test_src расположены файлы для юнит-тестирования;
  • в docs_src расположены файлы для создания документации.

Цели make

Цель Описание
all билдит библиотеку и краткую документацию для пользователя
develop удаляет созданные другими целями файлы, запускает создание отсчета о покрытие кода тестами (и сами тесты), создает подробную документацию
clean удаляет созданные другими целями файлы, возвращает проект в исходное состояние
rebuild удаляет созданные другими целями файлы, билдит библиотеку и краткую документацию для пользователя
check запускает тесты
libquadratic_equation.a билдит библиотеку
gcov_report запускает создание отчета о покрытие модуля тестами
dvi создание краткой документации
dvi_full создание подробной документации

И другие вспомогательные цели.

Дополнительно

Работоспособность модуля тестировалась на Ubuntu 22.04 и не гарантируется на других системах.

Всё остальное указано в документации.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors