Проект на лабораторные работы
В рамках лабораторных работ вам предлагается реализовать законченный проект, включающий в себя:
Приложение, разработанное в соответствии с заданием.
Систему сборки.
Unit-тесты.
Настроенные автоматические сборки (CI).
Работа над проектом разбивается на короткие итерации. Процесс разработки должен быть зафиксирован в системе контроля версий (git). Проект должен быть опубликован на github.
Вам предлагается выполнить проект «геометрия»:
Нужно реализовать операции с геометрическими фигурами: ввод и вывод в одном или нескольких текстовых форматах, вычисление площади, периметра и факта пересечения двух выбранных фигур. Сложность проекта регулируется за счет добавления дополнительных типов фигур.
В проекте возможно несколько вариантов считывания входных данных.
Считывание со стандартного потока ввода. Наиболее простой в реализации, но наименее удобный вариант. Ввод больших массивов данных слишком трудоемок, поэтому удобнее хранить их в файле, а для ввода использовать перенаправление.
Считывание данных из файла. В этом случае синтаксис запуска приложения выглядит следующим образом:
geometry <FILE>
При невозможности открыть файл приложение должно выводить человекопонятное сообщение об ошибке и завершаться с ненулевым кодом.
Гибридный вариант. Если в командной строке указан путь к файлу, то ходы считываются из него. Иначе приложение считывает данные из
stdin
. Аналогичное поведение можно наблюдать у многих стандартных утилит, например, catСинтаксис запуска в этом случае:
geometry [FILE]
Ниже приводятся полное описание проекта. Отдельно взятая лабораторная работа предполагает реализацию небольшой части проекта.
Геометрия
Приложение принимает на вход геометрические фигуры различных типов в WKT-подобном формате.
Для каждой фигуры приложение определяет:
Периметр.
Площадь.
С какими фигурами пересекается текущая.
Поддерживаемые фигуры в зависимости от уровня сложности:
- Easy
Окружность.
- Normal
Окружность, треугольник.
- Hard
Окружность, треугольник, полигон.
Грамматика (EBNF):
Object = 'circle' '(' Point ',' Number ')'
| 'triangle' '(' '(' Point ',' Point ',' Point ',' Point ')' ')'
| 'polygon' '(' '(' Point ',' Point ',' Point {',' Point } ')' ')'
Point = Number Number
Number = (* Floating-point number *)
Дополнительные замечания:
Типы фигур нечувствительны к регистру (case insensitive).
Между токенами может быть произвольное количество пробельных символов.
Для простоты можно считать, что одна фигура занимает ровно одну строку. В строке не может быть нескольких фигур.
Пример входных данных:
triangle((-3.0 -2, -1 0.0, -3.0 2.0, -3 -2))
circle(0 0, 1.5)
triangle((3 -2.0, 3.0 2, 1.0 0, 3.0 -2))
Иллюстрация:
Вывод:
1. triangle((-3 -2, -1 0, -3 2, -3 -2))
perimeter = 9.657
area = 4
intersects:
2. circle
2. circle(0 0, 1.5)
perimeter = 9.4247
area = 7.0686
intersects:
1. triangle
3. triangle
3. triangle((3 -2, 3 2, 1 0, 3 -2))
perimeter = 9.657
area = 4
intersects:
2. circle
Приложение должно обрабатывать некорректные входные данные и выводить сообщения об ошибках. Примеры:
circlee(1.0 2.0, 3)
^
Error at column 0: expected 'circle', 'triangle' or 'polygon'
circle(x1 2, 3.0)
^
Error at column 7: expected '<double>'
circle(1 2, 3.1(
^
Error at column 15: expected ')'
circle(1.0 2.1, 3) 123
^
Error at column 19: unexpected token