informatika i 7 . přednáška

31
Informatika I 7. přednáška RNDr. Jiří Dvořák, CSc. [email protected]

Upload: bertha-guy

Post on 03-Jan-2016

34 views

Category:

Documents


1 download

DESCRIPTION

Informatika I 7 . přednáška. RNDr. Jiří Dvořák, CSc. dvorak @uai.fme.vutbr.cz. Obsah přednášky. Rekurze Statické a dynamické proměnné Typ ukazatel Abstraktní dynamické datové struktury. Rekurze. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Informatika I 7 . přednáška

Informatika I7. přednáška

RNDr. Jiří Dvořák, CSc.

[email protected]

Page 2: Informatika I 7 . přednáška

Informatika I: přednáška 7 2

Obsah přednášky

Rekurze

Statické a dynamické proměnné

Typ ukazatel

Abstraktní dynamické datové struktury

Page 3: Informatika I 7 . přednáška

Informatika I: přednáška 7 3

RekurzeRekurze je proces řešení problému jeho

rozdělením na dva nebo více jednodušších podproblémů, z nichž alespoň jeden je jednodušší verzí původního problému (jednodušší ve smyslu menšího rozsahu).

Rekurze v programování je vždy spojena s rekurzivním voláním podprogramů (procedur nebo funkcí).

Page 4: Informatika I 7 . přednáška

Informatika I: přednáška 7 4

Přímá a nepřímá rekurze

Přímá rekurze: podprogram volá sám sebe.

Nepřímá rekurze: podprogram P1 volá podprogram P2,

podprogram P2 volá podprogram P3,

… ,

podprogram Pn-1 volá podprogram Pn,

podprogram Pn volá podprogram P1.

Page 5: Informatika I 7 . přednáška

Informatika I: přednáška 7 5

Obvyklá struktura přímo rekurzivního podprogramu

procedure Solve(problemP);begin if Podmínka then

Řeš triviální případ daného problému else

Solve(problemP’); {problém P’ je jednodušším případem problému P}

end;

Page 6: Informatika I 7 . přednáška

Informatika I: přednáška 7 6

Příklad rekurzivní funkce

function Faktorial(N:byte):real;begin if N <= 1 then

Faktorial:=1 else

Faktorial:=NFaktorial(N-1);end;

Page 7: Informatika I 7 . přednáška

Informatika I: přednáška 7 7

Problém hanojských věží

Úkolem je přenést disky na druhou tyč s použitím třetí tyče jako pomocné, přičemž musí být dodržena tato pravidla: v každém kroku můžeme přenést pouze jeden disk, a to vždy z tyče

na tyč není možné položit větší disk na menší

Page 8: Informatika I 7 . přednáška

Informatika I: přednáška 7 8

Rekurzivní řešení problému hanojských věží

procedure PrenesVez(N:byte; A,B,C:char); {Přenes věž o výšce N disků z tyče A na tyč B pomocí

tyče C; disky jsou číslovány vzestupně od nejmenšího do největšího čísly 1, 2, … , N}

begin if N=1 then

Přenes disk N z tyče A na tyč B elsebegin PrenesVez(N-1,A,C,B); Přenes disk N z tyče A na tyč B; PrenesVez(N-1,C,B,A); end

end;

Page 9: Informatika I 7 . přednáška

Informatika I: přednáška 7 9

program Hanoj;{$APPTYPE CONSOLE}var N:byte; S:string; Plan:TextFile;procedure PrenesVez(N:byte; A,B,C:char);{prenese vez o vysce N z tyce A na tyc B pomoci tyce C} begin if N=1 then writeln(Plan,'Prenes disk',N:3,' z ',A,' na ',B) else begin PrenesVez(N-1,A,C,B); writeln(Plan,'Prenes disk',N:3,' z ',A,' na ',B); PrenesVez(N-1,C,B,A); end; end;

Page 10: Informatika I 7 . přednáška

Informatika I: přednáška 7 10

begin writeln('Zadej jmeno souboru'); readln(S); assignfile(Plan,S); rewrite(Plan); writeln('Zadej pocet disku'); readln(N); PrenesVez(N,'A','B','C'); closefile(Plan);end.

Page 11: Informatika I 7 . přednáška

Informatika I: přednáška 7 11

Prenes disk 1 z A na C

Prenes disk 2 z A na B

Prenes disk 1 z C na B

Prenes disk 3 z A na C

Prenes disk 1 z B na A

Prenes disk 2 z B na C

Prenes disk 1 z A na C

Prenes disk 4 z A na B

Prenes disk 1 z C na B

Prenes disk 2 z C na A

Prenes disk 1 z B na A

Prenes disk 3 z C na B

Prenes disk 1 z A na C

Prenes disk 2 z A na B

Prenes disk 1 z C na B

Příklad řešení pro N = 4:

Page 12: Informatika I 7 . přednáška

Informatika I: přednáška 7 12

Procedura QuickSortconst MaxN=100;type TIndex=1..MaxN; TPole=array[TIndex] of integer;

procedure QuickSort(L,R:TIndex; var A:TPole);{Procedura provadi vzestupne trideni prvku pole v useku vymezenem indexy L a R. Nejprve se stanovi hodnota stredoveho prvku X. Pak se prvky pole preskladaji tak, ze vzniknou dve prekryvajici se casti s temito vlastnostmi: v prve casti nejsou prvky vetsi nez X a ve druhe casti nejsou prvky mensi nez X. Pro intervaly indexu nepatrici do prekryti těchto casti se potom vola procedura QuickSort.} var I,J:TIndex;

X,Pom:integer;

Page 13: Informatika I 7 . přednáška

Informatika I: přednáška 7 13

begin I:=L; J:=R; X:=A[(L+R) div 2]; repeat while A[I]<X do I:=I+1; while A[J]>X do J:=J-1; if I<=J then begin Pom:=A[I]; A[I]:=A[J]; A[J]:=Pom; I:=I+1; J:=J-1; end; until I>J; if L<J then QuickSort(L,J,A); if I<R then QuickSort(I,R,A); end;

Page 14: Informatika I 7 . přednáška

Informatika I: přednáška 7 14

Nepřímá rekurze a direktiva forwardprocedure Proc1(...); forward;procedure Proc2(...);

begin ... Proc1(...); ...end;

procedure Proc1; {Dokončení deklarace procedury Proc1}

begin ... Proc2(...); ...end;

Page 15: Informatika I 7 . přednáška

Informatika I: přednáška 7 15

Statické a dynamické proměnné

Statické proměnné:Jsou deklarovány v úseku var (úsek deklarací proměnných) a existují po tu dobu, po kterou se výpočetní proces nachází v bloku, v němž jsou deklarovány.

Dynamické proměnné:Jsou dynamicky vytvářeny v případě potřeby a rušeny v případě nepotřeby. Přístup k nim je zprostředkován pomocí proměnných typu ukazatel.

Page 16: Informatika I 7 . přednáška

Informatika I: přednáška 7 16

Typ ukazatel a dynamická proměnnáDefinice:

identif_typu_ukazatel =^identif_typu_dynamické_proměnné;

Přístup k dynamické proměnné:

identif_proměnné_typu_ukazatel^

proměnná typu ukazatel

dynamickáproměnná

Konstanta typu ukazatel: nilJestliže proměnná typu ukazatel má tuto hodnotu, znamená to, že neukazuje na žádnou dynamickou proměnnou.

Page 17: Informatika I 7 . přednáška

Informatika I: přednáška 7 17

Operace nad typem ukazatelVytvoření dynamické proměnné:

new(ProměnnáTypuUkazatel)

Uvolnění paměti po dynamické proměnné:

dispose(ProměnnáTypuUkazatel)

Relační operace (pro stejné typy ukazatel): = , <>

Operace přiřazení (pro stejné typy ukazatel): :=

Page 18: Informatika I 7 . přednáška

Informatika I: přednáška 7 18

Příklady pro typ ukazatelDefinice typů a deklarace proměnných:

type TZaznam = record Re,Im:real; end;

TPole = array[1..100] of integer; TUkZaznam = ^TZaznam; TUkPole = ^TPole;

var P,Q:^string; UkA,UkB:TUkPole; UkZ:TUkZaznam;

Vytvoření dynamických proměnných:

new(P); new(Q);new(UkA);new(UkZ);

Page 19: Informatika I 7 . přednáška

Informatika I: přednáška 7 19

Příklady pro typ ukazatelNaplnění dynamických proměnných :

P^:='alfa';Q^:=P^;readln(UkZ^.Re, UkZ^.Im);for i:=1 to N do

readln(UkA^[i]);

Rušení dynamické proměnné:

dispose(P);

Operace přiřazení pro typ ukazatel:

P:=nil;UkB:=UkA;

Page 20: Informatika I 7 . přednáška

Informatika I: přednáška 7 20

Abstraktní dynamické datové struktury

Zásobník (stack)

Fronta (queue)

Seznam (list)

Strom (tree)

Graf (graph)

Tyto struktury je možno implementovat pomocí typu pole nebo pomocí typu ukazatel.

Page 21: Informatika I 7 . přednáška

Informatika I: přednáška 7 21

ZásobníkDynamická homogenní lineární

struktura

Přístupová metoda LIFO (Last In, First Out)

Typické operace: vytvoření prázdného zásobníku vložení prvku do zásobníku zjištění hodnoty na vrcholu zrušení prvku na vrcholu test, zda je zásobník prázdný

inout

vrchol

Page 22: Informatika I 7 . přednáška

Informatika I: přednáška 7 22

Fronta

Dynamická homogenní lineární strukturaPřístupová metoda FIFO (First In, First Out)

Typické operace: vytvoření prázdné fronty vložení prvku na konec fronty zjištění hodnoty na čele fronty zrušení prvku na čele fronty test, zda je fronta prázdná

out in

Page 23: Informatika I 7 . přednáška

Informatika I: přednáška 7 23

SeznamJednoduchý seznam:

dynamická homogenní lineární struktura sekvenční přístupová metoda typické operace:

– vytvoření prázdného seznamu

– vložení prvku do seznamu

– odebrání prvku ze seznamu

– test, zda je seznam prázdný

Obecný seznam: prvky mohou být opět seznamy

Page 24: Informatika I 7 . přednáška

Informatika I: přednáška 7 24

Implementace jednoduchého seznamuJednosměrný seznam

Obousměrný seznam

Cyklický seznam

Page 25: Informatika I 7 . přednáška

Informatika I: přednáška 7 25

Příklad implementace seznamu studentů

type TStudent=record OsCislo:integer; Prijmeni,Jmeno:TRetezec; Body:integer; end;

TSpoj= ^TPrvek; TPrvek= record Stud:TStudent;

Dalsi:TSpoj; end;

var Zacatek,P,Q:TSpoj; Student:TStudent;

Page 26: Informatika I 7 . přednáška

Informatika I: přednáška 7 26

Příklady práce se seznamem studentů

Vytvoření prázdného seznamu:

Zacatek:=nil;

Vložení studenta na začátek seznamu:

new(P);P^.Stud:=Student;P^.Dalsi:=Zacatek;Zacatek:=P;

Zrušení studenta na začátku seznamu:

P:=Zacatek;Zacatek:=Zacatek^.Dalsi;dispose(P);

Page 27: Informatika I 7 . přednáška

Informatika I: přednáška 7 27

Příklady práce se seznamem studentůNalezení studenta s daným osobním číslem:

var OC:integer; {zadane osobni cislo} Nalez:TSpoj; {ukazatel na nalezeny zaznam} ...P:=Zacatek;Nalez:=nil;while P<>nil do begin if P^.Stud.OsCislo=OC then begin Nalez:=P; P:=nil; end else P:=P^.Dalsi; end;

Page 28: Informatika I 7 . přednáška

Informatika I: přednáška 7 28

Stromové strukturyBinární strom

(každý uzel má nejvýše dva následníky)

Obecný strom(každý uzel může mít

libovolný počet následníků)

Page 29: Informatika I 7 . přednáška

Informatika I: přednáška 7 29

Implementace binárního stromu

A

D

CB

E

A

C

B

ED

F F

Page 30: Informatika I 7 . přednáška

Informatika I: přednáška 7 30

Příklad implementace obousměrného seznamu a binárního stromu

type THodnota= ... ; {typy pro obousmerny seznam} TSpoj= ^TPrvek; TPrvek= record Vzad:TSpoj; Hodnota:THodnota; Vpred:TSpoj;

end; {typy pro binarni strom} THrana= ^TUzel; TUzel= record Hodnota:THodnota;

Levy:THrana; Pravy:THrana;

end;

Page 31: Informatika I 7 . přednáška

Informatika I: přednáška 7 31

Implementace uzlu obecného stromu

A

A