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

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

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

> Ошибка 205 ..., Floating point overflow
сообщение
Сообщение #1


Пионер
**

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

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


Дана задача: Дано множество A из N точек. Найти наименьший|наибольший периметр треугольника, вершины которого принадлежат различным точкам множества A, и сами эти точки (точки выводятся в том же порядке, в котором они перечислены при задании множества A). Я её сделал, но если задать четыре точки (N=4), то компилятор выдает ошибку 205 ... Это так должно быть или у меня в решении ошибка?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Профи
****

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

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


Цитата(kent @ 26.07.05 13:13)
Это так должно быть или у меня в решении ошибка?

Если у тебя ошибка, то так быть точно не должно :D Как ты делал ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

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

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


Вот решение:

uses crt;
type
TPoint = record
x,y,id : Integer;
end;
type
TIndex = record
first,second,third : Integer;
end;

{---------------------------------------}
Function Space(a,b : TPoint) : Double;
begin
Space := sqrt(sqr(a.x - b.x) + sqr(a.y - b.y));
end;
{---------------------------------------}

{---------------------------------------}
Function Range(a,b : Integer) : Extended;
var fac_a,fac_b,fac_dif : Extended;
p1,p2,p3 : Integer;
begin
fac_a := 1; p1 := 1;
repeat
inc(p1);
fac_a := fac_a * p1;
until p1 = a;
fac_b := 1; p2 := 1;
repeat
inc(p2);
fac_b := fac_b * p2;
until p2 = b;
fac_dif := 1; p3 := 1;
repeat
inc(p3);
fac_dif := fac_dif * p3;
until p3 = a - b;
Range := fac_a / (fac_b * fac_dif);
end;
{---------------------------------------}

var a : array [1..1000] of TPoint;
id : array[1..1000] of TIndex;
Perimeter : array [1..1000] of Double;
N,i,j,m : Integer;
indx,count_indx : Integer;
max_Perimeter,min_Perimeter : Double;
min_id,max_id : TIndex;
begin
{$R+}
Clrscr;
Write('Input N:');
ReadLn(N);
WriteLn('Input set A:');
for i := 1 to N do begin
Write('Point <',i,'> (X,Y):');
Read(a[i].x,a[i].y);
a[i].id := i;
end;
m := 3;
for i := 1 to m do a[i].id := i;
indx := 0;
repeat
inc(indx);
for i := 1 to m do
if (i > 2) then begin
id[indx].first := a[i - 2].id;
id[indx].second := a[i - 1].id;
id[indx].third := a[i].id;
end;
Perimeter[indx] := Space(a[a[i - 2].id],a[a[i - 1].id]) +
Space(a[a[i - 1].id],a[a[i].id]) +
Space(a[a[i - 2].id],a[a[i].id]);
i := m;
while (i > 1) and (a[i].id = N - m + i) do dec(i);
inc(a[i].id);
for j := i + 1 to m do a[j].id := a[j - 1].id + 1;
until (i = 0) or (indx = 1000) or (indx = Range(N,m));
count_indx := indx;
min_Perimeter := 500000;
max_Perimeter := 0;
for indx := 1 to count_indx do begin
if (Perimeter[indx] < min_Perimeter) then begin
min_Perimeter := Perimeter[indx];
min_id.first := id[indx].first;
min_id.second := id[indx].second;
min_id.third := id[indx].third;
end;
if (Perimeter[indx] > max_Perimeter) then begin
max_Perimeter := Perimeter[indx];
max_id.first := id[indx].first;
max_id.second := id[indx].second;
max_id.third := id[indx].third;
end;
end;
WriteLn;
WriteLn('------------------------------------------');
WriteLn('Min perimeter:',min_Perimeter,';');
WriteLn('Min perimeter points: ',min_id.first,'-',min_id.second,'-',min_id.third,';');
WriteLn('*******************************************');
WriteLn('Max perimeter:',max_Perimeter,';');
WriteLn('Max perimeter points: ',max_id.first,'-',max_id.second,'-',max_id.third,';');
WriteLn('-------------------------------------------');
Readkey;
end.





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


Профи
****

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

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


Цитата(kent @ 26.07.05 13:40)
Вот решение:

Ой, опять кучу массивов нагородил, зачем ?

Перебор делай так:

for I:=1 to n-2 do
for j:=i+1 to n-1 do
for k:=j+1 to n do begin
pr:=space(i,j)+space(j,k)+space(k,i);
{ тут же сравниваешь на мин и макс и сохраняешь i, j и k в переменных, например min1, min2, min3 и max1, max2, max3
}
end;
{все, здесь уже результат выводишь }



И не нужны тебе массивы, кроме "A". Из TPoint id тоже выкинь, зачем он там?

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


Пионер
**

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

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


А что уменя вообще неправильно что ли?

Цитата
Ой, опять кучу массивов нагородил, зачем ?

Перебор попроще просто не знал...

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


Профи
****

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

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


Цитата(kent @ 26.07.05 14:15)
Перебор попроще просто не знал...

Теперь знаешь smile.gif Проще исправить, чем ошибку найти, имхо.
А volvo дело говорит, так делай, или не вводи N вообще, а выведи в константы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





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