Ci¹g Fibonacciego zosta³ omówiony podczas zajêæ jako jeden z
bardziej interesuj¹cych problemów algorytmicznych. Program ten to praktyczna
realizacja tego realizacja tego zagadnienia.
PROGRAM Ciag_Fibonacciego_1;
USES Crt;
n,licznik,pierwsza,druga,z_p: LONGINT;
BEGIN
ClrScr;
Write ('Podaj ilosc
tworzonych liczb ci¹gu Fibonacciego n>=2, n = ');
Readln (n);
pierwsza:=0;
druga:=1;
Writeln;
Writeln ('Liczby ciagu
Fibonacciego: ');
Writeln;
Write
(pierwsza:10,druga:10);
FOR licznik:= 1
TO n-2 DO
BEGIN
z_p:=pierwsza+druga;
pierwsza:=druga;
druga:=z_p;
Write (druga:10);
END;
END.
program ciag_fibonacciego_kwadraty_szesciany ;
var n,i,j,l: longint;
a: array[1..46] of
longint;
x,y: real;
k:char;
begin
Write(' Drukowanie
wszystkich elementów ci¹gu Fibonacciego
(n<=46),');
writeln('które s¹
kwadratami lub szeœcianami liczb naturalnych.');
j:=1;
while j=1
begin
Writeln(' Podaj n-ty
numer ciagu');
readln(n);
if (n<=0) then
writeln('Z³e dane');
else
begin
writeln('f(1)=1');
if n>1 then
writeln ('f(2)=1');
if n>2 then
begin
a[1]:=1;
a[2]:=1;
for i:=2 to n do
begin
a[i]:=a[i-1]+a[i-2];
l:=0;
repeat
l:=l+1;
x:=l*l;
until x>=a[i];
l:=0;
repeat
l:=l+1;
y:=l*l*l;
until y>=a[i];
if a[i]=x then writeln ('f(',i,')=' , a[i],' ');
if a[i]=y then writeln ('f(',i,')=' , a[i],' ');
end;
end;
end;
writeln('czy
chcesz pracowaæ dalej? ('t/n');
readln(k);
if k='n' then j:=0
end;
end.
Zajmijmy siê teraz
sposobem zamiany liczb dziesiêtnych na binarne wykorzystuj¹c do tego celu
tablice. Przyk³adowy program z komentarzem
PROGRAM dz_na_bin; {
Zmiana uk³adu z dziesiêtnego na dwójkowy }
var cyfry : Array[1..16] of Integer; { tu zapiszemy kolejne cyfry w uk³adzie dwójkowym }
x, i : Integer; {
x-liczba w uk³adzie dziesiêtnym; i
zmienna pomocnicza }
begin { wprowadzamy
liczby }
repeat
writeln('Podaj liczbê
ca³kowit¹ 0 <= n <= 32767');
readln(x)
until x >= 0;
for i:=1 to 16 do
cyfry[i]:=0; { zerujemy cyfry "dwójkowe"}
{ wype³niamy tablicê
cyframi od pozycji najmniej znacz¹cej }
i:=1;
while x>0 do
begin
cyfry[17-i]:=x mod
2; { kolejna (od koñca) cyfra jest
reszt¹ z dzielenia przez 2 }
x:=x div 2; { przesuwamy siê o jedn¹ cyfrê w
lewo w zapisie dwójkowym }
inc(i)
end;
{ przeskakujemy
pocz¹tkowe zera w tablicy 'cyfry'}
i:=1; while (cyfry[i]=0)
and (i<16) do inc(i);
{ wyprowadzamy liczb w
zapisie dwójkowy na ekran }
write('W zapisie
dwójkowym = ');
while i<=16 do
begin
write(cyfry[i]);
inc(i);
end;
writeln;
readln
end.
Zbudujmy teraz
program, który pozwoli oceniæ znajomoœæ tabliczki mno¿enia oraz wyœwietla
procentowo prawid³owe wyniki
program test;
uses crt;
var
a,b:array[1..10] of integer;
i:integer;
pop:integer;
wynik:integer;
begin
clrscr;
randomize;
pop:=0;
for i:=1 to 10 do begin
a[i]:=random(11);
b[i]:=random(11);
end;
for i:=1 to 10 do begin
write('jaki wynik ', a[i],'*',b[i],'=');
readln(wynik);
if
wynik=(a[i]*b[i]) then pop:=pop+10;
end;
writeln('uzyskales
',pop,'% ','odpowiedzi ');
readln
end.
Wielomian w postaci wn(x)=(...((a0x+a)x+a2)x+.....+an-1)x+an jak i wynikaj¹cy z tego sposób obliczenia
wielomianu nazywamy schematem Hornera. Chcemy obliczyæ wn(z) czyli
wartoœæ wielomianu dla wartoœci argumentu x=z oznaczamy tê wartoœæ przez y
wtedy obliczenia przebiegaj¹ zgodnie z wzorami:
y:= ao y:=yn+ai I= 1,2, 3 ,…..n
z powy¿szych wzorów wynika, ¿e obliczenie wartoœci wielomianu
stopnia n wymaga wykonania n mno¿eñ i dodawañ. Proszê przeanalizowaæ ten
program
PROGRAM alg_hor; { WartoϾ wielomianu wg algorytmu Hornera }
const
MaxStWiel = 10; {
maksymalny stopieñ wielomianu }
type
t_a =
array[0..MaxStWiel] of Real; { typ
tablicy zawieraj¹cej
wspó³czynniki przy kolejnych potêgach x }
var
n : Integer; { n - stopnie wielomianu }
i : Integer; { zmienna pomocnicza }
x : Real; { argument }
a : t_a; { wspó³czynniki wielomianu }
y : Real; { wynik }
begin
write('Którego stopnia ma
by† wielomian (max =', MaxStWiel, ')? ');
readln(n);
writeln('Podaj kolejne
wartoœci wspó³czynników wielomianu');
writeln('od wyrazu
wolnego do stoj¹cego przy najwy¿szej potêdze x');
for i := 0 to n do
begin
write('a[', i, ']:=');
readln(a[i])
end;
write('Dla jakiego x
obliczyæ wartoœæ wielomianu? ');
readln(x);
y := 0.0; { przed rozpoczêciem obliczeñ wartoœæ
wyniku zerujemy }
for i := 0 to n do y :=
y*x + a[n-i]; { obliczamy wartoϾ wielomianu }
writeln('y= ', y);
readln
end.
Przedstawiam teraz inny program analizy
rozwi¹zania wielomianu
Program Wartosc_wielomianu;
uses crt;
var a:array [0..10] of integer;
n,x,y:integer;
i:byte;
begin
clrscr;
Writeln ('Podaj stopien n wielomianu max 10');
read (n);
for i:=0 to n do
begin
writeln
('Podaj ',i,' wspó³czynnik wielomianu');
read (a[i]);
end;
writeln ('Podaj argument x ');
read (x);
y:=a[0];
i:=0;
while i<n do
begin
i:=i+1;
y:=y*x+a[i];
end;
writeln ('WYNIK TEGO WIELOMIANU JEST',y);
repeat until keypressed;
end.
W tym programie pokazano w jaki sposób mo¿na zamieniaæ miêdzy sob¹
wiersze w tablicy
PROGRAM zmiana_wierszy; {
Zamiana miejscami i-tego i j-tego wiersza }
const n=5; { rozmiary
macierzy n - wierszy i m - kolumn }
m=6;
type t_a=Array[1..n,1..m] of Integer; { definiujemy typ t_a }
const a:t_a=((1,2,3,4,5,6),
{ definicja sta³ej typu t_a }
(1,1,1,3,4,1),
(3,4,5,6,7,1),
(0,0,0,0,0,1),
(5,5,4,4,1,1));
var i, j, k : Integer;
x : Integer;
begin
writeln('Macierz przed
przestawieniem wierszy:');
for i:=1 to n do
begin
for j:=1 to m do write(a[iä?ýt‘GHj�Ѩ�DÆ¿?Þ¬©ÿ z¼Ê¬í¤U™öüÊÏšb]¾Åûõ減À|s«}êѳ»ó>VdúÒ…fŽ‚xçûÌÌ›}j!åÉó+nÈ]›[ïQûÛjXu<ÓÇ:œ‘ÜÞÝ®ÿ Ü7”÷€¯–¼or|_ñ?J³ewµ–ò$›äáU¤‰öÅNýæç±%ìðŸ#ék_û}.õK 6k}5o µ’4$³Æ#+í�š¯¨ÚÚÞé¦ÊöÍ/&Ï™o7FDZ¯VÕÛó>)îx‡ÄoÉá™QÑ¼ë½ ûì̶Ÿì?û>†¸Èåʮߛ<�¼×³J^Þ<ÇÕe¸¯kÛM»ð©KÑÈzÛ`�ù©|ß›oðÕSÐ`NiÐ(ÙL°ƒåëW`"²øŠ´QnÙãÝýÚÑŽU�wnEùsóqÅ`ÔN„šÜÔð¯‡u¿^,vöÚ~áö‹Ù8EOö}O¥zæ�¤éz§ö^�Ãb‹Ã·/!îX×*ýÓâ3¼g5NDNsÎßüwÒ¨¬{|É!L¼“‚½sÌ¿O›¯µpQÒºg…û÷=á–¥£Ü]_ÿ cêð^Ùêoöè6[IÇ�·<â»MFæÏKÓæ¿»•#·�L²»÷6÷T�ZŸ6ˆùo^Öoü]âµËÝýÒÒ%ÿ –pçåZiRÉûÏʾn§Æ}æ�°¢‘ZH|¶ÝY7“Ë",q§˜KÀîÇÚ³¥Me.XŸJ|ðið‡‡w^¯üLï=Ëÿ tvO»Ðw.îÝ…} (ZÂâ*{J®cCƼ¯ËRnF^µ¡—³#ÊÓ¼Ñ@ùJÒmµ.æ¥ÔÚŠ¯ÊµiÌ®úËQ×Ï_³×ü�^&ÿ