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:

  1. object je pouze deklarace. Může mít víc instancí. Proto se deklaruje v sekci type.
  2. ▸ 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:

  1. zapouzdření - přístup k vnitřním datovým strukturám objektu pouze přes interface
  2. dědičnost - možnost využít existující objekt a definovat na jeho základě nový (specializovaný)
  3. 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.