„základy programování v pascalu“ (učební...
TRANSCRIPT
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) vezmeme konvici a napustíme ji vodou 2) zapneme sporák a postavíme na něj konvici 3) zatím co se voda ohřívá, připravíme si šálek 4) do šálku vložíme sáček čaje 5) 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 Význam značky
zpracování
Vykoná jakoukoli operaci, jejímž výsledkem je přeměna údajů, např. změna hodnoty, tvaru, pozice či umístěni.
rozhodování
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.
příprava
Umožní nastavit počáteční činnost, dle které se mění vlastní postup následných činností, např. proměnná cyklu.
vstup a výstup
Vstup dodává data pro zpracování do programu, zatímco výstup reprezentuje zobrazení konečných hodnot.
spojka
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ě.
mezní značka
Označuje místo začátku a konce vývojového diagramu.
poznámka
Slouží pro popis komentářů nebo vysvětlujících textů.
spojnice
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.
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ů.
hodnoty a i b jsou velikosti stran obdélníku
start
obsah =a*b
piš obsah (a,b)
konec
čti a, b
obvod =2*(a+b)
piš obvod
Další příklady na procvičení: 1) Převeďte zadaný čas v minutách na hodiny a minuty
a zakreslete řešení do vývojového diagramu. 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:
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: 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í:
r1 radius
název proměnné := výraz
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: 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: 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.
read ( proměnná )
read ( seznam proměnných )
Pro vypsání hodnoty na obrazovku, která je uložena v proměnné,
slouží příkaz výstupu, který má tvar: 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:
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
’,vysl, ’ �C.’ , 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 ).
write ( parametr )
write ( seznam parametrů )
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.
write (‘1*a=‘,b)
write (‘2*a=‘,b)
b:=1*a
b:=2*a
read( a)
start
write( ‘zadej nasobitele‘)
1
write (‘4*a=‘,b)
write (‘5*a=‘,b)
b:=5*a
write( ‘3*a=‘,b)
1
konec
b:=4*a
b:=3*a
Konstrukce programu
Jazyk Pascal patří mezi jazyky s blokovou stavbou programu. Základem této konstrukce je blok.
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:
begin end.
hlavička programu
úsek deklarací
příkazová část
BL OK
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í:
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.
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
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 spuštění napsaného
programu Shift+Ins vložení textu
Alt+F5 zobrazení výsledku programu na výstupní obrazovce
Alt+x vypnutí programu
Ctrl+F1 nápověda ke kurzorem označenému klíčovému
slovu F2
uloží rozepsaný program
Ctrl+Del smazání části textu F3 zobrazení seznamu vytvořených souborů
Ctrl+Ins zkopírování textu F5 zvětšení okna, například při
nápovědě
Ctrl+Break způsobí přerušení spuštěného programu F6
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:
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 různých datových typu,
zapisujeme je strukturovaně pod sebou např.:
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
var seznam proměnných:datový typ
var c1,c2,suma:integer prumer:real
čí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 rozsah Integer -32768…32767 ShortInt -128…127 LongInt -2147483648…2147483647 Byte 0…255 Word 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 operátor sčítání + odčítání - násobení *
celočíselné dělení div zbytek po celočíselném dělení 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:
určuje celou část podílu před desetinnou čárkou, např.:
7 div 4 = 1 4 div 7 = 0 7 div 3 = 2 7 div 0 = chyba 19 div 6 = 3 0 div 8 = 0
a div b
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:
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 7 mod 3 = 1 4 mod 7 = 4 19 mod 6 = 1
Relační operace celočíselných typů umožňují:
operace operátor rovná se =
nerovná se <> je větší >
je menší < je větší nebo rovno >=
je menší nebo rovno <=
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é.
a mod b
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
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 rozsah Real 2,9*10-39…1,7*1038 Single 1,5*10-45…3,4*1038 Double 5,0*10-324…1,7*10308 Extended 3,4*10-4932…1,1*104932 Comp -263+1…263-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 operátor sčítání + odčítání - násobení * dělení /
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:
Převod hodnoty typu neceločíselné na celočíselnou nelze provést automaticky, nemůžeme tedy zapsat:
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ř.:
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á
var x:real; y:integer; x:=y; x:=2; x:=4+1.2;
var x:real; y:integer; y:=x; y:=2,7; y:=4+1.2;
var x:real; y,z:integer; x:=2,7; y:=round(x); z:=trunc(x);
const min=10; max=50; pí=3.14;
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:
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:
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.
const název veličiny=konstanta;
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:
k vysvětlení můžeme použít český opis: 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á!
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,
if podmínka then příkaz
jestliže platí podmínka, pak proveď příkaz
příkaz
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:
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ř.:
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í
if podmínka then begin příkaz 1; příkaz 2; . . příkaz n end;
writeln(’zadej prvni hodnotu: ’); readln(a); writeln(’zadej druhou hodnotu: ’); readln(b);
if a>b then (’druha hodnota ’,b,’je mensí’); if a<b then (’první hodnot ’,a,’je mensí’);
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. 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.
if i<j then if i<k then min:=i; if j<i then if j<k then min:=j; if k<i then if k<j then min:=k;
Úplná podmínka má následující syntaktickou podobu: k vysvětlení můžeme použít český opis: 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říkaz1 libovolný příkaz nebo jiná operace, který se
provede, jestliže podmínka bude platit else klíčové slovo příkaz2 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 příkaz 1 else příkaz 2
jestliže podmínka platí, pak proveď tento příkaz, jestliže podmínka neplatí, proveď následující příkaz
if podmínka then begin příkaz 1; příkaz 2; . . příkaz n end else 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.
Ř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.
příkaz 2
příkaz 1
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 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:
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.
repeat příkaz 1; příkaz 2 ; . . příkaz n ; until podmínka;
s podmínkou
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:
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);
p:=0; repeat writeln(’Ahoj svete!’); p:=p+1; until p=5;
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:
kde následující části syntaktického tvaru znamenají
while klíčové slovo podmínka je libovolná hodnota nebo výraz, který může nabývat hodnotu pravda nebo nepravda do klíčové slovo příkaz 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 příkaz;
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: 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ů.
while podmínka do begin příkaz 1; příkaz 2; . . příkaz n end;
příkaz 1
příkaz 2
příkaz n
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: kdy
for klíčové slovo proměnná jakákoliv proměnná typu integer min hodnota celé číslo, proměnná i výraz udávající
počáteční hodnotu smyčky to klíčové slovo max hodnota celé číslo, proměnná i výraz udávající
konečnou hodnotu smyčky do klíčové slovo příkaz libovolný příkaz nebo jiná operace
for proměnná:=min hodnota to max hodnota do příkaz;
Pro snazší pochopení uvedené formy zápisu jej můžeme vyložit
následujícím způsobem:
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ř.:
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í:
Místo konstant můžeme použít i proměnné:
Syntaxe sestupného cyklu má tuto formu:
kdy for klíčové slovo proměnná jakákoliv proměnná typu integer max hodnota celé číslo či proměnná udávající horní
hodnotu smyčky downto klíčové slovo min hodnota celé číslo či proměnná udávající spodní
hodnotu smyčky do klíčové slovo příkaz libovolný příkaz nebo jiná operace
for proměnná:=min hodnota to max hodnota do begin příkaz 1; příkaz 2; . . příkaz n end;
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.
for proměnná:=max hodnota downto min hodnota do příkaz;
for i:=min to max do writeln(i)
for i:=1 to 10 do writeln(i).
Opětně pro snazší pochopení uvedeného zápisu jej můžeme objasnit
takto:
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):
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ů..
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.
proměnná:=max,min
příkaz 1
příkaz 2
příkaz n
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ř.:
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
var znak:char; begin znak:=‘a‘;
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:
kde case klíčové slovo proměnná jméno proměnné, které může být typu
integer a char of klíčové slovo konstanta pravděpodobná hodnota z množiny
proměnné : oddělující značka vymezující možnou
hodnotu od příkazu příkaz povel, který se vykoná, jestliže odpovídá
konstanta proměnné, za každým příkazem
je středník end 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í:
case proměnná of konstanta 1:příkaz 1; konstanta 2:příkaz 2;
.
. konstanta n:příkaz n end;
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:
kde case klíčové slovo proměnná jméno proměnné, které může být typu
integer a char of klíčové slovo konstanta pravděpodobná hodnota z množiny
proměnné : oddělující značka vymezující možnou
hodnotu od příkazu příkaz povel, který se vykoná, jestliže odpovídá
konstanta proměnné, za každým příkazem je středník
else klíčové slovo příkaz povel, který se vykoná, jestliže
neodpovídá konstanta proměnné v žádné možnosti, může být bez středníku
end zakončení podmínky case se středníkem
case proměnná of konstanta 1:příkaz 1; konstanta 2:příkaz 2;
.
. konstanta n:příkaz n else konstanta :příkaz end;
Schematický nákres úplného příkazu case:
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.
příkaz 1 příkaz 2 příkaz n příkaz
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:
kde
proměnná představuje jméno proměnné string klíčové slovo
[dékla řetězce] 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 znak
1. ‘P‘ 2. ‘a‘ 3. ‘s‘ 4. ‘c‘ 5. ‘a‘ 6. ‘l‘
var proměnná:string[délka řetězce]
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:
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:
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:
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
znaků v řetězci: write (jazyk[1],jazyk[2],jazyk[1], 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 …
write(Length(název řetězce))
write(jméno proměnné řetězce)
write( proměnná řetězce[hodnota pozice])
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 spojit dohromady,
vložíme mezi jejich proměnné symbol +, např..
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á).
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:
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.
val( znak, číslo, kladné celé číslo)
str(číslo[:odsazení:počet desetinných míst],string)
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 - obsahuje nástroje pro lepší práci v textovém
režimu b) DOS - umožňuje komunikaci s operačním systémem
MS-DOS c) GRAPH - zprostředkovává práci v grafickém režimu d) GRAPH3 - zavádí činnost v grafickém módu pro Turbo
Pascal 3.0. e) OVERALY - dovoluje zvětšit zdrojový kód nad velikost
65kB f) PRINTER - usnadňuje komunikaci s tiskárnou g) SYSTÉM - základní jednotka, není nutné ji zavádět. Je
použita ve všech programech. h) TURBO3 - zprostředkovává zpětnou kompatibilitu
s Turbo Pascalem 3.0. i) WINDOS - 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:
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.
x-ová osa
y-ov
á os
a
79,49 ����
����39,25
����1,1
číslo Barva překlad číslo barva překlad
0 Black černá 8 darkgray tmavě šedá 1 Blue modrá 9 lightblue světle modrá 2 Green zelená 10 lightgreen světle zelená 3 cyan azurová 11 lightcyan světle azurová 4 red červená 12 lightred světle červená 5 magenta fialová 13 lightmagenta světle fialová 6 brown hnědá 14 yellow žlutá 7 lightgray světle šedá 15 white 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ě např.: i:=wherex , 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 řádků sloupců
textmode(co40) 40 25 textmode(co80) 80 25
textmode(co40+font8x8) 40 50 textmode(co40+font8x8) 80 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 kód(Alt+35) Enter #13 Esc #27
Mezerník #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