Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2014, 17:48   #1
Nil09511
Пользователь
 
Регистрация: 11.11.2014
Сообщений: 13
По умолчанию Задача с квадратами на паскале

Помогите написать программу. И возможно ли решение без массивов?
Даны натуральное число n, действительные числа x1,...,x3n. Последовательность чисел x1,...,x3n определяет на плоскости n квадратов со сторонами, параллельными координатным осям: так, x1, x2 - координаты центра первого квадрата, x3 - длина его стороны; аналогично, числа x4, x5, x6 определяют второй квадрат, x7, x8, x9 - третий и т.д. Имеются ли точки, принадлежащие всем квадратам? Если да, то указать координаты одной из них.
Nil09511 вне форума Ответить с цитированием
Старый 11.11.2014, 18:26   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Решение без массивов возможно.
Нужно считать первые 3 числа и принять их за область пересечения.
Затем в цикле считывать по 3 числа, искать область пересечения этого квадрата с имеющейся областью и сохранять полученную область вместо имеющейся.
Если область на каком-то шаге вырождается (не существует), то печатается ответ "Нет" и происходит выход из цикла.
Если после считывания всех квадратов была получена общая для них всех область пересечения, то печатается ответ "Да" и любая точка из этой области.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.11.2014, 18:42   #3
Nil09511
Пользователь
 
Регистрация: 11.11.2014
Сообщений: 13
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Затем в цикле считывать по 3 числа, искать область пересечения этого квадрата с имеющейся областью и сохранять полученную область вместо имеющейся.
Проблема с нахождением пересечения. Как его найти?

BDA, нашёл ваш ответ на подобную задачу из этой темы http://www.programmersforum.ru/showthread.php?t=195787
Можете его прокомментировать?
"Мой алгоритм:
1) инициализируем top, right - максимальными, bottom ,left - минимальными значениями
2) считываем 3 числа x, y, a
3) if x-a/2>left then left=x-a/2
if x+a/2<right then rigth=x+a/2
if y-a/2>bottom then bottom=y-a/2
if y+a/2<top then top=y+a/2
4) после считывания всех троек точек, если top>=bottom и right>=left, то точки есть"

Последний раз редактировалось Stilet; 11.11.2014 в 20:09.
Nil09511 вне форума Ответить с цитированием
Старый 11.11.2014, 19:16   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Область пересечения удобнее хранить как координаты левой, правой сторон, верха и низа. Затем преобразовать 3 числа, задающих квадрат, в область, заданную 4 числами. Пересечение двух прямоугольников:
лево = максимум(лево1, лево2)
право = минимум(право1, право2)
верх = минимум(верх1, верх2)
низ = максимум(низ1, низ2)

Цитата:
нашёл ваш ответ
Хаха, всё повторяется

Для понимания просто нарисуйте 2 пересекающихся прямоугольника на бумаге и проследите, как получаются выше написанные равенства.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 11.11.2014 в 19:20.
BDA вне форума Ответить с цитированием
Старый 11.11.2014, 19:20   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ещё чуть дополню ответ.
Если на любом шаге область пересечения стала равной нулю (у очередного прямоугольника нет пересечения с предыдущей областью), то уже оставшиеся координаты можно не считывать - ответ отрицательный, общих точек нет.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.11.2014, 19:31   #6
Nil09511
Пользователь
 
Регистрация: 11.11.2014
Сообщений: 13
По умолчанию

Хорошо. Поясните насчёт координат сторон. Как это выглядит в программе? Я не понимаю
Nil09511 вне форума Ответить с цитированием
Старый 11.11.2014, 19:41   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
left := max(left, x - a/2);
right := min(right, x + a/2);
bottom := max(bottom, y - a/2);
top := min(top, y + a/2);
По сути, те же if'ы.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.11.2014, 19:49   #8
Nil09511
Пользователь
 
Регистрация: 11.11.2014
Сообщений: 13
По умолчанию

Чёрт, это гениально и просто! Спасибо)
Nil09511 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить в файле q все компоненты файла f являющиеся точными квадратами (Pascal) Ziner_Fisher Помощь студентам 2 02.12.2013 14:11
Аппроксимация функции наименьшими квадратами ivan.tiran Общие вопросы C/C++ 0 27.11.2013 17:59
В С++ определить количество цифр в числе, являющихся квадратами некоторого числа mmf_Valya Помощь студентам 1 20.10.2012 19:13
Найти количество чисел ai(i = 1, 2, ..., n), являющихся полными квадратами. (в Паскале) vasya1 Паскаль, Turbo Pascal, PascalABC.NET 3 01.02.2012 06:45