________________________________________________1
{ Iteracyjna realizacja algorytmu zamiany liczby dziesietnej na postac binarna
}
program 10_2_i;
var
dziesietna:longint;
binarna:string;
begin
Write('Podaj liczbe dziesietna: ');
ReadLn(dziesietna);
binarna:='';
while dziesietna>0 do
begin
binarna:=Chr(dziesietna mod 2 + Ord('0')) + binarna;
dziesietna:=dziesietna div 2;
end;
WriteLn(dziesietna,' = ',binarna,'B');
end.
________________________________________________2
{Rekurencyjna
realizacja algorytmu zamiany liczby dziesietnej na postac binarna ***program
poprawiony***}
program 10_2_r;
var
dziesietna:longint;
binarna:string;
procedure CyfraBinarna(dzies:longint);
begin
if
dzies>0 then
begin
binarna:=Chr(dzies mod 2 + Ord('0')) +
binarna;
CyfraBinarna(dzies
div 2);
end
end;
begin
Write('Podaj
liczbe dziesietna ');
ReadLn(dziesietna);
binarna:='';
CyfraBinarna(dziesietna);
WriteLn(dziesietna,'
= ',binarna,'B');
end.
________________________________________________3
{ Zamiana liczb z systemu szesnastkowego i odwrotnie }
program 16_10_16;
var
dziesietna:longint;
szesnastkowa:string;
(* Funkcja
podaje wartosc pojedynczej cyfry szesnastkowej *)
function H2D(hex:char):byte;
begin
hex:=UpCase(hex); (*
Zamiana na wielka litere *)
case hex of
'0'..'9': H2D:=Ord(hex) - Ord('0');
'A'..'F': H2D:=Ord(hex) - Ord('A') + 10;
end;
end;
(* Funkcja
zamienia liczbe dziesietna na cyfre szesnastkowa *)
function D2H(dec:byte):char;
begin
case dec of
0..9: D2H:=Chr(dec + Ord('0'));
10..15: D2H:=Chr(dec + Ord('A') - 10);
else D2H:=' ';
end;
end;
function Hex2Dec(hex:string):longint;
var
i:integer;
wartosc:longint;
begin
wartosc:=0;
for i:=1 to Length(hex) do
wartosc:=wartosc * 16 + H2D(hex[i]);
Hex2Dec:=wartosc;
end;
function Dec2Hex(dec:longint):string;
var
wartosc:string;
begin
wartosc:='';
while dec>0 do
begin
wartosc:=D2H(dec mod 16) + wartosc;
dec:=dec div 16;
end;
Dec2Hex:=wartosc;
end;
begin
Write('Podaj liczbe dziesietna: ');
ReadLn(dziesietna);
WriteLn(dziesietna,' = ',Dec2Hex(dziesietna),'H');
Write('Podaj liczbe szesnastkowa: ');
ReadLn(szesnastkowa);
WriteLn(szesnastkowa,'H = ',Hex2Dec(szesnastkowa));
end.
________________________________________________4
{ Obliczanie wartosci dziesietnej liczby dwojkowej }
(*
** UWAGA:
** program nie sprawdza poprawnosci wprowadzanych danych
*)
program 2_10;
var
binarna:string;
potega:longint;
dziesietna:longint;
i:integer;
begin
Write('Podaj liczbe binarna: ');
ReadLn(binarna);
dziesietna:=0;
potega:=1;
for i:=Length(binarna) downto 1 do
begin
dziesietna:=dziesietna+(Ord(binarna[i])-Ord('0'))*potega;
potega:=potega*2;
end;
WriteLn(binarna,'B = ',dziesietna);
end.
________________________________________________5
{ Sortowanie babelkowe }
program Babelki;
const
MAX_DANYCH=100;
type
TDane=array [1..MAX_DANYCH] of integer;
var
MojeDane:TDane;
procedure WprowadzDane(var d:TDane);
var
i:integer;
begin
for i:=1 to MAX_DANYCH do
begin
Write('Podaj element nr ',i,': ');
ReadLn(d[i]);
end;
end;
procedure WyprowadzDane(var d:TDane);
var
i:integer;
begin
for i:=1 to MAX_DANYCH do
Write(d[i]:8);
WriteLn;
end;
procedure LosujDane(var d:TDane);
var
i:integer;
begin
for i:=1 to MAX_DANYCH do
d[i]:=Random(MaxInt);
end;
procedure ZamienZmienne(var a,b:integer);
var
t:integer;
begin
t:=a;
a:=b;
b:=t;
end;
procedure
SortujBabelkowo(var d:TDane);
var
i,j:integer;
zamiana:boolean;
begin
i:=MAX_DANYCH-1;
repeat
zamiana:=FALSE; (* Czy byla jakas zamiana? - w tym
przebiegu nie *)
for j:=1 to i do
if d[j]<d[j+1] then
begin
ZamienZmienne(d[j],d[j+1]);
zamiana:=TRUE;
end;
i:=i-1;
until not zamiana; (* Az nie bedzie zadnej zamiany *)
end;
begin
Randomize;
LosujDane(MojeDane);
WriteLn('Dane przed posortowaniem:');
WyprowadzDane(MojeDane);
WriteLn('Dane po posortowaniu:');
SortujBabelkowo(MojeDane);
WyprowadzDane(MojeDane);
end.
________________________________________________6
{ Algorytm przeszukiwania binarnego }
{ - zastosowanie metody "dziel i zwyciezaj" }
program Przeszukiwanie_binarne;
const
LICZBA_DANYCH=100;
type
TDane=array [1..LICZBA_DANYCH] of integer;
var
MojeDane:TDane;
x:integer;
indeks:integer;
procedure
WyprowadzDane(var d:TDane);
var
i:integer;
begin
for i:=1 to LICZBA_DANYCH do
Write(d[i]:8);
WriteLn;
end; (* WyprowadzDane *)
procedure
LosujDane(var d:TDane);
var
i:integer;
begin
for i:=1 to LICZBA_DANYCH do
d[i]:=Random(MaxInt);
end; (* LosujDane *)
procedure
SortujPrzezWybor(var d:TDane);
var
i,minIndeks:integer;
function
WyszukajMinIndeks(var d:TDane; start:integer):integer;
var
i:integer;
minElement,minIndeks:integer;
begin
for i:=start to LICZBA_DANYCH do
if i=start then
begin
minIndeks:=i;
minElement:=d[minIndeks];
end
else
if d[i]<minElement then
begin
minIndeks:=i;
minElement:=d[minIndeks];
end;
WyszukajMinIndeks:=minIndeks;
end; (* WyszukajMinIndeks *)
procedure
ZamienZmienne(var a,b:integer);
var
t:integer;
begin
t:=a; a:=b; b:=t;
end; (* ZamienZmienne *)
begin
for i:=1 to LICZBA_DANYCH-1 do
begin
minIndeks:=WyszukajMinIndeks(d,i);
ZamienZmienne(d[i],d[minIndeks]);
end;
end; (* SortujPrzezWyszukiwanie *)
function
SzukajBinarnie(var d:TDane; x:integer):integer;
var
lewy,prawy,srodek:integer;
znalezione:boolean;
begin
lewy:=1;
prawy:=LICZBA_DANYCH;
znalezione:=FALSE;
while (lewy<=prawy) and not znalezione do
begin
srodek:=(lewy+prawy) div 2;
if d[srodek]=x then
znalezione:=TRUE
else
if d[srodek]<x then
lewy:=srodek+1
else
prawy:=srodek-1;
end;
if znalezione then
SzukajBinarnie:=srodek
else
SzukajBinarnie:=-1;
end; (* SzukajBinarnie *)
begin
Randomize;
LosujDane(MojeDane);
Writeln('Dane przed posortowaniem:');
WyprowadzDane(MojeDane);
Writeln('Dane po posortowaniu:');
SortujPrzezWybor(MojeDane);
WyprowadzDane(MojeDane);
Writeln('Podaj dana do wyszukania: ');
Readln(x);
indeks:=SzukajBinarnie(MojeDane,x);
if indeks<0 then
Writeln('Dana nieznaleziona')
else
Writeln('Dana znaleziona na pozycji ',indeks);
end.
________________________________________________7
{Algorytm wyszukiwania liczb pierwszych - sito Erastotenesa}
program Erastotenes;
uses
CRT;
const
MAX_N=64000;
var
sito:array [1..MAX_N] of boolean;
n,i,j,skok,sn:longint;
begin
ClrScr;
Write('Podaj n(<=',MAX_N,'): ');
ReadLn(n);
{ Inicjalizacja tablicy }
for i:=1 to n do
sito[i]:=TRUE;
{ Przesiewanie }
sn:=Round(Sqrt(n));
for i:=2 to sn do
if sito[i] then
begin
j:=i+i;
while j<=n do
begin
sito[j]:=FALSE;
j:=j+i;
end;
end;
{ Wypisywanie wynikąw }
for i:=2 to n do
if sito[i] then
Write(i:8);
Writeln;
end.
________________________________________________8
{ Iteracyjna realizacja algorytmu Euklidesa - wersja z dzieleniem }
program Euklides_i;
var
a,b:word;
function Euklides(a,b: word):word;
var
t:word;
begin
while b<>0 do
begin
t:=a;
a:=b;
b:=t mod b;
end;
Euklides:=a;
end;
begin
Write('Podaj a, b: ');
ReadLn(a,b);
WriteLn('NWD(',a,',',b,')=',Euklides(a,b));
end.
________________________________________________9
{ Rekurencyjna realizacja algorytmu Euklidesa - wersja z dzieleniem }
program Euklides_r;
var
a,b:word;
function Euklides(a,b: word):word;
begin
if b=0 then
Euklides:=a
else
Euklides:=Euklides(b, a mod b);
end;
begin
Write('Podaj a, b: ');
ReadLn(a,b);
WriteLn('NWD(',a,',',b,')=',Euklides(a,b));
end.
________________________________________________10
{ Iteracyjna realizacja algorytmu Euklidesa - wersja z odejmowaniem }
program Euklides_i;
var
a,b:integer;
begin
Write('Podaj a, b: ');
ReadLn(a, b);
while a<>b do
if a>b then a:=a-b
else b:=b-a;
WriteLn('NWD=',a);
end.
________________________________________________11
program Euk_od_r;
var
a,b:word;
function Euklides(a,b: word):word;
begin
if a=b then
Euklides:=a
else
if a<b then
Euklides:=Euklides(a,b-a)
else
Euklides:=Euklides(a-b,b);
end;
begin
Write('Podaj a, b: ');
ReadLn(a,b);
WriteLn('NWD(',a,',',b,')=',Euklides(a,b));
end.
________________________________________________12
{ Iteracyjna realizacja algorytmu obliczania liczb Fibonacciego }
program Fibonacci_i;
var
i:integer;
function
Fib(n:integer):longint;
var
i,poprzedni1, poprzedni2:longint;
wynik:longint;
begin
if n<3 then
Fib:=1
else
begin
poprzedni1:=1;
poprzedni2:=1;
for i:=3 to n do
begin
wynik:=poprzedni1+poprzedni2;
poprzedni2:=poprzedni1;
poprzedni1:=wynik;
end;
Fib:=wynik;
end;
end;
begin
for i:=1 to 40 do
WriteLn('F(',i,')=',Fib(i));
end.
________________________________________________13
{ Rekurencyjna realizacja algorytmu obliczania liczb Fibonacciego }
program Fibonacci_r;
var
i:word;
function Fib(n:word):longint;
begin
if n<3 then
Fib:=1
else
Fib:=Fib(n-2)+Fib(n-1);
end;
begin
for i:=1 to 40 do
WriteLn('F(',i,')=',Fib(i));
end.
________________________________________________14
{Iteracyjna realizacja Wiez Hanoi - wersja z tablicami}
program Hanoi_it;
const
MAX_KRAZKI=100;
type
TPalik= object
private
krazki:array [1..MAX_KRAZKI] of integer;
liczbaKrazkow:integer;
public
Nazwa:string;
procedure Inicjalizuj(lKrazkow:integer);
function NajwyzszyKrazek:integer;
function ZdejmijKrazek:integer;
procedure PolozKrazek(k:integer);
function JestPusty:boolean;
function MoznaPolozyc(k:integer):boolean;
end;
TNazwaPalika=(PALIK_A,PALIK_B,PALIK_C);
var
Paliki:array [TNazwaPalika] of TPalik;
lKrazkow:integer;
krazek:integer;
lPrzelozen:integer;
koniec:boolean;
procedure TPalik.Inicjalizuj(lKrazkow:integer);
var
i:integer;
begin
for i:=1 to lKrazkow do
krazki[i]:=lKrazkow-i+1;
liczbaKrazkow:=lKrazkow;
end; (* TPalik.Inicjalizuj *)
function TPalik.NajwyzszyKrazek:integer;
begin
NajwyzszyKrazek:=krazki[liczbaKrazkow];
end; (* TPalik.NajwyzszyKrazek *)
function TPalik.ZdejmijKrazek:integer;
begin
ZdejmijKrazek:=krazki[liczbaKrazkow];
Dec(liczbaKrazkow);
end; (* TPalik.ZdejmijKrazek *)
procedure TPalik.PolozKrazek(k:integer);
begin
Inc(liczbaKrazkow);
krazki[liczbaKrazkow]:=k;
end; (* TPalik.PolozKrazek *)
function TPalik.JestPusty:boolean;
begin
JestPusty:=liczbaKrazkow=0;
end; (* TPalik.JestPusty *)
function TPalik.MoznaPolozyc(k:integer):boolean;
begin
if liczbaKrazkow=0 then
MoznaPolozyc:= TRUE
else
MoznaPolozyc:= k<krazki[liczbaKrazkow];
end; (* TPalik.MoznaPolozyc *)
procedure PrzelozNajmniejszy;
var
P1,P2:TNazwaPalika;
begin
if Paliki[PALIK_A].JestPusty and Paliki[PALIK_B].JestPusty then
P1:=PALIK_C
else if Paliki[PALIK_A].JestPusty and Paliki[PALIK_C].JestPusty then
P1:=PALIK_B
else if Paliki[PALIK_B].JestPusty and Paliki[PALIK_C].JestPusty then
P1:=PALIK_A
else if Paliki[PALIK_A].JestPusty then
if Paliki[PALIK_B].NajwyzszyKrazek<
Paliki[PALIK_C].NajwyzszyKrazek
then P1:=PALIK_B
else P1:=PALIK_C
else if Paliki[PALIK_B].JestPusty then
if Paliki[PALIK_A].NajwyzszyKrazek<
Paliki[PALIK_C].NajwyzszyKrazek
then P1:=PALIK_A
else P1:=PALIK_C
else if Paliki[PALIK_C].JestPusty then
if Paliki[PALIK_A].NajwyzszyKrazek<
Paliki[PALIK_B].NajwyzszyKrazek
then P1:=PALIK_A
else P1:=PALIK_B
else
if Paliki[PALIK_A].NajwyzszyKrazek<
Paliki[PALIK_B].NajwyzszyKrazek then
if Paliki[PALIK_A].NajwyzszyKrazek<
Paliki[PALIK_C].NajwyzszyKrazek
then P1:=PALIK_A
else P1:=PALIK_C
else
if Paliki[PALIK_B].NajwyzszyKrazek<
Paliki[PALIK_C].NajwyzszyKrazek
then P1:=PALIK_B
else P1:=PALIK_C;
if P1=PALIK_A then P2:=PALIK_B
else if P1=PALIK_B then P2:=PALIK_C
else P2:=PALIK_A;
Writeln('Przekladam ',Paliki[P1].Nazwa,' ->
',Paliki[P2].Nazwa);
Paliki[P2].PolozKrazek(Paliki[P1].ZdejmijKrazek);
Inc(lPrzelozen);
end;
procedure
PrzelozNienajmniejszy;
var
P1,P2:TNazwaPalika;
begin
if Paliki[PALIK_A].JestPusty then
if Paliki[PALIK_B].NajwyzszyKrazek>
Paliki[PALIK_C].NajwyzszyKrazek
then P1:=PALIK_B
else P1:=PALIK_C
else if Paliki[PALIK_B].JestPusty then
if Paliki[PALIK_A].NajwyzszyKrazek>
Paliki[PALIK_C].NajwyzszyKrazek then P1:=PALIK_A
else P1:=PALIK_C
else if Paliki[PALIK_C].JestPusty then
if Paliki[PALIK_A].NajwyzszyKrazek>
Paliki[PALIK_B].NajwyzszyKrazek
then P1:=PALIK_A
else P1:=PALIK_B
else
if (Paliki[PALIK_A].NajwyzszyKrazek<Paliki[PALIK_B].NajwyzszyKrazek)
and
(Paliki[PALIK_A].NajwyzszyKrazek<Paliki[PALIK_C].NajwyzszyKrazek)
then
if Paliki[PALIK_B].NajwyzszyKrazek<
Paliki[PALIK_C].NajwyzszyKrazek
then P1:=PALIK_B
else P1:=PALIK_C
else if
(Paliki[PALIK_B].NajwyzszyKrazek<Paliki[PALIK_A].NajwyzszyKrazek) and
(Paliki[PALIK_B].NajwyzszyKrazek<Paliki[PALIK_C].NajwyzszyKrazek)
then
if Paliki[PALIK_A].NajwyzszyKrazek<
Paliki[PALIK_C].NajwyzszyKrazek
then P1:=PALIK_A
else P1:=PALIK_C
else
if Paliki[PALIK_A].NajwyzszyKrazek<
Paliki[PALIK_B].NajwyzszyKrazek
then P1:=PALIK_A
else P1:=PALIK_B;
if
P1=PALIK_A then
if Paliki[PALIK_B].MoznaPolozyc(Paliki[PALIK_A].NajwyzszyKrazek)
then
P2:=PALIK_B
else
P2:=PALIK_C
else if P1=PALIK_B then
if Paliki[PALIK_A].MoznaPolozyc(Paliki[PALIK_B].NajwyzszyKrazek)
then
P2:=PALIK_A
else
P2:=PALIK_C
else
if Paliki[PALIK_A].MoznaPolozyc(Paliki[PALIK_C].NajwyzszyKrazek)
then
P2:=PALIK_A
else
P2:=PALIK_B;
Writeln('Przekladam
',Paliki[P1].Nazwa,' -> ',Paliki[P2].Nazwa);
Paliki[P2].PolozKrazek(Paliki[P1].ZdejmijKrazek);
Inc(lPrzelozen);
end;
begin
repeat
Write('Podaj liczbe krazkow [1..',MAX_KRAZKI,']: ');
Readln(lKrazkow);
until (lKrazkow>=1) and (lKrazkow<=MAX_KRAZKI);
Paliki[PALIK_A].Inicjalizuj(lKrazkow);
Paliki[PALIK_A].Nazwa:='A';
Paliki[PALIK_B].Inicjalizuj(0);
Paliki[PALIK_B].Nazwa:='B';
Paliki[PALIK_C].Inicjalizuj(0);
Paliki[PALIK_C].Nazwa:='C';
lPrzelozen:=0;
repeat
PrzelozNajmniejszy;
koniec:=Paliki[PALIK_A].JestPusty and
(Paliki[PALIK_B].JestPusty or
Paliki[PALIK_C].JestPusty);
if not koniec then
PrzelozNienajmniejszy;
until koniec;
Writeln('Calkowita liczba przelozen: ',lPrzelozen);
end.
________________________________________________15
{ Iteracyjna realizacja Wiez Hanoi - wersja ze wskaŒnikami}
program Hanoi_iw;
const
MAX_KRAZKI=100;
type
TPalik= object
private
krazki:array [1..MAX_KRAZKI] of integer;
liczbaKrazkow:integer;
public
Nazwa:string;
procedure Inicjalizuj(lKrazkow:integer);
function NajwyzszyKrazek:integer;
function ZdejmijKrazek:integer;
procedure PolozKrazek(k:integer);
function JestPusty:boolean;
function MoznaPolozyc(k:integer):boolean;
end;
var
A,B,C:TPalik;
P1,P2:^TPalik;
lKrazkow:integer;
krazek:integer;
lPrzelozen:integer;
koniec:boolean;
procedure
TPalik.Inicjalizuj(lKrazkow:integer);
var
i:integer;
begin
for i:=1 to lKrazkow do
krazki[i]:=lKrazkow-i+1;
liczbaKrazkow:=lKrazkow;
end; (* TPalik.Inicjalizuj *)
function
TPalik.NajwyzszyKrazek:integer;
begin
NajwyzszyKrazek:=krazki[liczbaKrazkow];
end; (* TPalik.NajwyzszyKrazek *)
function
TPalik.ZdejmijKrazek:integer;
begin
ZdejmijKrazek:=krazki[liczbaKrazkow];
Dec(liczbaKrazkow);
end; (* TPalik.ZdejmijKrazek *)
procedure
TPalik.PolozKrazek(k:integer);
begin
Inc(liczbaKrazkow);
krazki[liczbaKrazkow]:=k;
end; (* TPalik.PolozKrazek *)
function
TPalik.JestPusty:boolean;
begin
JestPusty:=liczbaKrazkow=0;
end; (* TPalik.JestPusty *)
function
TPalik.MoznaPolozyc(k:integer):boolean;
begin
if liczbaKrazkow=0 then
MoznaPolozyc:=TRUE
else
MoznaPolozyc:= k<krazki[liczbaKrazkow];
end; (* TPalik.MoznaPolozyc *)
procedure
PrzelozNajmniejszy;
begin
if A.JestPusty and B.JestPusty then
P1:=@C
else if A.JestPusty and C.JestPusty then
P1:=@B
else if B.JestPusty and C.JestPusty then
P1:=@A
else if A.JestPusty then
if B.NajwyzszyKrazek<C.NajwyzszyKrazek then P1:=@B
else P1:=@C
else if B.JestPusty then
if A.NajwyzszyKrazek<C.NajwyzszyKrazek then P1:=@A
else P1:=@C
else if C.JestPusty then
if A.NajwyzszyKrazek<B.NajwyzszyKrazek then P1:=@A
else P1:=@B
else
if A.NajwyzszyKrazek<B.NajwyzszyKrazek then
if A.NajwyzszyKrazek<C.NajwyzszyKrazek then P1:=@A
else P1:=@C
else
if B.NajwyzszyKrazek<C.NajwyzszyKrazek then P1:=@B
else P1:=@C;
if P1=@A
then P2:=@B
else if P1=@B
then P2:=@C
else P2:=@A;
Writeln('Przekladam ',P1^.Nazwa,' ->
',P2^.Nazwa);
P2^.PolozKrazek(P1^.ZdejmijKrazek);
Inc(lPrzelozen);
end;
procedure PrzelozNienajmniejszy;
begin
if A.JestPusty then
if B.NajwyzszyKrazek>C.NajwyzszyKrazek then P1:=@B
else P1:=@C
else if B.JestPusty then
if A.NajwyzszyKrazek>C.NajwyzszyKrazek then P1:=@A
else P1:=@C
else if C.JestPusty then
if A.NajwyzszyKrazek>B.NajwyzszyKrazek then P1:=@A
else P1:=@B
else
if (A.NajwyzszyKrazek<B.NajwyzszyKrazek) and
(A.NajwyzszyKrazek<C.NajwyzszyKrazek) then
if B.NajwyzszyKrazek<C.NajwyzszyKrazek then P1:=@B
else P1:=@C
else if (B.NajwyzszyKrazek<A.NajwyzszyKrazek) and
(B.NajwyzszyKrazek<C.NajwyzszyKrazek)
then
if A.NajwyzszyKrazek<C.NajwyzszyKrazek then P1:=@A
else P1:=@C
else
if A.NajwyzszyKrazek<B.NajwyzszyKrazek then P1:=@A
else P1:=@B;
if P1=@A then
if B.MoznaPolozyc(A.NajwyzszyKrazek) then P2:=@B
else P2:=@C
else if P1=@B then
if A.MoznaPolozyc(B.NajwyzszyKrazek) then P2:=@A
else P2:=@C
else
if A.MoznaPolozyc(C.NajwyzszyKrazek) then P2:=@A
else P2:=@B;
Writeln('Przekladam ',P1^.Nazwa,' ->
',P2^.Nazwa);
P2^.PolozKrazek(P1^.ZdejmijKrazek);
Inc(lPrzelozen);
end;
begin
repeat
Write('Podaj liczbe krazkow [1..',MAX_KRAZKI,']: ');
Readln(lKrazkow);
until (lKrazkow>=1) and (lKrazkow<=MAX_KRAZKI);
A.Inicjalizuj(lKrazkow); A.Nazwa:='A';
B.Inicjalizuj(0); B.Nazwa:='B';
C.Inicjalizuj(0); C.Nazwa:='C';
lPrzelozen:=0;
repeat
PrzelozNajmniejszy;
koniec:=A.JestPusty and (B.JestPusty or C.JestPusty);
if not koniec then
PrzelozNienajmniejszy;
until koniec;
Writeln('Calkowita liczba przelozen: ',lPrzelozen);
end.
________________________________________________16
{ Rekurencyjna realizacja Wiez Hanoi - wersja z tablicami}
program Hanoi_rt;
const
MAX_KRAZKI=100;
type
TPalik= object
private
krazki:array [1..MAX_KRAZKI] of integer;
liczbaKrazkow:integer;
public
Nazwa:string;
procedure Inicjalizuj(lKrazkow:integer);
function NajwyzszyKrazek:integer;
function ZdejmijKrazek:integer;
procedure PolozKrazek(k:integer);
function JestPusty:boolean;
function MoznaPolozyc(k:integer):boolean;
end;
TNazwaPalika=(PALIK_A,PALIK_B,PALIK_C);
var
Paliki:array [TNazwaPalika] of TPalik;
lKrazkow:integer;
krazek:integer;
lPrzelozen:integer;
koniec:boolean;
procedure TPalik.Inicjalizuj(lKrazkow:integer);
var
i:integer;
begin
for i:=1 to lKrazkow do
krazki[i]:=lKrazkow-i+1;
liczbaKrazkow:=lKrazkow;
end; (* TPalik.Inicjalizuj *)
function TPalik.NajwyzszyKrazek:integer;
begin
NajwyzszyKrazek:=krazki[liczbaKrazkow];
end; (* TPalik.NajwyzszyKrazek *)
function TPalik.ZdejmijKrazek:integer;
begin
ZdejmijKrazek:=krazki[liczbaKrazkow];
Dec(liczbaKrazkow);
end; (* TPalik.ZdejmijKrazek *)
procedure TPalik.PolozKrazek(k:integer);
begin
Inc(liczbaKrazkow);
krazki[liczbaKrazkow]:=k;
end; (* TPalik.PolozKrazek *)
function TPalik.JestPusty:boolean;
begin
JestPusty:=liczbaKrazkow=0;
end; (* TPalik.JestPusty *)
function TPalik.MoznaPolozyc(k:integer):boolean;
begin
if liczbaKrazkow=0 then
MoznaPolozyc:= TRUE
else
MoznaPolozyc:= k<krazki[liczbaKrazkow];
end; (* TPalik.MoznaPolozyc *)
procedure PrzeniesN(n:integer; p1,p2:TNazwaPalika);
var
p3:TNazwaPalika;
begin
if n>0 then
begin
if (p1=PALIK_A) and (p2=PALIK_B)
then p3:=PALIK_C
else if (p1=PALIK_A) and (p2=PALIK_C) then p3:=PALIK_B
else
p3:=PALIK_A;
PrzeniesN(n-1,p1,p3);
Writeln('Przekladam ',Paliki[p1].Nazwa,' -> ',Paliki[p2].Nazwa);
Paliki[p2].PolozKrazek(Paliki[p1].ZdejmijKrazek);
Inc(lPrzelozen);
PrzeniesN(n-1,p3,p2);
end;
end; (* PrzeniesN *)
begin
repeat
Write('Podaj liczbe krazkow [1..',MAX_KRAZKI,']: ');
Readln(lKrazkow);
until (lKrazkow>=1) and (lKrazkow<=MAX_KRAZKI);
Paliki[PALIK_A].Inicjalizuj(lKrazkow);
Paliki[PALIK_A].Nazwa:='A';
Paliki[PALIK_B].Inicjalizuj(0);
Paliki[PALIK_B].Nazwa:='B';
Paliki[PALIK_C].Inicjalizuj(0);
Paliki[PALIK_C].Nazwa:='C';
lPrzelozen:=0;
PrzeniesN(lKrazkow,PALIK_A,PALIK_B);
Writeln('Calkowita liczba przelozen: ',lPrzelozen);
end.
________________________________________________17
{ Rekurencyjna realizacja Wiez Hanoi - wersja ze wskaznikami }
program Hanoi_rw;
const
MAX_KRAZKI=100;
type
TPalik= object
private
krazki:array [1..MAX_KRAZKI] of integer;
liczbaKrazkow:integer;
public
Nazwa:string;
procedure Inicjalizuj(lKrazkow:integer);
function NajwyzszyKrazek:integer;
function ZdejmijKrazek:integer;
procedure PolozKrazek(k:integer);
function JestPusty:boolean;
function MoznaPolozyc(k:integer):boolean;
end;
var
A,B,C:TPalik;
lKrazkow:integer;
krazek:integer;
lPrzelozen:integer;
koniec:boolean;
procedure TPalik.Inicjalizuj(lKrazkow:integer);
var
i:integer;
begin
for i:=1 to lKrazkow do
krazki[i]:=lKrazkow-i+1;
liczbaKrazkow:=lKrazkow;
end; (* TPalik.Inicjalizuj *)
function TPalik.NajwyzszyKrazek:integer;
begin
NajwyzszyKrazek:=krazki[liczbaKrazkow];
end; (* TPalik.NajwyzszyKrazek *)
function TPalik.ZdejmijKrazek:integer;
begin
ZdejmijKrazek:=krazki[liczbaKrazkow];
Dec(liczbaKrazkow);
end; (* TPalik.ZdejmijKrazek *)
procedure TPalik.PolozKrazek(k:integer);
begin
Inc(liczbaKrazkow);
krazki[liczbaKrazkow]:=k;
end; (* TPalik.PolozKrazek *)
function TPalik.JestPusty:boolean;
begin
JestPusty:=liczbaKrazkow=0;
end; (* TPalik.JestPusty *)
function TPalik.MoznaPolozyc(k:integer):boolean;
begin
if liczbaKrazkow=0 then
MoznaPolozyc:=TRUE
else
MoznaPolozyc:= k<krazki[liczbaKrazkow];
end; (* TPalik.MoznaPolozyc *)
procedure PrzeniesN(n:integer; var p1,p2:TPalik);
var
p3:^TPalik;
begin
if n>0 then
begin
if (p1.Nazwa='A') and (p2.Nazwa='B')
then p3:=@C
else if (p1.Nazwa='A') and (p2.Nazwa='C') then p3:=@B
else
p3:=@A;
PrzeniesN(n-1,p1,p3^);
Writeln('Przekladam ',p1.Nazwa,' -> ',p2.Nazwa);
p2.PolozKrazek(p1.ZdejmijKrazek);
Inc(lPrzelozen);
PrzeniesN(n-1,p3^,p2);
end;
end; (* PrzeniesN *)
begin
repeat
Write('Podaj liczbe krazkow [1..',MAX_KRAZKI,']: ');
Readln(lKrazkow);
until (lKrazkow>=1) and (lKrazkow<=MAX_KRAZKI);
A.Inicjalizuj(lKrazkow); A.Nazwa:='A';
B.Inicjalizuj(0); B.Nazwa:='B';
C.Inicjalizuj(0); C.Nazwa:='C';
lPrzelozen:=0;
PrzeniesN(lKrazkow,A,B);
Writeln('Calkowita liczba przelozen: ',lPrzelozen);
end.
________________________________________________18
{ Iteracyjna realizacja schematu Hornera }
program Horner_i;
const
MAX_WSP=4;
type
TWsp=array [0..MAX_WSP] of real;
var
MojeWsp:TWsp;
x:real;
procedure WprowadzWsp(var w:TWsp);
var
i:integer;
begin
for i:=MAX_WSP downto 0 do
begin
Write('Podaj wspolczynnik nr ',i,': ');
ReadLn(w[i]);
end;
end;
procedure WypiszWielomian(var w:TWsp);
var
i:integer;
begin
for i:=MAX_WSP downto 1 do
Write(w[i]:6:2,'*x^',i,' + ');
WriteLn(w[0]:6:2);
end;
function Horner(var w:TWsp; x:real):real;
var
i:integer;
wynik:real;
begin
wynik:=w[MAX_WSP];
for i:=MAX_WSP-1 downto 0 do
wynik:=w[i]+x*wynik;
Horner:=wynik;
end;
begin
WriteLn('*** Wprowadzanie wspolczynnikow wielomianu ***');
WprowadzWsp(MojeWsp);
WypiszWielomian(MojeWsp);
WriteLn('Podaj wartosc x: ');
ReadLn(x);
WriteLn('Wartosc wielomianu=',Horner(MojeWsp,x):8:2);
end.
________________________________________________19
{ Rekurencyjna realizacja schematu Hornera }
program Horner_r;
const
MAX_WSP=5;
type
TWsp=array [0..MAX_WSP] of extended;
var
MojeWsp:TWsp;
x:real;
procedure WprowadzWsp(var w:TWsp);
var
i:integer;
begin
for i:=MAX_WSP downto 0 do
begin
Write('Podaj wspolczynnik nr ',i,': ');
ReadLn(w[i]);
end;
end;
procedure WypiszWielomian(var w:TWsp);
var
i:integer;
begin
for i:=MAX_WSP downto 1 do
if w[i]<>0 then
Write(w[i]:6:2,'*x^',i,' + ');
WriteLn(w[0]:6:2);
end;
procedure LosujWsp(var w:TWsp);
var
i:integer;
begin
for i:=MAX_WSP downto 0 do
w[i]:=Random*40-20;
end; (* LosujWsp *)
function Horner(var w:TWsp; n:integer; x:real):real;
var
wynik:real;
begin
if n=MAX_WSP then
Horner:=w[MAX_WSP]
else
Horner:=w[n]+x*Horner(w,n+1,x);
end;
function ObliczWielomian(var w:TWsp; x:real):real;
begin
ObliczWielomian:=Horner(w,0,x);
end;
begin
WriteLn('*** Wprowadzanie wspolczynnikow wielomianu ***');
WprowadzWsp(MojeWsp);
WypiszWielomian(MojeWsp);
WriteLn('Podaj wartosc x: ');
ReadLn(x);
WriteLn('Wartosc wielomianu=',ObliczWielomian(MojeWsp,x):8:2);
end.
________________________________________________20
{ Znajdowanie maksimum z n liczb }
program Maksimum;
var
n,m:integer;
function
Max(n:integer):integer;
var
i,liczba,wynik:integer;
begin
for i:=1 to n do
begin
Write('Podaj liczbe: ');
ReadLn(liczba);
if i=1 then
wynik:=liczba
else
if liczba>wynik then
wynik:=liczba;
end;
max:=wynik;
end;
begin
Write('Podaj liczbe elementąw: ');
ReadLn(n);
m:=Max(n);
WriteLn('Maksimum = ',m);
end.
________________________________________________21
{ Algorytm jednoczesnego szukania najmniejszego i najwiekszego elementu zbioru
}
{ - zastosowanie metody "dziel i zwyciezaj" }
program MinMax;
const
N=100;
type
TDane=array [1..N] of integer;
var
MojeDane:TDane;
min,max:integer;
procedure LosujDane(var d:TDane);
var
i:integer;
begin
for i:=1 to N do
d[i]:=Random(MaxInt);
end; (* LosujDane *)
procedure WypiszDane(var d:TDane);
var
i:integer;
begin
Writeln('Wylosowane dane: ');
for i:=1 to N do
Write(d[i]:8);
Writeln;
end; (* WypiszDane *)
procedure WyszukajMinMax(var d:TDane; var
min,max:integer);
var
i:integer;
min1,max1:integer;
begin
for i:=1 to N div 2 do
begin
if d[i*2-1]<d[i*2] then
begin
min1:=d[i*2-1]; max1:=d[i*2];
end
else
begin
min1:=d[i*2]; max1:=d[i*2-1];
end;
if i=1 then
begin
min:=min1; max:=max1;
end
else
begin
if min1<min then
min:=min1;
if max1>max then
max:=max1;
end;
end;
if N div 2=1 then
begin
if d[N]<min then
min:=d[N];
if d[N]>max then
max:=d[N];
end;
end; (* WyszukajMinMax *)
begin
Randomize;
LosujDane(MojeDane);
WypiszDane(MojeDane);
WyszukajMinMax(MojeDane,Min,Max);
Writeln('Min=',Min,' Max=',Max);
end.
________________________________________________22
{Algorytm wyszukiwania liczb pierwszych - podejscie naiwne }
program
Pierwsze_naiwny;
uses
CRT;
var
i,j,n:longint;
Pierwsza:boolean;
begin
ClrScr;
Write('Podaj n: ');
ReadLn(n);
for i:=2 to n do
begin
Pierwsza:=TRUE;
j:=2;
while Pierwsza and (j<i) do
begin
if i mod j=0 then
Pierwsza:=FALSE;
j:=j+1;
end;
if Pierwsza then
Write(i:8);
end;
Writeln;
end.
________________________________________________23
{ Wypisanie wszystkich palindromow z danego tekstu }
(*
** Zakladamy, ze wyrazy sa rozdzielone spacjami
** Dopuszczamy mozliwosc wystapienia kilku spacji pod rzad
** i traktujemy je jako jedna spacje
*)
program Palindrom;
var
s, slowo:string;
i:integer;
bylaSpacja:boolean;
function
JestPalindromem(s:string):boolean;
var
i, dlugosc:integer;
begin
JestPalindromem:=TRUE;
dlugosc:=Length(s);
for i:=1 to dlugosc div 2 do
if UpCase(s[i])<>UpCase(s[dlugosc-i+1]) then
begin
JestPalindromem:=FALSE;
exit;
end;
end;
begin
Write('Podaj napis: ');
ReadLn(s);
s:=s+' '; (*
Wartownik *)
bylaSpacja:=TRUE;
for i:=1 to Length(s) do
if s[i]=' ' then
begin
if slowo<>'' then
begin
Write('Slowo "',slowo,'" ');
if not JestPalindromem(slowo) then
Write('nie ');
WriteLn('jest palindromem');
end;
bylaSpacja:=TRUE;
slowo:='';
end
else
begin
slowo:=slowo+s[i];
bylaSpacja:=FALSE;
end;
end.
________________________________________________24
{ Sprawdzanie, czy liczba jest pierwsza }
program Pierwsza;
var
liczba:word;
function JestPierwsza(n:word):boolean;
var
i:word;
begin
JestPierwsza:=TRUE;
for i:=2 to Trunc(Sqrt(n)) do
if n mod i=0 then (* Podzielna
*)
begin
JestPierwsza:=FALSE;
exit;
end;
end;
begin
Write('Podaj liczbe: ');
ReadLn(liczba);
if JestPierwsza(liczba) then
WriteLn('Liczba ',liczba,' jest pierwsza')
else
WriteLn('Liczba ',liczba,' nie jest pierwsza');
end.
________________________________________________25
{ Iteracyjna realizacja algorytmu oblicznia wartosci poteg liczb o wykladnikach
naturalnych }
program Potega_i;
var
p:real;
w:word;
function
Potega(a:real; n:word):real;
var
x,wynik:real;
k:word;
begin
(* Krok 1 *)
wynik:=1;
x:=a;
k:=n;
(* Krok 2 *)
while k<>0 do
(* Krok 3 *)
if k mod 2=1 then
begin
wynik:=wynik*x;
Dec(k);
end
else
begin
k:=k div 2;
x:=x*x;
end;
(* Krok 4*)
Potega:=wynik;
end;
begin
Write('Podaj podstawe: ');
Readln(p);
Write('Podaj wykladnik: ');
Readln(w);
Writeln(p:6:2,'^',w,'=',Potega(p,w):8:2);
end.
________________________________________________26
{ Rekurencyjna realizacja algorytmu oblicznia wartosci poteg liczb o
wykladnikach naturalnych }
program Potega_r;
var
p:real;
w:word;
function Potega(a:real; n:word):real;
begin
if n=0 then
Potega:=1
else
Potega:=a*Potega(a,n-1);
end;
begin
Write('Podaj podstawe: ');
Readln(p);
Write('Podaj wykladnik: ');
Readln(w);
Writeln(p:6:2,'^',w,'=',Potega(p,w):8:2);
end.
________________________________________________27
{ Obliczanie obszaru ograniczonego - metoda prostokatow }
program metoda_prostokatow;
uses
CRT;
var
a,b:real;
n:integer;
function Fun(x: real): real;
begin
Fun:=sin(x);
end;
function PoleProstokaty(a,b: real; n:integer):real;
var
pole:real;
w,xi:real;
i:integer;
begin
pole:=0;
w:=(b-a)/n;
xi:=a+w/2;
while xi<b do
begin
pole:=pole+Fun(xi);
xi:=xi+w;
end;
PoleProstokaty:=w*pole;
end;
begin
ClrScr;
Write('Podaj dolna granice przedzialu: ');
Readln(a);
Write('Podaj gorna granice przedzialu: ');
Readln(b);
Write('Podaj liczbe iteracji: ');
Readln(n);
Writeln('Pole=',PoleProstokaty(a,b,n):8:4);
end.
________________________________________________28
{ Rozwiazywanie rownania kwadratowego }
program Rownanie_kwadratowe;
var
a,b,c,d,pd:real;
begin
Write('Podaj a: '); ReadLn(a);
Write('Podaj b: '); ReadLn(b);
Write('Podaj c: '); ReadLn(c);
d:=b*b-4*a*c;
if d<0 then
WriteLn('Brak rozwiazan')
else if d=0 then
begin
WriteLn('x1=x2=',-b/(2*a):6:2);
end
else
begin
pd:=sqrt(d);
WriteLn('x1=',(-b-pd)/(2*a):6:2);
WriteLn('x2=',(-b+pd)/(2*a):6:2);
end;
end.
________________________________________________29
{ Rozwiazywanie rownania liniowego }
program Rownanie_liniowe;
var
a,b,x:real;
i,n:integer;
begin
Write('Podaj liczbe danych: ');
ReadLn(n);
for i:=1 to n do
begin
Write('Podaj a, b: ');
ReadLn(a, b);
if a=0 then
if b=0 then
WriteLn('Nieskonczenie wiele rozwiazan')
else
WriteLn('Rownanie sprzeczne')
else
begin
x:=-b/a;
Writeln('x=',x:6:2);
end;
end;
end.
________________________________________________30
{Sortowanie przez scalanie - realizacja iteracyjna }
program Scalanie_i;
uses
CRT;
const
MAX_MN=100;
type
TTablica=array[1..MAX_MN] of integer;
TDane=record
dane:TTablica;
lDanych:integer;
end;
var
Wynik,Dane1,Dane2:TDane;
procedure
WprowadzDane(var d:TDane);
var
i:integer;
begin
Write('Podaj liczbe danych: ');
repeat
Readln(d.lDanych);
if (d.lDanych<1) or (d.LDanych>MAX_MN) then
Writeln('Niepoprawna liczba danych');
until (d.lDanych>=1) and (d.LDanych<=MAX_MN);
Writeln('Wprowadz dane:');
for i:=1 to d.lDanych do
begin
Write('Podaj element nr ',i,': ');
Readln(d.dane[i]);
end;
end;
procedure
WyprowadzDane(var d:TDane);
var
i:integer;
begin
Writeln('Dane:');
for i:=1 to d.lDanych do
Write(d.dane[i]:8);
Writeln;
end;
procedure
SortujPrzezScalanie(var w:TDane; var d1,d2:TDane);
var
a,b,ab:TTablica;
ia,ib,iab:integer; (*
Pozycja w ciagu *)
la,lb,lab:integer; (*
Liczba elementow ciagu *)
begin
a:=d1.dane;
b:=d2.dane;
ia:=1;
ib:=1;
iab:=1;
la:=d1.lDanych;
lb:=d2.lDanych;
while (ia<=la) and (ib<=lb) do (* Sprawdz, czy w
ciagu sa dane *)
if a[ia]<b[ib] then
begin
ab[iab]:=a[ia]; Inc(iab); Inc(ia);
end
else if a[ia]>b[ib] then
begin
ab[iab]:=b[ib]; Inc(iab); Inc(ib);
end
else
begin
ab[iab]:=a[ia]; Inc(iab); Inc(ia);
ab[iab]:=b[ib]; Inc(iab); Inc(ib);
end;
while ia<=la do
begin
ab[iab]:=a[ia]; Inc(iab); Inc(ia);
end;
while ib<=lb do
begin
ab[iab]:=b[ib]; Inc(iab); Inc(ib);
end;
lab:=iab-1;
w.dane:=ab;
w.lDanych:=lab;
end;
begin
Writeln('*** Ciag A');
WprowadzDane(Dane1);
Writeln('*** Ciag B');
WprowadzDane(Dane2);
SortujPrzezScalanie(Wynik,Dane1,Dane2);
Writeln('*** Ciag scalony');
WyprowadzDane(Wynik);
end.
________________________________________________31
{ Iteracyjna realizacja algorytmu obliczania silni }
program Silnia_i;
var
n:integer;
function
SilniaIt(n:integer):longint;
var
i:integer;
wynik:longint;
begin
if n<2 then
SilniaIt:=1
else
begin
wynik:=2;
for i:=3 to n do
wynik:=wynik*i;
SilniaIt:=wynik;
end;
end;
begin
Write('Podaj n: ');
Readln(n);
WriteLn(n,'!=',SilniaIt(n));
end.
________________________________________________32
{ Rekurencyjna realizacja algorytmu obliczania silni }
program Silnia_r;
var
n:integer;
function SilniaRek(n:integer):longint;
begin
if n=0 then
SilniaRek:=1
else
SilniaRek:=n*SilniaRek(n-1);
end;
begin
Write('Podaj n: ');
Readln(n);
WriteLn(n,'!=',SilniaRek(n));
end.
________________________________________________33
{Zamiana liczb miedzy dowolnymi systemami pozycyjnymi }
program Systemy;
uses
CRT;
var
number:string;
p1,p2:integer;
ok:boolean;
function C2V(c:char):byte;
begin
c:=UpCase(c);
if (c>='0') and (c<='9') then
C2V:=Ord(c)-Ord('0')
else if (c>='A') and (c<='Z') then
C2V:=Ord(c)-Ord('A')+10
else
C2V:=0;
end;
function V2C(v:byte):char;
begin
if v<10 then
V2C:=Chr(v+Ord('0'))
else if v<36 then
V2C:=Chr(v-10+Ord('A'))
else
V2C:=' ';
end;
function X2D(x:string; p:integer):integer;
var
i,w:integer;
begin
w:=0;
for i:=1 to Length(x) do
w:=w*p+C2V(x[i]);
X2D:=w;
end;
function D2X(v:integer; p:integer):string;
var
w:string;
begin
if v=0 then
w:='0'
else
begin
w:='';
while v>0 do
begin
w:=V2C(v mod p)+w;
v:=v div p;
end;
end;
D2X:=w;
end;
function X2X(s:string; p1,p2:integer):string;
begin
X2X:=D2X(X2D(s,p1),p2);
end;
function DigitCorrect(c:char; p:integer):boolean;
var
up:char;
begin
c:=UpCase(c);
if (p<2) or (p>36) then
DigitCorrect:=FALSE
else
begin
up:=V2C(p);
if p<=10 then
DigitCorrect:=c in ['0'..up]
else
DigitCorrect:=c in ['0'..'9','A'..up];
end;
end;
function NumberCorrect(s:string; p:integer):boolean;
var
i:integer;
begin
NumberCorrect:=TRUE;
for i:=1 to Length(s) do
if not DigitCorrect(s[i],p) then
begin
NumberCorrect:=FALSE;
exit;
end;
end;
procedure Convert(s:string; p1,p2:integer);
begin
Writeln(s,'(',p1,')=',X2X(s,p1,p2),'(',p2,')');
end;
begin
ClrScr;
repeat
Write('Podaj liczbe do zamiany: ');
Readln(number);
repeat
Write('Podaj podstawe systemu liczby: ');
Readln(p1);
if (p1<2) or (p1>36) then
Writeln('Podstawa poza zakresem');
until (p1>=2) and (p1<=36);
ok:=NumberCorrect(number,p1);
if not ok then
Writeln('Podana liczba w podanym systemie jest
nieprawidlowa');
until ok;
repeat
Write('Podaj podstawe systemu docelowego: ');
Readln(p2);
if (p2<2) or (p2>36) then
Writeln('Podstawa poza zakresem');
until (p2>=2) and (p2<=36);
Convert(number,p1,p2);
end.
________________________________________________34
{ Algorytm przeszukiwania liniowego - wyszukiwanie liczby w tablicy liczb }
program T11_p5;
const
N=100;
type
TDane=array [1..N] of integer;
var
MojeDane:TDane;
x,i:integer;
procedure LosujDane(var d:TDane);
var
i:integer;
begin
for i:=1 to N do
d[i]:=Random(MaxInt);
end; (* LosujDane *)
procedure WypiszDane(var d:TDane);
var
i:integer;
begin
Writeln('Wylosowane dane: ');
for i:=1 to N do
Write(d[i]:8);
Writeln;
end; (* WypiszDane *)
function WyszukajDana(var d:TDane; x:integer):integer;
var
i:integer;
begin
i:=0;
repeat
Inc(i);
until (i>N) or (d[i]=x);
if i>N then WyszukajDana:=-1
else WyszukajDana:=i;
end; (* WyszukajDana *)
begin
Randomize;
LosujDane(MojeDane);
WypiszDane(MojeDane);
Write('Podaj dana do wyszukania: ');
Readln(x);
i:=WyszukajDana(MojeDane,x);
if i>0 then
Writeln('Dana znaleziona pod indeksem ',i)
else
Writeln('Dana nieznaleziona');
end.
________________________________________________35
{ Sortowanie szybkie - realizacja rekurencyjna }
program Szybki_r;
uses
CRT;
const
N=8;
type
TDane=array[1..N] of integer;
var
Dane:TDane;
procedure
WprowadzDane(var d:TDane);
var
i:integer;
begin
Writeln('*** Wprowadzanie danych');
for i:=1 to N do
begin
Write('Podaj element nr ',i,': ');
Readln(d[i]);
end;
Writeln('*** Dane wprowadzone');
end;
procedure
WyprowadzDane(var d:TDane);
var
i:integer;
begin
Writeln('*** Wyprowadzanie danych');
for i:=1 to N do
Write(d[i]:8);
Writeln;
Writeln('*** Dane wyprowadzone');
end;
procedure
SortujRekurencyjnie(var w:TDane; var a:TDane; la:integer);
var
x,y:TDane;
xw,yw:TDane;
k:integer;
ix,iy,iw:integer;
i:integer;
begin
if la>1 then
begin
k:=a[1];
ix:=1;
iy:=1;
for i:=2 to la do
if a[i]<=k then
begin
x[ix]:=a[i]; Inc(ix);
end
else
begin
y[iy]:=a[i]; Inc(iy);
end;
SortujRekurencyjnie(xw,x,ix-1);
SortujRekurencyjnie(yw,y,iy-1);
iw:=1;
for i:=1 to ix-1 do
begin
w[iw]:=xw[i]; Inc(iw);
end;
w[iw]:=k; Inc(iw);
for i:=1 to iy-1 do
begin
w[iw]:=yw[i]; Inc(iw);
end;
end
else if la=1 then
w[1]:=a[1];
end;
procedure
SortujDane(var d:TDane);
var
w:TDane;
begin
SortujRekurencyjnie(w,d,N);
d:=w;
end;
begin
WprowadzDane(Dane);
SortujDane(Dane);
WyprowadzDane(Dane);
end.
________________________________________________36
{Szyfrowanie i deszyfrowanie szyfrem kolumnowym }
program Szyfrowanie;
uses
CRT;
var
Tekst:string;
Wybor:char;
Szerokosc:integer;
function
Szyfruj(s:string; n:integer):string;
var
i,poz,l:integer;
wynik:string;
begin
l:=Length(s);
wynik:='';
poz:=1;
for i:=1 to l do
begin
wynik:=wynik + s[poz];
poz:=poz+n;
if poz>l then
poz:=poz mod n +1;
end;
Szyfruj:=wynik;
end;
function Deszyfruj(s:string; n:integer):string;
begin
n:=Length(s) div n;
if n=0 then n:=1;
Deszyfruj:=Szyfruj(s,n);
end;
begin
repeat
ClrScr;
WriteLn('1 - Szyfrowanie');
WriteLn('2 - Deszyfrowanie');
WriteLn('0 - Koniec');
Wybor:=ReadKey;
case Wybor of
'1': begin
Write('Podaj tekst do zaszyfrowania:
');
ReadLn(Tekst);
Write('Podaj szerokosc kolumny: ');
ReadLn(Szerokosc);
WriteLn(Tekst,' ->
',Szyfruj(Tekst,Szerokosc));
WriteLn;
WriteLn('Nacisnij dowolny klawisz');
ReadKey;
end;
'2': begin
Write('Podaj tekst do deszyfrowania:
');
ReadLn(Tekst);
Write('Podaj szerokosc kolumny: ');
ReadLn(Szerokosc);
WriteLn(Tekst,' ->
',Deszyfruj(Tekst,Szerokosc));
WriteLn;
WriteLn('Nacisnij dowolny klawisz');
ReadKey;
end;
'0': begin end;
else begin
WriteLn('Bledny wybor');
Delay(500);
end;
end;
until Wybor='0';
end.
________________________________________________37
{ Obliczanie obszaru ograniczonego - metoda trapezow }
program Metoda_trapezow;
uses
CRT;
var
a,b:real;
n:integer;
function Fun(x: real): real;
begin
Fun:=sin(x);
end;
function PoleTrapezy(a,b: real; n:integer):real;
var
pole:real;
w,xi:real;
i:integer;
begin
pole:=0;
w:=(b-a)/n;
xi:=a+w;
while xi<b do
begin
pole:=pole+Fun(xi);
xi:=xi+w;
end;
PoleTrapezy:=(Fun(a)+Fun(b)+2*pole)*w/2;
end;
begin
ClrScr;
Write('Podaj dolna granice przedzialu: ');
Readln(a);
Write('Podaj gorna granice przedzialu: ');
Readln(b);
Write('Podaj liczbe iteracji: ');
Readln(n);
Writeln('Pole=',PoleTrapezy(a,b,n):8:4);
end.
________________________________________________38
{Rozwiazywanie ukladu dwoch rownan liniowych }
{- metoda wyznacznikow }
program UkladRownan;
var
a,b,c,d,e,f:real;
w,wx,wy:real;
begin
Writeln('Rozwiazywanie ukladu rownan postaci:');
Writeln(' ax + by = c');
Writeln(' dx + ey = f');
Write('Podaj a: '); Readln(a);
Write('Podaj b: '); Readln(b);
Write('Podaj c: '); Readln(c);
Write('Podaj d: '); Readln(d);
Write('Podaj e: '); Readln(e);
Write('Podaj f: '); Readln(f);
Writeln('Uklad rownan:');
Writeln(a:6:2,'*x + ',b:6:2,'*y = ',c:6:2);
Writeln(d:6:2,'*x + ',e:6:2,'*y = ',f:6:2);
w:=a*e-b*d;
wx:=c*e-b*f;
wy:=a*f-c*d;
if w=0 then
if (wx=0) and (wy=0) then
Writeln('Uklad rownan ma nieskonczenie wiele rozwiazan')
else
Writeln('Uklad rownan nie ma rozwiazan')
else
Writeln('x=',wx/w:6:2,' y=',wy/w:6:2);
end.
________________________________________________39
{Zamiana ulamka dziesietnego na liczbe binarna }
program Ulamek_2;
const
DOKLADNOSC=20; (*
Maksymalna liczba cyfr *)
var
liczba, potega, x:real;
i:integer;
wynik:string;
begin
potega:=0.5;
wynik:='0.';
i:=DOKLADNOSC;
Write('Podaj liczbe (<1): ');
Readln(liczba);
x:=liczba;
while (x<>0) and (i>0) do
begin
if x<potega then
wynik:=wynik+'0'
else
begin
wynik:=wynik+'1';
x:=x-potega;
end;
potega:=potega/2;
Dec(i);
end;
Writeln(liczba:8:6,'=',wynik,'(2)');
end.
________________________________________________40
{ Sortowanie przez wstawianie - realizacja iteracyjna }
program Wstawianie_i;
uses
CRT;
const
N=8;
type
TDane=array[1..N] of integer;
var
Dane:TDane;
procedure
WprowadzDane(var d:TDane);
var
i:integer;
begin
Writeln('*** Wprowadzanie danych');
for i:=1 to N do
begin
Write('Podaj element nr ',i,': ');
Readln(d[i]);
end;
Writeln('*** Dane wprowadzone');
end;
procedure
WyprowadzDane(var d:TDane);
var
i:integer;
begin
Writeln('*** Wyprowadzanie danych');
for i:=1 to N do
Write(d[i]:8);
Writeln;
Writeln('*** Dane wyprowadzone');
end;
procedure
SortujDane(var d:TDane);
var
a,b:TDane;
i,j,l:integer;
k:integer;
liczbaElB:integer;
begin
a:=d;
b[1]:=a[1];
liczbaElB:=1;
for i:=2 to N do
begin
k:=a[i];
j:=1;
while (j<=liczbaElB) and (k>b[j]) do
Inc(j);
if j>liczbaElB
then (* Dopisz element *)
b[j]:=k
else
begin (*
Wstaw element *)
for l:=liczbaElB downto j do (* Przesun elementy o
1 *)
b[l+1]:=b[l];
b[j]:=k; (*
Wstaw element *)
end;
Inc(liczbaElB);
end;
d:=b;
end;
begin
WprowadzDane(Dane);
SortujDane(Dane);
WyprowadzDane(Dane);
end.
________________________________________________41
{ Sortowanie przez wstawianie - realizacja rekurencyjna }
program Wstawianie_r;
uses
CRT;
const
N=7;
type
TDane=array[1..N] of integer;
var
Dane:TDane;
procedure
WprowadzDane(var d:TDane);
var
i:integer;
begin
Writeln('*** Wprowadzanie danych');
for i:=1 to N do
begin
Write('Podaj element nr ',i,': ');
Readln(d[i]);
end;
Writeln('*** Dane wprowadzone');
end;
procedure
WyprowadzDane(var d:TDane);
var
i:integer;
begin
Writeln('*** Wyprowadzanie danych');
for i:=1 to N do
Write(d[i]:8);
Writeln;
Writeln('*** Dane wyprowadzone');
end;
procedure
SortujRekurencyjnie(var w:TDane; var lw:integer; var a:TDane;
pierwszy,ostatni:integer);
var
x,y:TDane;
lx,ly:integer;
srodek:integer;
iw,ix,iy:integer;
begin
if pierwszy<ostatni then
begin
srodek:=(pierwszy+ostatni) div 2;
SortujRekurencyjnie(x,lx,a,pierwszy,srodek);
SortujRekurencyjnie(y,ly,a,srodek+1,ostatni);
(* Scal uporzadkowane ciagi iteracyjnie *)
iw:=1;
ix:=1;
iy:=1;
while (ix<=lx) and (iy<=ly) do
if x[ix]<y[iy] then
begin
w[iw]:=x[ix]; Inc(iw); Inc(ix);
end
else if x[ix]>y[iy] then
begin
w[iw]:=y[iy]; Inc(iw); Inc(iy);
end
else
begin
w[iw]:=x[ix]; Inc(iw); Inc(ix);
w[iw]:=y[iy]; Inc(iw); Inc(iy);
end;
while ix<=lx do
begin
w[iw]:=x[ix]; Inc(iw); Inc(ix);
end;
while iy<=ly do
begin
w[iw]:=y[iy]; Inc(iw); Inc(iy);
end;
lw:=iw-1;
end
else if pierwszy=ostatni then
begin
w[1]:=a[pierwszy];
lw:=1;
end
end;
procedure
SortujDane(var d:TDane);
var
w:TDane;
lw:integer;
begin
SortujRekurencyjnie(w,lw,d,1,N);
d:=w;
end;
begin
WprowadzDane(Dane);
SortujDane(Dane);
WyprowadzDane(Dane);
end.
________________________________________________42
{ Sortowanie przez wybor }
program Sort_wybor;
const
LICZBA_DANYCH=100;
type
TDane=array [1..LICZBA_DANYCH] of integer;
var
MojeDane:TDane;
procedure
WyprowadzDane(var d:TDane);
var
i:integer;
begin
for i:=1 to LICZBA_DANYCH do
Write(d[i]:8);
WriteLn;
end; (* WyprowadzDane *)
procedure
LosujDane(var d:TDane);
var
i:integer;
begin
for i:=1 to LICZBA_DANYCH do
d[i]:=Random(MaxInt);
end; (* LosujDane *)
procedure
ZamienZmienne(var a,b:integer);
var
t:integer;
begin
t:=a;
a:=b;
b:=t;
end; (* ZamienZmienne *)
procedure
SortujPrzezWybor(var d:TDane);
var
i,minIndeks:integer;
function
WyszukajMinIndeks(var d:TDane; start:integer):integer;
var
i:integer;
minElement,minIndeks:integer;
begin
for i:=start to LICZBA_DANYCH do
if i=start then
begin
minIndeks:=i;
minElement:=d[minIndeks];
end
else
if d[i]<minElement then
begin
minIndeks:=i;
minElement:=d[minIndeks];
end;
WyszukajMinIndeks:=minIndeks;
end; (* WyszukajMinIndeks *)
begin
for i:=1 to LICZBA_DANYCH-1 do
begin
minIndeks:=WyszukajMinIndeks(d,i);
ZamienZmienne(d[i],d[minIndeks]);
end;
end; (* SortujPrzezWybor *)
begin
Randomize;
LosujDane(MojeDane);
WriteLn('Dane przed posortowaniem:');
WyprowadzDane(MojeDane);
WriteLn('Dane po posortowaniu:');
SortujPrzezWybor(MojeDane);
WyprowadzDane(MojeDane);
end.
________________________________________________43
{ Wyznaczanie miejsca zerowego funkcji }
program Miejsce_zerowe;
uses
CRT;
var
a,b:real;
d1,d2:real;
n:integer;
x:real;
function Fun(x: real): real;
begin
Fun:=3*x*x + x - 2;
{ Fun:=sin(x) + sqrt(3)*cos(x) - 1;}
{ Fun:=x*x*x + x*x - 2*x;}
{ Fun:=3*x*x*x - 2*x*x - 3*x +2;}
end;
function CheckConditions(a,b:real):boolean;
begin
if a<b then (*
Warunek a < b *)
CheckConditions:= Fun(a)*Fun(b)<0
else
CheckConditions:= FALSE;
end;
function ZeroN(a, b: real; n: integer; var x: real):
boolean;
function Recurse(a,b:real; n:integer):real;
var
c,fx:real;
begin
c:=(a+b)/2;
fx:=Fun(c);
if fx=0
then (* Miejsce zerowe
znalezione *)
Recurse:=c
else (*
Miejsce zerowe nieznalezione *)
if n=0
then (* Koniec rekurencji
*)
Recurse:=c
else
if fx*Fun(a)<0 then (* Lewy
przedzia *)
Recurse:=Recurse(a,c,n-1)
else (*
Prawy przedzia *)
Recurse:=Recurse(c,b,n-1);
end;
begin
if CheckConditions(a,b) then (* Warunki poczĄtkowe spenione
*)
begin
x:=Recurse(a,b,n);
ZeroN:=TRUE;
end
else (*
Warunki poczĄtkowe niespenione *)
ZeroN:=FALSE;
end;
function ZeroDelta1(a, b: real; delta: real; var x:
real): boolean;
function Recurse(a,b:real; delta:real):real;
var
c,fx:real;
begin
c:=(a+b)/2;
fx:=Fun(c);
if fx=0
then (* Miejsce zerowe
znalezione *)
Recurse:=c
else (*
Miejsce zerowe nieznalezione *)
if Abs(fx)<delta then (* OsiĄgni©to
zao”one przybli”enie *)
Recurse:=c
else
if fx*Fun(a)<0 then (* Lewy
przedzia *)
Recurse:=Recurse(a,c,delta)
else (*
Prawy przedzia *)
Recurse:=Recurse(c,b,delta);
end;
begin
if CheckConditions(a,b) then (* Warunki poczĄtkowe spenione
*)
begin
x:=Recurse(a,b,delta);
ZeroDelta1:=TRUE;
end
else (*
Warunki poczĄtkowe niespenione *)
ZeroDelta1:=FALSE;
end;
function ZeroDelta2(a, b: real; delta: real; var x:
real):boolean;
function Recurse(a,b:real; delta:real):real;
var
c,fx:real;
begin
c:=(a+b)/2;
fx:=Fun(c);
if fx=0
then (* Miejsce zerowe
znalezione *)
Recurse:=c
else (*
Miejsce zerowe nieznalezione *)
if Abs(b-a)<delta then (* OsiĄgni©to
zao”one przybli”enie *)
Recurse:=c
else
if fx*Fun(a)<0 then (* Lewy
przedzia *)
Recurse:=Recurse(a,c,delta)
else (*
Prawy przedzia *)
Recurse:=Recurse(c,b,delta);
end;
begin
if CheckConditions(a,b) then (* Warunki poczĄtkowe spenione
*)
begin
x:=Recurse(a,b,delta);
ZeroDelta2:=TRUE;
end
else (*
Warunki poczĄtkowe niespenione *)
ZeroDelta2:=FALSE;
end;
begin
ClrScr;
Write('Podaj dolna granice przedzialu: ');
Readln(a);
Write('Podaj gorna granice przedzialu: ');
Readln(b);
Write('Podaj liczbe iteracji: ');
Readln(n);
Write('Podaj delte dla funkcji ZeroDelta1: ');
Readln(d1);
Write('Podaj delte dla funkcji ZeroDelta2: ');
Readln(d2);
if ZeroN(a,b,n,x) then
Writeln('Miejsce zerowe znalezione funkcja ZeroN: ',x:8:4)
else
Writeln('Znalezienie miejsca zerowego funkcja ZeroN nie bylo
mozliwe');
if ZeroDelta1(a,b,d1,x) then
Writeln('Miejsce zerowe znalezione funkcja ZeroDelta1: ',x:8:4)
else
Writeln('Znalezienie miejsca zerowego funkcja ZeroDelta1 nie bylo
mozliwe');
if ZeroDelta2(a,b,d2,x) then
Writeln('Miejsce zerowe znalezione funkcja ZeroDelta2: ',x:8:4)
else
Writeln('Znalezienie miejsca zerowego funkcja ZeroDelta2 nie bylo
mozliwe');
end.