Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz

14.04.2008, 23:32
|
|
Banned
Регистрация: 23.07.2007
Сообщений: 87
Провел на форуме: 2147329
Репутация:
613
|
|
Падает прога...
Братцы! Выручайте! .. Паскаль.. Падает прога.. Error 207: Invalid floating point operation. Очень срочно нужно исправить ошибку. В итоге должна выводиться гистограмма - это значения, превышающие или меньшие значений определяющей функции (строки 107-111)..
Прога:
Код:
uses crt,graph;
{#### CONFIG ####}
const MAX = 10000;
N = 10; {#### 0<N<50 ####}
lambda = 1; {#### 0<lambda<50 ####}
beta = 5; {#### beta>lambda ####}
DOT = 4;
var Data: array [1..MAX] of real;
Hist: array [1..N] of integer;
{#### FUNCTION ####}
function w(x:real):real;
begin
if (lambda <= x) and (x <= ((beta + lambda)/2)) then
w:= 4*(x-lambda)/sqr((beta - lambda));
if ((beta + lambda)/2 <= x) and (x <= beta) then
w:= 4*(beta - x)/sqr((beta - lambda));
end;
{#### PROCEDURE ####}
procedure DrawHist;
var i:integer;
step:real;
Max_Num:integer;
s:string;
k:real;
m1:real;
D:real;
hi:real;
wk:real;
begin
for i:=1 to N do Hist[i]:=0;{clearing array}
{#### CALCULATE HIST ####}
step:=lambda/N;
for i:=1 to MAX do inc(Hist[1+trunc((Data[i]-beta+lambda/2)/step)]);
{#### LOOK FOR Max_Num ####}
Max_Num:=0;
for i:=1 to N do if Max_Num<Hist[i] then Max_Num:=Hist[i];
{#### DRAWHIST ####}
m1:=0;D:=0;hi:=0;
for i:=0 to N-1 do begin
SetColor(14);
rectangle(
round(i*GetMaxX/N),
round(2*GetMaxY/3),
round((i+1)*GetMaxX/N),
round(2*GetMaxY/3*(1-Hist[i+1]/Max_Num)));
str(Hist[i+1],s);
SetColor(3);
SetTextStyle(DefaultFont, VertDir, 1);
OutTextXY(round(i*GetMaxX/N)+GetMaxX div N,
round(2*GetMaxY/3)-40,s);
str((i+1)*step+beta-lambda/2:1:1,s);
SetColor(4);
OutTextXY(round(i*GetMaxX/N)+GetMaxX div N,
round(2*GetMaxY/3)+10,s);
m1:=m1+((i+1)*step+beta-lambda/2)*Hist[i+1]/Max;
D:=D+sqr(((i+1)*step+beta-lambda/2))*Hist[i+1]/Max;
wk:=0.5*sqrt(2)*
(sin(((i+1)*step+beta-lambda/2)*PI/2/lambda)*cos(PI*beta/2/lambda)
-cos(((i+1)*step+beta-lambda/2)*PI/2/lambda)*sin(PI*beta/2/lambda)
-sin((i*step+beta-lambda/2)*PI/2/lambda)*cos(PI*beta/2/lambda)
+cos((i*step+beta-lambda/2)*PI/2/lambda)*sin(PI*beta/2/lambda));
hi:=hi+MAX*sqr(Hist[i+1]/MAX-wk)/wk;
end;
SetTextStyle(DefaultFont,HorizDir,1);
SetColor(9);
str(m1:0:DOT,s);
OutTextXY(100,2*GetMaxY div 3 +70,'m1(prakt)= '+s);
str(beta:0:DOT,s);
OutTextXY(100,2*GetMaxY div 3 +90,'m1(teor) = '+s);
D:=D-m1*m1;
str(D:0:DOT,s);
OutTextXY(250,2*GetMaxY div 3 +70,'D(prakt)= '+s);
D:=(PI*PI-32+8*PI)*lambda*lambda/4/PI/PI;
str(D:0:DOT,s);
OutTextXY(250,2*GetMaxY div 3 +90,'D(teor) = '+s);
str(hi:0:DOT,s);
OutTextXY(400,2*GetMaxY div 3 +80,'hi2 ='+s);
k:=-100000;
for i:=0 to GetMaxX do
if w(i*lambda/GetMaxX-lambda/2+beta)>k then k:=w(i*lambda/GetMaxX-lambda/2+beta);
SetTextStyle(DefaultFont, HorizDir, 1);
MoveTo(0,round(2*GetMaxY/3*(1-w(-lambda/2+beta)/k)));
SetColor(4);
for i:=0 to GetMaxX do begin
LineTo(i,round(2*GetMaxY/3*(1-w(i*lambda/GetMaxX-lambda/2+beta)/k)));
end;
end;
{#### REV FUNCTION ####}
function F_Rev(x:real):real;
begin
if (lambda <= x) and (x <= ((beta + lambda)/2)) then
F_Rev:= 2*sqr((x-lambda))/sqr((beta - lambda));
if ((beta + lambda)/2 <= x) and (x <= beta) then
F_Rev:= 1 - 2*sqr((beta - x))/sqr((beta - lambda));
end;
{#### GENERATE AND FULL ARRAY #### }
procedure GenerateData;
var y:real;
i:integer;
begin
SetFillStyle(0,0);
OutTextXY(0,0,'Generating...');
for i:=1 to MAX do begin
y:=random;
Data[i]:=F_Rev(y);
end;
Bar(0,0,GetMaxX,GetMaxY);
end;
{#### FIND DRIVERS ####}
procedure OpenGraph;
var Gd, Gm: Integer;
begin
Gd := Detect;
InitGraph(Gd, Gm, 'c:\tp\bgi');
end;
{#### OUT ####}
begin
ClrScr;
Randomize;
{GetParams;}
OpenGraph;
repeat
GenerateData;
DrawHist;
delay(500);
until keypressed;
CloseGraph;
WriteLn('Good!');
end.
Последний раз редактировалось Tiler2k; 15.04.2008 в 01:03..
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|