[[TOC]]
Необходимо познакомьтесь с сообщениями, которые выдает компилятор во время компиляции
программы с синтаксическими ошибками
Неправильно указана команда препроцессора, команды препроцессора должны начинаться
с символа #
. Исправим добавив этот символ.
Для команды препроцесора #include
необходимо указывать имя
подключаемого файла в формате <FILENAME>
для библиотек и "FILENAME"
для внутренних файлов. Исправим на <stdio.h>
,
так как данная библиотека стандартная.
Неправильное описание функции. Функции должны объявляется
следующим образом.
Исправим код в соответствие выше указанным примером.
Неправильное присваивание переменной значения. Исправим убрав символ :
Использование необъявлённой функции print
. Необходимо исправить название функции
на printf
.
Неправильное оформление строки. Строки в Си указываются в двойных ковычках "some_text"
Пропущен символ ;
, обозначающий конец операции. Исправим добавив его.
Объявление неиспользуемой переменной. Это предупреждение возникло из-за неправильного
использования форматированного вывода.
Треугольник задан координатами своих вершин. Найти периметр треугольника.
Выделил следующие смысловые блоки:
coord.h
)
vector_lenght
- вычисляет длину вектора (отрезка) по двум точкамcount_perimeter
- вычисляет переметр треугольника по трём сторонамio_module.h
)
input_point
- ввод координат точкиoutput_perimeter
- вывод значения периметраИспользовал следующие математические формулы:
Три сопротивления R1, R2, R3 соединены параллельно. Найти сопротивление соединения.
Выделил следующие смысловые блоки:
resistence.h
)
parallel_resistance
- подсчёт сопротивления для 3-х соеденённых резистровio_module.h
)
input_resistence
- ввод сопротивленияoutput_resistence
- вывод сопротивленияИспользовал следующие математические преобразования:
| для трёх резистров, соеденных параллельно
| Привёл к общему знаменателю
| Выразил нужное нам значение
Важное замечание, если сопротивление любого резистра стремится к нулю, то и общее сопротивление стремится к нулю
Задано время в секундах. Перевести в часы, минуты, секунды.
Выделил следующий смысловой блок:
time_module.h
)
input_seconds
- ввод времени в секундахoutput_formated_time
- вывод преобразованного формата (Ч:М:С)convert_time
- преобразование секундного представления в формат (Ч:М:С)Использовал целочисленное деление и остаток от деления при преобразование согласно следующим зависимостям:
Функцию printf("%d", i)
можно вызывать лишь при i
= 0, 1, 2, …, 9. Составить программу, печатающую десятичную запись заданного
натурального числа n > 0.
Выделил следующий смысловой блок:
numeric.h
)
input_number
- ввод числа и проверка на корректность вводаprint_number
- вывод числаget_digits_of_number
- подсчёт количества разрядов числаВывожу число по-разрадно от большего к меньшему разряду с помощью операций целочисленного деления на (где - номер выводимого разряд) и операции остатка от деления на .
Неправильный вывод при работе с большими числами. Проблема заключалась в том, что возведение в степень в библиотеке math
выполняется с погрешностью (), что привело к неправильному вычислению , где - количество разрядов числа. Происходило целочисленное округление до , что нарушает работу алгоритма. Исправил, возводя в степень с помощью циклического умножения на число, то есть
Написал тесты. Для простоты тестирования написал программу которая парсит мой файл с тестами tests.txt и тестирует программу.
Ссылка на репозиторий: https://git.iu7.bmstu.ru/lvn19u232/auto_test
Проверил покрытие для каждого файла.
Определить пересекаются ли два отрезка.
Обратился к статье Вычислительная геометрия, или как я стал заниматься олимпиадным программированием. Часть 2. Где нашёл объяснение математического решения моей задачи.
Задача №6
Определить пересекаются ли два отрезка.
Решение
Вот эта задача мне, действительно, нравится. Отрезки пересекаются тогда, когда, концы каждого отрезка лежат по разные стороны от другого отрезка. Посмотрим на рисунок:
Итак, нам нужно проверить, чтобы концы каждого из отрезков лежали по разные стороны относительного концов другого отрезка. Пользуемся косым произведением векторов. Посмотрите на первый рисунок: , => . Аналогично
. Вы наверно думаете, почему не меньше либо равно. А потому, что возможен следующий случай, при котором векторное произведение как раз и равно нулю, но отрезки не пересекаются:
Поэтому нам необходимо сделать еще одну проверку, а именно: принадлежит ли хотя бы один конец каждого отрезка другому (принадлежность точки отрезку). Эту задачу мы уже решали.
Итак, для того чтобы отрезки имели общие точки необходимо и достаточно:
Ознакомившись со статьёй, разбил решение на следующие смысловые блоки:
io_module.h
)
input_point
- ввод координат точкиinput_segment
- ввод отрезка по двум точкамoutput_intersect
- вывод результат пересеченияvectors.h
)
points_is_equal
- проверка точек на совпадениеcreate_segment
- создание отрезка по двум точкамsegment_to_vector
- преобразования отрезка в векторcreate_vector
- создание вектора по двум точкамscalar_product
- функция скалярного произведения векторовvector_product
- функция векторного произведения (здесь косового, так как используется вычисления на плоскости )is_belongs_to_segment
- проверка на принадлежность точки отрезкуis_segments_intersect
- проверка на пересечение двух отрезковВозникли проблемы с проблемы с прохождением тестов. Опишу их:
points_is_equal
).Написал тесты и произвёл тестирование.
Проверил покрытие тестами.
Не удалось достичь 100% покрытия. Разбираем участки кода, не покрытые тестами.
main.c
Не достигается вывод ошибки о нулевом указателе и неизвестной ошибке. Данных ошибок не возможно достичь в рамках правильно работающей программы.
io_module.c
Не достигается возврат ошибки нулевого указателя.
vectors.c
Здесь тестами выявлены неиспользуемые функции:
create_segment
- создание отрезка по двум точкамиscalar_product
скалярное произведение векторовis_belongs_to_segment
принадлежность точки отрезкуДанные функции стали неиспользуемыми по мере разработки программы. Принял решение оставить данные функции, так как они имеют своё логическое наличие в рамкох модуля работы с векторами.
Вычислить с точность eps:
− приближенное значение функции s(x);
− точное значение функции f(x);
− абсолютную и относительную ошибки приближенного значения.
Разбил решение на следующие смысловые блоки:
io_module.h
)
input_value
- ввод значения ()input_eps
- ввод точности ()output_absolute_value
- вывод абсолютного значения функцииoutput_relative_value
- вывод приблизительного значения функцииoutput_absolute_difference
- вывод абсолютной погрешностиoutput_relative_difference
- вывод относительной погрешностиuntils.h
)
f
- функция f по условиюs
- функция члена s, представленная в рекурентном видеfind_with_precision
- функция поиска суммы ряда с точность epsget_absolute_difference
- подсчёт абсолютной погрешностиget_relative_difference
- подсчёт относительной погрешностиНаписал тесты и произвёл тестирование программы.
Проверяю покрытие тестами.
Не удалось достичь 100% покрытия. Разбираем участки кода, не покрытые тестами.
io_module.c
Не покрыты тестами участки кода, возвращающие ошибку нулевого указателя.