Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите исправить программку
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
stager
Програма нахождения максимальной площади по заданым точкам
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
Цитата(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
А какая ошибка? У меня компилируется.
Цитата
Вещественные числа нельзя сравнивать через = и <>.

blink.gif Честно?
hiv
Цитата(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
Цитата(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
не понял что такое e,
я так понял берём разность по модулю и всё это меньше какого то числа т.е если взять число чуть больше 0 то будет что надо?
и ещё если мы берём 4 точки и задаём прямую линию он пишет что паралелограмма нет а если больше точек то он его находит. Как это исправить?
Malice
Цитата(stager @ 9.01.2007 17:38) *

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

е- в смысле точность, например 0.00001.
stager
Всем большое спасибо теперь всё работает! good.gif
Bokul
Цитата
Как ты думаешь, что выдаст эта программа?

Нажмите для просмотра прикрепленного файла
volvo
Bokul, раздел не про 32-битные компиляторы... В FPC Real - сопроцессорный тип, а не эмуляция, приведенная программа с типом Single/Double даже в TP уже будет выводить семерку...
Bokul
Почему тогда программа Malice-а дала неверный результат?
volvo
Цитата(Malice @ 9.01.2007 11:17)
У меня, правда, чуть другой аспект затрагивается

Поэтому и дала такой результат... Кстати, вопрос-то был в том, что нельзя сравнивать вещественные числа, так что ориентируйся именно на программу Malice yes2.gif
Malice
Цитата(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) - получаем такой результат.
мисс_граффити
чтобы не обидно было:
Нажмите для просмотра прикрепленного файла

...никак не пытаюсь отрицать все сказанное выше.
volvo
Юля, скрин настроек компилятора заодно - в студию... Если так:
Нажмите для просмотра прикрепленного файла
, то "Bokul rulez!", а если
Нажмите для просмотра прикрепленного файла
, то "Malice rulez!"
мисс_граффити
smile.gif
ну, как бы то ни было, это оффтоп.
было так:
Нажмите для просмотра прикрепленного файла

но мой пример со всеми комбинациями значений выделенных настроек выдает равенство smile.gif)
Malice
Это нормально, у тебя же не 0.1 smile.gif Скажем так, погрешность при представлении вещественного числа _вероятна_.
И чтоб до конца быть политкорректным выведем правило:
Использование = и <> с вещественными числами не рекомендуется, т.к. не гарантирует правильность работы программы и допускаяется на свой страх и риск.
rolleyes.gif
мисс_граффити
я же не спорю smile.gif
понятно, что от числа зависит (0.5=2^-1... мантиссы, выделенной под real, а тем более под extended, хватит с огромным запасом)
я просто вторую неделю пытаюсь выучить вычмат... и после n-ного перечитывания первой лекции занудность стала ярко выраженной.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.