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

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

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

 
 Ответить  Открыть новую тему 
> Помогите исправить программку
stager
сообщение 9.01.2007 0:15
Сообщение #1





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

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


Програма нахождения максимальной площади по заданым точкам
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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 9.01.2007 1:15
Сообщение #2


Профи
****

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

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


Цитата(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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Bokul
сообщение 9.01.2007 1:22
Сообщение #3


Гуру
*****

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

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


А какая ошибка? У меня компилируется.
Цитата
Вещественные числа нельзя сравнивать через = и <>.

blink.gif Честно?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hiv
сообщение 9.01.2007 12:03
Сообщение #4


Профи
****

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

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


Цитата(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

Сообщение отредактировано: hiv - 9.01.2007 12:04


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 9.01.2007 12:17
Сообщение #5


Профи
****

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

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


Цитата(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 посложнее.. У меня, правда, чуть другой аспект затрагивается, но суть таже.

Сообщение отредактировано: Malice - 9.01.2007 12:19
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
stager
сообщение 9.01.2007 17:38
Сообщение #6





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

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


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

Сообщение отредактировано: stager - 9.01.2007 18:06
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 9.01.2007 17:54
Сообщение #7


Профи
****

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

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


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

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

е- в смысле точность, например 0.00001.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
stager
сообщение 9.01.2007 20:07
Сообщение #8





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

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


Всем большое спасибо теперь всё работает! good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Bokul
сообщение 10.01.2007 1:12
Сообщение #9


Гуру
*****

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

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


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

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


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.01.2007 1:17
Сообщение #10


Гость






Bokul, раздел не про 32-битные компиляторы... В FPC Real - сопроцессорный тип, а не эмуляция, приведенная программа с типом Single/Double даже в TP уже будет выводить семерку...
 К началу страницы 
+ Ответить 
Bokul
сообщение 10.01.2007 1:32
Сообщение #11


Гуру
*****

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

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


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


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.01.2007 1:37
Сообщение #12


Гость






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

Поэтому и дала такой результат... Кстати, вопрос-то был в том, что нельзя сравнивать вещественные числа, так что ориентируйся именно на программу Malice yes2.gif
 К началу страницы 
+ Ответить 
Malice
сообщение 10.01.2007 12:01
Сообщение #13


Профи
****

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

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


Цитата(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) - получаем такой результат.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 10.01.2007 14:48
Сообщение #14


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


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

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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.01.2007 17:54
Сообщение #15


Гость






Юля, скрин настроек компилятора заодно - в студию... Если так:
Прикрепленное изображение
, то "Bokul rulez!", а если
Прикрепленное изображение
, то "Malice rulez!"
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 10.01.2007 18:06
Сообщение #16


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


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

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

Сообщение отредактировано: мисс_граффити - 10.01.2007 18:13


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 10.01.2007 18:55
Сообщение #17


Профи
****

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

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


Это нормально, у тебя же не 0.1 smile.gif Скажем так, погрешность при представлении вещественного числа _вероятна_.
И чтоб до конца быть политкорректным выведем правило:
Использование = и <> с вещественными числами не рекомендуется, т.к. не гарантирует правильность работы программы и допускаяется на свой страх и риск.
rolleyes.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 10.01.2007 19:11
Сообщение #18


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 23.05.2024 15:53
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"