TABLICE W TURBO PASCALU I NIE TYLKO TABLICE

Cig Fibonacciego zosta omwiony podczas zaj jako jeden z bardziej interesujcych problemw algorytmicznych. Program ten to praktyczna realizacja tego realizacja tego zagadnienia.

PROGRAM Ciag_Fibonacciego_1;

USES Crt;

VAR

n,licznik,pierwsza,druga,z_p: LONGINT;

BEGIN

ClrScr;

Write ('Podaj ilosc tworzonych liczb cigu 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 elementw cigu Fibonacciego (n<=46),');

writeln('ktre s kwadratami lub szecianami liczb naturalnych.');

j:=1;

while j=1

begin

Writeln(' Podaj n-ty numer ciagu');

readln(n);

if (n<=0) then writeln('Ze 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 dziesitnych na binarne wykorzystujc do tego celu tablice. Przykadowy program z komentarzem

 

PROGRAM dz_na_bin; { Zmiana ukadu z dziesitnego na dwjkowy }

var cyfry : Array[1..16] of Integer; { tu zapiszemy kolejne cyfry w ukadzie dwjkowym }

x, i : Integer; { x-liczba w ukadzie dziesitnym; i zmienna pomocnicza }

begin { wprowadzamy liczby }

repeat

writeln('Podaj liczb cakowit 0 <= n <= 32767');

readln(x)

until x >= 0;

for i:=1 to 16 do cyfry[i]:=0; { zerujemy cyfry "dwjkowe"}

{ wypeniamy tablic cyframi od pozycji najmniej znaczcej }

i:=1;

while x>0 do

begin

cyfry[17-i]:=x mod 2; { kolejna (od koca) cyfra jest reszt z dzielenia przez 2 }

x:=x div 2; { przesuwamy si o jedn cyfr w lewo w zapisie dwjkowym }

inc(i)

end;

{ przeskakujemy pocztkowe zera w tablicy 'cyfry'}

i:=1; while (cyfry[i]=0) and (i<16) do inc(i);

{ wyprowadzamy liczb w zapisie dwjkowy na ekran }

write('W zapisie dwjkowym = ');

while i<=16 do

begin

write(cyfry[i]);

inc(i);

end;

writeln;

readln

end.

 

Zbudujmy teraz program, ktry pozwoli oceni znajomo tabliczki mnoenia oraz wywietla procentowo prawidowe 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 wynikajcy z tego sposb obliczenia wielomianu nazywamy schematem Hornera. Chcemy obliczy wn(z) czyli warto wielomianu dla wartoci 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 powyszych wzorw wynika, e obliczenie wartoci wielomianu stopnia n wymaga wykonania n mnoe 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 zawierajcej

wspczynniki przy kolejnych potgach x }

var

n : Integer; { n - stopnie wielomianu }

i : Integer; { zmienna pomocnicza }

x : Real; { argument }

a : t_a; { wspczynniki wielomianu }

y : Real; { wynik }

 

begin

write('Ktrego stopnia ma by wielomian (max =', MaxStWiel, ')? ');

readln(n);

writeln('Podaj kolejne wartoci wspczynnikw wielomianu');

writeln('od wyrazu wolnego do stojcego przy najwyszej potdze 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 rozpoczciem 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 rozwizania 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,' wspczynnik 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 sposb mona zamienia midzy 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 staej 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?tGHjѨDƿ?ެzʬUϚb]減|s}ѳ>Vd҅fx̛}j!+n][QjXu<:ݮ7or|_?Jew$UN%#k_}.K 6k}5o 4$#+큚/&ϙo7FDZV>)xoQѼ ̶?>ʮߛ<׳J^YzfM,Zi,0["KU@]O>+k SiBsk{[=NY\D)$ro4=j=z5>kfrvTYX>K'*Gѫ@Wwq #Ҽǟ K>Sq>Ʒ+:0U}ykHm.{y^)chگ>ʅ|#/ue>9VOto7H/j:t}PsP)aH4o5Ԋ&LZ_"8 ףoំYrs^[|c{ %cmۢHWU{gڻ7Z9乙YдծE$Emo_۾3g]Oޝk Kr'' {NvVrFsiw 16rӗJyGkZC]Z˂7j$.>F~|[oO@~Ϟ]S\o\m[mz3ZGSeH;N'c%7P %+?=;7 ҹ)5b5ڟ/zߩ2,Fj5P8O|=o Yl|ja|/n^Nwk8ds15u\x[1Gzɨ^(*&Mtojt[LVpCXq?ٮZ٤ yɝfۭ<:WQF*emka!kŭJlf͛kX&z8ۻfKTvW׊uf?S`~Tqϩ'ӻ;p%ȵyuhRKrIPDytGa Q'1f{B5QxoCv7hET@<0m>]>

for i:=1 to n do

begin

for j:=1 to m do write(a[i,j]:3);

writeln

end;

readln

end.

Program umoliwia rozoenie liczby na czynniki pierwsze z wykorzystaniem tablic

program rozklad_na_czynniki_pierwsze;

uses crt;

var n,i,p,cz:integer;

{tabl:array[1..100] of integer; }

begin

clrscr;

Write('Podaj n, n='); readln(n);

writeln('Czynniki pierwsze liczby ',n,' :');

{{ {for i:=2 to n do}

{ i:=2 ;

repeat

if n mod i = 0 then

p:= n div i;

readln(tabl[i]);

n:= p;

write(tabl[i]);

until i>n;

{ for i:=2 to n do

write(tabl[i] ,','); }

 

trudniejszy nieco problem to obliczenie sumy odlegoci pomidzy kolejnymi punktami od punktu (x1,y1) do punktu (xn,yn) z pominieciem punktw zbyt odlegych od punktu poprzedniego}

 

PROGRAM Dlugosc_Drogi;

CONST

LICZBA_PUNKTOW=30;

TYPE

Tab =ARRAY[1..LICZBA_PUNKTOW] OF REAL;

Nr_Punktu=1..LICZBA_PUNKTOW;

VAR

x,y :Tab;

Max_Odl:REAL;

n :Nr_Punktu;

s :REAL;

PROCEDURE Wczytaj; {wczytanie danych o punktach}

VAR

i:Nr_Punktu;

PROCEDURE Wczytaj_Punkt

{wczytanie danych jednego punktu}

(nr:Nr_Punktu);

BEGIN

WRITELN(' Podaj wspolrzedne punktu nr ',nr);

WRITE(' x =');

READ(x[nr]);

WRITE(' y =');

READ(y[nr]);

WRITELN

END; {Wczytaj_Punkt}

 

BEGIN {Wczytaj}

REPEAT

WRITE(' Ile punktw? ');

READLN(n)

UNTIL n<=LICZBA_PUNKTOW;

FOR i:=1 TO n DO

Wczytaj_Punkt(i);

READLN

END; {Wczytaj}

 

FUNCTION Nast {okrelenie numeru kolejnego punktu}

(nr:Nr_Punktu):INTEGER;

VAR

j:Nr_Punktu;

d:REAL;

f:BOOLEAN;

 

FUNCTION Odl {odleglosc miedzy dwoma punktami}

(n1,n2:Nr_Punktu):REAL;{numery punktw}

BEGIN

odl:=sqrt(sqr(x[n1]-x[n2])+sqr(y[n1]-y[n2]))

END; {Odl}

 

BEGIN {Nast}

j:=nr;

f:=FALSE;

IF j=n

THEN Nast:=0

ELSE

WHILE (j<n) AND NOT f DO

BEGIN

WRITE(' Krok: ',j);

j:=j+1;

d:=Odl(nr,j);

WRITE(' odlego punktu ',nr,' od punktu ',j,' wynosi: ',d:10:2);

IF d<=Max_Odl

THEN

BEGIN

Nast:=j;

f:=TRUE;

s:=s+d;

WRITELN

END

ELSE WRITELN(' punkt ',j,' odrzucony')

END;

IF NOT f

THEN Nast:=0

END; {Nast}

 

PROCEDURE Wypisz; {analiza punktw i obliczenia drogi}

VAR

i:INTEGER;

BEGIN

i:=1;

s:=0;

REPEAT

i:=Nast(i)

UNTIL i=0;

WRITELN(' Rozpatrzono wszystkie punkty');

WRITELN(' Cakowita dugo drogi wynosi: ',s:10:2)

END; {Wypisz}

 

BEGIN {Program gwny}

WRITE('Podaj krytyczna odlego ');

READLN(Max_Odl);

Wczytaj;

Wypisz;

WRITELN('Naciniecie klawisza Enter zakoczy prace programu');

READLN

END. {Dlugosc_Drogi}

 

 

{p:=n div i; }

{write(p,','); }

 

{ readln;

end. }

{begin }

 

for i:=n downto 1 do

if n mod i =0 then

 

 

begin

repeat

cz:=n div i;

write(cz,', ');

n:=i;

{ i:=n; }

 

 

until n=i ;

{readln( tabl[cz]);}

{ for cz:=1 to n do

write(cz,','); }

end;

readln;

 

end.

 

Dzikuj za zaangaowanie w czasie wiczenia i zapraszam do dalszej walki z TURBO PASCALEM

powrt