Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
34
Добавлен:
08.12.2019
Размер:
303.82 Кб
Скачать

Минобрнауки РФ

Санкт-Петербургский государственный электротехнический университет

им. В.И. Ульянова (Ленина) «ЛЭТИ»

(СПбГЭТУ)

Факультет компьютерных технологий и информатики

Кафедра САПР

ОТЧЁТ

По лабораторной работе №2

«Определение принадлежности точки области»

Преподаватель: ______________________ Калмычков В. А.

Студент гр. 8309: ______________________ Янтиков Д. А.

Санкт-Петербург

2018

Оглавление

Формулировка задания 3

Цель работы 3

Анализ задания и контрольный пример 3

Математическая постановка задачи 3

Блок-схема 5

Текст программы 6

Примеры работы программы 9

Вывод 9

Приложение 10

Формулировка задания

Написать программу, определяющую, принадлежит ли точка с координатами (x, y) заштрихованной области:

Рис. 1

Цель работы

Изучение операторов If и Else, а также их применение для решения задач разного типа. Изучение библиотеки “math.h” и ее использование при решении задач.

Анализ задания и контрольный пример

  • Укажите начальные координаты крайней левой точки палубы (X Y) через пробел:0 5

  • Укажите длину палубы (>=0):10

  • Укажите начальные координаты крайней левой точки дна (X Y) через пробел:3 0

  • Укажите длину дна (>=0):4

  • Укажите начальную координату крайней левой точки трубы по оси X:1

  • Укажите ширину трубы (>=0):1

  • Укажите высоту трубы (>=0):23

  • Введите координаты произвольной точки (X Y) через пробел:4 1

  • Точка принадлежит заштрихованной области

Математическая постановка задачи

Дано: Начальные координаты крайней левой точки палубы и дна (x, y), длина палубы, длина дна, начальная координата крайней левой точки трубы по оси x, ширина трубы, высота трубы.

Найти: Принадлежит ли произвольно введенная с клавиатуры точка с координатами (x, y) внутренней области образовавшейся фигуры.

Способ решения: По введённым пользователем некоторым начальным координатам фигуры, применяя математические действия, находятся остальные координаты, необходимые для сравнение координат произвольной точки со сторонами фигуры.

Особенности решения задачи на компьютере: По заданным пользователем начальным значениям вычисляются остальные координаты фигуры при помощи несложных математический вычислений. Однако программа не предусматривает случай, когда все введенные координаты фигуры равны 0. При вводе отрицательных значений длин сторон фигуры, программа выдает ошибку (Рис. 3). Программа предусматривает возможность “кораблика” отражаться относительно оси X, а также, при совпадающих дне и палубе программа запрашивает указать направление “трубы” фигуры (Рис. 5).

Организация диалога с пользователем: Программа выводит на экран приветствие и условие задачи. Затем предлагает пользователю задать определенные параметры фигуры. При неверно введенных данных на экране появится «Ошибка построения», иначе пользователю будет предложено задать координаты произвольной точки. После чего на экране появится: «Точка принадлежит заштрихованной области», в случае, если точка находится в плоскости фигуры; «Точка не принадлежит заштрихованной области», в случае, если точка лежит за пределами фигуры.

Определение внутреннего формата представления данных: Все начальные переменные в программе имеют тип float. При выполнении действий программа также работает с переменными типа float.

Описание алгоритма: Ввод значений переменных для задания фигуры. Проверка их на корректность. Рассмотрение нескольких случаев построения фигуры. Сравнение введенных координат произвольной точки с внутренней областью фигуры.

Блок-схема

Рис. 2

Текст программы

#include "pch.h"

#include "iostream"

#include "iomanip"

#include "math.h"

using namespace std;

int main(int)

{

setlocale(LC_ALL, "Russian");

float x, y, a, a1, b, b1, c, c1, d, d1, lp, t, t1, r, r1, p, p1, k, k1, ht, lt, ld, n;

cout << "Iantikov Daniil, 8309." << endl << "Version 2.1.2 " << endl << "(11.09.2018 - 16.09.2018)" << endl << endl;

cout << "Определить, принадлежит ли точка с координатами (X Y) заштрихованной обалсти." << endl << endl;

cout << "Y| " << endl;

cout << " | " << endl;

cout << " | 0000000 " << endl;

cout << " | 0 / / 0 " << endl;

cout << " | 0 / / 0 " << endl;

cout << " | 0 / / 0 " << endl;

cout << " | 0 / / 0 " << endl;

cout << " | 0 / / 0 " << endl;

cout << " | 0 / / 0 " << endl;

cout << " |00000 / / 00000000000000000000" << endl;

cout << " | 0 / / / / / / / / / / / / /0" << endl;

cout << " | 0 / / / / TITANIC / / / /0" << endl;

cout << " | 0 / / / / / / / / / / /0" << endl;

cout << " | 0 / / / / / / / / / /0" << endl;

cout << " O-----00000000000000000000------------" << endl;

cout << " X" << endl << endl;

cout << "Укажите начальные координаты крайней левой точки палубы (X Y) через пробел:";

cin >> a >> a1;

cout << "Укажите длину палубы (>=0):";

cin >> lp;

if (lp < 0)

{

cout << "Ошибка введенных данных";

return 0;

}

cout << "Укажите начальные координаты крайней левой точки дна (X Y) через пробел:";

cin >> c >> c1;

cout << "Укажите длину дна (>=0):";

cin >> ld;

if (ld < 0)

{

cout << "Ошибка введенных данных";

return 0;

}

b1 = a1;

b = a + lp;

d1 = c1;

d = c + ld;

t1 = a1;

cout << "Укажите начальную координату крайней левой точки трубы по оси X:";

cin >> t;

cout << "Укажите ширину трубы (>=0):";

cin >> lt;

if (lt < 0)

{

cout << "Ошибка введенных данных";

return 0;

}

cout << "Укажите высоту трубы (>=0):";

cin >> ht;

if (ht < 0)

{

cout << "Ошибка введенных данных";

return 0;

}

if (a1 < c1)

{

r = t;

r1 = t1 - ht;

p = r + lt;

p1 = r1;

k = t + lt;

k1 = t1;

if ((ld > lp) || (c < a) || (d > b) || (c > b) || (d < a) || (lt > lp) || (t < a) || (t > b) || (k < a) || (k > b) || (r1 > t1))

{

cout << "Ошибка построения" << endl;

return 0;

}

else

{

cout << "Введите координаты произвольной точки (X Y) через пробел:";

cin >> x >> y;

if (((y <= c1) && (y >= a1) && (((x - a) * (c1 - a1) - (c - a) * (y - a1)) >= 0) && (((x - b) * (d1 - b1) - (d - b) * (y - b1)) <= 0) && (x >= a) && (x <= b)) || ((x >= t) && (x <= k) && (y <= t1) && (y >= r1)))

{

cout << endl << "Точка принадлежит заштрихованной области" << endl << endl;

}

else

{

cout << endl << "Точка не принадлежит заштрихованной области" << endl << endl;

}

}

}

if (a1 > c1)

{

r = t;

r1 = t1 + ht;

p = r + lt;

p1 = r1;

k = t + lt;

k1 = t1;

if ((ld > lp) || (c < a) || (d > b) || (c > b) || (d < a) || (lt > lp) || (t < a) || (t > b) || (k < a) || (k > b) || (r1 < t1))

{

cout << "Ошибка построения" << endl;

return 0;

}

else

{

cout << "Введите координаты произвольной точки (X Y) через пробел:";

cin >> x >> y;

if (((y >= c1) && (y < a1) && (((x - a) * (c1 - a1) - (c - a) * (y - a1)) <= 0) && (((x - b) * (d1 - b1) - (d - b) * (y - b1)) >= 0) && (x >= a) && (x <= b)) || ((x >= t) && (x <= k) && (y >= t1) && (y <= r1)))

{

cout << endl << "Точка принадлежит заштрихованной области" << endl << endl;

}

else

{

cout << endl << "Точка не принадлежит заштрихованной области" << endl << endl;

}

}

}

if (a1 = c1)

{

cout << "Задайте направление трубы (Вверх - 1, Вниз - 0):";

cin >> n;

if ((n != 0) && (n != 1))

{

cout << "Ошибка введенных данных";

return 0;

}

else

{

if (n == 1)

{

r = t;

r1 = t1 + ht;

p = r + lt;

p1 = r1;

k = t + lt;

k1 = t1;

if ((ld > lp) || (c < a) || (d > b) || (c > b) || (d < a) || (lt > lp) || (t < a) || (t > b) || (k < a) || (k > b) || (r1 < t1) || (lp < 0) || (ld < 0) || (ht < 0) || (lt < 0))

{

cout << "Ошибка построения" << endl;

return 0;

}

else

{

cout << "Введите координаты произвольной точки (X Y) через пробел:";

cin >> x >> y;

if (((y >= c1) && (y < a1) && (((x - a) * (c1 - a1) - (c - a) * (y - a1)) <= 0) && (((x - b) * (d1 - b1) - (d - b) * (y - b1)) >= 0) && (x >= a) && (x <= b)) || ((x >= t) && (x <= k) && (y >= t1) && (y <= r1)))

{

cout << endl << "Точка принадлежит заштрихованной области" << endl << endl;

}

else

{

cout << endl << "Точка не принадлежит заштрихованной области" << endl << endl;

}

}

}

if (n == 0)

{

r = t;

r1 = t1 - ht;

p = r + lt;

p1 = r1;

k = t + lt;

k1 = t1;

if ((ld > lp) || (c < a) || (d > b) || (c > b) || (d < a) || (lt > lp) || (t < a) || (t > b) || (k < a) || (k > b) || (r1 > t1) || (lp < 0) || (ld < 0) || (ht < 0) || (lt < 0))

{

cout << "Ошибка построения" << endl;

return 0;

}

else

{

cout << "Введите координаты произвольной точки (X Y) через пробел:";

cin >> x >> y;

if (((y <= c1) && (y >= a1) && (((x - a) * (c1 - a1) - (c - a) * (y - a1)) >= 0) && (((x - b) * (d1 - b1) - (d - b) * (y - b1)) <= 0) && (x >= a) && (x <= b)) || ((x >= t) && (x <= k) && (y <= t1) && (y >= r1)))

{

cout << endl << "Точка принадлежит заштрихованной области" << endl << endl;

}

else

{

cout << endl << "Точка не принадлежит заштрихованной области" << endl << endl;

}

}

}

}

}

}

Соседние файлы в папке 1 семестр Калмычков