Cálculo de array da série de Fibonacci criado em tempo de execução
{ Calulo da serie de Fibonacci com array definido em tempo de execucao}
{ Joao Paulo Schwarz Schuler }
{ http://www.schulers.com/jpss }
{$X+} {extended syntax}
const csError = -1;
const csMaxArray = 16000;
type TIntArr= array[0..csMaxArray] of longint;
type TIntArrPtr= ^TIntArr;
type TIntArray = object { array dinamico de numeros inteiros }
private
Max:longint; {Maior indice permitido}
ArrInt:TIntArrPtr;
AllocatedMem:longint;
public
constructor Init(PMax:longint);
{aloca array}
function Get(N:longint):longint;
{devolve valor de indice N}
function GetMax:longint;
{devolve maior indice permitido no array}
procedure Seta(Pos,Data:longint);
{atribui valor Data na posicao Pos}
destructor Done;
{desaloca memoria}
end;
type TFibonacci = object (TIntArray) { classe para calculo da serie de Fibonacci}
public
constructor Init(PMax:longint);
{calcula valores da serie de fibonacci ate indice Max}
end;
constructor TFibonacci.Init(PMax:longint);
{aloca e calcula serie}
var I:longint;
begin
inherited Init(PMax);
ArrInt^[0]:=0;
ArrInt^[1]:=1;
for I:=2 to PMax do
ArrInt^[I]:=ArrInt^[I-1]+ArrInt^[I-2];
end;
constructor TIntArray.Init(PMax:longint);
{aloca memoria}
begin
Max:=PMax;
AllocatedMem:=(Max+1)*SizeOf(longint);
GetMem(ArrInt,AllocatedMem);
end;
function TIntArray.Get(N:longint):longint;
{devolve valor de indice N}
begin
if (N<=Max)
then Get:=ArrInt^[N]
else Get:=csError;
end;
function TIntArray.GetMax:longint;
{devolve maior indice permitido no array}
begin
GetMax:=Max;
end;
procedure TIntArray.Seta(Pos,Data:longint);
{atribui valor Data na posicao Pos}
begin
if (Pos<=Max)
then ArrInt^[Pos]:=Data
else {erro};
end;
destructor TIntArray.Done;
{desaloca memoria}
begin
FreeMem(ArrInt,AllocatedMem);
end;
const csMaxFib = 46;
{ mostra os 47 primeiros numeros da serie de Fibonacci }
var Fib:TFibonacci;
I:longint;
begin
Fib.Init(csMaxFib);
for I:=0 to csMaxFib
do Writeln(I:5,Fib.Get(I):20);
Fib.Done;
end.