Programování v Pascalu Přednáška 4 RNDr. Hana Havelková
Příkazy cyklu for while repeat … until
Cyklus for předem je znám počet opakování cyklu je řízený řídící proměnnou (počitadlem) řídící proměnná musí být ordinálního typu počáteční hodnota a koncová hodnota počitadla je předem dána počáteční hodnota se zvyšuje (snižuje) o 1 do koncové hodnoty jedná se vlastně o cyklus s podmínkou na začátku, takže nemusí proběhnout ani jednou – je-li např. počáteční hodnota větší než koncová a má se zvyšovat proměnná for to do downto := kon. hodnota poč. hodnota příkaz
Příklad cyklu for – součet posloupnosti n čísel var n, i : integer; cislo, suma : real; begin Write('Zadej počet hodnot: '); ReadLn(n); suma := 0; for i := 1 to n do begin Write(i +'. cislo: '); ReadLn(cislo); suma := suma + cislo; end; WriteLn('Soucet je ', suma); ReadLn end.
Příklad for – tabulka druhých odmocnin celých čísel v daném rozsahu const dolni_mez : integer = 1; horni_mez : integer = 100; var n : integer; begin for n := dolni_mez to horni_mez do WriteLn(n : 3, sqrt(n) : 8 : 4); ReadLn end.
Příklad for – výpis násobků 5 od 1 do N var N, i : integer; begin Write('Zadej N: '); ReadLn(N); for i := 1 to N div 5 do Write (5*i ,' '); WriteLn; ReadLn end.
Cyklus while cyklus s podmínkou na začátku podmínka (logický výraz) se vyhodnotí je-li true (podmínka platí), vykonají se příkazy těla cyklu a jde se znovu na další testování podmínky je-li false (podmínka neplatí), provádění cyklu je ukončeno nemusí být předem znám počet opakování cyklu cyklus nemusí proběhnout ani jednou while do log. výraz příkaz
Největší společný dělitel dvou čísel {Eukleiduv algoritmus} var x, y : word; begin Write('Zadej dvě přirozená čísla: '); readLn(x, y); while x <> y do begin if x > y then x := x – y else y := y – x; end; WriteLn('NSD je: ', x); ReadLn end.
Přirozená mocnina čísla - xn var x, mocnina : real; n : byte; begin Write('Zadej číslo: '); ReadLn(x); Write('Zadej přirozený exponent: ');ReadLn(n); mocnina := 1; while n > 0 do begin if Odd(n) then mocnina := mocnina * x; {n je liché} n := n div 2; x := x * x; end; WriteLn('Mocnina je ', mocnina : 16:4); ReadLn end.
Průměr posloupnosti čísel zakončené pomocí CTRL-Z (eof stand. vstupu) var pocet : integer; cislo, suma : real; begin pocet := 0; suma := 0; Write('Zadej první číslo: '); while not eof do begin readLn(cislo); Inc(pocet); suma := suma + cislo; Write('Další číslo: '); end; if pocet > 0 then WriteLn('Průměr: ', suma/pocet : 12:4) else WriteLn('Prázdná posloupnost'); ReadLn end.
Nekonečný cyklus while true do WriteLn('Ahoj'); Ukončení nekonečného provádění programu: CTRL - Break
Tabelace funkce sin, cos Nekonečný cyklus const PI : real = 3.14159265359; var x, prirustek, dolni_mez, horni_mez : real; begin dolni_mez := 0; horni_mez:= 2*PI; prirustek := PI/20; x := dolni_mez; while x <> horni_mez do begin WriteLn(x:10:8, sin(x) :12:8, cos(x) : 12 : 8); x := x + prirustek; end; ReadLn end. Proč asi?
Cyklus repeat cyklus s podmínkou na konci podmínka (logický výraz) se vyhodnotí je-li false (podmínka neplatí), vykonají se příkazy těla cyklu a jde se znovu na další testování podmínky je-li true (podmínka platí), provádění cyklu je ukončeno předem není znám počet opakování cyklus proběhne vždy aspoň jednou repeat until příkaz log. výraz
Kontrola zadávání známky v rozsahu 1 – 5 var znamka : byte; begin repeat Write('Zadej známku: '); ReadLn(znamka); until (znamka > 0) and (znamka < 6); …. end.
Největší společný dělitel podruhé var x, y, zbytek : word; begin Write('Zadej dvě přirozená čísla'); ReadLn(x, y); repeat zbytek := x mod y; x := y; y := zbytek; until zbytek = 0; WriteLn('NSD je ', x); ReadLn end.
Blok představuje jistou ucelenou část programu programové jednotky procedury funkce metody je složen z deklarací (mohou být v libovolném pořadí) návěští konstant typů proměnných procedur a funkcí příkazů
Rozsah platnosti identifikátorů veškeré identifikátory a návěští deklarované v deklarační části bloku mají omezenou platnost pro tento blok – jsou lokální použijeme-li tedy v různých blocích stejné identifikátory, mohou se překrývat, jsou-li bloky do sebe vnořeny
Test platnosti program TestPlatnosti; var a, b : integer; procedure Pokus; a : integer; begin a:=77; WriteLn(a:3, b:3, a*b:5); end; {hlavní program} a:=5; b:= 10; WriteLn(a:3, b:3, a*b:5) ; {vypíše 5 10 50} Pokus; {vypíše 77 10 770} end.
Podprogramy ucelené části kódu, které se mají opakované využití umožňují strukturovat (zpřehlednit) kód Dělí se na procedury – nevracejí hodnotu funkce – vracejí hodnotu
Deklarace procedury hlavička procedury blok procedury identifikátor seznam formálních parametrů kvalifikovaný identifikátor procedure
Tělo procedury blok near ; forward external far asm blok interrupt direktiva inline
Parametry seznam formálních parametrů deklarace parametru ( ) deklarace parametru ; deklarace parametru seznam parametrů var const : typ
Druhy formálních parametrů hodnotové nepředchází jim var je uveden jejich typ konstantní předchází jim const proměnné předchází jim var netypové předchází jim var nebo const není uveden jejich typ
Hodnotové parametry formální parametr představuje lokální proměnnou v dané proceduře (funkci) jako skutečný parametr může figurovat výraz, který se vyhodnotí a dosadí do příslušné lokální proměnné náhrada formálního parametru skutečným je tzv. náhrada hodnotou typ skutečného parametru nesmí být file nebo strukturovaný typ zahrnující typ file skutečný a formální parametr musí být kompatibilní vůči přiřazení je-li skutečný parametr podtyp typu string, musí být formální parametr typu string
Konstantní parametry formální parametr se chová jako read-only lokální proměnná procedury (funkce) této proměnné není možné přiřadit nějakou hodnotu hodnota této proměnné je získána z odpovídajícího skutečného parametru při použití konstantních parametrů se generuje efektivnější kód, než kdyby se použily hodnotové parametry, které by byly neměnné
Proměnné parametry používají se, pokud je nutné voláním procedury (funkce) zajistit výstup hodnoty – výstupní parametry (vlastně vstupně-výstupní) formální parametr představuje skutečnou proměnnou existující ještě před voláním procedury (funkce) jakýkoliv odkaz na formální parametr je vlastně odkazem na skutečný parametr náhrada formálního parametru skutečným je tzv. náhrada odkazem (referencí) skutečný parametr musí být proměnná stejného typu jako formální parametr direktiva $P reguluje použití parametrů typu string {$P+} typ string představuje parametr open-string {$P-} typ string odpovídá string[255]
Netypové parametry skutečným parametrem může být odkaz na libovolnou proměnnou nebo konstantu netypový parametr uvedený klíčovým slovem var se dá modifikovat netypový parametr uvedený klíčovým slovem const je read-only
Příklad – podtržený text procedure PodtrzenyText (txt : string); var delka, i : byte; begin delka := Length(txt); Writeln(txt); for i := 1 to delka do Write('_'); WriteLn; end; Poznámka: mohl by být použit konstantní parametr tj. procedure PodtrzenyText (const txt : string);
Převod čísla na řetězec procedure IntToStr (n : integer; var S : string); var cifra : char; A : integer; begin S := ''; A := Abs(n); repeat cifra := Chr((A mod 10) + Ord('0')); S := cifra + S; A := A div 10; until A = 0; if n < 0 then S := '-' + S ; end;
Procedura vyměňující hodnoty dvou proměnných procedure Vymena(var a : real; var b : real) var tmp : real; begin tmp := a; a := b; b := tmp; end;
Near a far TP podporuje dva modely volání procedur a funkcí near – efektivnější kód, ale tyto procedury a fce se dají použít jen z modulu, v němž jsou deklarovány far – méně efektivní kód, ale procedury a fce se dají použít z libovolného modulu, tj. nejen z toho, v němž jsou deklarovány Překladač automaticky korektně volí vhodný model procedury a fce deklarované v implementation části programové jednotky (unit) – model near procedury a fce deklarované v interface části programové jednotky (unit) – model far direktiva {$F+} vynucuje far model direktiva {$F-} ponechává volbu na překladači
Forward zveřejňuje pouze uvádí hlavičku procedury či funkce umožňuje použít proceduru (fci) v kódu dříve, než je definována definice této procedury či funkce musí následovat někde dále, není pak již nutné uvádět seznam formálních parametrů (ani návratový typ fce)
External umožňuje použít (připojit, přilinkovat) procedury a fce původně napsané v assembleru, které byly již přeloženy do souborů OBJ příslušný kód se musí připojit direktivou {$L jmeno_souboru} procedure MoveWord(var Source, Destination; Count : word); external; procedure FillWord(var Destination; Data:integer; Count : word); external; {$L d:\ASM\PROC.OBJ}
Assembler umožňuje psát celé procedury (fce) v assembleru assembler deklarační část asm příkaz ;
Inline umožňuje psát místo bloku příkazů pascalského kódu rovnou psát strojový kód
Deklarace funkce hlavička funkce hlavička funkce blok funkce function identifikátor seznam form. parametrů kvalif. identifikátor function návratový typ :
Funkce signum function Signum (cislo : real) : shortint ; begin if cislo > 0 then Signum := 1 else if cislo = 0 then Signum := 0 else Signum := -1; end;
Ciferný součet function CifernySoucet(cislo : word) : byte; var suma, cifra : byte; begin suma := 0; while cislo > 0 do begin cifra := cislo mod 10; cislo := cislo div 10 suma := suma + cifra; end;