Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Помогите исправить программку

Автор: stager 9.01.2007 4:15

Програма нахождения максимальной площади по заданым точкам

program dom2;
var
m,i,j,k,l,q,w,e,r,p:integer;
x,y:array[1..100] of real;
o:array[1..2,1..4] of real;
s,s1,a,b,c,d,f,g,h:real;
pri,prim:boolean;
x1,x2,x3,x4,y1,y2,y3,y4:real;
begin
writeln('nahogdenie iz tochek, chtobi ploshadb paralelogram');
writeln('s vershinami v etih tochkah bil MAX');
repeat
writeln('vvedite kolichestvo tochek');
read(m);
if (m<4) or (m>100) then
writeln('nevernoe chislo');
until (m>=4) and (m<=100);
i:=0;
repeat
i:=i+1;
p:=0;
writeln('Vvedite to4ki',I,'tochka');
readln(x[i],y[i]);
if i>1 then
begin
j:=0;
repeat
j:=j+1;
if (x[i]=x[j]) and (y[i]=y[j]) then
begin
writeln ('takaia tochka est');
p:=1;
end;
until (p=1) or (j=i-1);
end;
i:=i-p;
until i=m;
p:=0;
s1:=0;
s:=0;
for i:=1 to m-3 do
for j:= i+1 to m-2 do
for k:=j+1 to m-1 do
for l:= k+1 to m do
if (x[l]-x[i])*(y[j]-y[i])<>(y[l]-y[i])*(x[j]-x[i]) then
begin


pri:=true;


a:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
b:=sqrt(sqr(x[j]-x[k])+sqr(y[j]-y[k]));
c:=sqrt(sqr(x[k]-x[l])+sqr(y[k]-y[l]));
d:=sqrt(sqr(x[l]-x[i])+sqr(y[l]-y[i]));
f:=sqrt(sqr(x[i]-x[k])+sqr(y[i]-y[k]));
g:=sqrt(sqr(x[j]-x[l])+sqr(y[j]-y[l]));
h:=sqrt(sqr(y[j]-y[i]));
if (a=c) and (b=d) then
begin
prim:=true;
s1:=a*h;
if s1>s then
begin
s:=s1;
q:=i;
w:=j;
e:=k;
r:=l;
end;
end;
end;
x1:=x[q];
x2:=x[w];
x3:=x[e];
x4:=x[r];
y1:=y[q];
y2:=y[w];
y3:=y[e];
y4:=y[r];



if (pri) and (prim) then
begin
Writeln('Parallelogramm imeet MAX S');

writeln('T',Q,',',X[Q]:4:1,y[q]:4:1);
writeln('T',W,',',X[W]:4:1,y[W]:4:1);
writeln('T',E,',',X[E]:4:1,y[E]:4:1);
writeln('T',R,',',X[R]:4:1,y[R]:4:1);
end;
if (pri=false) and (prim=false) then
writeln('paralelogramma net');
end.


М
С тегами лучше выглядит, правда?
volvo


Автор: Malice 9.01.2007 5:15

Цитата(stager @ 9.01.2007 0:15) *

if (x[l]-x[i])*(y[j]-y[i])<>(y[l]-y[i])*(x[j]-x[i]) then
if (a=c) and (b=d) then

Вещественные числа нельзя сравнивать через = и <>. Можно только так:
Код
if (abs(a-c)<e)then
, где е-необходимая точность.
ps Странно, что до сих пор этого нет в faq.

Автор: Bokul 9.01.2007 5:22

А какая ошибка? У меня компилируется.

Цитата
Вещественные числа нельзя сравнивать через = и <>.

blink.gif Честно?

Автор: hiv 9.01.2007 16:03

Цитата(Bokul @ 9.01.2007 1:22) *
blink.gif Честно?
Как ты думаешь, что выдаст эта программа?
var r :real;
begin
r:=7/pi;
r:=r*pi;
writeln( r );
end.

Я запускал на TP7.0 и получил ответ 6.99999999999272E+0000
И это нормально! Вещественные числа нельзя сравнивать так, как это делают с целыми. Всегда работая с ними необходимо понить про ошибки округления (их накопление) и точность вычисления.
2Malice good.gif

Автор: Malice 9.01.2007 16:17

Цитата(Bokul @ 9.01.2007 1:22) *

blink.gif Честно?

yes2.gif
var x:real;
begin
x:=0.1;
if x=0.1 then writeln ('Bokul rulez!') else
writeln ('Malice rulez!');
end.

Вот хороший пример, показательный. У hiv посложнее.. У меня, правда, чуть другой аспект затрагивается, но суть таже.

Автор: stager 9.01.2007 21:38

не понял что такое e,
я так понял берём разность по модулю и всё это меньше какого то числа т.е если взять число чуть больше 0 то будет что надо?
и ещё если мы берём 4 точки и задаём прямую линию он пишет что паралелограмма нет а если больше точек то он его находит. Как это исправить?

Автор: Malice 9.01.2007 21:54

Цитата(stager @ 9.01.2007 17:38) *

не понял что такое e wacko.gif

е- в смысле точность, например 0.00001.

Автор: stager 10.01.2007 0:07

Всем большое спасибо теперь всё работает! good.gif

Автор: Bokul 10.01.2007 5:12

Цитата
Как ты думаешь, что выдаст эта программа?

Прикрепленное изображение

Автор: volvo 10.01.2007 5:17

Bokul, раздел не про 32-битные компиляторы... В FPC Real - сопроцессорный тип, а не эмуляция, приведенная программа с типом Single/Double даже в TP уже будет выводить семерку...

Автор: Bokul 10.01.2007 5:32

Почему тогда программа Malice-а дала неверный результат?

Автор: volvo 10.01.2007 5:37

Цитата(Malice @ 9.01.2007 11:17)
У меня, правда, чуть другой аспект затрагивается

Поэтому и дала такой результат... Кстати, вопрос-то был в том, что нельзя сравнивать вещественные числа, так что ориентируйся именно на программу Malice yes2.gif

Автор: Malice 10.01.2007 16:01

Цитата(Bokul @ 10.01.2007 1:32) *

Почему тогда программа Malice-а дала неверный результат?

Почему не верный ? Красиво получилось.. smile.gif
В моем примере даже 2 аспекта:
1. погрешность накапливается не только в выражениях, существует еще погрешность представления числа. Поэтому 0.1 в real - это 1.00..023E-1.
2. При включенном сопроцессоре в паскале все константные вещественные числа считаются сопроцессором, т.е. приводятся к типу Extended (при выключенном - к Real), а 0.1 в extended представляется без погрешности..
Исходя из того, что сопроцессор у тебя наверняка включен и real(0.1)!=extended(0.1) - получаем такой результат.

Автор: мисс_граффити 10.01.2007 18:48

чтобы не обидно было:
Прикрепленное изображение

...никак не пытаюсь отрицать все сказанное выше.

Автор: volvo 10.01.2007 21:54

Юля, скрин настроек компилятора заодно - в студию... Если так:
Прикрепленное изображение
, то "Bokul rulez!", а если
Прикрепленное изображение
, то "Malice rulez!"

Автор: мисс_граффити 10.01.2007 22:06

smile.gif
ну, как бы то ни было, это оффтоп.
было так:
Прикрепленное изображение

но мой пример со всеми комбинациями значений выделенных настроек выдает равенство smile.gif)

Автор: Malice 10.01.2007 22:55

Это нормально, у тебя же не 0.1 smile.gif Скажем так, погрешность при представлении вещественного числа _вероятна_.
И чтоб до конца быть политкорректным выведем правило:
Использование = и <> с вещественными числами не рекомендуется, т.к. не гарантирует правильность работы программы и допускаяется на свой страх и риск.
rolleyes.gif

Автор: мисс_граффити 10.01.2007 23:11

я же не спорю smile.gif
понятно, что от числа зависит (0.5=2^-1... мантиссы, выделенной под real, а тем более под extended, хватит с огромным запасом)
я просто вторую неделю пытаюсь выучить вычмат... и после n-ного перечитывания первой лекции занудность стала ярко выраженной.