Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Informatika I 8. přednáška RNDr. Jiří Dvořák, CSc.

Podobné prezentace


Prezentace na téma: "Informatika I 8. přednáška RNDr. Jiří Dvořák, CSc."— Transkript prezentace:

1 Informatika I 8. přednáška RNDr. Jiří Dvořák, CSc.

2 Informatika I: přednáška 82 Obsah přednášky Rekurze Statické a dynamické proměnné Typ ukazatel Abstraktní dynamické datové struktury

3 Informatika I: přednáška 83 Rekurze Rekurze 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í).

4 Informatika I: přednáška 84 Přímá a nepřímá rekurze Přímá rekurze: podprogram volá sám sebe. Nepřímá rekurze: podprogram P 1 volá podprogram P 2, podprogram P 2 volá podprogram P 3, …, podprogram P n-1 volá podprogram P n, podprogram P n volá podprogram P 1.

5 Informatika I: přednáška 85 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;

6 Informatika I: přednáška 86 Příklad rekurzivní funkce function Faktorial(N:byte):real; begin if N <= 1 then Faktorial:=1 else Faktorial:=N  Faktorial(N-1); end;

7 Informatika I: přednáška 87 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ší

8 Informatika I: přednáška 88 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 else begin 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;

9 Informatika I: přednáška 89 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;

10 Informatika I: přednáška 810 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.

11 Informatika I: přednáška 811 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:

12 Informatika I: přednáška 812 Procedura QuickSort const 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;

13 Informatika I: přednáška 813 begin I:=L; J:=R; X:=A[(L+R) div 2]; repeat while A[I]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

14 Informatika I: přednáška 814 Nepřímá rekurze a direktiva forward procedure Proc1(...); forward; procedure Proc2(...); begin... Proc1(...);... end; procedure Proc1; {Dokončení deklarace procedury Proc1} begin... Proc2(...);... end;

15 Informatika I: přednáška 815 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.

16 Informatika I: přednáška 816 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: nil Jestliže proměnná typu ukazatel má tuto hodnotu, znamená to, že neukazuje na žádnou dynamickou proměnnou.

17 Informatika I: přednáška 817 Operace nad typem ukazatel Vytvoř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): :=

18 Informatika I: přednáška 818 Příklady pro typ ukazatel Definice 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);

19 Informatika I: přednáška 819 Příklady pro typ ukazatel Naplně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;

20 Informatika I: přednáška 820 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.

21 Informatika I: přednáška 821 Zásobník Dynamická 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

22 Informatika I: přednáška 822 Fronta Dynamická homogenní lineární struktura Pří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á outin

23 Informatika I: přednáška 823 Seznam Jednoduchý 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

24 Informatika I: přednáška 824 Implementace jednoduchého seznamu Jednosměrný seznam Obousměrný seznam Cyklický seznam

25 Informatika I: přednáška 825 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;

26 Informatika I: přednáška 826 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);

27 Informatika I: přednáška 827 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;

28 Informatika I: přednáška 828 Stromové struktury Biná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ů)

29 Informatika I: přednáška 829 Implementace binárního stromu A D CB E A C B E D F F

30 Informatika I: přednáška 830 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;

31 Informatika I: přednáška 831 Grafová struktura G = (V, E),V … množina vrcholů (uzlů) E … množina hran, E  V×V Pozn.: Strom je zvláštním případem grafu.

32 Informatika I: přednáška 832 Implementace uzlu grafu A A

33 Informatika I: přednáška 833 Implementace uzlu hranově ohodnoceného grafu A x y z xyzA

34 Informatika I: přednáška 834 Příklad implementace uzlu grafu type THrana= ^TUzel; TSpoj= ^TPrvek; TUzel= record {Uzel grafu} Obec:string; Sousede:TSpoj;{Ukazatel na seznam hran vystupujicich z uzlu} end; TPrvek= record {Prvek seznamu hran} Vzdalenost:real; Hrana:THrana; Dalsi:TSpoj; end; Jedná se o datové typy, které by mohly být využity pro implementaci grafové struktury reprezentující silniční síť. Uzly grafu představují obce a hrany grafu odpovídají přímému silničnímu propojení sousedních obcí. Hrany jsou ohodnoceny vzdálenostmi.


Stáhnout ppt "Informatika I 8. přednáška RNDr. Jiří Dvořák, CSc."

Podobné prezentace


Reklamy Google