Objekty
Na úvod lze zjednodušeně říct: object
je jako record
, který má svoje vlastní metody.
Objektově orientované programévání je rozsáhlé téma. Pro začátek člověku stačí, když si uvědomí následující fakta:
- ▸ object je pouze deklarace. Může mít víc instancí. Proto se deklaruje v sekci
type
. - ▸ se zbytkem programu komunikuje každá instance objektu pouze přes daný interface. Stejně jako má bicykl řidítka, brzdy a pedály abychom na něm mohli jezdit, má objekt metody, které nám umožní používat jeho použití v rámci programu.
Motivací pro implementaci objektového zásobníku nám byla následující lehce satirická úloha s militantním nádechem:
Invaze na Krym
Ruská armáda verbuje mužiky ze Sibiře. Všichni projdou speciálním diagnostickým přístrojem, který jim přiděluje čísla: sudé číslo je známkou prudké inteligence, zatímco lichým číslem označuje přístroj jedince, u kterých předpokládá vynikající bojové schopnosti. Do přípravného tábora tak přichází očíslovaní Iljové, Voloďové a Borisové, kterým je třeba rozdat pušky. V Rusku je tradičně víc vojáků než pušek - vychází jedna puška na dva ogary. Abychom maximalizovali bojový potenciál, chceme poslat spolu vždy "lichého" a "sudého" vojína.
Napište program, který pro vstupní posloupost čísel vytiskne spárované dvojice: (liché,sudé) tak, aby bylo zachováno pořadí.
Tedy například pro posloupnost: 35,44,22,34,26,33,40,11,7,55
by měl program vypsat:
(35,44) (33,22) (11,34) (7,26) (55,40)
zapouzdření, dědičnost, polymorfismus
Kdysi někdo zavřel do jedné místnosti skupinu expertů na objektově orientované programování. Meli sestavit seznam tří nejdůležitějších pojmů OOP a vyprodukovali tuto trojici:
- ★ zapouzdření - přístup k vnitřním datovým strukturám objektu pouze přes interface
- ★ dědičnost - možnost využít existující objekt a definovat na jeho základě nový (specializovaný)
- ★ polymorfismus - možnost deklarovat v objektu tzv. abstraktní metodu, kterou budou implementovat až potomci. Každý potomek to potom může udělat jinak.
Hledání k-tého prvku
Randomizovaný algoritmus, který v nesetříděné posloupnosti (bez opakujících se prvků) najde k-tý nejmenší člen.
kElem(k,A) // k - hledam k-ty prvek // A - posloupnost delky N i := random(1,N) // nahodne vybereme index LTE = emptyset GT = emptyset for j:= 1 to N do if A[j] <= A[i] then LTE.add(A[j]) // mensi prvky else GT.add(A[j]) // vetsi prvky m := |LTE| if m = k then return A[i] // trefa nahodnym indexem if m < k then return kElem(m-k,GT) // hledani mezi vetsimi if m > k then return kElem(k,LTE) // hledani mezi mensimi
Algoritmus má lineární složitost vzhledem k počtu prvků. Přestože závisí na náhodě, dá se ukázat, že i v nejhorším případě (pro k = n/2) dostane rekurzivní volání v očekávaném případě seznam zkrácený cca. o 1/4 oproti původnímu.
Domácí úkol
Při zadávání došlo k omylu - CodEx nepřijímá pascalovské řešení pro úlohu Příšera v bludišti. Zadal jsem místo něj úlohu Sokoban čili skladník.