Informatika I 4 pednka RNDr Ji Dvok CSc

  • Slides: 42
Download presentation
Informatika I 4. přednáška RNDr. Jiří Dvořák, CSc. dvorak@uai. fme. vutbr. cz Informatika I:

Informatika I 4. přednáška RNDr. Jiří Dvořák, CSc. dvorak@uai. fme. vutbr. cz Informatika I: přednáška 4

Obsah přednášky n Uživatelem definované datové typy n Výčtový typ a typ interval n

Obsah přednášky n Uživatelem definované datové typy n Výčtový typ a typ interval n Datové struktury n Typ řetězec n Typ pole n Procedury a funkce n Oblasti platnosti jmen Informatika I: přednáška 4 2

Uživatelem definované datové typy v Pascalu n Jednoduché typy: · výčet · interval n

Uživatelem definované datové typy v Pascalu n Jednoduché typy: · výčet · interval n Strukturované typy : · řetězec · pole · množina · záznam · soubor n Typ ukazatel Informatika I: přednáška 4 3

Možnosti deklarace proměnných pro uživatelsky definované typy a) Pomocí pojmenovaných typů: type ident_typu =

Možnosti deklarace proměnných pro uživatelsky definované typy a) Pomocí pojmenovaných typů: type ident_typu = typ; var ident_prom : ident_typu; b) Pomocí nepojmenovaných typů: var ident_prom : typ; Informatika I: přednáška 4 4

Výčtový typ n Definice: (hodnota 1, hodnota 2, … ) n Vlastnosti: Typ výčet

Výčtový typ n Definice: (hodnota 1, hodnota 2, … ) n Vlastnosti: Typ výčet je ordinální typ a jeho hodnotami jsou identifikátory. Každá hodnota v seznamu má určené pořadí, počínaje nulou. Jsou definovány relační operace a funkce ord, pred, succ. Hodnoty výčtového typu nemohou být použity při čtení/zápisu z/do textového souboru. n Využití: · konstrukce množiny, · indexování pole, · hodnoty selektoru větvení v příkazu case Informatika I: přednáška 4 5

Příklady pro výčtový typ Definice typů a deklarace proměnných: type TDen = (Po, Ut,

Příklady pro výčtový typ Definice typů a deklarace proměnných: type TDen = (Po, Ut, St, Ct, Pa, So, Ne); TBarva =(cervena, zluta, modra, fialova); var Den: TDen; B 1, B 2: TBarva; Teplota: (nizka, stredni, vysoka); Výsledky relačních operací: Po < So = true cervena > modra = false Hodnoty některých funkcí: ord(Po)=0, ord(zluta)=1, pred(Ne)=So, succ(modra)=fialova Informatika I: přednáška 4 6

Typ interval n Definice: konstanta 1. . konstanta 2 n Vlastnosti: Typ interval vymezuje

Typ interval n Definice: konstanta 1. . konstanta 2 n Vlastnosti: Typ interval vymezuje interval hodnot v množině hodnot nějakého ordinálního typu a jsou pro něj definovány tytéž operace jako pro hostitelský typ. n Využití: · konstrukce množiny · indexování pole · hodnoty selektoru větvení v příkazu case Informatika I: přednáška 4 7

Příklady pro typ interval Definice typů a deklarace proměnných: type TDen = (Po, Ut,

Příklady pro typ interval Definice typů a deklarace proměnných: type TDen = (Po, Ut, St, Ct, Pa, So, Ne); TPrac. Den = Po. . Pa; TVelka. Pismena = 'A'. . 'Z'; TRozsah. Indexu = 1. . 100; var PD: TPrac. Den; VP 1, VP 2: TVelka. Pismena; i, j: TRozsah. Indexu; Cfr: '0'. . '9'; Informatika I: přednáška 4 8

Příklady klasifikace datových struktur n Hledisko 1 (typ složek): · homogenní (složky stejného typu)

Příklady klasifikace datových struktur n Hledisko 1 (typ složek): · homogenní (složky stejného typu) · heterogenní (složky různého typu) n Hledisko 2 (proměnnost struktury): · statické (rozsah struktury, tj. rozsah přidělené paměti se během výpočtu nemění) · dynamické (během výpočtu se mění rozsah přidělené paměti a případně také vztahy mezi složkami struktury a jejich rozmístění v paměti) Informatika I: přednáška 4 9

Datové struktury v Pascalu řetězec množina homogenní pole heterogenní záznam soubor Informatika I: přednáška

Datové struktury v Pascalu řetězec množina homogenní pole heterogenní záznam soubor Informatika I: přednáška 4 statické dynamická 10

Typ řetězec n Definice: string[max_délka] n Vlastnosti: Max_délka je celé číslo z intervalu [1,

Typ řetězec n Definice: string[max_délka] n Vlastnosti: Max_délka je celé číslo z intervalu [1, 255]. Řetězec je vlastně jednorozměrné pole znaků. n Reprezentace: Řetězec je uložen v (max_délka + 1) bytech. Nultý byte obsahuje znak, jehož ordinální číslo určuje skutečnou délku řetězce. n Konstanta: 'posloupnost znaků' Posloupnost znaků může být i prázdná. Pozn. : Typ string bez uvedení délky je standardní typ, který je v Turbo Pascalu totožný s typem string[255]. Od verze Delphi 2 tento typ umožňuje pracovat s delšími řetězci, které jsou reprezentovány jinak, než je uvedeno výše. Informatika I: přednáška 4 11

Operace nad typem řetězec n Přístup ke složce: ProměnnáTypuŘetězec[index] Index je výraz celočíselného typu.

Operace nad typem řetězec n Přístup ke složce: ProměnnáTypuŘetězec[index] Index je výraz celočíselného typu. n Relační operace: Řetězce se porovnávají lexikograficky (porovnávají se znaky na 1. pozici, v případě jejich shody znaky na 2. pozici, atd. ) n Spojení řetězců: Ke spojování řetězců slouží operátor +. n Přiřazení: Proměnné typu řetězec je možno přiřadit výraz typu znak nebo výraz libovolného typu řetězec. n Určení délky řetězce: length(výraz typu řetězec) Informatika I: přednáška 4 12

Příklady pro typ řetězec Definice typů a deklarace proměnných: type TRetezec = string[20]; var

Příklady pro typ řetězec Definice typů a deklarace proměnných: type TRetezec = string[20]; var R 1, R 2: TRetezec; S 1, S 2: string[50]; S: string; Výsledky relačních operací: 'ABB'<'ABBA'= true, 'ABA'<'ABBA'= true 'ABBA'<'BA'= true Spojování řetězců a hodnoty funkce length: S: =''; S: =S + 'ALFA'; S: =S + 'BETA'; writeln(S); ` {pak length(S)=0} {pak length(S)=4} {pak length(S)=8} {vypise se text ALFABETA} Informatika I: přednáška 4 13

Příklady pro typ řetězec var Zn, Zn 1, Zn 2: char; S: string[100]; i,

Příklady pro typ řetězec var Zn, Zn 1, Zn 2: char; S: string[100]; i, Pocet: integer; {Urceni poctu vyskytu znaku Zn v retezci S} Pocet: =0; for i: =1 to length(S) do if Zn=S[i] then Pocet: =Pocet+1; {Nahrada znaku Zn 1 znakem Zn 2 v retezci S} for i: =1 to length(S) do if S[i]=Zn 1 then S[i]: =Zn 2; Informatika I: přednáška 4 14

Příklady pro typ řetězec Otočení řetězců S a Str: var S, OS: string[100]; Str,

Příklady pro typ řetězec Otočení řetězců S a Str: var S, OS: string[100]; Str, OStr: string; i, N: integer; . . . N: =ord(S[0]); {ord(S[0])=length(S)} OS[0]: =S[0]; {nastaveni delky retezce OS} for i: =1 to N do OS[i]: =S[N-i+1]; {Pro typ string se to v Delphi musi udelat takto: } N: =length(Str); Set. Length(OStr, N); {nastaveni delky retezce OStr} for i: =1 to N do OStr[i]: =Str[N-i+1]; Informatika I: přednáška 4 15

Typ pole n Definice: array[Typ. Indexu] of Typ. Složky array[Typ. Indexu 1, Typ. Indexu

Typ pole n Definice: array[Typ. Indexu] of Typ. Složky array[Typ. Indexu 1, Typ. Indexu 2, … ] of Typ. Složky n Vlastnosti: Typ indexu je ordinální typ. Informatika I: přednáška 4 16

Operace nad typem pole n Přístup ke složce: ProměnnáTypu. Pole[index] ProměnnáTypu. Pole[index 1, index

Operace nad typem pole n Přístup ke složce: ProměnnáTypu. Pole[index] ProměnnáTypu. Pole[index 1, index 2, … ] Index je výraz ordinálního typu. n Přiřazení: Proměnná 1 Typu. Pole : = Proměnná 2 Typu. Pole Musí se jednat o proměnné téhož typu pole. Informatika I: přednáška 4 17

Příklady pro typ pole Definice typů a deklarace proměnných: type TVektor = array[1. .

Příklady pro typ pole Definice typů a deklarace proměnných: type TVektor = array[1. . 100] of real; TMatice = array[1. . 20, 1. . 50] of integer; var X, Y: TVektor; A, B, C: TMatice; Cetnost: array['a'. . 'z'] of integer; Příklady přístupu ke složce pole: {i a j jsou typu integer, Zn je typu char} X[i], Y[2 i], A[1, 1], B[i, j+1], Cetnost['q'], Cetnost[Zn] Informatika I: přednáška 4 18

Příklady pro typ pole Výpočet součtu prvků pole: var X: array[1. . 200] of

Příklady pro typ pole Výpočet součtu prvků pole: var X: array[1. . 200] of real; i, N: integer; {N je skutecny počet prvku} Suma: real; . . . Suma: =0; for i: =1 to N do Suma: =Suma+X[i]; Informatika I: přednáška 4 19

Příklady pro typ pole Načtení matice typu (M, N): const Max. M=100; Max. N=100;

Příklady pro typ pole Načtení matice typu (M, N): const Max. M=100; Max. N=100; type TMatice = array[1. . Max. M, 1. . Max. N] of integer; var M, N, i, j: integer; A, B, C: TMatice; . . . for i: =1 to M do for j: =1 to N do begin write('Zadej prvek ', i, ', ', j, ': '); readln(A[i, j]); end; Informatika I: přednáška 4 20

Příklady pro typ pole Určení počtu odpracovaných hodin za týden: type TDen = (Po,

Příklady pro typ pole Určení počtu odpracovaných hodin za týden: type TDen = (Po, Ut, St, Ct, Pa, So, Ne); var Den: TDen; Odprac. Za. Tyden: real; Odpracovano: array[TDen] of real; . . . Odprac. Za. Tyden: =0; for Den: = Po to Ne do Odprac. Za. Tyden: = Odprac. Za. Tyden+Odpracovano[Den]; Informatika I: přednáška 4 21

Příklady pro typ pole Výpis tabulky četností malých písmen: var mp: 'a'. . 'z';

Příklady pro typ pole Výpis tabulky četností malých písmen: var mp: 'a'. . 'z'; Cetnost: array['a'. . 'z'] of integer; . . . writeln('Tabulka cetnosti'); writeln('pismeno cetnost'); writeln('--------'); for mp: = 'a' to 'z' do writeln(mp: 4, Cetnost[mp]: 9); Informatika I: přednáška 4 22

Program a podprogram a) Program P 1 Akce A(x) b) Program P 2 Call

Program a podprogram a) Program P 1 Akce A(x) b) Program P 2 Call A(x) Call A(y) Podprogram A Akce A(y) Informatika I: přednáška 4 23

Použití podprogramů n Realizace opakovaných činností. n Řešení podproblémů, které vzniknou rozkladem původního problému.

Použití podprogramů n Realizace opakovaných činností. n Řešení podproblémů, které vzniknou rozkladem původního problému. n Implementace operací nového datového typu. Informatika I: přednáška 4 24

Podprogramy v Pascalu n Procedura je podprogram, který mění stav programu (změnou stavu proměnných

Podprogramy v Pascalu n Procedura je podprogram, který mění stav programu (změnou stavu proměnných nebo změnou stavu obrazovky). n Funkce je podprogram, který vrací jednoduchou hodnotu do příkazu, odkud byla volána. Funkce by neměla měnit stav programu. Informatika I: přednáška 4 25

Deklarace procedury procedure ident_proc(seznam specifikací formálních parametrů); lokální definice a deklarace; begin příkaz 1;

Deklarace procedury procedure ident_proc(seznam specifikací formálních parametrů); lokální definice a deklarace; begin příkaz 1; příkaz 2; . . . end; Informatika I: přednáška 4 26

Příklad procedury type TVektor=array[1. . 100] of real; procedure Soucet. Vektoru(N: integer; var X,

Příklad procedury type TVektor=array[1. . 100] of real; procedure Soucet. Vektoru(N: integer; var X, Y, Z: TVektor); {N je dimenze vektoru, X a Y jsou vstupni vektory, Z = X+Y} var i: integer; begin for i: =1 to N do Z[i]: =X[i]+Y[i]; end; Informatika I: přednáška 4 27

Deklarace funkce function ident_fce(seznam specifikací formálních parametrů): ident_typu_funkce; lokální definice a deklarace; begin příkaz

Deklarace funkce function ident_fce(seznam specifikací formálních parametrů): ident_typu_funkce; lokální definice a deklarace; begin příkaz 1; příkaz 2; . . . ident_fce: =výraz; . . . end; Typ funkce je typ hodnoty funkce. Musí to být jednoduchý typ nebo Informatika I: přednáška 4 28 typ řetězec.

Příklad funkce type TVektor=array[1. . 100] of real; function Abs. Vekt(N: integer; var X:

Příklad funkce type TVektor=array[1. . 100] of real; function Abs. Vekt(N: integer; var X: TVektor): real; {N je dimenze vektoru, X je vstupni vektor, funkce pocita absolutni hodnotu vektoru X} var i: integer; s: real; begin s: =0; for i: =1 to N do s: =s+sqr(X[i]); Abs. Vekt: =sqrt(s); end; Informatika I: přednáška 4 29

Specifikace formálních parametrů n Specifikace parametrů volaných hodnotou: ident_par: ident_typu ident_par 1, ident_par 2,

Specifikace formálních parametrů n Specifikace parametrů volaných hodnotou: ident_par: ident_typu ident_par 1, ident_par 2, … : ident_typu n Specifikace parametrů volaných odkazem: var ident_par: ident_typu var ident_par 1, ident_par 2, … : ident_typu Jednotlivé specifikace formálních parametrů jsou oddělovány středníkem. Informatika I: přednáška 4 30

Volání procedury a funkce n Volání procedury: ident_procedury(seznam skutečných parametrů) n Volání funkce: ident_funkce(seznam

Volání procedury a funkce n Volání procedury: ident_procedury(seznam skutečných parametrů) n Volání funkce: ident_funkce(seznam skutečných parametrů) Jednotlivé skutečné parametry jsou oddělovány čárkou. Volání procedury má charakter příkazu, kdežto volání funkce má charakter výrazu. Informatika I: přednáška 4 31

Parametry volané hodnotou n Skutečnými parametry mohou být výrazy a jejich hodnoty se přiřadí

Parametry volané hodnotou n Skutečnými parametry mohou být výrazy a jejich hodnoty se přiřadí odpovídajícím formálním parametrům. n Formální parametry mají charakter proměnných, které jsou v příslušné proceduře nebo funkci lokální. n Parametr volaný hodnotou nemůže být výstupním parametrem. n Volání strukturovaných parametrů hodnotou zvyšuje časové a paměťové nároky. Informatika I: přednáška 4 32

Parametry volané odkazem n Odpovídajícími skutečnými parametry musejí být proměnné. n Funkce nebo procedura

Parametry volané odkazem n Odpovídajícími skutečnými parametry musejí být proměnné. n Funkce nebo procedura pracuje přímo s proměnnou, která je skutečným parametrem, a může měnit její hodnotu. n Výstupní parametry musejí být volány odkazem. n Strukturované parametry je vhodnější volat odkazem. Informatika I: přednáška 4 33

Oblasti platnosti jmen n Oblastí platnosti jména definovaného v deklarační části hlavního programu je

Oblasti platnosti jmen n Oblastí platnosti jména definovaného v deklarační části hlavního programu je část programu následující tuto definici včetně každé následující deklarace podprogramu, pokud tento podprogram nepoužívá stejné jméno k označení formálního parametru nebo je nedefinuje ve svých lokálních deklaracích. n Oblastí platnosti definice jakéhokoli jména použitého k označení formálního parametru podprogramu nebo definovaného v lokálních deklaracích podprogramu je tělo tohoto podprogramu. Informatika I: přednáška 4 34

Globální a lokální proměnné Program Global_a_local; var a, b, c: typ 1; {globální proměnné}

Globální a lokální proměnné Program Global_a_local; var a, b, c: typ 1; {globální proměnné} procedure Proc(b: typ 2); var c, d: typ 3; {lokální proměnné} begin {Proměnná a je zde přístupná, význam glob. proměnných b, c je zastíněn formálním parametrem b a lokální proměnnou c}. . . end; begin {proměnná d zde není definována}. . . end. Informatika I: přednáška 4 35

Globální proměnné a podprogramy Nevyžaduje-li to zvláštní zájem, globální proměnné by neměly být v

Globální proměnné a podprogramy Nevyžaduje-li to zvláštní zájem, globální proměnné by neměly být v podprogramech používány. To znamená, že veškerá komunikace podprogramu se zbytkem programu (předání vstupních údajů do podprogramu, předání výstupních údajů z procedury) by měla být prováděna pomocí parametrů. Použití globálních proměnných v podprogramu zhoršuje jeho použitelnost v jiném programu. Informatika I: přednáška 4 36

Skalární součin vektorů - zadání Vstup: dimenze vektorů N (přirozené číslo) vektory reálných čísel

Skalární součin vektorů - zadání Vstup: dimenze vektorů N (přirozené číslo) vektory reálných čísel x = (x 1, … x. N), y = (y 1, … y. N) Výstup: hodnota skalárního součinu Informatika I: přednáška 4 37

Skalární součin vektorů - návrh Čti dimenzi vektorů N Čti vektor x Čti vektor

Skalární součin vektorů - návrh Čti dimenzi vektorů N Čti vektor x Čti vektor y Vypočti s = x·y Vypiš s Informatika I: přednáška 4 38

Skalární součin vektorů - implementace program Skalarni_soucin_vektoru; {$APPTYPE CONSOLE} const Max. N=100; type TVektor=array[1.

Skalární součin vektorů - implementace program Skalarni_soucin_vektoru; {$APPTYPE CONSOLE} const Max. N=100; type TVektor=array[1. . Max. N] of real; var N: integer; X, Y: TVektor; S: real; Informatika I: přednáška 4 39

procedure Cti. Vektor(N: integer; var X: TVektor); var i: integer; begin for i: =1

procedure Cti. Vektor(N: integer; var X: TVektor); var i: integer; begin for i: =1 to N do begin write(i, '. slozka: '); readln(X[i]); end; Informatika I: přednáška 4 40

function Skalarni. Soucin(N: integer; var X, Y: TVektor): real; var i: integer; S: real;

function Skalarni. Soucin(N: integer; var X, Y: TVektor): real; var i: integer; S: real; begin S: =0; for i: =1 to N do S: =S+X[i]*Y[i]; Skalarni. Soucin: =S; end; Informatika I: přednáška 4 41

begin writeln('Vypocet skalarniho soucinu vektoru'); write('Zadej dimenzi vektoru: '); readln(N); writeln('Zadavej prvni vektor'); Cti.

begin writeln('Vypocet skalarniho soucinu vektoru'); write('Zadej dimenzi vektoru: '); readln(N); writeln('Zadavej prvni vektor'); Cti. Vektor(N, X); writeln('Zadavej druhy vektor'); Cti. Vektor(N, Y); S: =Skalarni. Soucin(N, X, Y); writeln('Skalarni soucin =', S: 9: 2); writeln('Stiskni enter'); readln; end. Informatika I: přednáška 4 42