Pascal. Пересекающиеся окружности
Задан массив, размером n строк на 3.(Const n=10, элементы массива типа байт) Первые два элемента строки координаты центра окружности, третий элемент ее радиус. Найти число пересекающихся окружностей. (Ответ: № окружности число пересечений)
P.S. буду очень благодарен!
P.S. буду очень благодарен!
Расстояние между двумя точками вычисляется по теореме Пифагора.
Две окружности пересекаются, если расстояние между их центрами меньше суммы их радиусов.
Две окружности пересекаются, если расстояние между их центрами меньше суммы их радиусов.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
Хыиуду, задачка то с подковыркой... :-)
к сожалению, не так... они могут и не пересекаться в случае когда меньшая окружность полностью внутри большей..." писал(а):Две окружности пересекаются, если расстояние между их центрами меньше суммы их радиусов.
Спасибки большое, мож кому пригодиться текст программы:
Var a:array[1..n] of real;
b:array[1..n] of real;
r:array[1..n] of real;
i,KolvoPeresecheni: integer;
sum,d,L:real;
count:integer;
Begin
Clrscr;
writeln('Vvedite ', n , ' elementov massiva dlya x');
for i:=1 to n do
readln(a);
writeln('vvedite ',n, ' elementov massiva dlya y');
for i:=1 to n do
readln(b);
writeln('vvedite ', n, ' radiusov okryznostey');
for i:=1 to n do
readln(r);
if r<0 then writeln ('vvedeno nevernoe chislo radiysov');
KolvoPeresecheni := 0;
i:= 0;
for i:=1 to n-1 do
begin
L:=sqrt(sqr(a-a[i+1])+sqr(b-b[i+1]));
if L < r+r[i+1] then KolvoPeresecheni := KolvoPeresecheni + 1;
end;
Writeln(' okryznosti peresekaitsa -', KolvoPeresecheni, 'raz.');
Readln;
End.
Var a:array[1..n] of real;
b:array[1..n] of real;
r:array[1..n] of real;
i,KolvoPeresecheni: integer;
sum,d,L:real;
count:integer;
Begin
Clrscr;
writeln('Vvedite ', n , ' elementov massiva dlya x');
for i:=1 to n do
readln(a);
writeln('vvedite ',n, ' elementov massiva dlya y');
for i:=1 to n do
readln(b);
writeln('vvedite ', n, ' radiusov okryznostey');
for i:=1 to n do
readln(r);
if r<0 then writeln ('vvedeno nevernoe chislo radiysov');
KolvoPeresecheni := 0;
i:= 0;
for i:=1 to n-1 do
begin
L:=sqrt(sqr(a-a[i+1])+sqr(b-b[i+1]));
if L < r+r[i+1] then KolvoPeresecheni := KolvoPeresecheni + 1;
end;
Writeln(' okryznosti peresekaitsa -', KolvoPeresecheni, 'raz.');
Readln;
End.
Serge_Bliznykov писал(а):Хыиуду, задачка то с подковыркой... :-)
к сожалению, не так... они могут и не пересекаться в случае когда меньшая окружность полностью внутри большей...
Тогда "Меньше суммы их радиусов, но больше разности"
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
Хыиуду, угу, вот теперь полностью согласен!Хыиуду писал(а):Две окружности пересекаются, если расстояние между их центрами меньше суммы их радиусов, но больше разности радиусов
проблема только в том, что, похоже, автор топика не стал заморачиваться с подобными сложностями и сделал как мог... :-)))
ну, как говорится, дай Бог :-)
Не думаю... Почитай написанное ниже. Код неправильный." писал(а):Спасибки большое, мож кому пригодиться текст программы:
1)это не ошибка, но зачем i присваивать ноль перед циклом "for?
2)if l <r+r[i+1] надо заменить на if (l<r+r[i+1])and(l>abs(r-r[i+1])
3)но даже принципиально кодж неверен. Почему вы сравниваете только радиусы i и i+1? окружность ведь пересекается не только с соседней!
цикл надо делать такой:
Код: Выделить всё
for i:=1 to n do begin
peres:=0;
for j:=1 to n do
if (i<>j)and(l<r[i]+r[j])and(l>abs(r[i]-r[j]) then inc(peres,2) else if (l=r[i]+r[j])or(l=abs(r[i]-r[i+1]) then inc(peres)
writeln('N okruzhnosti ',i,' peresechenij ',peres);
end;
Ваши руки совершили идиотскую ошибку и будут оторваны!
[OK]
[OK]
ладно, сразу объясню.
в условии вы написали:
Но т.к вы также написали
А у двух окружностей могут быть 2 пересечения либо одно(когда они кассаются).
Дальше надеюсь, всё понятно.
З.Ы. вот я и senior developer=)
в условии вы написали:
Надо найти кол-во ОКРУЖНОСТЕЙ." писал(а):Найти число пересекающихся окружностей
Но т.к вы также написали
то надо найти кол-во ПЕРЕСЕЧЕНИЙ." писал(а):(Ответ: № окружности число пересечений)
А у двух окружностей могут быть 2 пересечения либо одно(когда они кассаются).
Дальше надеюсь, всё понятно.
З.Ы. вот я и senior developer=)
Ваши руки совершили идиотскую ошибку и будут оторваны!
[OK]
[OK]
Medved, поздравляю с повышением 
DemonRed, у вас нечетко сформулировано задание. "Найти число пересекающихся окружностей. (Ответ: № окружности число пересечений)" - это бред. Ответ, данный в скобках, предполагает вопрос "Найти число пересечений для каждой окружности". А "найти число пересекающихся окружностей" (кстати, не число, а количество) - это, по моему мнению, количество разных пар окружностей, таких, что окружности в каждой паре пересекаются.
Еще остается открыт вопрос, считать ли касание окружностей пересечением.
В общем, по-хорошему такие вопросы должны быть объяснены в задании. Но я еще не видел преподавателя, который давал бы нормальные задания.

DemonRed, у вас нечетко сформулировано задание. "Найти число пересекающихся окружностей. (Ответ: № окружности число пересечений)" - это бред. Ответ, данный в скобках, предполагает вопрос "Найти число пересечений для каждой окружности". А "найти число пересекающихся окружностей" (кстати, не число, а количество) - это, по моему мнению, количество разных пар окружностей, таких, что окружности в каждой паре пересекаются.
Еще остается открыт вопрос, считать ли касание окружностей пересечением.
В общем, по-хорошему такие вопросы должны быть объяснены в задании. Но я еще не видел преподавателя, который давал бы нормальные задания.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
Хыиуду,
Medved,
я, конечно, могу ошибаться, но, мне кажется, что господин АвторТопика давно уже потерял интерес к теме (программу? как мы видим, он написал, и, не исключаю, что уже и сдал :-) что ему теперь тут делать? Похоже теоретическо-философские изыски, как правильно решить задачу и считается ли касание пересечением его не интересуют... :-)
Medved,
я, конечно, могу ошибаться, но, мне кажется, что господин АвторТопика давно уже потерял интерес к теме (программу? как мы видим, он написал, и, не исключаю, что уже и сдал :-) что ему теперь тут делать? Похоже теоретическо-философские изыски, как правильно решить задачу и считается ли касание пересечением его не интересуют... :-)