IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Найти непересекающиеся окружности
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Женский
Реальное имя: Марина

Репутация: -  0  +


Я вообще не понимаю в програмировании.Никогда не было информатики а тут надо одну задачу решить и зачет.Рещите пожалуйста кто умеет .Нужно в турбо паскале.Буду оч благодарна(шоколадку обеспечу))


Окружность на плоскости задана координатами X,Y,R-радиус(все значения формируются случайным образом).Из 20-ти окружностей показать те,которые не пересекают другие.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Примерно вот так:
const
n= 20;

var
c: array[1..n] of record
x,y,r: double
end;
i,j: integer;

begin
randomize;
for i:=1 to n do with c[i] do begin
x:= random*100-50;
y:= random*100-50;
r:= random*12
end;
for i:=1 to n do with c[i] do begin
write(i:3,': x=',x:7:3,' y=',y:7:3,' r=',r:6:3);
j:= 1;
while (j<=n) and ((i=j) or (Sqrt(Sqr(c[j].x-x)+Sqr(c[j].y-y))>c[j].r+r)) do inc(j);
if j>n then writeln(' - не пересекается с другими') else writeln
end;
readln
end.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 3
Пол: Женский
Реальное имя: Марина

Репутация: -  0  +


Спасибо огромное!!как тебе шоколадку передать? d3.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Андрей, одна окружность лежащая внутри другой, но не касающаяся и не пересекающая её, наверное, тоже должна считаться непересекающейся ни с чем?

Я про вот такой случай:
const
n = 4;
c: array[1..n] of record
x,y,r: double
end =
(
(x:3; y:3; r:1),
(x:7; y:2; r:1),
(x:8; y:5; r:1), // <-- Лежит внутри №4
(x:8; y:5; r:3)
);

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(IUnknown @ 17.10.2011 23:41) *
Андрей, одна окружность лежащая внутри другой, но не касающаяся и не пересекающая её, наверное, тоже должна считаться непересекающейся ни с чем?
Да, я тоже так думаю. Спасибо, Володь, я опять выпустил этот случай из виду, +1 тебе.
Конечно, нужно проверять вложенные окружности.. Как-то вот так, если не ошибся в спешке:
const
n= 20;

var
c: array[1..n] of record
x,y,r: double
end;
i,j: integer;

begin
for i:=1 to n do with c[i] do begin
x:= random*100-50;
y:= random*100-50;
r:= random*12
end;
for i:=1 to n do with c[i] do begin
write(i:3,': x=',x:7:3,' y=',y:7:3,' r=',r:6:3);
j:= 1;
while
(j<=n) and (
(i=j) or
(Sqrt(Sqr(c[j].x-x)+Sqr(c[j].y-y)) > c[j].r+r) or { лежит снаружи }
(Sqrt(Sqr(c[j].x-x)+Sqr(c[j].y-y)) < abs(c[j].r-r)) { лежит внутри }
)
do inc(j);
if j>n then writeln(' - не пересекается с другими') else writeln
end;
readln
end.

Цитата(Carrera @ 17.10.2011 23:24) *

Спасибо огромное!!как тебе шоколадку передать? d3.gif
Спасибо! smile.gif
Боюсь, передача выйдет тебе недешево: полшоколадки на один континент, пол - на другой.. )) Мы с IUnknown дарим ее тебе (верно, Володь?), съешь сама. Только честно! smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6





Группа: Пользователи
Сообщений: 3
Пол: Женский
Реальное имя: Марина

Репутация: -  0  +


Ребята,спасибо вам огромное.я как сдам.вам отпишу)жаль что с шоколадкой так плохо получилось(
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> j:= 1;
> while (j<=n) and ((i=j) or (Sqrt(Sqr(c[j].x-x)+Sqr(c[j].y-y))>c[j].r+r)) do inc(j);

Мне этот код почему-то напомнил вот это: http://govnokod.ru/4883
Там человек задался целью написать всю логику программы в одном булевом выражении в заголовке while.
Я надеюсь, ты это написал не всерьёз, а чтобы оставить человеку "на дом" задачу переделать это в нормальный вид.


Ну и чисто от себя добавлю, что в данной задаче можно избавиться от квадрата (перебор всех пар окружностей), если ввести сетку и хеширование.
Я уж не говорю о том, что вместо sqrt(a)>b выгоднее проверять a>sqr(b).

Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(TarasBer @ 19.10.2011 16:35) *
Я надеюсь, ты это написал не всерьёз, а чтобы оставить человеку "на дом" задачу переделать это в нормальный вид.
Ну и чисто от себя добавлю, что в данной задаче можно избавиться от квадрата (перебор всех пар окружностей), если ввести сетку и хеширование.
Ну, ясно дело, тут есть, что оптимизировать.. ))

Цитата
Я уж не говорю о том, что вместо sqrt(a)>b выгоднее проверять a>sqr(b).
Может быть, но я не уверен..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> но я не уверен..

В чём? Что умножить число на себя быстрее, чем взять корень? Или что b не окажется отрицательным? Или что переполнения с типом double тут не случится?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 25.04.2024 5:51
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name