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


Гость






kent, ты все время описываешь массивы заведомо бОльшего размера, чем тебе нужно. А зачем? Есть же более удобные способы smile.gif
Type
TPoint = Record
{ твое описание ... }
End;
PArrPoint = ^ArrPoint;
ArrPoint = Array[0 .. Pred(maxInt Div SizeOf(TPoint))] Of TPoint;

...
Var
arr: PArrPoint;
...
{ вводишь размерность массива: N }
{ и размещаешь массив в "куче" }
GetMem(arr, N * SizeOf(TPoint));
{
и так же, как ты работал со своим массивом,
работаешь с массивом расположенным в "куче",
просто вместо arr[i] делаешь arr^[i], и не надо
никаких массивов по 1000 элементов...
}

...
{ по окончании работы с массивом - осввобождаешь память }
FreeMem(arr, N * SizeOf(TPoint));
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

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

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


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


Профи
****

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

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


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

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


Пионер
**

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

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


Надо ещё теорию подучить...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

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

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


Если не хочешь исправлять, то так:

Function Range(a,b : Integer) : Extended;
.............
fac_dif := 1; p3 := 1;
repeat
inc(p3);
fac_dif := fac_dif * p3;
until p3 = a - b;
.............
end;


В выделенном фрагменте поставь p3=0; иначе если (a-B )=1 у тебя сразу p3 становится=2 и цикл крутится ооочень долго smile.gif.
И еще, в Tpoint поставь тип longint, а то функция space может лажаться.

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


Пионер
**

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

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


Malice, спасибо... :thanks:
Теперь вроде врубаюсь почему при (N=4) выдает ошибку...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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