CRT = knihovna prostředků pro lepší práci s textovou obrazovkou, klávesnicí a generátorem zvuků Dosud obrazovka = textový soubor, sekvenční zápis po řádcích. Při použití CRT možnost adresace na obrazovce, barvy, atd. Použití v programu: uses CRT; bezprostředně za hlavičkou programu Adresace na obrazovce: (X, Y) X je sloupec, číslování od 1 do 80 zleva doprava Y je řádek, číslování od 1 do 25/50 shora dolů Pavel Töpfer, 2016 Programování 1-12 1
Konstanty barev: Black = 0 DarkGray = 8 Blue = 1 LightBlue = 9 Green = 2 LightGreen = 10 Cyan = 3 LightCyan = 11 Red = 4 LightRed = 12 Magenta = 5 LightMagenta = 13 Brown = 6 Yellow = 14 LightGray = 7 White = 15 Blink = 128 Pavel Töpfer, 2016 Programování 1-12 2
Proměnné: CheckBreak: boolean - citlivost na Ctrl+Break (přerušení výpočtu) default hodnota true CheckEOF: boolean - citlivost na Ctrl+Z (příznak EOF input) default hodnota false (!) TextAttr: byte - aktuální atributy zobrazování textu bity 76543210 - blikání pozadí popředí (znak) Procedury a funkce: TextColor(Color: 0..15) - barva písma TextBackground(Color: 0..7) - barva pozadí nastavují hodnotu TextAttr, lze i přímo dosadit např. TextAttr := Yellow + Blue*16 + Blink; GotoXY(X, Y) - umístění kursoru na pozici (X, Y) WhereX - funkce vrací X-ovou souřadnici kursoru WhereY - funkce vrací Y-ovou souřadnici kursoru Pavel Töpfer, 2016 Programování 1-12 3
ClrScr - smaže obrazovku (barvou pozadí), kursor na (1,1) ClrEol - smaže od kursoru do konce řádku DelLine - vynechá řádek s kursorem InsLine - vloží prázdný řádek TextMode(mode) TextMode(C80) TextMode(C80+Font8x8) 25 řádků 50 řádků Window(X1, Y1, X2, Y2) - definice okna = výřezu obrazovky, s nímž se bude dále pracovat - (X1, Y1) levý horní roh, (X2, Y2) pravý dolní roh - dále adresace relativně v okně levý horní roh okna je (1,1) - default celá obrazovka (1, 1, 80, 25) Pavel Töpfer, 2016 Programování 1-12 4
Klávesnice KeyPressed boolean - byla stisknuta nějaká klávesa? - znak je ponechán v klávesnicovém bufferu pro následné čtení - nereaguje na samotné přeřaďovače (Shift, Alt, Ctrl, CapsLock, NumLock) ReadKey char - čte jeden znak z klávesnice (nečeká na Enter, bez echa na obrazovku) - KeyPressed = true čte okamžitě, false čeká na znak - reaguje i na speciální klávesy (na rozdíl od read) Speciální klávesy na PC (ne ASCII) rozšířené kódy: ReadKey čte nejprve znak #0 a následně kód speciální klávesy Pavel Töpfer, 2016 Programování 1-12 5
Generátor zvuků Sound(Hz: word) NoSound - spuštění zvuku s frekvencí Hz - vypnutí generátoru zvuku Měření času Delay(ms: word) - pozdržení výpočtu o ms milisekund (přibližně) - použití pro zvuky (sekvence Sound Delay NoSound), pro chvilkové zobrazení informace apod. Pavel Töpfer, 2016 Programování 1-12 6
Pseudonáhodná čísla = algoritmicky generovaná náhrada za náhodná čísla Použití: - náhodnost při rozhodování např. ve hrách (výběr z více možných stejně dobrých tahů v dané pozici, házecí kostka) - generování rozsáhlých testovacích dat - výpočetní metody typu Monte Carlo Generátor pseudonáhodných čísel - algoritmus, který na základě předchozí hodnoty určí další náhodné číslo v posloupnosti - existuje teorie, jak je vytvářet, my využijeme standardní generátor - při volání generátoru lze zvolit, zda chceme číslo celé či reálné a z jakého rozmezí hodnot Pavel Töpfer, 2016 Programování 1-12 7
Generátor pseudonáhodných čísel v TP RandSeed standardní proměnná typu longint = semínko generátoru, výchozí hodnota pro algoritmus Random funkce volání generátoru - spočítá výslednou hodnotu na základě RandSeed, zároveň nadefinuje novu hodnotu RandSeed pro další volání. Dvě možnosti volání: - volání bez parametru hodnota typu real z intervalu <0,1) - volání Random(N) hodnota typu word z intervalu <0,N-1> Randomize procedura pro inicializaci RandSeed na základě aktuální hodnoty systémového času Pavel Töpfer, 2016 Programování 1-12 8
Inicializace generátoru - provádí se jen jednou na začátku programu. Dvě možnosti: 1. Randomize; při každém běhu programu jiná série náhodných čísel (většinou požadovaný cílový stav) 2. RandSeed := VýchozíHodnota; pokaždé stejná série náhodných čísel použití: dočasně při ladění programu, trvale při šifrování dat apod. Pseudonáhodná čísla z jiného rozmezí - vynásobením změnit rozsah u typu real, přičtením posunout rozsah Příklady: Random(6) + 1 běžná házecí kostka Random * 20-10 reálná čísla z rozmezí od -10 do 10 Pavel Töpfer, 2016 Programování 1-12 9
Příkaz CASE - výběr z více variant podle hodnoty výrazu case Výraz of Hodnota1: Příkaz1; Hodnota2: Příkaz2; HodnotaN: PříkazN end Výraz uvedený za case může být libovolného celočíselného typu, hodnoty musí být konstanty téhož typu. Sémantika: if Výraz = Hodnota1 then Příkaz1 else if Výraz = Hodnota2 then Příkaz2 else if Výraz = HodnotaN then PříkazN Pokud se tedy Výraz nerovná žádné z uvedených hodnot, nevykoná se žádný z příkazů. Pavel Töpfer, 2016 Programování 1-12 10
Rozšíření příkazu case Možnost doplnit implicitní variantu pokud se Výraz nerovná žádné z uvedených hodnot, vykoná se Příkaz z větve else. case Výraz of Hodnota1: Příkaz1; Hodnota2: Příkaz2; HodnotaN: PříkazN; else Příkaz end Přípustné tvary hodnot uváděných u variant: - konstanta 20: - několik konstant oddělených čárkami 20, 22, 24: - interval hodnot 30..40: - kombinace výše uvedených možností 1, 3..7, 9..15, 40: Hodnoty u variant nemusí být navzájem disjunktní vykoná se příkaz z první větve, u které dojde ke shodě hodnoty s výrazem. Pavel Töpfer, 2016 Programování 1-12 11
Příklad: case N of {N je proměnná typu integer} 1: writeln(n); {jedna akce} 2: begin inc(a); dec(b) end; {více akcí složený příkaz} 0..9: {jiné jednociferné číslo nedělej nic} else writeln( CHYBA ) {víceciferné číslo je chyba} end. Příklad praktického použití: Program potřebuje reagovat podle toho, jaká klávesa byla stisknuta na klávesnici rozhoduje se podle hodnoty proměnné obsahující hodnotu stisknuté klávesy (každá klávesa má nějaký celočíselný kód), je mnoho možností, pro některé klávesy bude stejná reakce. case StisknutaKlavesa of SipkaNahoru: SipkaDolu: SipkaVlevo, SipkaVpravo: Cifra0..Cifra9: else end akce pro šipku nahoru; akce pro šipku dolů; akce pro jinou šipku akce pro dekadickou číslici; akce pro všechny ostatní klávesy Pavel Töpfer, 2016 Programování 1-12 12
Příkaz skoku = předání řízení na určité místo v programu Syntaxe: goto Návěští - Návěští = celé číslo bez znaménka, v TP může být i identifikátor - Návěští se musí deklarovat label Návěští; - cíl skoku (příkaz) v programu se označí Návěští: Ve strukturovaném programování se užívají strukturované příkazy a příkaz skoku prakticky nepotřebujeme. Může být zdrojem mnoha nebezpečí (např. skok dovnitř cyklu) používat skok jen v mimořádných případech! Rozumné strukturované skoky pomocí standardních procedur: break - předčasné ukončení cyklu exit - předčasné ukončení procedury nebo funkce (příp. programu) halt - předčasné ukončení programu Pavel Töpfer, 2016 Programování 1-12 13
Použití příkazu goto výskok z více vnořených cyklů (break ukončuje pouze jeden cyklus) Příklad: vyhledávání dané hodnoty X v matici čísel A label Konec; const N = 10; M = 15; var X: integer; {hledaná hodnota} A: array[1..n, 1..M] of integer; I, J: integer; for I:=1 to N do for J:=1 to M do if A[I,J] = X then begin {zpracování výsledku} goto Konec end; Konec: {pokračování výpočtu} Pavel Töpfer, 2016 Programování 1-12 14
Jiné řešení téhož úkolu bez použití příkazu goto, pomocí break: const N = 10; M = 15; var X: integer; {hledaná hodnota} A: array[1..n, 1..M] of integer; I, J: integer; Konec: boolean; Konec := false; for I:=1 to N do begin for J:=1 to M do if A[I,J] = X then begin {zpracování výsledku} Konec := true; break end; if Konec then break end; {pokračování výpočtu} Pavel Töpfer, 2016 Programování 1-12 15
Záznam - strukturovaný datový typ - co patří logicky k sobě, ať je u sebe i deklarováno - jednotlivé položky záznamu mohou být různých typů (libovolných, třeba i strukturovaných) - nedají se indexovat jako v poli, mají svá vlastní jména (identifikátory) - jména jednoznačná v rámci záznamu, ale ne vůči okolnímu světu type JménoTypu = record Položka1: TypPoložky1; Položka2: TypPoložky2; PoložkaN: TypPoložkyN end; - popis položek se řídí stejnými syntaktickými pravidly jako deklarace proměnných Pavel Töpfer, 2016 Programování 1-12 16
type Datum = record Den, Mesic, Rok: word end; var Dnes, Zitra: Datum; type Zamestnanec = record Jmeno: string[20]; Plat: word; Narozen: Datum; Deti: array[1..10] of string[20]; end; var Alois: Zamestnanec; Z: array[1..1000] of Zamestnanec; Pavel Töpfer, 2016 Programování 1-12 17
Operace S proměnnou typu záznam lze jako s celkem provádět jedinou operaci, a to dosazení mezi dvěma proměnnými téhož typu: Dnes:=Zitra; Z[3]:=Alois; Přístup ke složkám pomocí tečkové notace: JménoZáznamu.JménoPoložky - se složkou záznamu se pak manipuluje stejně jako s každou jinou proměnnou příslušného typu. Dnes.Den:=31; Dnes.Mesic:=12; read(alois.jmeno); Suma:=Suma + Alois.Plat * 2; Z[3].Narozen.Rok:=1945; Z[3].Deti[1]:= Pepicek ; Pavel Töpfer, 2016 Programování 1-12 18
Příklad: reprezentace polynomu a n x n + a n-1 x n-1 + a n-2 x n-2 + a 1 x + a 0 Dvě varianty: 1. ukládáme všechny členy polynomu včetně nulových, exponent slouží jako index v poli ( snadná manipulace) 2. ukládáme pouze nenulové členy, exponent se ukládá do pole společně s koeficientem (vhodné pro řídké polynomy) type Polynom1 = record Stupen: word; {stupeň polynomu} Koeficient: array[0..maxstupen] of real end; type Polynom2 = record Pocet: word; {počet nenulových členů} Clen: array[0..maxpocet] of record Koef: real; Exp: word end; end; Pavel Töpfer, 2016 Programování 1-12 19
Inicializovaná proměnná typu záznam const LetosniPrvniMaj: Datum = (Den: 1; Mesic: 5; Rok: 2004); type Complex = record X, Y: real end; const Z: Complex = (X: 2.0; Y: 3.5); Pavel Töpfer, 2016 Programování 1-12 20
Příkaz WITH - použití: pro snadnější přístup k více položkám téhož záznamu - syntaxe: with JménoZáznamu do Příkaz - sémantika: v rámci Příkazu se před každý identifikátor, kde to má syntaktický smysl, jakoby přidá tečkou oddělené JménoZáznamu with Z[1] do read(jmeno, Plat, Narozen.Den, Narozen.Mesic, Narozen.Rok); with Alois do begin Jmeno:= Alois Jirasek ; Plat:= 10000; Deti[1]:= Kaspar ; Deti[2]:= Melichar ; Deti[3]:= Baltazar end; Pavel Töpfer, 2016 Programování 1-12 21