Czemu niepowiązana zmienna kopiuje wartość od drugiej?
Z nieznanego powodu pRekur kopiuje wartość pierwiastekIter. Ma oczywiście samodzielnie liczyć wartość, ze środka funkcji są poprawne wydruki.
Przykładowe dane wejściowe 2,1000,0.0001,10
Można to zauważyć jak zakomentuje się pierwiastekIter.
program zadanie_v4;
var a, p, Eps: real;
var MaxI: integer;
var pierwiastekIter:real;
var pRekur: real;
var iIter, iRekur:integer; // liczniki iteracji dla pierwiastka iteracyjnego i rekurencyjnego
procedure CzytajDanePierwiastka;
begin
write( 'Podaj liczbe rzeczywista - a: ' ); readln( a );
writeln;
write( 'Podaj wartosc pierwszego przyblizenia - p: ' ); readln( p );
writeln;
write( 'Podaj dokladnosc Eps: ' ); readln( Eps );
writeln;
write( 'Podaj maksymalna liczbe iteracji MaxI: ' ); readln( MaxI );
writeln;
end;
function LiczPierwiastekIteracyjnie(a, p, Eps:real; var MaxI:integer): real;
var pierwiastek, b:real;
var i: integer;
begin
pierwiastek := p;
b := a;
i := 0;
while(abs(p-b)>=Eps) and (i<MaxI) do
begin
p := (p+b)/2;
b := a/p;
writeln('pierwiastek ', p:5:5, ' b:', b:5:5);
i := i+1;
end;
writeln;
iIter := i;
LiczPierwiastekIteracyjnie:=b;
end;
function LiczPierwiastekRekurencyjnie(a, p, Eps:real; var MaxI:integer): real;
var pierwiastek, b:real;
var i: integer;
begin
if(abs(p*p-a)<=Eps) and (i<MaxI) then
begin
LiczPierwiastekRekurencyjnie:=p;
end
else
begin
p:=0.5*(p + a/p);
i := i+1;
writeln ('p:', p);
LiczPierwiastekRekurencyjnie(a,p,Eps,MaxI);
end;
iRekur := i;
end;
procedure WypiszPierwiastek(var pierwiastekIter, pierwiastekRekur:real);
begin
writeln('Obliczona wartosc pierwiastka iteracyjnie x=', pierwiastekIter:7:7);
writeln('Wykonana liczba iteracji - ', iIter);
writeln('Kwadrat pierwiastka - x*x=', (pierwiastekIter*pierwiastekIter):10:10);
writeln('Roznica liczby i kwadratu pierwiastka - a-x*x=', (a-pierwiastekIter*pierwiastekIter):10:10);
writeln;
writeln('Obliczona wartosc pierwiastka rekurencyjnie x=', pierwiastekRekur:7:7);
writeln('Wykonana liczba rekurencji - ', (iRekur-1));
writeln('Kwadrat pierwiastka - x*x=', (pierwiastekRekur*pierwiastekRekur):10:10);
writeln('Roznica liczby i kwadratu pierwiastka - a-x*x=', (a-pierwiastekRekur*pierwiastekRekur):10:10);
end;
begin
pierwiastekIter := 0;
pRekur := 0;
CzytajDanePierwiastka;
pierwiastekIter := LiczPierwiastekIteracyjnie(a,p,Eps,MaxI);
pRekur := LiczPierwiastekRekurencyjnie(a,p,Eps,MaxI);
writeln('pierwiastekrekur ', pRekur);
WypiszPierwiastek(pierwiastekIter, pRekur);
readln;
end.