Informatika I 6 pednka RNDr Ji Dvok CSc

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

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

Obsah přednášky q Program a podprogramy q Procedury a funkce q Parametry volané hodnotou

Obsah přednášky q Program a podprogramy q Procedury a funkce q Parametry volané hodnotou a odkazem q Globální a lokální proměnné Informatika I: přednáška 6 2

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 6 3

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

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

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

Podprogramy v Pascalu q Procedura je podprogram, který mění stav programu (změnou stavu proměnných nebo změnou stavu obrazovky). q 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 6 5

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 6 6

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 6 7

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; {v Delphi místo ident_fce může být Result}. . . end; Typ funkce je typ hodnoty funkce. Ve standardním Pascalu to musí být jednoduchý typ nebo typ řetězec; v Delphi to může být i strukturovaný typ. Informatika I: přednáška 6 8

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 6 9

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

Specifikace formálních parametrů q Specifikace parametrů volaných hodnotou: ident_par: ident_typu ident_par 1, ident_par 2, … : ident_typu q 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 6 10

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

Volání procedury a funkce q Volání procedury: ident_procedury(seznam skutečných parametrů) q 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. Aby se tedy provedlo vyhodnocení funkce, musí být její volání součástí nějakého příkazu. Informatika I: přednáška 6 11

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

Parametry volané hodnotou q 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. q Formální parametry mají charakter proměnných, které jsou v příslušné proceduře nebo funkci lokální. q Parametr volaný hodnotou nemůže být výstupním parametrem. q Volání strukturovaných parametrů hodnotou zvyšuje časové a paměťové nároky. Informatika I: přednáška 6 12

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

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

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

Oblasti platnosti jmen q 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. q 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 6 14

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 6 15

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 6 16

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 6 17

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 6 18

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 6 19

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 6 20

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 6 21

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 6 22

Vytvoření souboru program Studenti; {$APPTYPE CONSOLE} {Z klavesnice se zadavaji udaje o studentech. Kazdy

Vytvoření souboru program Studenti; {$APPTYPE CONSOLE} {Z klavesnice se zadavaji udaje o studentech. Kazdy student zacina na novem radku a udaje jsou oddelovane mezerami. Vytvorene zaznamy jsou ukladany do souboru} const Max. N=100; type TRetezec=string[15]; TStudent=record Os. Cislo: integer; Prijmeni, Jmeno: TRetezec; Body: integer; end; TSoubor=file of TStudent; var i, N: integer; Jmeno: string; Student: TStudent; Soubor: TSoubor; Informatika I: přednáška 6 23

procedure Cti. Retezec(var Retezec: TRetezec); var Ret: TRetezec; Zn: char; begin Ret: =''; read(Zn);

procedure Cti. Retezec(var Retezec: TRetezec); var Ret: TRetezec; Zn: char; begin Ret: =''; read(Zn); while (Zn<>' ') or (Ret='') do {Pocita se s tim, ze udaje by mohly byt oddeleny vice nez jednou mezerou} begin if Zn<>' ' then Ret: =Ret+Zn; read(Zn); end; Retezec: =Ret; end; begin writeln('Zadej pocet studentu'); readln(N); writeln('Zadej jmeno souboru'); readln(Jmeno); Informatika I: přednáška 6 24

assignfile(Soubor, Jmeno); rewrite(Soubor); writeln('Udaje o studentovi jsou oddelovany'); writeln('mezerami a ukoncene radkem'); for i:

assignfile(Soubor, Jmeno); rewrite(Soubor); writeln('Udaje o studentovi jsou oddelovany'); writeln('mezerami a ukoncene radkem'); for i: =1 to N do begin writeln('Zadej studenta ', i, ': '); with Student do begin read(Os. Cislo); Cti. Retezec(Prijmeni); Cti. Retezec(Jmeno); readln(Body); end; write(Soubor, Student); end; closefile(soubor); end. Informatika I: přednáška 6 25