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 Blue = 1 Green = 2 Cyan = 3 Red = 4 Magenta = 5 Brown = 6 LightGray = 7
DarkGray = 8 LightBlue = 9 LightGreen = 10 LightCyan = 11 LightRed = 12 LightMagenta = 13 Yellow = 14 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) WhereX WhereY Pavel Töpfer, 2016
- umístění kursoru na pozici (X, Y) - funkce vrací X-ovou souřadnici kursoru - funkce vrací Y-ovou souřadnici kursoru Programování 1 - 12
3
ClrScr ClrEol DelLine InsLine
- smaže obrazovku (barvou pozadí), kursor na (1,1) - smaže od kursoru do konce řádku - vynechá řádek s kursorem - 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 - pozdržení výpočtu o ms milisekund (přibližně) - použití pro zvuky (sekvence Sound – Delay – NoSound), pro chvilkové zobrazení informace apod. Delay(ms: word)
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 Pavel Töpfer, 2016
akce pro šipku nahoru; akce pro šipku dolů; akce pro jinou šipku akce pro dekadickou číslici; akce pro všechny ostatní klávesy 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
anxn + an-1xn-1 + an-2xn-2… + a1x + a0 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