SŠ informatiky a spojů, Brno, Ćichnova 23, Brno 624 00
„Základy programování v Pascalu“ (učební pomůcka)
Vypracoval: Skalka František
Brno 2006
Obsah Úvod …………………………………………..………………….
3
Algoritmizace a vývojové diagramy ………………………………
4
Značky vývojových diagramů ….…………..…………………….
5
Programové výrazy …….…………………………………………
8
Pascal ……………………………..………………………………
10
Proměnné a přiřazení hodnoty ……………………..……………..
11
Vstupní a výstupní hodnoty ………………………………………. 13 Konstrukce programu ……………………………….……………
16
Prostředí jazyka……………………………………..…………….
18
Číselné datové typy …………………………………..…………… 20 Podmínění příkaz …………………………………………………. 26 Náhodný výběr ……………………………… ………..………….
32
Nový řádek u vstupu a výstupu …………………………………..
33
Příkazy cyklů …………………………………………..…………
34
Datový typ char ……………………………… ………..…………
42
Mnohonásobné větvení ………………………… …………..……
44
Datový typ string …………………………………………………
48
Převod mezi typem znakovým a celočíselným ………..…………. 52 Jednotky ……….………………………………………………….. 53 Jednotka CRT ………………………………………………….…
53
Literatura ………………………………………………………....
62
Úvod Na SŠ informatiky a spojů, Čichnova 23 v Brně, má Pascal dlouholetou tradici a osnovy jej zařazují mezi povinné učivo předmětu informační a komunikační technologie. Potíž je v tom, že neexistuje pro střední školy oficiální učebnice tohoto vyššího programovacího jazyka. Z tohoto důvodu má tato učební pomůcka zaplnit vzniklou mezeru, a usnadnit tak nelehkou cestu žákům, kteří mají zájem se naučit programovat. Programovací jazyk Pascal je vnímán širokou veřejností jako nástroj pro tvorbu jednoduchých a přehledných programů. Vznikl počátkem sedmdesátých let 20. století jako jazyk pro výuku programování. Navrhl jej profesor Niklaus Wirthem na Eidgenössische Hochschule ve švýcarském Zürichu. Tvůrce měl za cíl vytvořit vhodný jazyk pro systematickou výuku programování. Časem se plně osvědčil, a proto i dnes na většině středních a vysokých škol patří mezi programovací jazyky, na kterých se studenti učí základům programování, a osvojují si tak dovednost logicky myslet. Oddíly v této učební pomůcce jsou řazeny tak, jak se praktikují ve výuce a jak se osvědčily praxí. První část je věnována algoritmům a vývojovým diagramům. V druhé části se studenti seznámí se základními pojmy. Třetí část se pak dotýká prostředí Pascalu. Čtvrtá, předposlední část, je věnována podmínkám a cyklům, tedy samotným složeným příkazům. Poslední pátý oddíl nás seznamuje s textovým prostředím jednotky CRT. U všech kapitol, jak jdou po sobě, by měl student najít dostatek informací k tomu, aby danou úlohu pochopil a uměl ji aplikovat v příkladech na procvičení. Příručka obsahuje hlavní programátorské činnosti, které slouží k základům u všech programovacích jazyků. Pokud dojde k jejich osvojení během úvodního studia programování, již pro studenta nebude obtížné přejít na jiný programovací jazyk, který se v současné době využívá k programováni.
Algoritmizace a vývojové diagramy S algoritmy se setkáváme v běžném životě. Je to řada nejrůznějších činností, které mohou být jednoduché - čištění zubů, cesta do školy, nebo složité - různé chemické reakce či řízení kosmické lodi. Většinu činností můžeme rozdělit na řadu po sobě jdoucích úkonů, které na sebe navazují. Pro uskutečnění takových činností pak můžeme sestavit návody. A algoritmus představuje právě takový přesný návod, jakým je kupříkladu recept na vaření, instrukce na sestrojení papírového draka nebo operace pro zastavení jedoucího vozidla. Díky těmto pracovním postupům pak můžeme řešit libovolné druhy úloh. Ukázka algoritmu vaření čaje po jednotlivých krocích: 1) 2) 3) 4) 5)
vezmeme konvici a napustíme ji vodou zapneme sporák a postavíme na něj konvici zatím co se voda ohřívá, připravíme si šálek do šálku vložíme sáček čaje zalijeme čaj vřící vodou
Každý algoritmus by měl mít tyto vlastnosti: 1) Postupnost - jednotlivé kroky jdou v určitém pořadí, v jakém budou vykonávány. Měla by být dána přesná posloupnost, aby bylo jasné, jak jdou za sebou, a který z nich je poslední. 2) Obecnost - algoritmus by měl řešit libovolnou úlohu a ne konkrétní příklad. Neměl by zpracovávat zadání c = 2 + 2, ale měl by řešit zadání obecně c = a + b, tedy realizovat řešení celé skupiny podobných úkolů. 3) Výslednost - algoritmus vede po určitém počtu kroků vždy k výsledku a nesmí být nekonečný. Pro snadnější práci s algoritmy byl vyvinut symbolický algoritmický jazyk, který využívá názorné zobrazení pomocí dohodnutých obrazců, které představují jednotlivé kroky algoritmu. Tento jazyk se definuje jako vývojový diagram. Je normalizován českou státní normou ČSN ISO 5807, která je platná od 1. ledna 1996. Norma specifikuje značky používané ve vývojových diagramech pro grafické znázornění posloupnosti operací, které řeší určitý problém.
Značky vývojových diagramů Značka
zpracování
Význam značky Vykoná jakoukoli operaci, jejímž výsledkem je přeměna údajů, např. změna hodnoty, tvaru, pozice či umístěni.
Provede akci, ve které dojde k větvení vývojového diagramu. Na základě podmínky uvnitř symbolu bude stanoven způsob dalšího postupu programu. rozhodování Umožní nastavit počáteční činnost, dle které se mění vlastní postup následných činností, např. proměnná cyklu. příprava Vstup dodává data pro zpracování do programu, zatímco výstup reprezentuje zobrazení konečných hodnot. vstup a výstup Představuje přechod z jedné části diagramu na jinou, tedy přerušení a následné pokračování na jiném místě. spojka
Označuje místo začátku a konce vývojového diagramu. mezní značka Slouží pro popis komentářů nebo vysvětlujících textů. poznámka Představují svislé nebo vodorovné čáry sloužící ke spojení jednotlivých symbolů mezi sebou a dále vyznačující směr toku informace.
spojnice
Předností vývojových diagramů je jejich názornost. Uvádím přepis zapsání vývojového diagramu pomocí vývojových značek pro výpočet obsahu a obvodu obdélníku, který je zakreslen obecně pomocí českých příkazů. start
čti a, b
obsah =a*b
piš obsah
(a,b) obvod =2*(a+b)
piš obvod
konec
hodnoty a i b jsou velikosti stran obdélníku
Další příklady na procvičení: 1) Převeďte zadaný čas v minutách na a zakreslete řešení do vývojového diagramu.
hodiny
a
minuty
2) Nastiňte vývojovým diagramem výpočet splnění normy automobilky v procentech, jestliže víte počet prodaných vozů a počet vozů, kolik se automobilka zavázala vyrobit. 3) Sestavte vývojový diagram pro výpočet průměru známek na vysvědčení. I když pro zadání použijete všechny známky (např. 7), do průměru se nezapočítává známka z chování. 4) Navrhněte algoritmus pro výpočet roků, měsíců, týdnů, dnů, hodin, minut a vteřin, k aktuálnímu letopočtu, například od tvého narození. 5) Zakreslete pomocí vývojového diagramu kalkulačku, která po zadání dvou čísel tyto hodnoty sečte, odečte, vynásobí a podělí. 6) Vymyslete postup pomocí algoritmu, který bude řešit výpočet mzdy za den, jestliže budeme zadávat příchod a odchod do zaměstnání a dále sazbu na hodinu. Daň činí 19% . 7) Pomocí vývojového diagramu proveďte příklad, který zobrazí panu řediteli, kolik má v celé škole žáků a kolik je průměrně žáků v jedné třídě. Víte, že škola má pět tříd, a počet žáků v každém ročníku se snižuje o dva žáky. V poslední třídě pak zadejte počet chlapců i dívek . 8) Proveďte pomocí vývojového diagramu kalkulaci celkové sumy peněz na účtu, jestliže zadáte (například 5) výčet všech výplat a též po zadání úročení vkladu (například 2%). 9) Navrhněte algoritmus pro příklad výpočtu vzdálenosti mezi body. Rychlovlak jedoucí rychlostí 70 m/s vyjede z bodu A. Za jak dlouho dorazí do bodu B, když víte, že bod B leží 50 kilometrů od bodu A. 10) Pomocí vývojového diagramu vyřešte výpočet pohybu cyklisty v metrech za vteřinu, když víte, že za 20 minut ujel vzdálenost dvanáct kilometrů?
Programové výrazy Program umožňuje přepis algoritmu do řeči počítače, tedy do programovacího jazyka. Příkazy, které jsou postupně vykonávány, jsou buď ve strojovém kódu, který počítač může ihned začít vykonávat, nebo se nachází v tzv. zdrojovém tvaru, který musí být nejdříve převeden překladačem do binárního tvaru pro procesor. Tyto pojmy se vážou k programování a znamenají: Strojový kód – představuje zápis čísel ve dvojkové soustavě, kterými je naplněna paměť typu RAM, a které je procesor schopen začít zpracovávat. Tato kombinace jedniček a nul reprezentuje příkazy vyššího programovacího jazyka. Vyšší programovací jazyk – je tvořen příkazy, jež umožňují účinněji využít možnosti procesoru i paměti počítače a snadněji vyjádřit kroky algoritmu. Příkazy jsou reprezentovány klíčovými slovy, která jsou pro programátora přijatelnější než strojový kód. Aby bylo možné program spustit, musí být nejprve převeden do strojového kódu. Vyššími programovacími jazyky jsou např.: Fortran, Basic, Pascal, C, atd. Klíčová slova – jsou formována daným programovacím jazykem a mají přesně stanovený význam v podobě příkazů, které nelze žádným způsobem měnit. Vyznačují jednotlivé konstrukce jazyka a tvoří určité celky. Zdrojový text – je část obsahu programu, který vyjadřuje vlastní popis algoritmu a představuje jeho řešení. Využívá k tomu vlastní příkazy daného programovacího jazyka a k převodu zdrojového textu i všech ostatních částí programu do strojového kódu používá překladače: a) interpret – překládá příkazy po jednotlivých krocích, jakmile je vykonán předcházející příkaz, spouští se další, který se opět okamžitě začne vykonávat. Tyto překladače jsou ihned spustitelné, ale pomalé. b) kompilátor – překládá celý program najednou a teprve poté vykonává příkazy. Tyto překladače nespustí program, pokud obsahuje chyby a je-li je příliš rozsáhlý.
Nevýhodou je, že překlad trvá delší dobu, avšak po kompilaci program běží velmi rychle. Při přepisu algoritmu do programu je velmi důležité dodržovat jisté definice daného programovacího jazyka. Těmito definicemi jsou syntax a sémantika. Syntax – udává pravidla pro korektní formu zápisu programovacího jazyka. Při psaní příkazu musíme tedy dodržovat přesně dané normy, které jsou předepsané jazykem. Pravidla jsou uvedena v nápovědě programovacího jazyka a znalost těchto pravidel je nutná pro základní tvorbu programu. Sémantika – přiřazuje význam jednotlivým syntaktickým pravidlům. Syntakticky správně zapsané příkazy, pokud nejsou vhodně sémanticky uspořádané, nevytvoří funkční program.
Pascal Po vytvoření vývojového diagramu je nutné vložit algoritmus do počítače. K tomuto účelu slouží program. Program umožňuje přepis algoritmu do řeči počítače, a to pomocí programovacího jazyka. Tomuto jazyku již počítač rozumí a je schopen začít vykonávat jeho jednotlivé kroky. Našim cílem je sestavovat algoritmy jako programy. Proto musíme pracovat tak, jak nám to dovoluje používaný programovací jazyk. Převod algoritmu do programovacího jazyka je závislý na tom, který programovací jazyk si zvolíme. S tím souvisí i dodržování zásady konstrukce daného jazyka. A jaký jazyk by to měl být? Každý programovací jazyk má své výhody a nevýhody, a tudíž nelze říci, že jeden je lepší než druhý. A protože Pascal patří do větve univerzálních programovacích jazyků a plně se osvědčil v průběhu své dlouhé historie, měl by se vyučovat jako první programovací jazyk. Je to z toho důvodu, že Pascal je víceméně didaktický, protože jednoduchým způsobem docílíte dobrých výsledků a navíc je přehledný. Dále obsahuje málo prvků, avšak využívá veškeré konstrukce uplatnitelné i v jiných jazycích. Oproti současným jazykům nevyžaduje komfortní počítače a nový operační systém. Verze programovacího jazyka Pascal: 1) Pascal - vyšší programovací jazyk, který je spustitelný na libovolném počítači, jestliže daný počítač obsahuje překladač. 2) Turbo Pascal - je překladač, editor a nástroj pro ladění programů jazyka Pascal určený pro počítače PC vybavené operačním systém MS DOS. Jeho jednotlivé vývojové verze jsou číslovány např. TP 7.0. 3) Borland Pascal - je překladač, editor a ladící systém jazyka Pascal určený pro počítače vybavené operačním systém MS Windows. 4) Free Pascal Compiler – volně šiřitelný překladač pro všechny OS navazující na Pascal. Vznikl v době, kdy firma Borland oznámila, že končí s programem Turbo Pascal. Jeho součástí je i vlastní editor. 5) Borland Delphi – vývojové prostředí, jenž vychází z jazyka Pascal a umožňuje jeho používání v prostředí Windows. První verze vyšla v roce 1994 a na trh ji uvedla firma Borland. Dnes patří k nejpoužívanějším programovacím prostředkům s objektově orientovaným přístupem.
Proměnné a přiřazení hodnoty Prvotním nástrojem pro práci s daty je proměnná. Většina programů se bez proměnné neobejde. Proměnná je objekt, který má pevně stanovené označení a nese určitou hodnotu. Tato hodnota se může v průběhu programu měnit. Pro označení proměnných se v Pascalu používají jména složená z písmen a číslic, první však musí být písmeno. Proměnnou znázorňujeme ve tvaru: r1 radius
Takto zapsané proměnné ale ještě nejsou vymezeny, protože jim není přiřazena žádná hodnota. Hodnotou proměnné může být číslo celé r1:=10, číslo neceločíselné radius:=2,7 nebo text. Přiřazení hodnoty k proměnné se děje dle přiřazovacího příkazu: název proměnné := výraz
kdy název proměnné označuje jméno, které má být u dané proměnné použito výraz zastupuje objekt pro získání hodnoty := představuje přiřazovací znaménko. Výrazy na pravé straně přiřazovacího příkazu zapisujeme obdobným způsobem, jak je zvykem v matematice sum:=(25+38)*3, znamená přiřaď k proměnné sum hodnotu výrazu 25 + 38 a to celé násob 3. Výrazy mohou obsahovat nejen hodnoty, ale i proměnné sum:=(a+b)*(a-b). Jestliže dosadíme do proměnné a hodnotu čtyři a do proměnné b hodnotu tři a:=4 a b:=3, poté po vykonání příkazu bude proměnná sum obsahovat hodnotu 7. Přiřazovací příkaz r1:=z způsobí, že po jeho provedení budou mít obě proměnné stejnou hodnotu, neboť proměnná r1 získává hodnotu z proměnné z. Ve výrazu na pravé straně přiřazovacího příkazu může být i proměnná, která je na levé straně příkazu poc:=poc+1. Potom proměnná na levé straně nabývá hodnotu o jednu vyšší než proměnná na pravé straně. Příklady na procvičení:
1) Vypište pomocí vývojového diagramu hodnotu o jednu vyšší, než byla při přiřazení. 2) Proveďte algoritmus přiřazení k proměnné c proměnnou v. Proměnná c má být desetkrát větší než proměnná v. Pro vyřešení použijte další proměnnou p, jako konstantu pro hodnotu 10. 3) Zapište do vývojového diagramu přiřazovací příkaz pro záměnu hodnot u proměnné a a b, kdy a:=10 a b:=15. Po provedení budou mít obě proměnné opačné hodnoty. Pro vyřešení postupu použijte další pomocnou proměnnou (lze řešit i bez pomocné proměnné). 4) Vytvořte algoritmus, který po přiřazení roku narození přiřadí jiné proměnné, kolik je dotyčnému let. 6) Znázorněte pomocí vývojového diagramu přesun hodnot v následujících proměnných a, b a c, kdy a:=10, b:=20, c:=30. Po provedení změny bude proměnná a mít hodnotu proměnné b, b proměnné c a proměnná c nabude hodnotu proměnné a. 7) Vytvořte algoritmus, který přiřadí výsledné proměnné vysl, jaká je vzdálenost mezi hodnotami na číselné ose, jestliže přiřazujeme k proměnným a i b libovolnou hodnotu. 8) Vypočítejte a znázorněte pomocí vývojového diagramu objem kulového zásobníku, jehož průměr je zadán v metrech. Na základě přiřazení vypište, na jak dlouho vydrží voda pro jednoho člověka, když víte, že za den spotřebuje 5 litrů vody. 8) Sestavte algoritmus součtu, jehož úkolem bude přiřadit výsledné proměnné sumu všech živočichů v teráriu. Pro řešení použijte počet zadaných končetin pavouků, brouků a hlemýžďů. Víte, že pavouci mají osm, brouci šest a hlemýždi jednu končetinu. 9) Navrhněte algoritmus pro výpočet rychlosti běhu geparda v kilometrech za hodinu, když víte, že běží tři a půlkrát rychleji než člověk. Atlet uběhne deset metrů za vteřinu, kolik uběhne gepard kilometrů za hodinu?
Vstupní a výstupní hodnoty Pro práci s počítačem slouží data, která uživatel předává počítači. Program tato data odebírá a ukládá je do proměnných. V programování existují dva způsoby, jak může proměnná nabývat novou hodnotu: a) přiřazovacím příkazem b) načtením vstupu Protože přiřazovací příkaz byl probrán výše, bude nás nyní zajímat získání hodnoty načtením. K tomuto účelu slouží příkazy vstupu, které získáme ze vstupního zařízení, zpravidla z klávesnice. Tento proces obstarává jednoduchý příkaz vstupu: read ( proměnná )
kdy proměnná představuje název proměnné, do které se má načíst hodnota. Tento příkaz vstupu způsobí, že se k proměnné uvedené v závorce za příkazem read načte hodnota, kterou zadáme z klávesnice. Pokud však potřebujeme načíst více hodnot z klávesnice více proměnným, současně použijeme: read ( seznam proměnných )
kdy seznam proměnných označuje jednotlivé proměnné, do kterých chceme uložit hodnotu, a které jsou od sebe odděleny čárkou, např.: read (x,y,z) představuje příkaz vstupu s proměnnými x, y, z, kterým chceme zadat následující hodnoty x=10, y=3 a z=432, potom z klávesnice zadáváme hodnoty v přesně daném pořadí 10↵,3↵,432↵ se stiskem klávesy Enter.
Pro vypsání hodnoty na obrazovku, která je uložena v proměnné, slouží příkaz výstupu, který má tvar: write ( parametr )
kdy parametr představuje buď proměnnou, jejíž hodnotu chceme zobrazit, nebo textový řetězec zapsaných mezi apostrofy (apostrof zapisujeme pomocí ASCII kódu Alt+39), např.: write(’zadej hodnotu’). Pro zobrazení více informací použijeme následující definici: write ( seznam parametrů )
kdy platí: seznam
parametrů zastupuje více proměnných oddělených čárkami, textový řetězec s proměnnou nebo výsledek operace s textovým řetězcem či proměnnou. Pro zadání kombinace parametrů textového řetězce s proměnnou platí následující pravidla zápisu apostrofů a čárek, např.: write ’Výsledek je C.’, ’,vysl, ’ znamená, že Výsledek je představuje textový řetězec, vysl zastupuje proměnnou, do
které byla přiřazena hodnota 19 a C. je opět posloupnost znaků, tedy jakýkoliv text ohraničený apostrofy. Na zobrazovací jednotce bude poté vypsáno Výsledek je 19 C. Pro vypsání výsledku operace s textem nemusíme výsledek přiřazovat, ale stačí jej zadat v patřičném tvaru, např.: write ’Soucet se rovná ’,a+b. Zobrazení na výstupní obrazovce poté bude ve tvaru Soucet se rovná 20, (jestliže např. a=5 a b=15).
Po porozumění proměnné a vstupně výstupních příkazů by již studenti měli další vývojové diagramy vypracovávat stejným způsobem, který se využívá při psaní zdrojového textu, a to z toho důvodu, aby si osvojili správný zápis při psaní zdrojového textu. Jako vzorová ukázka s načrtnutým postupem řešení může sloužit následující zadání. Vypište na obrazovku pomocí vývojového diagramu malou násobilku od jedné do pěti. Jako násobitele však můžete zadat jakékoli číslo od jedné do deseti.
start
1
write( ‘zadej nasobitele‘)
b:=3*a
read( a)
write( ‘3*a=‘,b)
b:=1*a
b:=4*a
write (‘1*a=‘,b)
write (‘4*a=‘,b)
b:=2*a
b:=5*a
write (‘2*a=‘,b)
write (‘5*a=‘,b)
1
konec
Konstrukce programu Jazyk Pascal patří mezi jazyky s blokovou stavbou programu. Základem této konstrukce je blok. hlavička programu úsek deklarací begin příkazová část end.
B L O K
Program v Pascalu je tedy tvořen touto konstrukcí: hlavička vyjadřuje pojmenování programu a tvoří první řádek. Začíná klíčovým slovem program, za kterým je námi volené pojmenování. Pokud chceme užít víceslovné pojmenování programu, musíme slova psát bez mezer, nebo oddělovat jednotlivá slova spodní pomlčkou. Hlavička je nepovinný údaj. deklarace (prohlášeni) formuluje seznam objektů, které se mohou v samotném zdrojovém textu vyskytovat a definují jejich význam. Těmito objekty mohou být proměnné, konstanty, knihovny, procedury atd. Překladač tuto část využívá pro zablokování určitého místa v paměti počítače. příkazová část představuje samotný zdrojový text pro řešení algoritmu. Je uzavřena mezi klíčovými slovy begin (začátek) a end (konec) a obsahuje jednotlivé příkazy programu. Použití konstrukce programu v jazyce Pascal – ukázkový program: program vypocet_obsahu_obdelniku; var a,b,obsah:integer; begin write(’Zadej stranu a obdelniku ’); read(a); write(’Zadej stranu b obdelniku read(b); obsah:=a*b; write(’Obdelnik ma obsah ’,obsah) end.
’);
Forma zápisu a úprava programu: ♦ za jednotlivými příkazy píšeme středník ♦ Pascal nerozlišuje velká a malá písmena ♦ program končí klíčovým slovem end s tečkou, vše, co je za ním, je ignorováno ♦ za klíčovým slovem begin se nedělá středník ♦ před jakýmkoliv příkazem end nemusí být středník ♦ každý příkaz by měl stát na samostatném řádku ♦ příkazy odsazujeme pro přehlednost tabulátorem ♦ dvojice příkazů patřících k sobě píšeme pod sebe, např.: begin a end Důležitou součástí programu je též poznámka neboli komentář: komentář slouží k objasnění některých objektů a k vysvětlení složitějších konstrukcí programu. Jedná se o text, který překladač vynechává, a který používá programátor ke svému zpracování algoritmu. Je uložen buďto do složených závorek {…} nebo se vkládá do závorek s hvězdičkou (*…*). Práce s programem nekončí správným přepisem algoritmu do korektně strukturovaného zdrojového textu bez syntaktických chyb. Program je důležité spustit a vyzkoušet. K tomuto účelu nám slouží řada klávesových zkratek, které nám urychlují práci v prostředí Pascalu. Úvodem pouze dvě podstatné klávesové zkratky pro úplný začátek v programování: Ctrl+F9 spuštění programu Alt+F5 přepnutí obrazovky do výstupního zobrazení k náhledu výsledku a návrat zpět Ctrl+Break přerušení spuštěného programu Na závěr této kapitoly si studenti vytvoří a vyzkouší svůj vlastní program: 1) program ahoj; begin write(’Ahoj, svete.’) end. 2) program opis; var i:integer; begin write(’Zadej hodnotu ’); read(i); write(’Zadna hodnota je ’,i) end.
Prostředí jazyka Pascal nabízí příjemné programátorské prostředí poskytující kompletní balík služeb. Kromě samotného překladače obsahuje editor pro tvorbu zdrojového textu, kvalitní prostředky pro ladění programu, podrobnou nápovědu, řadu demonstračních příkladů atd.
Hlavní část spuštěné aplikace vyplňuje editační okno, ve kterém vytváříme samotný program. Tato pracovní plocha se stává výchozím bodem tvorby programu. Nastavení této plochy se provádí jako všechna ostatní nastavení z menu, nebo můžeme použít tzv. klávesové zkratky. V hlavním menu nalezneme všechny funkce, které program nabízí. Lze jej ovládat stiskem klávesy F10 nebo myší. Jednotlivé položky umožňují řadu funkcí, z nichž jsou níže uvedené pro základní práci podstatné: File – slouží pro práci se soubory a obsahuje následující podpoložky: a) new otevře prázdné editační okno bez jména b) open zobrazí seznam vytvořených souborů c) save as uloží rozepsaný program, nutno použít jen jména o osmi znacích, koncovka bude doplněna automaticky d) change dir změní adresář pro ukládání Edit – poskytuje funkce pro práci s textem: a) undo vrátí akci o krok zpět b) copy zkopíruje text c) paste vloží vyjmutý text Run – obsahuje povely pro spuštění a ladění programu: a) run spustí program b) trace into provádí program řádek po řádku, tzv. krokuje (důležité při hledání chyb)
Debug – nastavuje ladící prostředky: a) breakpoints bod zastavení programu (Ctrl+F8), někdy jej studenti omylem stisknou místo spuštění a objeví se jim červený pruh v místě, kde byl umístěn kurzor, lze odstranit opětovným stiskem (Ctrl+F8) b) watch nové okno, ve kterém si můžete prohlédnout použité proměnné a při krokování sledovat změnu jejich hodnoty c) output další okno sloužící k prohlédnutí výstupní obrazovky při spuštěném zdrojovém kódu d) add watch přidání proměnné do okna watch Options – konfigurace Pascalu a) directories exe & tpu, cesta pro uložení samospustitelného souboru b) unit directories slouží k nastavení cesty ke knihovnám (units) c) environment editor/syntax - highlight, zvýraznění klíčových slov Help – nápověda a) contents přehled zákl. kapitol systému nápovědy b) index heslovitě abecedně seřazená klíčová slova s možností detailů Nejdůležitější klávesové zkratky: Ctrl+F9 Alt+F5
Ctrl+F1
spuštění napsaného programu zobrazení výsledku programu na výstupní obrazovce nápověda ke kurzorem označenému klíčovému slovu
Shift+Ins vložení textu Alt+x
F2
Ctrl+Del
smazání části textu
F3
Ctrl+Ins
zkopírování textu
F5
Ctrl+Break
způsobí přerušení spuštěného programu
F6
vypnutí programu uloží rozepsaný program zobrazení seznamu vytvořených souborů zvětšení okna, například při nápovědě přepínání mezi otevřenými okny
Číselné datové typy V kapitole o proměnných je uvedeno, že proměnná může nabývat hodnot celočíselných, neceločíselných nebo textových. Aby překladač mohl s takto nastavenou proměnnou pracovat, musí ji mít zavedenou v deklarační části programu. Protože rozsah typu nemůže nabývat libovolné hodnoty a nemůže být ani nekonečný, definuje se velikostí minimální a maximální hodnoty. Nestačí uvést tedy pouze jméno proměnné, ale proměnnou musíme označit určitým datovým typem. Tento typ přesně stanovuje, jakých hodnot může proměnná v průběhu programu nabývat. Máme čtyři základní typy: a) integer ( celá čísla) b) real (desetinná čísla) c) char (znaky) d) boolean (logická hodnota) Datový typ se zavádí v deklarační části za klíčovým slovem var (variable – proměnná) v následujícím tvaru: var seznam proměnných:datový typ
kdy seznam proměnných jména proměnných oddělená čárkou : oddělovací značka datový typ určuje, jakého typu budou proměnné nabývat Pokud potřebujeme zavést více zapisujeme je strukturovaně pod sebou např.:
různých
datových
typu,
var c1,c2,suma:integer prumer:real
Správné určení typu je základem řádného chodu programu. Pokud dejme tomu nastavíme nevhodný typ pro dělení, což bývá u začínajících programátorů základní chyba, program vypíše chybové hlášení type mismatch a nedojde ke spuštění programu. Chyba nastane z důvodu nekompatibility typu proměnné a typu prováděné operace, neboť u celých
čísel nemůžeme při dělení očekávat vždy výsledek celočíselný. Proto si jednotlivé typy rozdělíme a objasníme si možné operace. První skupinu tvoří typy celočíselné. Pascal nabízí pět předdefinovaných datových typů pro práci s celými čísly. Velikost typu je vždy omezena číselným rozsahem daného datového typu. Pokud dojde k překročení mezních hodnot tohoto rozsahu, program buď vypíše chybové hlášení, nebo hodnotu neodpovídající výsledku operace. To může být způsobeno tím, Pascal pokračuje s výpočtem od opačné mezní hodnoty. Celočíselné typy jsou zastoupeny představiteli: datový typ Integer ShortInt LongInt Byte Word
rozsah -32768…32767 -128…127 -2147483648…2147483647 0…255 0…65535
Pro množinu celých čísel nabízí Pascal tyto možné operace : a) aritmetické (součet, součin, rozdíl) b) relační (rovná se, je větší, atd.) Aritmetické operace celočíselných typů umožňují: operace sčítání odčítání násobení celočíselné dělení zbytek po celočíselném dělení
operátor + * div mod
Operátor celočíselného dělení je reprezentován příkazem div (divided – dělit), před a za kterým se umísťují mezery. Operace: a
div
b
určuje celou část podílu před desetinnou čárkou, např.: 7 div 4 = 1 7 div 3 = 2 19 div 6 = 3
4 div 7 = 0 7 div 0 = chyba 0 div 8 = 0
Operátor zbytku po celočíselném dělení je reprezentován příkazem mod (modulo – modulace), před a za kterým se opět umísťují mezery. Operace: a
mod
b
vrací zbytek po dělení dvou celočíselných hodnot, přičemž znaménko je shodné s první zadanou hodnotou, např.: -7 mod 4 = -3 4 mod 7 = 4
7 mod 3 = 1 19 mod 6 = 1
7 mod 4 = 3 kdy vycházíme z výpočtu 7 : 4 = 1, jeden krát čtyři jsou čtyři a kolik je sedm a tři
Relační operace celočíselných typů umožňují: operace rovná se nerovná se je větší je menší je větší nebo rovno je menší nebo rovno
operátor
= <> > < >= <=
Pořadí prováděných operací je stejné jako v matematice a pokud není závorkami dáno jinak, provádějí se operace v tomto pořadí: *, /, div, mod, +, -, operace se stejnou prioritou se provádějí zleva doprava. Příklady na procvičení: 1) Rozdělte pomocí celočíselného dělení hodnotu od 0 do 99 na jednotky a desítky, např.: číslo 49 má 9 jednotek a 4 desítky 2) Proveďte totéž s trojmístným číslem od 0 do 999 3) Navrhněte program na rozměnění papírových bankovek. Po vložení určité sumy bankovek od 50 Kč do 500 Kč, vám program vydá patřičný obnos v kovových mincích v hodnotách 1 Kč, 2 Kč, 5 Kč, 10 Kč a 20 Kč. 4) Převeďte číslo z desítkové soustavy do soustavy dvojkové.
Druhou skupinu tvoří představitelé typů pro práci s desetinnými čísly. Pascal zde nabízí opět pět předdefinovaných datových typů s různým rozsahem a přesností: datový typ Real Single Double Extended Comp
rozsah -39 38 2,9*10 …1,7*10 -45 38 1,5*10 …3,4*10 -324 308 5,0*10 …1,7*10 -4932 4932 3,4*10 …1,1*10 63 63 -2 +1…2 -1
Zápis reálného čísla má tvar: mantisa * 10 exponent. Mantisa je celé číslo nebo číslo v desetinném tvaru, exponent je celé číslo udávající pohyb desetinné čárky. Pokud přiřadíme do proměnné a:=2.4, program nám vypíše tuto hodnotu ve tvaru 2.4000000000E+00. To znamená, že mantisa rovná se 2.4, dále je uveden určitý počet nul dle typu a poté následuje exponent, který nám říká, kam máme posunout desetinnou tečku (čárka má jinou funkci) při čtení tohoto čísla. Samozřejmě je tento tvar velmi nepohodlný, a proto Pascal nabízí jeho zkrácení. Při výpisu čísla v reálném tvaru se za proměnnou do závorek uvede dvakrát dvojtečka s hodnotou. První hodnota udává odsazení od posledního znaku na řádku, druhá hodnota počet desetinných míst, např.: write (’Vysledek je’,a:5:2), jestliže a:=2.4, vypíše se Vysledek je 2.40. První dvojtečku s hodnotou lze uplatnit i u celočíselných typů na odsazení výsledku, např.: write (’Obsah obdelniku je’,a:3), při hodnotě a:=24. Pro množinu reálných čísel nabízí Pascal tyto možné operace : a) aritmetické (součet, součin, rozdíl, podíl) b) relační (rovná se, je větší atd.), shodné jako u celočíselného typu Aritmetické operace neceločíselných typů umožňují: operace sčítání odčítání násobení dělení
operátor + * /
Jak bylo uvedeno výše, typickou chybou začátečníků je chybné přiřazení typu dané operaci. Typy se mezi sebou totiž nemůžou libovolně míchat. Lze převádět hodnoty typu celočíselného na neceločíselný, nikoli však v obráceném směru, to vede k vypsání hlášení o chybě. Můžeme tedy zapsat: var
x:real; y:integer; x:=y; x:=2; x:=4+1.2;
Převod hodnoty typu neceločíselné na celočíselnou nelze provést automaticky, nemůžeme tedy zapsat: var
x:real; y:integer; y:=x; y:=2,7; y:=4+1.2;
Pokud bychom chtěli přiřazovat neceločíselnou hodnotu k proměnné celočíselné, potom nám Pascal nabízí příkaz trunc a round. Trunc převede hodnotu reálného typu na celočíselnou tak, že odstraní desetinnou část, round zaokrouhlí reálné číslo na nejbližší celé číslo, tedy od 0,51 nahoru, např.: var
x:real; y,z:integer; x:=2,7; y:=round(x); z:=trunc(x);
dostaneme po převedení tohoto typu výsledek y=3, z=2. Na závěr kapitoly o datovém typu se lze zmínit ještě o práci s konstantou, která má v průběhu celého programu neměnnou hodnotu. Vedle použití proměnných, které se načítají z klávesnice nebo se získávají přiřazovacím příkazem, a jejichž hodnoty se mohou v průběhu programu libovolně měnit, je hodnota konstanty v průběhu programu stále stejná
a neměnná, a proto k této hodnotě nelze ani přiřazovat ani ji měnit načtením. Konstanty se přiřazují v deklarační části za klíčovým slovem const (konstanta), jež je umístěno nad deklarací proměnných. Za const se zapíše jméno veličiny či veličin, rovnítko a hodnota se středníkem. Se zřetelem na čísla uvedená za názvem veličiny se již nezapisuje datový typ, neboť kompilátor sám rozpozná dle hodnoty, jakého typu stálá veličina je. Konstanty uvedené v deklarační části se zapisují pod tímto tvarem: const název veličiny=konstanta;
kdy název veličiny pojmenování stálé hodnoty = oddělovací značka konstanta hodnota bez datového typu ukončená středníkem Pokud potřebujeme zavést více konstant, zapisujeme je pod sebe a oddělujeme středníkem takto: const min=10; max=50; pí=3.14;
Jména konstant již nemohou být použita jako názvy dalších proměnných. Využití konkrétní hodnoty v programu nabízí usnadnění při použití jedné hodnoty v programu vícekrát a dále konstanty zvyšují přehlednost zdrojového kódu. Význam tedy nabývají v rozsáhlejších programech. Použití stálé veličiny si můžeme uvést na úloze s rozdělením čísla od 0 do 99 na jednotky a desítky, jež je uvedena výše. const s=10; var k,l,v:integer; begin write(’Zadej hodnotu ’); read(k); v:=k div s; l:=k mod s; write(’desitek je ’,v,’ jednotek je ’,l ) end.
Podmíněný příkaz Abychom nepoužívali jen aritmetické operace, nabízí nám programovací jazyky možnost větvení programu s využitím relačních operací. K tomuto účelu slouží podmíněný příkaz, tj. podmínka, jež představuje činnost, která umožňuje postupovat v programu podmíněným směrem. Jestliže například budeme potřebovat, aby se program rozhodl mezi volbou a>b vypiš pravda nebo obráceně nepravda, můžeme použít podmínku if. Existují dva druhy zápisu podmínky if: a) neúplný b) úplný Neúplná podmínka má následující syntaktickou podobu: if
podmínka
then
příkaz
k vysvětlení můžeme použít český opis: jestliže platí podmínka, pak proveď příkaz
kdy if klíčové slovo podmínka je libovolná hodnota nebo výraz, který může nabývat hodnotu pravda nebo nepravda then klíčové slovo příkaz libovolný příkaz nebo jiná operace Neúplná podmínka, jak ji zobrazuje vývojová značka s větvením při splnění (+) či nesplnění (-) výrazu. U neúplné podmínky je potřeba si uvědomit,že pokud podmínka neplatí, program ji ignoruje a podmínku vůbec nevykoná!
příkaz
Jako ukázkový příklad si uvedeme úlohu, kdy se program musí rozhodnout mezi volbou nižší a vyšší hodnoty uvedené v úvodu o podmínce. Uživatel zadá do proměnné a a b libovolné hodnoty omezené typem. Úkolem algoritmu je rozpoznat, která z těchto proměnných má nižší hodnotu a vypsat ji na obrazovku. K řešení úlohy využijeme podmínku if a to hned dvakrát. Poprvé, když budeme zjišťovat,
zda není větší proměnná a a podruhé, když budeme zjišťovat, zda není větší proměnná b. Samotný zápis algoritmu podmínky pak může mít tuto podobu: writeln(’zadej prvni hodnotu: ’); readln(a); writeln(’zadej druhou hodnotu: ’); readln(b); if a>b then (’druha hodnota ’,b,’je mensí’); if a
Pokud potřebujeme zadat ne jeden, ale dva a více příkazů náležejících k podmínce, je nutné, abychom příkazy uzavřeli do klíčových slov begin a end se středníkem, např.: if
podmínka
then
begin příkaz 1; příkaz 2; . . příkaz n end;
Jednotlivé příkazy mezi begin a end je nutné ukončovat středníky. Složitější výrazy lze porovnávat s použitím logických operací. Ty zahrnují logickou negaci, která se v Pascalu označuje klíčovým slovem not, dále logický součin, jenž se označuje and, logický součet, kterému Pascal vymezuje klíčové slovo or, a nakonec logická operace výlučného součtu, kterému je vyhrazeno klíčové slovo xor. Při porovnávání logických výrazů je nutné jednotlivé dílčí výrazy uzavírat do kulatých závorek, aby nedocházelo při vyhodnocování k běhové chybě, např.: (a>0) and (a<6). Tato ukázka znázorňuje proměnnou a, která by měla nabývat hodnotu od jedné do pěti. Nevyhoví-li proměnná a podmínce, bude programem podmínka ignorována. Pokud bychom použili v příkladu logický součet, tedy (a>0) or (a<5), pak proměnná a může nabývat libovolné hodnoty omezené pouze typem. Pokud použijeme logickou operaci výlučného součtu např.: (a<=b) xor (a>=b), pak je podmínka pravdivá pouze tehdy, když si proměnné nejsou rovny. Klíčové slovo logické negace se umísťuje hned za vyhrazené slovo if např.: if not a>0, což znamená, že podmínka platí, jestliže proměnná a bude menší než jedna. Výrazy v podmínce, které jsou spojené operátory, můžeme různě kombinovat. Důležité je uvědomit si, že nejdříve se testují
výrazy s operátorem not, poté s operátorem and a nakonec výrazy spojené s operátory or a xor. Jestliže algoritmus vyžaduje použití více podmínek v programu, můžeme postup řešení zkrátit tím, že upřednostníme vnořenou podmínku, tj. podmínku v podmínce, např.: vyberte ze tří proměnných nejmenší zadanou. if i<j then if i
Příklady na procvičení: 1) Vypište, zda zadané číslo je kladné či záporné. Poté zkuste totéž, ale přidejte, je-li navíc i nulové. 2) Zadejte dvě čísla, která program na výstupu seřadí vzestupně. 3) Sestrojte program, který bude simulovat semafor, barvy nahraďte čísly (1- červená, 2 - oranžová, 3 - zelená) a po jejich vložení vypište, jak se má auto na křižovatce chovat. 5) Zjistěte, zda čísla zadaná na vstupu jsou dělitelná třemi a zároveň pěti. 6) Ze zadaných tří hodnot vypište maximální. Poté zkuste totéž s pěti proměnnými. 7) Po vložení čtyř proměnných, které zastupují známky ve škole, spočítejte jejich průměr a vypište, zda se jedná o vyznamenání, o prospěl či neprospěl. 8) Vytvořte program, který určí, zda je číslo sudé nebo liché. 9) Zhotovte program, který po zadání roku, měsíce a dne narození vypíše, kolik je dotyčnému let a zda má dnes narozeniny. 10) Navrhněte program, který z data narození zjistí, zda již máte volební právo.
Úplná podmínka má následující syntaktickou podobu: podmínka
if
then
příkaz 1
else
příkaz 2
k vysvětlení můžeme použít český opis: jestliže podmínka platí, pak proveď tento příkaz, jestliže podmínka neplatí, proveď následující příkaz
kdy if podmínka
then příkaz1 else příkaz2
klíčové slovo je libovolná hodnota nebo výraz, který může nabývat hodnotu pravda nebo nepravda klíčové slovo libovolný příkaz nebo jiná operace, který se provede, jestliže podmínka bude platit klíčové slovo libovolný příkaz nebo jiná operace, který se provede, jestliže podmínka nebude platit
Zde u úplné podmínky již platí, že program podmínku vykoná, i když podmínka neplatí, neboť za klíčovým slovem else zadáváme, co se má stát, pokud podmínka splněna není. I zde můžeme zadat více příkazů jak v první části podmínky, tak v druhé. Opět k tomu použijeme ohraničení begin a end.
if
podmínka
then
begin
else
příkaz 1; příkaz 2; . . příkaz n end begin příkaz 1; příkaz 2; . . příkaz n end;
Pozor, před ani za else se nedělá středník. V prvním případě kompilátor zobrazí chybu, v druhém se provedou obě podmínky dohromady. Úplná podmínka, kterou zobrazuje vývojová značka rozhodování (se splněním ’+’ nebo nesplněním ’-’). Na rozdíl od neúplné podmínky, kde při nesplnění předpokladu dojde v programu k přeskoční podmínky, se zde u úplné podmínky při nesplnění předpokladu vykoná příkaz 2, při splnění předpokladu vykoná příkaz 1.
příkaz 2 příkaz 1
Řada příkladů, které byly uvedeny u neúplné podmínky, jenž se řeší zdlouhavějším způsobem, lze vyřešit přes úplnou podmínku jednodušeji tím, že za vyhrazeným slovem else uvedeme příkaz, pro který jsme u neúplné podmínky museli vymýšlet podmínku novou. Dejme tomu úkol s vypsáním kladného a záporného čísla. U neúplné podmínky je nutné uvést podmínky dvě ve tvaru: if a>=0 then write (’hodnota je kladna’); if a<0 then write (’hodnota je zaporna’); zatím co u úplné podmínky nám stačí zadat: if a>=0 then write(’hodnota je kladna’) else write(’hodnota je zaporna’); a tím se nám program zjednodušuje a urychluje. Příklady na procvičení: 1) Sestrojte program na výpočet hmotnosti, který na základě indexu (výška/váha) určí, zda osoba má nadváhu, váhu optimální či podváhu. Hodnoty indexu pro nadváhu jsou pod 1,8, pro optimální váhu od 1,8 do 2,4 a pro podváhu nad 2,4.
2) Sestavte program, který zjistí, zda zadané číslo je v intervalu <0,50>. 3) Vytvoř program na zobrazení absolutní hodnoty čísla. 4) Navrhněte program na sečtení dvou libovolných hodnot ze tří, které načítáme na vstupu. Hodnoty těchto dvou sečtených proměnných však musí být v intervalu <0,5>. Pokud nebudou alespoň dvě z proměnných do tohoto intervalu náležet, program vypíše, že hodnoty jsou mimo rozsah. 5) Zhotovte program na sečtení dvou libovolných hodnot ze tří, které načítáme na vstupu. Hodnoty těchto dvou sečtených proměnných však musí být v intervalu <0,5>. Pokud nebudou alespoň dvě z proměnných do tohoto intervalu náležet, program se ukončí. Pokud hodnoty budou v rozsahu všechny tři, sečtou se ty nižší. 6) Vytvořte program na výpočet cen jízdného taxi, když víte že cena jízdného za jeden kilometr činí: do 19,9km ………. 27 Kč/km od 20 do 49,9 ……. 25 Kč/km od 50 do 99,9 ……. 23 Kč/km nad 100 ………….. 20 Kč/km 6) Vyřešte výpočet celkové tělesné hmotnosti BMI pro člověka. K sestavení výpočtu zadejte výšku v metrech a váhu v kilogramech a dosaďte je do vzorce výška/(váha)2.
Náhodný výběr Programy vytvořené pro uživatele nemusí nutně nabývat hodnot, jež určuje programátor nebo uživatel. Představitelem této funkce je příkaz random, generátor náhodných čísel. Příkaz se zavádí příkazem randomize, který příkaz random nastaví na počáteční hodnoty. Randomize nemá žádné jiné parametry a zadává se do samotného zdrojového kódu většinou za begin pouze se středníkem. Pokud by tento příkaz nebyl v programu uveden, nespustí se libovolný výběr hodnoty v programu a náhodná hodnota bude vždy nulová. Příkaz random můžeme buď přiřazovat k proměnným celočíselného typu, nebo je můžeme vypisovat přímo. Hodnota rozsahu náhodného čísla se uvádí za příkaz do závorek. Vždy jde o posloupnost čísel začínající nulou. Pokud bychom chtěli nulu vyřadit z výpisu libovolných čísel, stačí za mezní hodnotu přičíst jedničku např.: random(15)+1. Náhodná hodnota se načítá ze systémových hodin a maximální hodnota může být 65536. Příklad přiřazení x:=random(255), nebo výpisu write(random(15). Úkolem k procvičení je prográmek na hádání čísla. Počítač vygeneruje libovolné číslo od jedné do sta a úkolem uživatele je uhodnout tuto hodnotu na co nejméně pokusů. Při hádání je po zadání čísla napovězeno hráči, zda má volit následné číslo vyšší či nižší. Po uhodnutí program vypíše, jaké bylo myšlené číslo, a také počet pokusů, které uživatel potřeboval k vyřešení. Příklady na procvičení: 1) Sestrojte program, který vygeneruje náhodné číslo od jedné do deseti. 2) Vypište záporné číslo a zjistěte zda je liché nebo sudé. 3) Vygeneruj dvě náhodná čísla a vypiš je vzestupně. 4) Vytvořte program pro výpočet průměru z pěti náhodných čísel. 5) Ze tří náhodně vygenerovaných čísel vypiš vždy nejmenší.
Nový řádek u výstupu a vstupu Pokud potřebujeme, aby se nám vypisovaly příkazy pod sebou a ne vedle sebe, můžeme použít příkaz výstupu, který zapíše za obsah výpisu znak, jenž posune kurzor na nový řádek. Tento příkaz má název writeln, kde zkratka ln v příkazu značí line-řádek. Jedná se o shodný příkaz s write, nicméně po vykonání příkazu výstupu dojde k přesunu kurzoru na začátek nového řádku. Použijeme-li tedy následující příkaz výstupu write(’Zadej hodnotu ’) a vstupu read(a), bude výsledek po provedení příkazů mít vzhled Zadej hodnotu 5, zatímco pokud použijeme writeln ve stejném zadání, výsledek bude obsahovat text Zadej hodnotu na jednom řádku a následně program umístí kurzor na přiřazení hodnoty 5 na začátek dalšího řádku. Totéž platí, jestliže potřebujeme dejme tomu vynechat řádek ve výpisu, potom nám stačí zadat writeln bez parametrů. Stejný případ platí i pro příkaz vstupu, který má tvar readln a též přesouvá kurzor na nový řádek. Při použití tohoto příkazu v celém programu můžeme využít zapsání příkazu readln bez parametrů k načtení klávesy Enter. Dokud nedojde k jejímu stisku, program se nerozběhne. Nejvíce se využívá na konci programu před endem na zobrazení výsledku, abychom nemuseli přepínat mezi editorem a výstupní obrazovkou klávesovou zkratkou Alt+F5. Podmínkou funkčnosti čekání na stisk klávesy Enter u výstupní obrazovky je, aby v celém zdrojovém textu byl použit jen příkaz readln a žádný read. Využití obou příkazů na ukázce programu výpisu čísla s hodnotou x-krát větší. program násobení; var i,j:integer; begin writeln(’Zadej hodnotu’); readln(i); writeln(’Zadej nasobek’); readln(j); i:=i*j; writeln(’Vysledna hodnota je’,i) readln; end. Program bude vypisovat jednotlivé přiřazení z klávesnice na samostatné řádky a po výpisu výsledku počká, na stisk klávesy Enter.
Příkazy cyklů Příkazy cyklů opakují určité příkazy nebo posloupnosti příkazů pomocí dokola se opakujících smyček. Uskutečňují jednotlivé příkazy tak, jak jdou za sebou, od prvního k poslednímu, dokud nenarazí na podmínku, která na základě vyhodnocení cyklus buď ukončí nebo provede skok k novému vykonávání jednotlivých příkazů. V Pascalu máme tři druhy příkazů cyklů, z nichž první dva se liší především v tom, zda podmínka, má - li se smyčka opakovat nebo ukončit, je na začátku cyklu nebo na konci, a třetí, bez podmínky, je využíván, jestliže předem známe počet opakování cyklu: 1) cyklu repeat until - podmínka opakování je na konci s podmínkou 2) cyklus while do - podmínka opakování je na začátku 3) cyklus for to do - počet opakování je předem znám bez podmínky Nejjednodušší je cyklus první. Tento cyklus postupně vykonává příkaz po příkazu uvedených za klíčovým slovem repeat (opakuj), až po podmínku umístěnou za klíčovým slovem until (dokud). Pokud podmínka until na konci cyklu neplatí, vykoná se celý blok příkazů uvedených v těle cyklu za repeatem znovu, a to tak dlouho, dokud nebude podmínka splněna. U tohoto cyklu dochází vždy k průchodu opakováním alespoň jednou. Syntaktická a schematická podoba příkazu má následující tvar: repeat příkaz 1; příkaz 2 ; . . příkaz n ; until podmínka;
Za příkazem repeat se nemusí dělat středník. Jednotlivých příkazů v cyklu můžeme vložit neomezeně, ale za nimi se středník dělat musí, a pokud potřebujeme, můžeme použít i další vnořené cyklu v repeatu. Protože za until je podmínka, nelze u ní přiřazovat, pouze využít relační operátory, za kterými již cyklus končí a neobsahuje žádná další klíčová slova.
příkaz 1 příkaz 2 příkaz n
Vytvoříme - li však podmínku na konci opakování chybně, což se v počátku seznamování s cykly stává, dochází k zacyklení (dokola se prochází cyklem bez možnosti ukončení samotným programem), a tak nezbývá, než cyklus přerušit zastavením kombinací kláves Ctrl+Pause. Na obrazovce se objeví modrý pruh, který udává, na jakém místě byl program uživatelem přerušen. Opětovné spuštění po jakékoliv opravě bude vyžadovat potvrzení změny zdrojového textu, a jestliže program proběhne řádně a nebude již zapotřebí jej nestandardně ukončit, označení zmizí. Nejběžnější použití tohoto cyklu je v omezení zadávaných hodnot. Jestliže toto omezení budeme ošetřovat podmínkou, pouze se vypíše chyba v zadané hodnotě, ale program bude pokračovat dál. Využití tohoto cyklu zkusíme aplikovat na příkladu z podmínky výpočtu průměru čtyř známek ve škole. Při řešení zadání v podmínkách se mohlo stát, že uživatel, ačkoliv měl zadat známky v rozsahu <1..5>, schválně mohl zadat neodpovídající hodnoty. A z tohoto důvodu je nejlepším ošetřením proti takovémuto překlepu cyklus, který uživatele nepustí k řešení dílčích úloh algoritmu dál, dokud nezadá hodnoty správně. Část programu s tímto ošetřením pak bude vypadat následovně: repeat writeln(’Zadej hodnotu’); readln(i); if (i>5) or (i<1) then begin writeln(’Zadna hodnota ’,i,’ je chybna!’); writeln(’Zkus to znovu’) end; until (i<=5) and (i>=1); Po zadání příkazu opakování následuje příkaz výstupu a vstupu, kterým načteme hodnotu definovanou typem v deklarační části a dále neúplná podmínka pro zjišťování rozsahu zadaného čísla. Pokud číslo není v rozsahu <1..5>, podmínka platí a zobrazí se na monitoru výstup „Zadaná hodnota je chybná!“ a „Zkus to znovu“, pokud hodnota do intervalu patří, podmínka se vůbec nevykoná. Poté následuje ukončení cyklu klíčovým slovem until s podmínkou, která opět vyhodnocuje výraz porovnáváním. Pokud podmínka opakování za untilem platí, smyčka se ukončí a program pokračuje dalšími příkazy, jestliže
neplatí, cyklus se opakuje znovu od výstupu, a to tak dlouho, dokud není podmínka splněna. Další novou částí cyklů bez předem daného počtu opakování je počítadlo, které nám zaznamenává množství průchodu smyčkou. Jako příklad lze uvést výpis slov „ Ahoj světe. “ třeba pětkrát: p:=0; repeat writeln(’Ahoj svete!’); p:=p+1; until p=5; Prvním průchodem, který se provede vždy u tohoto cyklu, jak jsme si uvedli výše, nabude proměnná p hodnotu o jednu větší, a tedy se bude rovnat jedné. Na začátku každého spuštění programu se všechny proměnné v Pascalu vždy v paměti vynulují, ale i tak může dojít k chybě, a proto bychom měli na začátku programu nulovat všechny proměnné sami přiřazením nuly k proměnným. Poté následuje podmínka a porovnání hodnot. Protože průchod cyklem byl proveden poprvé a proměnná p nabyla hodnotu jedna, podmínka opakování splněna není a smyčka se bude provádět znovu. Druhý průchod přiřadí proměnné p hodnotu dva a podmínka opakování splněná opět nebude. Totéž se bude dít i v třetím a čtvrtém opakování. Při pátém průchodu cyklem proměnná p již získá počet pět a podmínka opakování bude vyhodnocena jako pravdivá a smyčka se ukončí. Protože ukončení cyklu repeat na předem daný počet opakování je příliš zdlouhavé a nevýhodné (pohodlnější je využít příkaz cyklu for, který si rozebereme na konci kapitoly), ukážeme si jiné praktičtější použití cyklu, kdy předem neznáme počet opakování. Jedná se kupříkladu o vkládání hodnot, a opět budeme aplikovat vzor se zadáváním prospěchu ve škole, jestliže chceme zjistit průměr ze zadaných známek z maturitních předmětů. Na základě výpočtu pak zobrazíme výsledek. Zadávání známek budeme končit stiskem hodnoty nula. repeat p:=p+1; writeln(’Zadej známku’); readln(i); k:=k+i; until i=0; prum:=k/(p-1); writeln(prum);
Zdrojový text nám zobrazuje počítadlo, které zaznamenává počet opakování cyklu, dále výstupní a vstupní příkaz a na dalším řádku zpracování součtu zadaných hodnot vstupu, které známe již z podmínky. Poté následuje podmínka opakování vyhodnocující vstupní číslo, které ukončí opakování smyčky při načtení hodnoty nula. Jestliže je podmínka opakování splněna, program přistoupí k zpracování výpočtu průměrné známky. Zde je potřeba si uvědomit, že se k proměnné p přičte i poslední průchod smyčkou při zadání závěrečného vstupu, který je nutný ve výpočtu odečíst, aby nedošlo ke zkreslení výpočtu. Celá úloha se dá zkomplikovat omezením na ošetření zadaných hodnot. Druhý cyklus while řeší opakování stejným způsobem jako repeat a příkazy jsou si rovnocenné. Nicméně při použití cyklu while je podmínka opakování na začátku a pokud program podmínku nesplňuje, nevykoná se a neproběhne ani jednou. U tohoto cyklu tedy nedojde při nesplnění podmínky k vnoření do těla cyklu, a proto je někdy výhodnější používat právě tento druh opakování. Cykly jsou si nicméně rovny a co lze vykonat cyklem repeat, lze provést i cyklem while a naopak. Tvar zápisu cyklu while: while
podmínka
do
příkaz;
kde následující části syntaktického tvaru znamenají while podmínka do příkaz
klíčové slovo je libovolná hodnota nebo výraz, který může nabývat hodnotu pravda nebo nepravda klíčové slovo libovolný příkaz nebo jiná operace
Pokud potřebujeme zapsat více příkazů do cyklu, musíme zadat za příkaz do klíčové slovo begin, které nám dovolí vložit více příkazů do těla cyklu a posloupnost těchto příkazů ukončíme klíčovým slovem end se středníkem. Poté bude syntaktický a schematický zápis vypadat následovně:
while podmínka do begin příkaz 1; příkaz 2; . . příkaz n end;
Výhoda oproti cyklu repeat je v tom, že pokud potřebujeme ošetřit omezení při zadávání určitých hodnot, je jednodušší použít cyklus while, nicméně mezi začátečníky není tento cyklus moc oblíben:
příkaz 1 příkaz 2 příkaz n
writeln (’Zadej hodnotu od 1 do 5 ’); readln (i); while (i<1)or(i>5) do begin writeln(’chyba, zadej znovu’); readln(i) end; V uvedeném příkladu nejdříve načteme proměnnou i, která se vyhodnotí v podmínce. Neodpovídá - li hodnota podmínce, pokračuje se za cyklem dalšími příkazy, tzn., proměnná má hodnotu 1 až 5, odpovídá li proměnná podmínce, následuje vstup do smyčky a nejdříve se vypíše hlášení „chyba“ a poté bude cyklus čekat na nové zadání vstupu pro proměnnou i. V případě, že bude proměnná opět vyhovovat podmínce, doje opětovně k vypsaní chybového zadání a čekání na načtení nového vstupu a to tak dlouho, dokud podmínka nepřestane platit. Příklady na procvičení: 1) Sestrojte program na výpis hodnot, které jsou jen kladné. Zadávání končete nulou a u výsledku dále zobrazte i celkový počet zadaných vstupů.
2) Sestavte program na součet sudých a lichých hodnot zadaných ve vstupu, konec zadávání proveďte opět nulou. 3) Vymyslete prográmek na součin dvou hodnot tak, aby v prográmku nebylo uvedeno znaménko krát. 4) Použijte zadání předchozí otázky, v řešení se mohou objevit ale jen dvě proměnné. 5) Navrhněte program na uspořádání pěti zadaných čísel ze vstupu tak, aby se na výstupu seřadila vzestupně. 6) Zhotovte program na vypsání druhého nejvyššího čísla z hodnot zadaných na vstupu a zakončených nulou. 7) Všechny uvedené příklady řešte jak pomocí cyklu repeat, tak i pomocí cyklu while.
Poslední z trojice cyklů je opakování bez podmínky, kdy je předem dán počet průchodů smyčkou. Jedná se o cyklus for, který v řadě případů nahrazuje dva výše uvedené cykly, neboť efektivněji a přehledněji dosahuje požadovaného výsledku. Cyklus má dva tvary: a) vzestupný b) sestupný Tvar zápisu vzestupného cyklu for má tuto podobu: for proměnná:=min hodnota to max hodnota
do příkaz;
kdy for proměnná min hodnota to max hodnota do příkaz
klíčové slovo jakákoliv proměnná typu integer celé číslo, proměnná i výraz udávající počáteční hodnotu smyčky klíčové slovo celé číslo, proměnná i výraz udávající konečnou hodnotu smyčky klíčové slovo libovolný příkaz nebo jiná operace
Pro snazší pochopení uvedené formy zápisu jej můžeme vyložit následujícím způsobem: Pro proměnnou, která má např. nulovou počáteční hodnotu, přičítej po průchodu smyčkou vždy hodnotu o jednu větší až ke konečné hodnotě a při tom proveď uvedený příkaz.
A opět, pokud potřebujeme zadat více příkazů náležejících ke smyčce, vypomůžeme si uzavřením dané posloupnosti příkazů mezi klíčová slova begin a end se středníkem, např.: for proměnná:=min hodnota to max hodnota do begin příkaz 1; příkaz 2; . . příkaz n end;
Jako příklad si můžeme uvést vypsání hodnot od jedné do deseti. Ukázka slouží i jako porovnání mezi cyklem for a repeat (while). Uvedený vzor lze naprogramovat všemi třemi cykly, nicméně tímto způsobem dojdeme k nejpohodlnějšímu řešení: for i:=1 to 10 do writeln(i). Místo konstant můžeme použít i proměnné: for i:=min to max do writeln(i) Syntaxe sestupného cyklu má tuto formu: for proměnná:=max hodnota
downto min hodnota do příkaz;
kdy for proměnná max hodnota downto min hodnota do příkaz
klíčové slovo jakákoliv proměnná typu integer celé číslo či proměnná udávající horní hodnotu smyčky klíčové slovo celé číslo či proměnná udávající spodní hodnotu smyčky klíčové slovo libovolný příkaz nebo jiná operace
Opětně pro snazší pochopení uvedeného zápisu jej můžeme objasnit takto: Pro proměnnou, která má horní hodnotu opakování po průchodu smyčkou odečítej hodnotu o jednu až po nejnižší zadanou hodnotu a pokaždé přitom proveď příkaz.
I zde platí, že jestliže potřebujeme zadat sekvenci příkazů do smyčky, využijeme klíčová slova begin a end se středníkem. Pro algoritmické znázornění sestupného cyklu se využívá tato vývojová značka (u vzestupného se jen prohodí min a max):
proměnná:=max,min
příkaz 1
příkaz 2
příkaz n
Příklady na procvičení: 1) Napište program pro vypsání hodnot od šesti do deseti, aniž byste ve zdrojovém kódu tato čísla použili. 2) Pomocí cyklu for načti pět hodnot, sečti je a vypočítej z nich průměr. 3) Vymyslete program na vypsání malé násobilky po zadání hodnoty od nuly do deseti. 4) Proveďte totéž, ale výpis rozdělte do dvou sloupců..
Datový typ char V kapitole o číselném datovém typu jsem si uvedli čtyři základní datové typy. Mezi nimi byl i typ char (charakter - znak) pro práci se znaky. Jako jiné typy se zavádí v deklarační části za jménem názvu proměnné. Jestliže však chceme přiřadit k dané proměnné znak, musíme jej zadat do apostrofů, např.: var znak:char; begin znak:=‘a‘;
Při zápisu znaku do datového typu char rozlišujeme velké i malé znaky. Pakliže bychom zapsali do proměnné znak, číslo, znak:=’1’, kompilátor jej nebude překládat jako číslo, ale znak. Pokud by však nebyly uvedeny apostrofy u daného znaku, překladač by ohlásil chybu typu. Při zadání většího počtu znaků si proměnná uchová pouze první zadaný znak. Při načítání znaků je možné využít všechny znaky ASCII kódu (American Standard Code for Information Intecharge - znaky využívané počítačem). Příklad použití typu char je kupříkladu u ukončení cyklu na stisknutí požadované klávesy u úlohy uvedené výše, kde musíme použít nulu a posléze ji odečíst. V tomto případě nikoliv: repeat p:=p+1; writeln(’Zadej známku’); readln(i); k:=k+i; writeln(’Chces zadavat dal? Ne stiskni n.’); readln(z); until z=’n ’; prum:=k/p; writeln(prum); Dále nám tento typ nabízí dvě funkce: a) ord převede znak na číslo write(ord(’\’)), vypíše číslo 92 b) chr převede číslo na znak write(chr(92)), vypíše znak zpětné lomítko
Protože využití ASCII kódu v programování je užitečné, je velmi jednoduché si pomocí cyklu for nechat vypsat všechny znaky tak, jak po sobě v této tabulce následují. for i:=1 to 255 do write(i, ’) ’,chr(i), ’; ’); Příklady na procvičení: 1) Sestav prográmek na výpis iniciál ze jména. Uživatel zadá celé své jméno a program je převede na počáteční písmena a vypíše. 2) Napište program, který dle prvního písmene ročního období vypíše celý jeho název. Ostatní písmena ošetři. 3) Nechť uživatel zvolí znak, pomocí kterého se bude vykreslovat plný čtverec (4*4), složený ze zvoleného znaku. 4) Navrhni program na výpis trojúhelníku ze znaku, který zvolí na začátku programu uživatel, poté zvolí ještě výšku (počet znaků od jedné do pěti) a trojúhelník vykresli. 5) Sestavte program, který bude převádět malé písmeno na velké a obráceně, dokud uživatel nezadá nulu. 6) Vytvoř program heslo, kdy počítač si myslí určité čtyřmístné slovo, které je uživateli předem známo. Pokud jej však uživatel nezadá ani na třetí pokus správně, systém vypíše chybu a ukončí se. Pokud je heslo zadáno správně na některý ze tří pokusů, program uživatele pochválí a také se skončí. 7) Zhotov program na hádání slova, kdy počítač má nadefinované určité slovo a uživatel se je pokouší uhodnout.
Mnohonásobné větvení U mnohonásobného větvení se jedná opětovně o podmínku nyní tvořenou příkazem case, který může mít opět dva druhy zápisu: a) neúplný - pokud podmínka není splněna, příkaz se neprovede b) úplný - příkaz se provede vždy Syntaxi neúplné podmínky case znázorňujeme takto: case proměnná of konstanta 1:příkaz 1; konstanta 2:příkaz 2; . . konstanta n:příkaz n end;
kde case proměnná of konstanta : příkaz
end
klíčové slovo jméno proměnné, které může být typu integer a char klíčové slovo pravděpodobná hodnota z množiny proměnné oddělující značka vymezující možnou hodnotu od příkazu povel, který se vykoná, jestliže odpovídá konstanta proměnné, za každým příkazem je středník zakončení podmínky case se středníkem
Podoba schematického znázornění neúplného příkazu case je následující:
příkaz 1
příkaz 2
příkaz n
Řešení rozsáhlejších úloh pomocí podmínky if je zdlouhavé a značně nepřehledné. Proto se ke snadnějšímu postupu využívá příkaz case. Při použití povelu case se nejdříve zvolí typ proměnné, kterou může proměnná získat a nadefinuje se v deklarační části. Poté se daná proměnná načte a podmínka projde sledem všech množin konstant obsažených v levé části větvení za klíčovým slovem of. Pokud žádná ze stálých veličin uvedených před dvojtečkou v podmínce neodpovídá proměnné, podmínka je vyhodnocena jako neplatná a neprovede se. Jestliže dojde ke shodnosti konstanty s proměnnou, vykoná se příkaz uvedený za danou veličinou. V případě, že potřebujeme použít větší počet příkazů za konstantou, můžeme je uzavřít mezi begin a end. Jako příklad si můžeme uvést úkol pro výpočet základních matematických operací – kalkulačka, kdy si nejdříve zadáme první a druhou hodnotu a jako poslední, zda hodnoty budeme sčítat odčítat násobit nebo dělit: var a,b:integer; z:char; begin writeln(’Zadej první hodnotu’); readln(a); writeln(’Zadej druhou hodnotu’); readln(b); writeln(’Zadej početní operaci’); readln(z); case z of ’+’:write(a+b); ’-’:write(a-b); ’*’:write(a*b); ’/’:write(a/b:0:2) end; readln; end. Jako konstanta nemusí být uvedena jen jedna stálá veličina, ale může být použit i určitý rozsah, který se zadává dvěma tečkami mezi mezními hodnotami. K zavedení typu integer se mezní hodnoty neuvozují do apostrofů 1800..1899:write(’19. století’), s apostrofy se používají u typu char ’a’..’z’:write(’pismeno’).
Pro názornost - forma zápisu s více příkazy za konstantou ’5’..’9’: begin writeln(’chyba’); z:=z-1; end; U úplné podmínky příkazu case platí stejné pravidlo jako u podmínky if. Pokud podmínka platí, vykoná se příkaz za odpovídající konstantou. V případě, že není splněna ani jedna z možných konstant, provede se příkaz popřípadě příkazy, pokud je uzavřeme mezi begin a end za klíčovým slovem else. Syntaktická forma zápisu úplného příkazu case má tvar: case proměnná of konstanta 1:příkaz 1; konstanta 2:příkaz 2; . . konstanta n:příkaz n else konstanta :příkaz end;
kde case proměnná of konstanta : příkaz
else příkaz
end
klíčové slovo jméno proměnné, které může být typu integer a char klíčové slovo pravděpodobná hodnota z množiny proměnné oddělující značka vymezující možnou hodnotu od příkazu povel, který se vykoná, jestliže odpovídá konstanta proměnné, za každým příkazem je středník klíčové slovo povel, který se vykoná, jestliže neodpovídá konstanta proměnné v žádné možnosti, může být bez středníku zakončení podmínky case se středníkem
Schematický nákres úplného příkazu case:
příkaz 1
příkaz 2
příkaz n
příkaz
Ukázkou na řešení úplné podmínky case je příklad na výpočet hmotnosti. Uživatel zadává výšku a váhu a na základě těchto dvou veličin mu program sdělí, zda má váhu v normě či zda má nadváhu nebo podváhu. Výpočet koeficientu se provádí dělením výšky a váhy. Údaje jsou v metrech a kilogramech. var vyska,vaha,orez,hod1,hod2:integer; deshod:real; begin writeln(’zadej svoji vysku v metrech: ’); readln(vyska); writeln(’zadej svoji vahu: ’); readln(vaha); deshod:= vyska/vaha; orez:=trunc(deshod*10); hod1:=orez div 10; hod2:=orez mod 10; case hod1 of 1: write(’nadvaha’); 2:case hod2 of 0..5:writeln(’norma ’); 6..9:writeln(’podvaha’); end; 3: writeln(’podvaha’)else writeln(’je mi lito chybne zadano’); end; end.
Datový typ string Tento datový typ byl vytvořen jako nástavba datového tytu char. Jedná se o znakový datový typ, jenž může obsahovat více znaků najednou. Maximální počet znaků, které můžeme do tohoto typu zadat, je 255. Zavádí se v deklarační části za jménem proměnné, kde můžeme omezit velikost obsahu zadávaného řetězce a to připsáním hodnoty za typ, nebo bez hodnoty délky řetězce s maximální velikostí. Syntaxe zápisu typu string v deklarační části má následující tvar: var
proměnná:string[délka řetězce]
kde proměnná string [dékla řetězce]
představuje jméno proměnné klíčové slovo udává se celým číslem v hranatých závorkách např. s[5], je to nepovinný údaj
Typ string tedy umožňuje proměnné přiřadit posloupnost znaků zapsanou v apostrofech. Jestliže zadáme do proměnné typu string delší posloupnost znaků, než je uvedeno v deklarační části, budou zbývající znaky smazány. Pokud přiřazujeme k proměnné, může mít zápis přiřazení podobu jazyk:=’Pascal’. Protože se jedná o znakový datový typ, musí být přiřazené znaky uvozeny v apostrofech, stejně jako u typu char. Jednotlivé pozice v řetězci jsou číslovány od první až po poslední vymezenou v deklarační části. Pozor, i zde rozlišujeme velké a malé znaky při zápisu. Takže z výše uvedeného příkladu přiřazení vyplývá: Pozice 1. 2. 3. 4. 5. 6.
znak ‘P‘ ‘a‘ ‘s‘ ‘c‘ ‘a‘ ‘l‘
Nultá pozice zastupuje počet obsazených znaků v řetězci. Představuje ji funkce Length, která vrací aktuální hodnotu délky řetězce. Syntaxe zápisu má pak tvar: write(Length(název řetězce))
např.: write(Length(jazyk)), vypíše na výstupní obrazovce hodnotu 6, neboť slovo Pascal má šest znaků. Pokud potřebujeme s aktuální délkou řetězce dále pracovat, máme možnost ji přiřadit k celočíselné proměnné, např.: délka:=Length(jazyk), nebo ji můžeme přímo vypsat. Jestliže potřebujeme vypsat celý řetězec, použijeme příkaz: write(jméno proměnné řetězce)
V případě, že požadujeme vypsat znak na určité pozici z požadovaného řetězce, umístíme hodnotu s pozicí do hranatých závorek:
write( proměnná řetězce[hodnota pozice])
Příklad vypsání celého řetězce: write(jazyk), vypíše celou proměnou, v našem případě slovo Pascal. Ukázka vypsání určitých write (jazyk[1],jazyk[2],jazyk[1], znaků v řetězci: jazyk[5]) vypíše na výstupní obrazovku znaky PaPa. Obdobným způsobem jak jsme zvyklí z příkazu read přiřazujeme znaky z klávesnice na jednotlivé pozice, např.: read (jazyk[1], jazyk[5]), nebo celý text najednou read (jazyk). V první ukázce zapíšeme z klávesnice pouze na pozici jedna a pět, v druhé zapisujeme postupně od první po konečnou pozici danou deklarační částí. S jednotlivými pozicemi v řetězci můžeme pracovat stejně jako se samotnými proměnnými, např: if jazyk[1]= ’P’ then …
Ukázkou řešení datového typu string bude příklad na zjištění kladné či záporné odpovědi na určitou otázku. var otazka:string; begin writeln(’Je pondeli, zadej ano ci ne’: ’); readln(otazka); if (otazka=’ANO ’)or (otazka=’ano ’)then writeln(’kladna odpoved: ’) else if (otazka=’NE ’)or (otazka=’ne ’)then writeln(’zaporna odpoved: ’)else writeln(’chybna odpoved: ’); readln; end. Pokud potřebujeme dva datové typy string vložíme mezi jejich proměnné symbol +, např..
spojit dohromady,
var s1,s2,s3:string; begin s1:=’auto’; s2:=’mechanik’; s3:=s1+s2; write(s3); Při výpisu bude proměnná s3 obsahovat řetězec‚’automechanik’. Další funkce proměnných typu string: Concat má stejnou funkci jako operátor plus, spojí dva a více řetězců dohromady s3:=concat(’auto’,’mechanik’). Copy
zkopíruje určitý počet znaků řetězce od dané pozice se zadanou délkou s:= copy(s3, 5, 8), vypíše do proměnné typu string textový řetězec z proměnné s3, takže pokud byl v proměnné s3 text automechanik, bude v proměnné s mechanik. Kopíruje od páté pozice osm znaků.
Delete smaže určitou část řetězce od zadané pozice s danou délkou s:= copy(s3, 5, 8). Jestliže použijeme stejný text jako v předešlé funkci, bude z proměnné s po vykonání příkazu smazán text mechanik. Insert
vloží nadefinovaný řetězec do proměnné typu string od určité pozice insert(’mechanik’,s,5). Pokud bude v proměnné s nadefinovaný text auto, výše uvedeným příkladem umístíme od posledního znaku v proměnné text mechanik a výsledek poté bude obsahovat řetězec automechanik.
Pos
porovnává pozice v určitém řetězci s určitou hodnotou. Např. pokud bude k proměnné přiřazen řetězec s:=’auto’, můžeme například jeho druhou pozici porovnat v podmínce if pos(’u’,s)=2 then, nebo v přiřazení a:= pos(’u’,s)
Příklady na procvičení: 1) Najděte v uživatelem nadefinovaném řetězci velké písmeno A. 2) Vypište počet malých a v řetězci nadefinovaném uživatelem. 3) Napište počet všech předložek v uživatelem napsaném textu. 4) Určete počet vět na základě tečky ve větě, z textu zadaného uživatelem. 5) Proveďte totéž, ale ošetřete i velké počáteční písmeno a mezeru za tečkou. 6) Procházejte celý řetězec nadefinovaný uživatelem a zjistěte počet znaků v řetězci. Napodobení funkce length. 7) Převeďte číslo z dvojkové soustavy do desítkové .
Převod mezi typem znakovým a celočíselným Pascal nám umožňuje převádět číselné znaky na čísla. K převodu mezi typy slouží procedura val. Ta pracuje jak s celými tak reálnými čísly a zároveň, jak s typem string tak s typem char. U této procedury se musí v deklarační části nastavit tři proměnné (jedna znaková, jedna číselná a jedna celočíselná). val( znak, číslo, kladné celé číslo)
Proměnná typu string (char), nese číselné znaky, 1. číselná proměnná přebírá znaková čísla a přiřazuje je jako hodnoty a 2. proměnná typu integer zaznamenává pozici chyby. Převod může mít následující postup: Jestliže zadáme do proměnné typu string znaky:=’-45’ a chceme je převést na celočíselnou hodnotu cisla, převod zapíšeme následujícím způsobem val (znaky, cisla, chyba). Poté bude přiřazena proměnné cisla hodnota -45 a proměnná chyba bude obsahovat 0, protože převod proběhl bez chyb. Při převodu znaky:=’4,5 ’ bude proměnná cisla obsahovat 0 a proměnná chyba 2. Je to způsobeno chybou na druhé pozici, kde není číselný znak, ale znak ,, jež se nedá převést, protože Pascal pracuje s desetinnou tečkou a ne čárkou. Opačný postup, tedy převod celočíselného typu na znak v Pascalu, zajišťuje funkce str: str(číslo[:odsazení:počet desetinných míst],string)
Proměnná číselného typu nese určitou hodnotu, která se zapisuje po provedení procedury str do proměnné typu string, nelze použít u typu char. Pokud potřebujeme převést desetinné číslo použijeme dvě za sebou jdoucí dvojtečky, kdy první určuje odsazení od posledního znaku, druhá počet desetinných míst za desetinou tečkou. Tuto druhou dvojtečku nelze použít při převodu celých čísel. Ukázka převodu z čísla na znak, kdy proměnná čísla nese hodnotu -4.5 a chceme ji převést do textové podoby, může mít tvar str(cisla:0:1,znaky). Po provedení této procedury získá proměnná znaky na 1. pozici znaménko pomlčka, na 2. pozici znak čtyři na 3. pozici znak tečky a na 4. pozici znak pětky.
Jednotky Jednotka je soubor krátkých prográmků napsaných ve zdrojovém kódu Pascalu. Obsahují vlastní proměnné, typy a samotné zdrojové kódy, sloužící pro usnadnění práce při vytváření programů s danou jednotkou. Jsou uloženy v souboru turbo.tpl a chovají se jako samostatný program. Jednotky se zavádí v deklarační části nad klíčovým slovem var a const a uvozují se klíčovým slovem uses. Za ním následuje název jednotky. Pascal zahrnuje devět základních jednotek: a) CRT b) DOS c) GRAPH d) GRAPH3 e) OVERALY f) PRINTER g) SYSTÉM h) TURBO3 i) WINDOS
- obsahuje nástroje pro lepší práci v textovém režimu - umožňuje komunikaci s operačním systémem MS-DOS - zprostředkovává práci v grafickém režimu - zavádí činnost v grafickém módu pro Turbo Pascal 3.0. - dovoluje zvětšit zdrojový kód nad velikost 65kB - usnadňuje komunikaci s tiskárnou - základní jednotka, není nutné ji zavádět. Je použita ve všech programech. - zprostředkovává zpětnou kompatibilitu s Turbo Pascalem 3.0. - zahrnuje podobné funkce jak jednotka DOS s výkonnějšími operacemi
Jednotka CRT Jednotka CRT obsahuje nástroje pro lepší práci s výstupní uživatelskou obrazovkou a skládá se z několika procedur a funkcí. Tyto funkce dovolují rozšíření základních operací o barvy, zvuky, a jiné výstupní efekty. Výstupní obrazovka programu má dva základní režimy zobrazení, jež záleží na nastavení systému. Je to 24 a 50řádkový režim. Pod operačním systémem Windows 9x je standardně nastaven 24řádkový režim, pod operačním systémem Windows 2000 a Windows XP režim 50řádkový. Změna režimu se nastavuje přes proceduru textmode, která bude popsána níže.
Pro lepší pochopení některých procedur, se kterými pracuje jednotka CRT, je třeba znát rozvržení výstupní obrazovky. Ta se skládá z x-ové a y-ové osy. X-ová osa představuje počet bodů na řádku a y-ová osa zahrnuje počet bodů ve sloupci. Při zadávání souřadnic se nejdříve uvádí osa x a poté y, oddělená čárkou. Pro snazší představu o rozměrech uživatelské plochy slouží její popis: y-ová osa
x-ová osa
1,1
39,25
79,49
Při 50řádkovém režimu nám bílý bod vpravo dole na uživatelské textové ploše znázorňuje pozici kurzoru 80,49, kdy číslo 80 značí počet znaků na řádek a číslo 49 počet řádků na obrazovce. Souřadnice 1,1 je vždy umístěna vlevo nahoře. Funkce a procedury jednotky CRT: a) clrscr
- smaže obrazovku a umístí kurzor na začátek řádku na souřadnici 1,1
b) textcolor
- nastaví barvu textu od 0 do 15 dle tabulky přiřazující daným číslům barvu. Např.: textcolor (14) nastaví barvu písma na žlutou. Při zadávání hodnoty můžeme použít jak číslo udávající požadovanou barvu tak i samotný anglický název barvy, např.: textcolor(red). Pokud má písmo blikat, přidá se za název barvy buď + 128, nebo text blink.
číslo
Barva
překlad
číslo
barva
překlad
0 1 2 3 4 5 6 7
Black Blue Green cyan red magenta brown lightgray
černá modrá zelená azurová červená fialová hnědá světle šedá
8 9 10 11 12 13 14 15
darkgray lightblue lightgreen lightcyan lightred lightmagenta yellow white
tmavě šedá světle modrá světle zelená světle azurová světle červená světle fialová žlutá bílá
c) textbackground
- nastaví barvu pozadí od 0 do 7, např.: extbackground(1)nastaví barvu pozadí na modrou. I zde můžeme použít jak číselné označení jména barvy tak její anglické jméno. Barvy odpovídají prvnímu sloupečku v tabulce. Pokud chceme mít zbarvenou celou plochu pozadí, zapíšeme pod textbackground(hodnota) příkaz clrscr.
d) delay
- pozastavuje běh programu na danou časovou jednotku. Hodnota jednotky se udává v milisekundách ( 1s=cca1000ms), pokud tedy chceme zadat prodlevu programu na jednu vteřinu, zapíšeme delay(1000). Tato hodnota platí pro počítače s nižším taktem procesoru. Se vzrůstajícím taktem se prodleva zkracuje.
e) sound
- zapne PC speaker na určité zvukové frekvenci. Hodnota uvedená za příkazem v závorce udává kmitočet v Hz, např.: sound(500). Slyšitelný rozsah pro zdravé lidské ucho je mezi 0-15000.
f) nosound
- vypne PC speaker (nutno zapsat pro ukončení zvuku), pokud spustíte program bez nosound, nemá žádný parametr, zvuk se nevypne a je nutné opustit prostředí DOSu.
g) gotoxy
- nastaví pozici kurzoru na zadané souřadnice. Např.: gotoxy(20,5) umístí kurzor dvacet bodů od začátku pátého řádku. Pro bezchybný zápis procedury gotoxy(x,y)nemusíme tak jako u všech výše uvedených procedur do závorky zadávat hodnoty typu integer, ale můžeme je nahradit i proměnnými.
h)wherex
- vrátí aktuální x-ovou souřadnici polohy kurzoru, v celočíselné podobě i:=wherex, např.: nebo gotoxy(wherex,20).
i)wherey
- totéž co funkce wherex vrací aktuální y-ovou souřadnici polohy kurzoru, v celočíselné podobě, např.: i:=wherey, nebo gotoxy(wherex,wherey).
j) window
- stávající okno obrazovky bude nahrazeno oknem novým se zadanými souřadnicemi. Souřadnice v okně jsou relativní a odpovídají souřadnicím nového okna. Syntaxe procedury: window (x1,y1,x2,y2), kde x1 a y1 reprezentují hodnoty levého horního rohu okna a x2 a y2 zastupují hodnoty pravého dolního rohu nového okna. Pokud tedy zadáme např.: window (25,11,55,14), vytvoříme nové okno uprostřed
obrazovky, které má velikost x-ové souřadnice 30 bodů na řádek a y-ová souřadnice má 3 body na sloupec. Od chvíle nastavení nového okna se nelze vrátit do okna původního a program používá souřadnice nastaveného okna. Návrat do předešlého okna nelze provést jinak než, znovunastavením nového okna. Pokud bychom chtěli, aby bylo okno ihned viditelné na obrazovce, musíme mu nastavit jinou barvu pozadí a vymazat obrazovku. k) keypressed
- funkce, která zjišťuje, byla-li stisknuta jakákoli klávesa na klávesnici. Využívá se kupříkladu k ukončení repeat cyklu until keypressed, který bude opakovat smyčku, dokud nestiskneme nějakou klávesu.
l) readkey
- funkce načte do paměti jeden znak z klávesnice. Znak se po stisku klávesy neobjeví na obrazovce. Pokud potřebujeme danou hodnotou zpracovat, můžeme ji například přiřadit do proměnné charového typu: i:=readkey.
m) textmode
- slouží pro nastavení režimu zobrazení. Pod OS Windows 9x se standardně nastavuje režim zobrazení 80 znaků na řádek a 25 znaků na sloupec. Pokud toto zobrazení potřebujeme přednastavit na režim s menším počtem řádků či sloupců, můžeme vycházet z následující tabulky.
syntaxe textmode(co40) textmode(co80) textmode(co40+font8x8) textmode(co40+font8x8)
řádků 40 80 40 80
sloupců 25 25 50 50
Jako vzorový příklad pro práci s textovou uživatelskou plochou uvádím ukázku barevného textu na barevném pozadí umístěném uprostřed zobrazovací plochy pod OS Windows 9x. uses crt; begin textbackground(1); clrscr; gotoxy(30,12); textcolor(14); writeln(’Konecne vidim barevne a pipam’); sound(300); delay(200); nosound end. Než přejdeme k dalším příkladům vysvětleme si ještě jedno zadání společně. Jedná se o příklad s pohybem kurzoru, který má reagovat na stisk určité klávesy. Pokud chceme například posouvat znak „ * “ po obrazovce doleva a doprava, využíváme princip přepisování znaku s barvou pozadí. Nejdříve si nastavíme barvu pozadí a vyčistíme obrazovku. Poté nastavíme barvu textu a umístíme kurzor se znakem na souřadnice uprostřed obrazovky (40,12). uses crt; var o:char; begin textbackground(1); clrscr; textcolor(14); gotoxy(40,12); write(’*’);
Dále nadefinujeme smyčku repeat, ve které využijeme další z řady procedur jednotky CRT a vložíme funkci readkey na načtení určité klávesy z klávesnice. Pro výběr pohybu kurzoru doprava si zvolíme klávesu p,pro pohyb kurzoru doleva klávesu l a pro ukončení cyklu klávesu k. Tuto volbu ošetřujeme podmínkou, v níž přiřazujeme nějaké proměnné buď klávesu vpravo či vlevo. Za podmínkou následuje posloupnost příkazů s již zmiňovaným trikem používání barvy pozadí. Nejdříve si tedy navolíme barvu pozadí, poté předposlední pozici kurzoru (kurzor se nachází vpravo za vypsaným znakem), kterou navolíme díky funkci wherex-1 a vypíšeme znak. Tím docílíme toho, že vypsaný znak se přepíše stejným znakem, ale s barvou pozadí, takže působí jako smazaný. Poté nám již stačí vypsat znak o pozici dál a námi nadefinovanou barvou popředí. repeat o:=readkey; if o=’p’ then begin textcolor(1); gotoxy(wherex-1,12); write(’*’); textcolor(14); gotoxy(wherex,12); write(’*’); end; To vše uvedeme ještě jednou pro opačný směr a následuje ukončení cyklu s podmínkou na stisk určité klávesy. Pokud podmínka není splněna, smyčka se dále opakuje. if o='l' then begin textcolor(1); gotoxy(wherex-1,12); write(’*’); textcolor(14); gotoxy(wherex-2,12); write(’*’); end; Pokud je podmínka splněna, prográmek končí svou činnost. until o=’k’; end.
Pro načítání z klávesnice můžeme použít i kurzorové a speciální klávesy. Klávesa Enter Esc Mezerník
kód(Alt+35) #13 #27 #32 #072 #075 #077 #080
Pokud bychom tedy chtěli provést předešlý příklad pomocí kurzorových kláves a klávesy Enter, příkazy by měly tuto formu zápisu: if o=(#077) then … if o=(#075) then … until o=(#13); Příklady na procvičení: 1) Vytvořte program na změnu pozadí obrazovky dle číselné nabídky. 2) Naprogramujte rámeček ze znaků, které si uživatel vybere na začátku programu. Dále si uživatel volí i velikost rámečku od dvou do dvaceti. 3) Sestrojte program na přičítání a odečítání čísla. Uprostřed obrazovky se zobrazí číslo nula. Po stisku kurzorové klávesy „nahoru“ se k nule přičte hodnota o jednu větší atd. až po hodnotu sto. Pokud uživatel stiskne šipku dolů, hodnota se kdykoliv zmenší o jednu, maximálně však do méně sta. Na stisk klávesy Enter se program ukončí. 4) Vyrobte program „světelné noviny“. Uživatel si nastaví text, který po zadání běží v novém okně zleva doprava stále dokola. Maximálně čtyři znaky. 5) Navrhni program na vykreslení trojúhelníku na uživatelem zadaný počet řádků z předem daného znaku.
6) Zhotovte program „spirála“, který se bude skládat z rámečků, které se budou vždy s novou začínající stranou o jeden znak zmenšovat, až skončí uprostřed obrazovky. Poté spirálu opět po jednotlivých úsecích mažte. 7) Vypracujte „čítač“, tzn. po spuštění prográmku nastavte dobu odčítání od jedné do šedesáti (ošetřete) a zapněte čas. Od nastaveného času se začnou po cca vteřinovém intervalu odečítat o jednu hodnotu čísla, dokud nebude čas na nule. V tento okamžik se hodiny zastaví a program pípne. 8) Vytvořte prográmek „spořič obrazovky“ s různým počtem zobrazovaných bodů a s různou rychlostí jejich pohybu po obrazovce. 9) Napište program pro písničku „Kočka leze dírou“, kdy program zahrajete celou melodii písně. Notová stupnice pro Pascal má tyto hodnoty: c=262, d=294, e=330, f=349, g=392, a=440, h=494. 10) Sestavte hru „výherní automat“ na trénink postřehu uživatele. Uprostřed obrazovky jsou vedle sebe umístěny dvě buňky s náhodně se zobrazujícími čísly od nuly do devíti. Úkolem je stisknout libovolnou klávesu v okamžiku shodnosti dvou čísel. Pokud je pokus úspěšný, bod se přičte, pokud chybný, bod se odečte. Hra končí při dosažení buď tří kladných nebo záporných bodů. 11) Navrhni pro výše uvedené programy úvodní obrazovku, ve které bude číselný seznam tebou vytvořených programů a po spuštění volby a vykonání programu bude možné se do úvodní obrazovky vrátit zpět a spustit jinou volbu. 12) Naprogramuj šachovnici s 16 poli na řádku a 8 poli ve sloupci. Dále nastav před prvním řádkem abecední osu a prvním sloupcem osu číselnou. 13) Vytvoř program, kdy uživatel zadá slovo, to se náhodně 5 * rozmístí na obrazovce a poté se u jednotlivých slov po jednotlivých znacích bude přesouvat na dolní řádek, kde zmizí.
Literatura [1] MOKRES, David. Základy programování. Praha. Computer Press, 1998. [2] SATRAPA, Pavel. Pascal pro zelenáče. Praha. Neokortex, 2000. [3] BAJGAR, Lubomír, TYC, Otto. Základy programování. Pascal. Brno. VUT Brno, 1992. [4] Borland Pascal 7.0. Dokumentace překladače. Borland