Algoritmy a datové struktury 1 Modul 1 – Vývojové diagramy a příkazy jazyka Borland Pascal
Text pro distanční studium
Ing. Eliška Treterová
Ostravská univerzita v Ostravě, Přírodovědecká fakulta Katedra Informatiky a počítačů Ostrava 2003
Algoritmy a datové struktury 1
2
Algoritmy a datové struktury 1 Obsah
Úvod....................................................................................................................4 1. Algoritmizace – 1. část ..............................................................................5 1.1. Vývojové diagramy .............................................................................6 1.2. Sestavení algoritmu .............................................................................8 1.3. posloupnost (sekvence) .......................................................................8 1.4. Větvení (alternativa, rozhodování)....................................................10 1.5. Korespondenční úkol č.1...................................................................16 2. Algoritmizace – 2. část ............................................................................17 2.1. Cykly (Iterace)...................................................................................17 2.1.1. cyklus s podmínkou na konci (s výstupní podmínkou).............18 2.1.2. cyklus s podmínkou na začátku (se vstupní podmínkou)..........20 2.1.3. cyklus s řídící proměnnou .........................................................22 2.2. Korespondenční úkol č. 2..................................................................28 3. Algoritmus a program ............................................................................29 3.1. Postup při tvorbě programu...............................................................29 3.2. Terminologie .....................................................................................30 3.3. Programovací jazyk PASCAL ..........................................................31 3.3.1. Struktura programu v BORLAND PASCALU.........................31 3.3.2. Zdrojový text programu ............................................................32 3.3.3. Vstup hodnot do operační paměti..............................................34 3.3.4. Výstup hodnot z operační paměti..............................................35 4. Datové typy a jejich rozdělení ................................................................38 4.1. Číselné datové typy ...........................................................................40 4.1.1. Celočíselné datové typy ............................................................40 4.1.2. Datové typy pro čísla s desetinnou částí ...................................41 5. Příkazy jazyka Borland Pascal ..............................................................43 5.1. Jednoduché příkazy ...........................................................................44 5.1.1. Přiřazovací příkaz......................................................................44 5.1.2. Příkaz skoku ..............................................................................45 5.2. Strukturované příkazy .......................................................................46 5.2.1. Složený příkaz ...........................................................................46 5.2.2. Příkaz pro rozhodování (IF) ......................................................46 5.2.3. Příkaz pro rozhodování CASE ..................................................52 5.2.4. Příkazy cyklů.............................................................................56 5.2.5. Příkaz cyklu s podmínkou na konci (REPEAT UNTIL)..........56 5.2.6. Příkaz cyklu se vstupní podmínkou – WHILE........................58 5.2.7. Příkaz cyklu s řídící proměnnou - FOR ..................................60 5.3. Korespondeční úkol č. 3....................................................................63 Závěr.................................................................................................................64 Literatura.........................................................................................................64
3
Algoritmy a datové struktury 1
Úvod Studijní text, který máte před sebou, je adresován zájemcům o studium předmětu Algoritmy a datové struktury. Cílem tohoto studijního textu je seznámit studenty s problematikou tvorby algoritmů a jejich zakreslení ve formě vývojových diagramů a naučit studenty využívat při řešení úkolů programovací jazyk Borland Pascal. Při tvorbě vývojových diagramů se naučíte rozdělit řešený problém na jednotlivé dílčí kroky, zvládnete problematiku rozhodování a opakování zvolených kroků. Po probrání tvorby vývojových diagramů následuje část programátorská, kdy budete seznámeni s programovacím jazykem Borland Pascal. Tento programovací jazyk byl zvolen proto, že je přímo pro výuku programování vytvořen. Jeho prostředí není příliš složité a je pochopitelné i pro úplné začátečníky. Programovací jazyk Borland Pascal je sestaven tak, že hlídá jednotlivé kroky programátora a usměrňuje jeho činnost, což ve svém důsledku vede k pochopení základních principů programování. Pro zvládnutí učiva tohoto studijního textu se předpokládá základní znalost prostředí programovacího jazyka Borland Pascal nebo prostředí programovacího jazyka Borland C. Věřím, že čas, který strávíte studiem, nebude pro vás ztracený, a poskytne vám dostatek informací, abyste dobře pochopili význam programování při řešení úkolů z různých oblastí.
4
Algoritmy a datové struktury 1
1. Algoritmizace – 1. část Cíl: Po nastudování této kapitoly byste měli umět: - definovat pojmy algoritmus, vývojový diagram, posloupnost a , rozhodování - použít předdefinované grafické prvky pro sestavení vývojových diagramů - zakreslit ve vývojovém diagramu posloupnost - zakreslit ve vývojovém diagramu větvení (rozhodování) - rozpoznat, kdy je třeba použít úplné větvení, neúplné větvení a vnořené větvení Klíčová slova: Algoritmus, vývojový diagram, program, posloupnost, větvení, neúplné větvení, úplné větvení, vnořené větvení. Průvodce studiem: Dá se předpokládat, že jste již pojem algoritmus slyšeli, ale neměli jste potřebu jej použít. V našem běžném životě neustále probíhají činnosti, které my nejsme zvykli pojmem algoritmus označit, ale přesto se o algoritmus jedná. V této kapitole se vám pokusím toto vysvětlit. Algoritmus – postup, který určuje, co máme dělat, abychom vyřešili libovolnou úlohu. Algoritmus můžeme zapsat: a) slovně - jen jednoduché postupy, u složitějších postupů je slovní popis nepřehledný a nesrozumitelný. Příkladem algoritmů zapsaných slovně jsou kuchařské recepty. b) graficky - při tomto zápisu se používají grafické symboly, které mají předem definovaný význam. Nejrozšířenější formy grafického zápisu jsou vývojové diagramy a strukturogramy. V dalším výkladu jsou použity pouze vývojové diagramy. Algoritmy v běžném životě: S algoritmy se běžně setkáváme. Těmito algoritmy jsou například recepty na vaření, postup ovládání video kamery, postup sestavení nábytku z jednotlivých dílů, apod. V dalším výkladu se bude jednat vždy o algoritmy zaměřené na matematické výpočty.
5
Algoritmy a datové struktury 1 Průvodce studiem: Pokud stojíte před úkolem popsat postup činnosti tak, aby uživatel dospěl k požadovanému cíli (tedy máte sestavit algoritmus), je důležité přizpůsobit algoritmus znalostem a schopnostem potenciálního uživatele. Algoritmus práce s počítačem bude jiný pro člověka, který k počítači usedá poprvé, než pro člověka, který už má určité zkušenosti. Vlastnosti algoritmů: • Elementárnost - algoritmus se skládá z konečného počtu jednoduchých kroků • Determinovanost – v každé fázi zpracování musí být určen další postup • Konečnost – činnost algoritmu skončí v reálném čase • Rezultativnost – od libovolných vstupních dat musíme dospět k výsledkům • Hromadnost – algoritmus musí být použitelný pro všechny úlohy stejného typu Algoritmus zapsaný v programovacím jazyku se nazývá program.
1.1.
Vývojové diagramy
Slovní zápis algoritmu má jen velmi omezené možnosti použití. Aby náš algoritmus byl srozumitelný a použitelný pro širší okolí uživatelů, zapisujeme jej takřka vždy ve formě vývojových diagramů. Ke kreslení vývojových diagramů používáme standardní grafické symboly. Koncová značka
Začátek
Značka přiřazení
A:= 0
Vstup nebo výstup dat
Tiskni: z
Značka rozhodování
U >0
Značka podprogramu
6
Záměna
Algoritmy a datové struktury 1 Jednotlivé symboly spojujeme čárami a spojkami. Ve vývojovém diagramu dodržujeme směr shora dolů, proto není nutné svislé čáry kreslit se šipkou. Čáru zakončujeme šipkou v případě, kdy se směr mění, např. při naznačení cyklu. Spojky použijeme v případě, že vývojový diagram nevejde na jednu stránky a pokračuje na straně další. Pak je vhodné pomocí spojek označit návaznosti. Ukázka jednoduchého algoritmu:
1
Začátek
spojka
Tisk: Z
Z:=0 U:= 10
Konec
Z:=z+d U:= u -1 U=0 1
spojka
Průvodce studiem:
Pojem algoritmus již znáte. Musíte se nyní tedy naučit zapsat algoritmus v přehledné a srozumitelné podobě, tedy ve formě vývojových diagramů. Ve vývojových diagramech již budeme používat zápis v souladu s programovacím jazykem, který v další etapě zajistí zpracování algoritmu. My budeme používat programovací jazyk BORLAND PASCAL. Kreslení vývojových diagramů se v současné době využívá.jen velmi málo. Je to dáno úrovní výpočetní techniky a úrovní programovacích prostředí, kdy běžně používané osobní počítače umožňují ladění programu stylem „pokus – omyl“, tzn.např. pokud se objeví nějaký problém s počtem průchodů cyklem, nezačneme sestavovat vývojový diagram a přemýšlet nad ukončovací podmínkou cyklu, ale přímo ve zdrojovém textu vyzkoušíme změnu, která nás napadne jako první. Nějaký výsledek dostaneme, pokud to opět není správně, tak vyzkoušíme něco jiného a to děláme tak dlouho, až dojdeme k požadovanému výsledku. Vývojové diagramy zařazené v dalším textu řeší velmi jednoduché problémy a měly by vám umožnit pochopení základních programátorských struktur.
7
Algoritmy a datové struktury 1
1.2.
Sestavení algoritmu
Algoritmus je sestaven na základě tří základních struktur: 1. Posloupnost (sekvence) 2. Větvení (alternativa, rozhodování) 3. Cykly (iterace, opakování)
1.3.
posloupnost (sekvence)
Posloupnost je řada za sebou navazujících kroků, jejichž pořadí je předem pevně dáno. Posloupnost má svůj začátek a konec. Žádný krok nemůže být vynechán. Posloupnost se v algoritmech objevuje samostatně nebo jako součást složitějších struktur (větvení, cykly).
Začátek Příkaz 1 . . Příkaz N Konec
8
Algoritmy a datové struktury 1 Příklad: Popište pomocí vývojového diagramu algoritmus záměny obsahu proměnných. Pro vyřešení tohoto úkolu musíme zavést pomocnou proměnnou, do které uložíme hodnotu z proměnné A (první ze zaměňovaných hodnot). Pak můžeme hodnotu proměnné A přepsat hodnotou proměnné B. Po tomto kroku je obsah obou proměnných (A i B ) stejný, což ale nevadí. V pomocné proměnné máme uloženou původní hodnotu A, proto nyní obsah pomocné proměnné uložíme do B.
Začátek Tisk: zadej číslo Čti A Tisk: zadej číslo Čti B pom := A A := B B:= pom Tisk A,B Konec
9
Algoritmy a datové struktury 1
1.4.
Větvení (alternativa, rozhodování)
Větvení použijeme tam, kde podle okolností mají být některé kroky v posloupnosti vynechány, přidány nebo nahrazeny jinými. Větvení obsahuje obvykle tří části. První částí je otázka, na kterou existuje kladná nebo záporná odpověď. Druhou částí je krok, který se provede v případě kladné odpovědi na otázku. Třetí částí je krok, který se provede v případě záporné odpovědi na otázku. První část větvení (otázka) je povinná, zbylé dvě části jsou nepovinné. Pokud však současně chybí druhý i třetí krok, ztrácí větvení smysl. Průvodce textem:
Prakticky neustále se rozhodujete a svou další činnost rozvíjíte podle toho, jak jste se rozhodli. Ve vývojovém diagramu máte možnost rozhodování jednoduchým způsobem zakreslit. Musíte ale vždy přesně naznačit i ty větve rozhodování, ve kterých se žádná činnost nebude provádět. Ve vývojovém diagramu se tedy může objevit • úplné větvení • neúplné větvení • vnořené větvení a) úplné větvení (alternativa) - jsou zařazeny kroky pro kladnou i zápornou odpověď. Podle toho, jak je sestavena podmínka, budou zařazeny další činnosti. Je proto nutné nějakým způsobem označit, která větev se provádí v případě, že podmínka je pravdivá (říkáme také že podmínka platí) a která větev se provádí, když podmínka není pravdivá (neplatí). V dalším textu je vždy pravdivost podmínky označena symbolem + (plus) a nepravdivost symbolem – (mínus).
+
Podmínka
Příkaz1
Příkaz2
10
Algoritmy a datové struktury 1 Příklad:
Popište pomocí vývojového diagramu algoritmus načtení dvou čísel a výpočtu podílu těchto dvou čísel. Pozor: !! Nelze dělit nulou !! Rozbor: A,B slouží pro uložení hodnot, P slouží pro uložení výsledku dělení. Při řešení je použito úplné větvení, tzn. provádí se činnost v kladné i záporné větvi.
Začátek Tisk: zadej číslo
čti: A Tisk: zadej číslo Čti: B +
B<>0
P := A / B
-
Tisk: nulou nelze dělit
Tisk: P
Konec
11
Algoritmy a datové struktury 1 b) neúplné větvení (alternativa) - chybí krok pro kladnou nebo pro zápornou odpověď (častější je situace, kdy chybí krok pro zápornou odpověď). V logickém sledu činností sice chybí krok pro zápornou odpověď, ale ve vývojovém diagramu je nutné tuto skutečnost zakreslit.
+
podmínka
Příkaz1
Příklad: Popište pomocí vývojového diagramu algoritmus, který v případě, že číslo A je záporné, vypočítá jeho absolutní hodnotu. Obsah proměnné A vytiskne. Rozbor: K řešení je použito neúplné větvení, tzn. činnost se provádí pouze v jedné větvi. V tomto případě v kladné větvi. Záporná větev ale musí být ve vývojovém diagramu zakreslena. Začátek Čti A
+
-
A<0
A := ABS(A)
Tisk A
Konec
12
Algoritmy a datové struktury 1
c) Vnořené větvení (alternativa) – krok pro kladnou nebo pro zápornou odpověď (nebo pro obě odpovědi) je tvořen opět větvením
+
Podmínka 1
+
Příkaz1
Podmínka 2
-
Příkaz3
Příkaz2
Příklad: Popište pomocí vývojového diagramu algoritmus, který zjišťuje, zda číslo A je menší nebo větší nebo rovno nule. Rozbor: Při rozhodování musíme řešit tři různé situace. Pro řešení v těchto případech je vhodné použít vnořené větvení, které celý rozhodovací proces zkrátí a zjednoduší (nemusíme sestavovat třetí podmínku). K řešení je ale také možné sestavit tři neúplná větvení.
13
Algoritmy a datové struktury 1 a) k řešení je použito vnořené větvení.
Začátek
Čti A
+
-
A<0
Tisk: A je menší než nula
+
Tisk: A je větší než nula
A>0
-
Tisk: A je rovno nule
Konec
Průvodce studiem:
Při tomto řešení vám stačí pouze dva rozhodovacími bloky. Testovat třetí podmínku (v našem případě by to bylo A = 0 ) není třeba, protože pokud neplatí podmínka A < 0 a neplatí podmínka A > 0, pak může nastat pouze stav A = 0. Uvedený příklad je dosti elementární (což je pro výuku nutné) a možná si teď řeknete, že je vnořené větvení zbytečné. Jeho velký přínos objevíte tehdy, když budete muset řešit nějakou situaci, která má tři varianty a jedna z těchto variant je obtížně vyjádřitelná podmínkou. Příkladem může být situace, kdy budete muset zjistit, zda znak je malé písmeno, nebo je velké písmeno nebo to vůbec není písmeno. Vyjádření podmínek pro první a druhou situaci je celkem jednoduché, složitěji se jeví třetí varianty. A tady bych doporučila vnořené větvení, které vám dá možnost třetí podmínku nesestavovat.
14
Algoritmy a datové struktury 1
b) k řešení je použito neúplné větvení
Začátek Čti A +
-
A<0
Tisk:A je menší než nula
+
A>0
-
Tisk:A je větší než nula
+
A=0
-
Tisk:A je rovno nule
Konec
Průvodce studiem:
Při tomto řešení musíte sestavit všechny tři varianty rozhodování. Při každém rozhodování chybí činnosti v záporné větvi.
15
Algoritmy a datové struktury 1
Shrnutí: Algoritmus je postup řešení, které vede k dosažení stanoveného cíle. Algoritmy nejčastěji znázorňujeme v grafické podobě ve formě vývojových diagramů, protože tím zajistíme srozumitelnost a názornost řešení pro potenciální uživatele. Při kreslení vývojových diagramů používáme předem domluvené značky. Do algoritmu zařazujeme posloupnosti příkazů, rozhodovací bloky a bloky pro cyklické opakování některých činností – ty jsou obsahem další kapitoly. Kontrolní otázky: 1) Jaké vlastnosti by měl mít algoritmus ? 2) Jaká omezení vzniknou, pokud při sestavení algoritmu použijeme pouze posloupnost příkazů ? 3) Kdy do algoritmu zařazujeme větvení ? 4) Jaký je rozdíl mezi úplným a neúplným větvením ? 5) Kdy je vhodné použít vnořené větvení ?
1.5.
Korespondenční úkol č.1
Zadání: Popište pomocí vývojového diagramu algoritmus, který zjišťuje, zda načtené číslo X leží uvnitř nebo mimo nebo na hranici intervalu (1,10). Rozbor: Číslo X leží uvnitř, pokud platí podmínka: (X>1) AND (X<10) Číslo X leží mimo, pokud platí podmínka: (X<1) OR (X>10) Číslo X leží na hranici, pokud platí podmínka: (X=1) OR (X=10) Řešte: b) pomocí vnořeného větvení c) pomocí neúplného větvení
16
Algoritmy a datové struktury 1
2. Algoritmizace – 2. část Cíl: Po nastudování této kapitoly byste měli umět: - využívat v algoritmech cykly - rozpoznat, kterou variantu cyklu je vhodné do algoritmu zařadit - vysvětlit rozdíl mezi rozhodováním a cykly Klíčová slova: Cyklus, iterace, podmínka na začátku, podmínka na konci, tělo cyklu, řídící proměnná. Průvodce studiem:
V úvodní kapitole jste měli možnost se seznámit s problematikou tvorby vývojových diagramů. Výklad končil u možnosti zařazovat do řešení rozhodování. To by vám ale brzy přestalo stačit, protože velmi často se dostanete do situace, kdy se některé činnosti opakují v závislosti na tom, zda nastala či nenastala nějaká situace. A právě to, jak zajistit opakování některých kroků, je cílem této kapitoly.
2.1.
Cykly (Iterace)
V algoritmech velmi často nastává situace, kdy musíme některé činnosti zopakovat. To, zda se opakování provede či nikoliv, závisí vždy na vyhodnocení určité podmínky (otázky). Buď přesně známe, kolikrát se má činnost opakovat, pak podmínkou kontrolujeme, zda již bylo opakování provedeno v potřebném počtu. Nebo opakování závisí na vzniku určité situace, např. při výpočtu dojde k překročení nějaké extrémní hodnoty, pak podmínkou kontrolujeme vznik této situace. Existují dva základní typy cyklů, a sice cyklus, který nejdříve vykoná určité příkazy a pak teprve vyhodnocuje podmínku opakování, a pak cyklus, který nejdříve vyhodnocuje podmínku opakování a pak provádí příkazy. V dalším výkladu je zařazen ještě cyklus s řídící proměnnou, který je určitým zjednodušením cyklu s podmínkou na začátku. Tento cyklus je velkým zjednodušením práce programátora. Budeme tedy rozlišovat 3 typy cyklů (všechny uvedené cykly jsou v dalším textu podrobně vysvětleny): cyklus s podmínkou na konci (s výstupní podmínkou) cyklus s podmínkou na začátku (se vstupní podmínkou) cyklus s řídící proměnnou
17
Algoritmy a datové struktury 1 2.1.1. cyklus s podmínkou na konci (s výstupní podmínkou)
Postup provádění:
Nejdříve se vykonají příkazy těla cyklu, pak se provede vyhodnocení podmínky. Má-li podmínka hodnotu FALSE (není pravdivá), provede se návrat na začátek těla cyklu, provedou se příkazy těla cyklu a opět se vyhodnotí podmínka. Tato činnost se opakuje tak dlouho, až podmínka nabude hodnotu TRUE (je pravdivá). Pak je cyklus ukončen.
Průvodce studiem:
Při použití tohoto cyklu si musíte zapamatovat, že se příkazy těla cyklu provedou vždy alespoň jednou. To vám může někdy způsobit problémy ! Zakreslení cyklu s výstupní podmínkou (s podmínkou na konci) ve vývojovém diagramu:
Tělo cyklu
podmínka +
Průvodce studiem:
Tady vás musím upozornit na to, že neplatí obecně pro každý programovací jazyk, že cyklus s výstupní podmínkou končí při hodnotě TRUE. Toto platí pro BORLAND PASCAL a v celém dalším textu je toto pravidlo dodrženo. Například pro programovací jazyk C platí, že cyklus končí při hodnotě FALSE.
18
Algoritmy a datové struktury 1 Příklad: Popište pomocí vývojového diagramu algoritmus výpočtu obvodu a obsahu čtverce o straně A. Zajistěte, aby výpočet proběhl pouze tehdy, jestliže strana A bude mít velikost větší než nula (v opačném případě nemá smysl výpočet provádět). Pro řešení použijte cyklus s podmínkou na konci. Význam proměnných: A … strana čtverce Obvoda … obvod čtverce Plocha … obsah čtverce
Začátek
Tisk: zadej stranu čtverce Čti: A
-
A>0 + Obvod := 4 * A Plocha := A * A Tisk: Obvod Tisk: Plocha Konec
Průvodce studiem:
Cyklus, který je zařazen ve vývojovém diagramu, je ukázkou cyklu s výstupní podmínkou. V uvedeném příkladu se jedná o situaci, kdy nevíte, kolikrát se činnost bude opakovat. Opakování činnosti má končit při zadání hodnoty větší než nula. Tomu tedy odpovídá sestavená podmínka. Doporučila bych vám vždy při sestavování podmínky pro cyklus s výstupní podmínkou si položit otázku „kdy chci, aby cyklická činnost skončila“.
19
Algoritmy a datové struktury 1 2.1.2. cyklus s podmínkou na začátku (se vstupní podmínkou) Postup provádění:
Nejdříve dojde k vyhodnocení podmínky. Má-li podmínka hodnotu TRUE, provede se tělo cyklu (jeden nebo více příkazů) a pak se provede automaticky návrat k podmínce, ta se opět vyhodnotí. Pokud má podmínka opět hodnotu TRUE, celá činnost se opakuje. Cyklus je ukončen až tehdy , když podmínka nabude hodnoty FALSE. Průvodce studiem:
Chci vás upozornit na to, že u tohoto cyklu se může stát, že se tělo cyklu neprovede ani jednou ! To nastane v případě, že podmínka má hodnotu FALSE již při prvním vyhodnocení. Cyklus s podmínkou na začátku je nejčastěji používaný cyklus. Programátor by si vystačil jen s tímto cyklem.
Zakreslení cyklu s vstupní podmínkou (s podmínkou na začátku) ve vývojovém diagramu:
-
podmínka + Tělo cyklu
20
Algoritmy a datové struktury 1 Příklad:
Popište pomocí vývojového diagramu algoritmus zpracování souboru čísel. Vyřešte situaci, kdy víme, že v souboru je N čísel. Zpracováním zde budeme rozumět zjištění součtu všech čísel na vstupu. Pro řešení použijte příkaz cyklu s podmínkou na začátku. Význam proměnných:
N a suma p
… počet čísel na vstupu … proměnná pro uložení čísla ze vstupu … součet čísel na vstupu … počítadlo
Začátek suma := 0 p := 0 Zadej počet čísel Čti: N
p < N
-
+ Čti: a
Tisk: suma
suma :=suma + a
Konec
p := p + 1
21
Algoritmy a datové struktury 1 Průvodce studiem:
Při řešení úkolu jsem použila cyklus se vstupní podmínkou. Ze zadání úkolu vyplývá, že přesně víme kolikrát se musí tělo cyklu opakovat. Proto jsem podmínku opakování či ukončení cyklické činnosti sestavila v závislosti na tom, kolik hodnot se má zpracovat celkem (N) a kolik hodnot již bylo zpracováno (P). Proměnná P v algoritmu plní funkci počítadla, před zahájením cyklické činnosti má hodnotu nula a při každém průchodu se její hodnota zvyšuje o jedničku. Podmínku pak musíte sestavit tak, aby se tělo cyklu provedlo právě N-krát (jeden průchod cyklem = zpracování jednoho čísla).
2.1.3. cyklus s řídící proměnnou
Cyklus s řídící proměnnou je poněkud zjednodušený cyklus se vstupní podmínkou. Lze jej použít pouze tehdy, jestliže počet opakování je dán explicitně a nezávisí na činnosti prováděné v těle cyklu. Postup provádění:
Cyklus je řízen řídící proměnnou. Hodnoty řídící proměnné jsou omezeny počáteční (initial) a koncovou (final) hodnotou cyklu. Na začátku provádění cyklu se do řídící proměnné uloží počáteční hodnota. Pokud je pak hodnota řídící proměnné menší nebo rovna koncové hodnotě, provedou se tyto činnosti: vykoná se tělo cyklu pak se provede návrat na začátek cyklu pak se automaticky zvýší hodnota řídící proměnné o 1 pokud je hodnota řídící proměnné menší nebo rovna koncové hodnotě, celá činnost se opakuje cyklus končí tehdy, když řídící proměnná dosáhne hodnoty vyšší než je hodnota koncová. Průvodce studiem:
V této části výkladu jsem uvedla jen ten úplně základní princip činnosti cyklu s řídící proměnnou. Organizace tohoto cyklu se může v různých programovacích jazycích lišit. V příští kapitole vám vysvětlím další podrobnosti a varianty fungování tohoto cyklu. Pro pochopení použití cyklu s řídící proměnnou je nejdůležitější skutečnost, že můžete tento cyklus zařadit pouze v případě, že znáte počet opakování požadovaných kroků.
22
Algoritmy a datové struktury 1 Zakreslení cyklu s řídící proměnnou ve vývojovém diagramu:
Rp := 1,2, … , n
Tělo cyklu
Průvodce studiem:
Podle slovního popisu i podle zakreslení ve vývojovém diagramu byste si měli všimnout, že chybí podmínka pro opakování či ukončení cyklu. Tuto podmínku skutečně nemusíte nikde psát. Podmínka je skryta v zápisu a její vyhodnocení se provádí automaticky. Podmínka má tvar: Rp < = N. Pokud je tato podmínka pravdivá, provede se tělo cyklu, pokud je nepravdivá, cyklická činnost končí. Taktéž se nemusíte starat o počítadlo, které jsme museli zavést v případě použití cyklu se vstupní podmínkou. Jako počítadlo zde funguje řídící proměnná a jak je uvedeno výše, obsah řídící proměnné se automaticky zvyšuje o jedničku při každém návratu na začátek cyklu.
Příklad: Popište pomocí vývojového diagramu algoritmus zpracování souboru čísel. Vyřešte situaci, kdy víme, že v souboru je N čísel. Zpracováním zde budeme rozumět zjištění součtu všech čísel na vstupu. Pro řešení použijte příkaz cyklu s řídící proměnnou. Význam proměnných: N … počet čísel na vstupu a … proměnná pro uložení čísla ze vstupu suma … součet čísel na vstupu I … řídící proměnná cyklu
23
Algoritmy a datové struktury 1 Vývojový diagram:
Začátek suma :=0
Zadej počet čísel na vstupu Čti: N
I := 1,2, … , N
Tisk: suma
Čti: a suma :=suma + a
Konec
24
Algoritmy a datové struktury 1
Příklad: Popište pomocí vývojového diagramu algoritmus zpracování souboru čísel. Vyřešte situaci, kdy neznáme počet čísel v souboru, ale víme, že soubor je ukončen číslem 100, které ale do zpracování nesmíme zahrnout. Zpracováním zde rozumíme zjištění aritmetického průměru zadaných čísel. Takto zadaný úkol lze řešit pomocí cyklu s podmínkou na začátku i pomocí cyklu s podmínkou na konci. Nelze využít cyklus s řídící proměnnou, protože neznáme počet vstupních hodnot (počet opakování cyklu). Význam proměnných: a … proměnná pro uložení čísla ze vstupu suma … součet čísel na vstupu pocet … počet zadaných čísel prumer …..proměnná pro uložení aritmetického průměru a) použijeme cyklus s podmínkou na začátku
Začátek suma := 0 pocet := 0 Čti: a
a <> 100
-
+
Tisk: suma
Přičti k suma hodnotu v a
Prumer := suma / pocet
pocet := pocet + 1
Tisk: prumer
Čti: a Konec
Takto sestaveny algoritmus zajistí, aby se mezi zpracovaná čísla nedostala ukončující hodnota ze vstupního souboru (v našem příkladě je to číslo 100).
25
Algoritmy a datové struktury 1 b) použijeme cyklus s podmínkou na konci
Začátek suma := 0 Pocet := 0
Čti: a Přičti k suma hodnotu a Pocet := pocet + 1
-
a = 100
+ Suma := suma - a pocet := pocet - 1 prumer := suma / pocet Tisk: prumer Konec Při tomto řešení nesmíme zapomenout na to, že ukončující hodnota se nemá zpracovávat – v našem případě se přičte k sumě a také k počtu zpracovaných hodnot se přičte jednička navíc, což neodpovídá požadavku ze zadání, aby se koncová hodnota do zpracování nezahrnovala. Proto bylo třeba od konečné sumy tuto hodnotu odečíst a také snížit počet zpracovávaných hodnot o jedna. Teprve pak je možno vypočítat aritmetický průměr. Abychom se vyhnuli úpravě obsahu proměnných po skončení cyklu, je možné sestavit vývojový diagram tak, že do těla cyklu zařadíme rozhodování, zda hodnota v proměnné A, kterou máme zpracovat, je různá od koncové značky, v našem případě testujeme, zda je různá od hodnoty 100. Toto řešení je pak hodně obecné, ale dojde k prodloužení doby algoritmu, protože při každém průchodu cyklu je nutno vyřešit rozhodování.
26
Algoritmy a datové struktury 1
b) použijeme cyklus s podmínkou na konci, ale s úpravou v příkazech těla cyklu
Začátek suma := 0 pocet := 0 Čti: a
-
a < > 100
+ Suma := suma + a pocet := pocet + 1
-
a = 100
+ Prumer := suma / pocet Tisk: prumer Konec
27
Algoritmy a datové struktury 1
Shrnutí:
Hlavním cílem této kapitoly je naučit se správným způsobem používat v algoritmech cykly. K dispozici máme tři typy cyklu. Každý z uvedených typů cyklu je jiný a je na vás, který zvolíte. Nejvíce obecný je cyklus s podmínkou na začátku a dá se říci, že by nám úplně stačil jen tento cyklus pro vyřešení všech cyklických situaci. Ostatní dva cykly jsou zařazeny pro zjednodušení práce programátora a nesou sebou při použití určitá omezení či rizika. Omezení se týká cyklu s řídící proměnnou, kdy musíte předem znát počet opakování. Rizika jsou spojena zase s cyklem s výstupní podmínkou, kdy může dojít ke zkreslení výsledku vlivem toho, že vždy alespoň jednou se tělo cyklu vykoná. Kontrolní otázky
1. 2. 3. 4. 5. 6. 7.
K čemu slouží v algoritmu cyklus ? Jak se provádí cyklus s podmínkou na konci ? Jak se provádí cyklus s podmínkou na začátku ? Jak se provádí cyklus s řídící proměnnou ? Jaká omezení má cyklus s řídící proměnnou ? Které z cyklů je sestaven tak, že se tělo cyklu nemusí provést ani jednou ? Který z cyklů je sestaven tak, že se tělo cyklu provede vždy alespoň jednou ?
2.2.
Korespondenční úkol č. 2
Zadání:
Popište pomocí vývojového diagramu algoritmus zpracování souboru čísel. Vyřešte situaci, kdy víme, že v souboru je N čísel. Zpracováním zde budeme rozumět zjištění počtu čísel větších než nula.Vyřešte pomocí všech typů cyklu. Popište význam proměnných, které jsou v algoritmu použity.
28
Algoritmy a datové struktury 1
3. Algoritmus a program Cíl:
Po prostudování této kapitoly budete schopni - orientovat se v základních pojmech týkajících se zdrojového textu programu v BORLAND PASCALU - objasnit význam datových typů - vyjmenovat a charakterizovat způsoby rozdělování datových typů - vysvětlit a použít číselné datové typy - realizovat vstup a výstup z programu Klíčová slova: Program, programovací jazyk, strojový kód, vyšší programovací jazyk, překladač, syntaxe a sémantika, proměnná, konstanta, klíčové slovo, identifikátor, komentář, řetězec, deklarační část, příkazová část. Průvodce studiem:
Již v první kapitole jste se dověděli, že algoritmus zapsaný v programovacím jazyku se nazývá program. Dostáváme se tedy k problematice převedení algoritmu znázorněného ve vývojovém diagramu do podoby, které bude rozumět počítač – tedy do podoby programu. Veškerý další výklad je orientován na programovací jazyk BORLAND PASCAL a je proto nutné, abyste měli tento program k dispozici. Taktéž budete potřebovat literaturu, která vám usnadní orientaci v prostředí BORLAND PASCAL. Podrobný popis tohoto programového prostředí není součástí výukového materiálu. Doporučena literatura: Kvoch Martin:Programování v TURBO PASCALU 7.0.
3.1. • • • •
Postup při tvorbě programu
Analýza problému – co se má řešit Sestavení algoritmu – posloupnost řešení Sestavení programu – zápis algoritmu v syntaxi programovacího jazyka Ověření správnosti programu – odstranění syntaktických a logických chyb (nejdelší fáze)
První část je definice řešeného úkolu. Je třeba přesně vědět, co se má vlastně naprogramovat, co všechno má program umět. U tvorby jednoduchých programů je tato fáze velice krátká. Druhá část – sestavení algoritmu – se provádí při tvorbě jakéhokoli programu. U jednoduchých programů stačí mít algoritmus v hlavě, u složitějších je potřeba jej vytvořit na papír (vývojový diagram). U algoritmizace úlohy je třeba především postupovat tak, aby každý příkaz měl jednoznačný význam,
29
Algoritmy a datové struktury 1
který počítač dovede interpretovat. Je nutné si také uvědomit, že počítač za programátora nic nedomyslí, že postupuje přesně podle našich instrukcí. Při sestavování algoritmu se musíme řídit matematickou logikou. Třetí část – tvorba programového kódu. Tady záleží na tom, který programovací jazyk si programátor zvolil, a na tom, jaké zkušenosti programátor má. Je vhodné při psaní programového kódu dodržovat: programový text by měl být graficky přehledný názvy proměnných by měly vystihovat účel neměly by chybět komentáře Čtvrtá část – ověření správnosti programu. Prostředí programovacích jazyků poskytuje prostředky pro splnění této fáze práce. Průvodce studiem:
Pokud budete řešit jednoduchý úkol, pravděpodobně nebudete svou činnost rozdělovat do výše uvedených etap. Taktéž málokdo si opravdu sestaví na papír vývojový diagram a teprve pak začne přepisovat do zdrojového kódu programovacího jazyka. Nutnost členění postupu při tvorbě programu vyvstane v okamžiku, kdy řešený problém je rozsáhlý a složitý a zvláště pak v situacích, kdy se řešení účastní více lidí.
3.2.
Terminologie
Strojový kód Strojový kód je programový kód, který jediný dokáže počítač přímo zpracovávat. Strojový kód je reprezentován spoustou čísel ve dvojkové soustavě, které vyjadřují příkazy vyššího programovacího jazyka. Vyšší programovací jazyk Je to programovací jazyk, jehož příkazy jsou tvořeny pomocí klíčových slov, jejichž význam musí být převeden do strojového kódu a teprve potom může být program napsaný ve vyšším programovacím jazyce vykonán. Pascal patří mezi vyšší programovací jazyky. Překladače Převod programového textu z vyššího programovacího jazyka do strojového kódu zajišťují překladače (kompilery). Rozeznáváme 2 typy překladačů: Interpreter - překládá další příkaz vyššího programovacího jazyka teprve ve chvíli, kdy předcházející příkaz je již vykonán. Překlad programového textu do strojového kódu probíhá až do spuštění programu. Výhodou interpreteru je, že usnadňuje ladění programu, nevýhodou je, že zpomaluje běh programu. Kompilátor - přeloží celý programový text ještě před spuštěním programu. Výhodou je, že program běží rychleji, nevýhodou je, že program nelze spustit dříve, než jsou z něho odstraněny všechny syntaktické chyby. Syntaxe programovacího jazyka Jedná se o soubor pravidel pro tvorbu programu v daném programovacím jazyku. Jsou to pravidla pro zápis jednotlivých příkazů (syntaxe = gramatika).
30
Algoritmy a datové struktury 1
Každý programovací jazyk má svá syntaktická pravidla, která jsou uvedena v elektronické nápovědě a v manuálech. Sémantika programovacího jazyka Sémantika představuje logický význam syntaktické konstrukce. Konstanta Konstanta je místo v paměti, které má své jméno (identifikátor konstanty). Konstanta je datový objekt, kterému je na začátku běhu programu přiřazena hodnota a po celou dobu běhu programu se tato hodnota nemění. Proměnná Proměnná je místo v paměti, které má své jméno (identifikátor proměnné). Pomocí tohoto jména s proměnnou pracujeme. Proměnná je datový objekt, jehož hodnota se v průběhu výpočtu může měnit.
3.3.
Programovací jazyk PASCAL
Historie jazyka Pascal: Autorem jazyka Pascal je význačný odborník v oblasti výpočetní techniky profesor Niclaus Wirth, který jej navrhl v 70. Letech hlavně z důvodů zkvalitnění výuky svých studentů. V krátké době se jazyk stal nejen hojně používaným pro výuku programování, ale rovněž v profesionální práci. Dnes ustupuje Pascal v profesionální sféře před dokonalejšími jazyky jako je např. C/C++. K nejznámějším kompilátorům jazyka Pascal patří TURBO PASCAL a BORLAND PASCAL americké firmy Borland International pro platformu PC kompatibilních s PC IBM. 3.3.1. Struktura programu v BORLAND PASCALU PROGRAM název programu;
Hlavička programu
USES název knihovny; programů (UNIT)
Připojení knihoven
TYPE - úsek deklarace datových typů LABEL - úsek deklarace návěští; CONST - úsek deklarace konstant; VAR - úsek deklarace proměnných; PROCEDURE - úsek deklarace procedur; FUNCTION - úsek deklarace funkcí;
BEGIN . příkazy . END.
Deklarační část
Příkazová část
31
Algoritmy a datové struktury 1 Hlavička programu Obsahuje slovo PROGRAM a programátorem zvolený název. Hlavička programu není povinná. Část pro připojení knihoven Slouží k připojení standardních a vlastních knihoven (UNIT) k programu. Tato část programu není povinná. Pokud ale potřebujeme některé knihovny připojit, musíme tak učinit ihned za hlavičkou programu (neboli-li před deklarační části). Musíme napsat slovo USES a název knihovny, např.: USES CRT; … připojení standardní knihovny podprogramů pro práci s obrazovkou Deklarační část programu Tato část slouží k definování všech identifikátorů, které budeme používat v příkazové části programu. Pořadí úseků deklarační části je libovolné a každý úsek se může vyskytnout vícekrát nebo nemusí být uveden vůbec. Příkazová část programu Tato část je povinná. Musí začínat klíčovým slovem BEGIN a končit klíčovým slovem END. Za END musí být tečka. Mezi BEGIN .. END je uveden jeden nebo více příkazů ukončených středníkem.
Průvodce studiem:
Uvedená struktura programu se vám určitě v tomto okamžiku zdá hodně složitá a obsáhlá. Zařadila jsem zde úplně vše, co program může obsahovat. V ukázkových programech se budou objevovat vždy pouze ty úseky, které jsou nutné. Teprve po prostudování celého studijního textu budete znát a umět využít všechny zde uvedené úseky.
3.3.2. Zdrojový text programu
Při psaní zdrojového textu můžeme použít : • písmena: A, B, .. , Z, a, b, .. , z • číslice 0 .. 9 • speciální symboly: + - * / . , : ; = < > ( ) { } [ ] # $ @ ^ ‘ • dvojice: := <> <= >= .. (* *) !!! Překladač nerozlišuje malá a velká písmena, kromě použití v řetězcích !!!
32
Algoritmy a datové struktury 1 Ve zdrojovém textu rozlišujeme:
a) Klíčová slova - jsou to slova, která mají v programovacím jazyku předem určený význam a nemohou být použita pro jiné účely(např. názvy proměnných, podprogramů …) b) Identifikátory – jsou to názvy programu, proměnných, konstant , datových typů, návěští, procedur a funkcí. Při vytváření identifikátoru musíme dodržet tato pravidla: • Lze použít písmena, číslice a spodní podtržítko. Není zde rozdíl mezi malými a velkými písmeny. • Na prvním místě nesmí být číslice. • Délka je libovolná, ale rozlišuje se pouze prvních 63 znaků.
c) Celá čísla - celé číslo lze zapsat v desítkové nebo šestnáctkové soustavě. Zápis čísla v desítkové soustavě: číslice 0 ..9 a znaménko + nebo Zápis čísla v hexadecimální soustavě: 0 .. 9, A .. F a znak $. Např.: $F = 15 d) Desetinná čísla (reálná) – pro zápis můžeme použít: 0 .. 9, +, desetinnou tečku písmeno E nebo e Např.: 310 = 3.1E+2 6700.0 = 6.7E+3 e) Řetězce Řetězec je posloupnost znaků, která je na obou stranách ohraničena apostrofy. V řetězci se rozlišují malá a velká písmena. f) Komentáře Komentář je jakýkoliv text uzavřený mezi symboly (* *) nebo { }. To, co uvedeme jako komentář, nemá vliv na chod programu. Komentář slouží ke zvýšení srozumitelnosti programu. Maximální délka programové řádky ve zdrojovém textu je 126 znaků !
33
Algoritmy a datové struktury 1 3.3.3. Vstup hodnot do operační paměti
Průvodce studiem:
Nyní již víte, jaká je struktura programu, ale neznáte ještě příkazy, které byste použili. Vzhledem k tomu, že skoro každý váš program bude očekávat od uživatele vstupní data a uživatel zase bude očekávat nějaké výsledky (výstupy), jsou hned v úvodu zařazeny a vysvětleny činnosti, které vám tyto vstupy a výstupy umožní zrealizovat. a) Vstup dat z klávesnice do programu: READLN(položka_1, položka_2, … , položka_n); READ(položka_1, položka_2, … , položka_n);
Položkou může být pouze název proměnné !!! Příkaz provede uložení hodnoty zadané na klávesnice do proměnné uvedené v kulatých závorkách. Jedním příkazem lze načíst více hodnot (podle počtu proměnných). Zadávání hodnot z klávesnice musí být ukončeno klávesou ENTER. Při zadávání slouží jako oddělovač jednotlivých hodnot mezera, tabelátor nebo ENTER. Rozdíl mezi READLN a READ : READLN … čte hodnotu i ukončující ENTER READ … nepřečte ukončující ENTER a hodnota této klávesy zůstává ve vyrovnávací paměti
Průvodce studiem:
Rozdíl mezi příkazy Read a Readln nabývá na významu při práci s řetězci a pak při čtení ze souboru. Při práci s číselnými hodnotami není rozdíl významný. Doporučuji zařazovat příkaz ve tvaru READLN. Využít také můžete příkaz READLN bez kulatých závorek, pouze ukončený středníkem. Tento příkaz čeká, že zmáčknete klávesu ENTER. Používám ho v ukázkových programech a jeho význam spočívá v tom, že výstup na obrazovku zůstává viditelný tak dlouho, dokud nezmáčknete klávesu ENTER. Teprve pak dojde k návratu do prostředí Borland Pascalu.
34
Algoritmy a datové struktury 1
3.3.4. Výstup hodnot z operační paměti Průvodce studiem:
Vstupní data, mezivýsledky a konečné výsledky máte po celou dobu běhu programu uloženy v operační paměti. Po skončení programu ztrácíte možnost se k těmto datům zpět vrátit. Proto je pro vás velmi důležité si výsledné hodnoty zobrazit na obrazovce nebo je vytisknout na tiskárně nebo uložit do souboru dat mimo operační paměť. V dalším textu jsou výsledky vždy zobrazovány na obrazovku, další uvedené možnosti nejsou obsahem tohoto výukového materiálu. Pro zobrazení dat uložených v operační paměti slouží v Borland Pascalu tyto dva příkazy: WRITELN(položka_1, položka_2, … , položka_n); WRITE(položka_1, položka_2, … , položka_n);
Položkou může být: • • • • • • •
celé nebo reálné číslo znak (např. ‘A’) textový řetězec (např. ‘Ahoj’) booleovská hodnota (např. TRUE) název konstanty název proměnné volání funkce
Položky se vytisknou (zobrazí na obrazovce) v tom pořadí, jak jsou uvedeny v kulatých závorkách. Rozdíl mezi WRITELN a WRITE:
WRITELN … po vypsání poslední položky se kurzor přesune na další řádek WRITE … po vypsání poslední položky zůstává kurzor na tomtéž řádku, tedy za poslední vypsanou položkou výstupu WRITELN; … takto zadaný příkaz provede pouze přechod na nový řádek ! Využíváme jej pro vkládání prázdných řádků.
35
Algoritmy a datové struktury 1 Formátování výstupu na obrazovku: a) Procedura WRITELN (WRITE) nevkládá mezi položky mezery. Pokud je požadujeme, musíme je vložit sami (mezi apostrofy):
WRITELN(položka, ‘ ‘, položka,‘ ‘‚ … ,‘ ‘, položka); Příklad:
a := 1; b := 2; c := 3; jmeno := ‘Pavel‘; V programu: WRITELN(a,b,c); WRITELN(a,’ ‘,b,‘ ‘,c); WRITELN(‘AHOJ‘,jmeno); WRITELN(‘AHOJ‘,‘ ‘,jmeno,‘.‘);
na obrazovce(znak _ znázorňuje mezeru): 123 1_2_3 AHOJPavel AHOJ_ _ Pavel.
b) Můžeme také zadat šířku pole, ve kterém se provede výstup položky:
WRITELN(položka:šířka, …); Příklad.: a := 10; b := 2; c := 100; V programu: WRITELN(a,b,c); WRITELN(a:2,b:2,c:2); WRITELN(a:3,b:3,c:3); WRITELN(a:2,b:3,c:4);
Na obrazovce(znak _ znázorňuje mezeru): 102100 10_2100 _10_ _2100 10_ _2_100
Pokud je šířka větší, jsou položky zleva doplněny mezerami, tedy jsou zarovnány vpravo. Pokud je šířka menší, pak si PASCAL rozšíří pole na potřebnou velikost. V podstatě slouží tento formát k zarovnání výstupních hodnot na pravý okraj ! c) Pouze pro desetinná čísla lze použít kromě šířky výstupního pole zadat také počet desetinných míst:
WRITELN(položka:šířka:desetinná místa, …); Přidání hodnoty „desetinná místa“ způsobí výstup reálného čísla ve tvaru s pevnou desetinnou tečkou a zároveň určuje počet číslic, která se za desetinnou tečkou zobrazí.
36
Algoritmy a datové struktury 1 Příklad: X := 421.53; V programu: WRITELN(X); WRITELN(X:8); WRITELN(X:6:2); WRITELN(X:8:2); WRITELN(X:8:4);
na obrazovce(znak _ znázorňuje mezeru): 4.21153000000E+02 4.21E+02 421.53 _ _421.53 421.5300
Do šířky se započítává jedno místo pro desetinnou tečku. Kontrolní otázky:
1. 2. 3. 4. 5.
Jaký je postup při tvorbě programu ? Co je to syntaxe a sémantika programovacího jazyka ? Jaký je rozdíl mezi strojovým kódem a vyšším programovacím jazykem? Co je to proměnná a co je konstanta Ze kterých částí se skládá program v Borland Pascalu a k jakému účelu slouží jednotlivé částí ? 6. Co to je identifikátor a jaká pravidla platí pro jeho sestavení? 7. Co to jsou klíčová slova ? 8. K čemu slouží komentář ve zdrojovém textu programu ? 9. Jak zajistíme vstup hodnot do programů ? 10. Jak zajistíme výstup hodnot z programů na obrazovku ? 11. Co to je formátování výstupu ? Shrnutí:
Tato kapitola vám dala úvodní informaci o tom, jak je třeba postupovat v etapě, kdy již máte sestavený vývojový diagram a potřebujete vámi sestaveny algoritmus vyřešit za pomocí výpočetní techniky. V celém studijním materiálu se využívá pro tuto činnost programovací jazyk Borland Pascal. Proto jsem vám zde přiblížila, jak je třeba postupovat při psaní zdrojového textu programu, co je dovoleno a co ne. Program má předepsanou strukturu. Obsahuje hlavičku, deklarační část a příkazovou část. Hlavička programu není povinná, ale je vhodné ji zavést, protože v hlavičce se uvádí jméno programu, a to vede k lepší orientaci. Deklarační část slouží k deklaraci objektů, které pak použijeme v příkazové části. V deklarační části stačí zařazovat pouze ty úseky, které jsou nutné, ostatní lze vynechat. V příkazové části uvádíme příkazy, pomocí kterých řešíme vlastní algoritmus úlohy. Příkazová část je povinná. Pro zadání vstupních hodnot do programu slouží příkazy Read aReadln. Pro získání výstupních hodnot pak příkazy Write a Writeln.
37
Algoritmy a datové struktury 1
4. Datové typy a jejich rozdělení Cíl:
Záměrem této kapitoly je, abyste po jejím prostudování byli schopni: - vysvětlit význam datových typů v prostředí Borland Pascalu - vyjmenovat datové typy - rozdělit datové typy z různých hledisek - použít v programech celočíselné datové typy - použít v programech datové typy pro desetinná čísla Klíčová slova. Datový typ, množina hodnot, množina operací, jednoduché datové typy, strukturované datové typy, standardní datové typy, číselné datové typy, aritmetické operace, relační operace.
Vzhledem k tomu, že pro výuku byl zvolen programovací jazyk Borland Pascal, je nutné věnovat dostatečnou pozornost tomu, jak tento jazyk přistupuje k práci s daty. Jazyk BORLAND PASCAL vyžaduje, aby každá proměnná, kterou chceme v programu použít, měla stanoveno jméno a datový typ. Datový typem jednoznačně určujeme, zda do proměnné budeme ukládat celé číslo, desetinné číslo, znak, skupinu znaků nebo logickou hodnotu. Za tímto účelem byla v programu zavedena deklarační část a byla zavedena určitá klíčová slova, která umožňují jednoznačně datový typ proměnné určit. Průvodce studiem:
Tady vás chci upozornit na to, že programovací jazyk Borland Pascal je velmi citlivý na stanovení datového typu proměnných. V dalším výkladu se vždy dovíte, co pro vás jako programátora znamená zvolený datový typ proměnné. Pečlivé dodržování stanovených pravidel vám ušetří mnoho času při odstraňování chyb v programu. Obecně platí:
Datový typ jednoznačně určuje dvě charakteristiky proměnné: • množinu hodnot, kterých může proměnná nabývat během programu (velikost paměťového místa, v němž budou uloženy hodnoty) • množinu operací, které lze s touto proměnnou provádět. A tyto dvě informace také budou vždy přesně uvedeny u každého datové typu
38
Algoritmy a datové struktury 1 Množina všech datových typů v Borland Pascalu:
Borland Pascal obsahuje tuto množinu datových typů, kterou pak dělíme podle různých hledisek: -
celočíselné reálné znakové (CHAR) logické (BOOLEAN) řetězec (STRING) pole výčtový typ interval záznam množina soubor ukazatel
Rozdělení datových typů podle vnitřní struktury:
a) jednoduché typy – nemají vnitřní strukturu. S proměnnými jednoduchých datových typů pracujeme vždy jen jako s celkem b) Strukturované typy – hodnoty těchto typů mají vnitřní strukturu (členění na komponenty). S proměnnými strukturovaných typů lze pracovat buď jako s celkem nebo s jejími jednotlivými komponentami. Jednoduché datové typy: - celočíselné - reálné - znakové (CHAR) - logické (BOOLEAN) Strukturované datové typy - řetězec (STRING) - pole - záznam - množina - interval - výčtový typ - soubor Rozdělení datových typů podle způsobu definice: a) standardní datové typy – jsou předem přesně definovány b) definované uživatelem – uživatel sám definuje některé vlastnosti datového typu
39
Algoritmy a datové struktury 1
Standardní typy - celočíselné - reálné - znakové (CHAR) - řetězec (STRING) - logické (BOOLEAN) Definované uživatelem - výčtový typ - typ interval - pole - záznam - množina - soubor - ukazatel Průvodce studiem:
Vidíte, že dělení datových typů je různé. Možná se vám to nyní zdá úplně zbytečné. Mělo by vám to ale hned v úvodu posloužit k lepší orientaci v této problematice. Teprve až se postupně seznámíte v praxi s jednotlivými datovými typy, bude se vám toto dělení zdát naprosto přirozené.
4.1.
Číselné datové typy
V BORLAND PASCALU musíme rozlišovat mezi číslem celým a číslem s desetinnou částí. 4.1.1. Celočíselné datové typy
Překladač Borland Pascalu rozlišuje 5 datových typů pro celá čísla. Typ Množina hodnot (rozsah) Velikost paměti v bytech BYTE 0 .. 255 1 SHORTINT -128 .. 127 1 WORD 0 .. 65 535 2 INTEGER -32 768 .. 32 767 2 LONGINT -2 147 483 648 .. 2 147 483 647 4
Průvodce studiem:
Ti z vás, kteří pozorně studovali předchozí text, tak určitě pochopili, že výše uvedená tabulka nám sděluje jaké jsou dovolené hodnoty pro jednotlivé celočíselné datové typy, což je jedna z charakteristik proměnné. Druhá charakteristika proměnné – dovolené operace je popsána v následujícím odstavci. 40
Algoritmy a datové struktury 1
Dovolené operace s proměnnými celočíselných typů: a) aritmetické: + , - , * , DIV, MOD, / + … sčítání … odčítání * … násobení DIV … celočíselné dělení MOD… zbytek po celočíselném dělení / … přesné dělení Použití operace dělení pomocí operátoru / je dovoleno pro celočíselné proměnné, ale výsledek tohoto dělení je reálné číslo (číslo s desetinnou částí). Výsledkem ostatních operací bude celočíselná hodnota. b) relační : = … <> … > … >= … < … <= …
rovná se nerovná se větší než větší nebo rovno menší než menší nebo rovno
Výsledkem těchto operací je logická hodnota TRUE nebo FALSE. Předdefinované celočíselné konstanty - není třeba je zavádět v deklarační části programu.
MAXINT - obsahuje největší dovolenou hodnotu , kterou lze uložit do proměnné typu INTEGER, což je 32 767. MAXLONGINT - obsahuje největší dovolenou hodnotu , kterou lze uložit do proměnné typu LONGINT, což je 2 147 483 647. Je výhodné znát, že existují tzv. předdefinované konstanty. Tyto konstanty pak můžete použít, aniž byste je museli uvádět v deklarační část programu a pak také máte jistotu, že mají vždy stejnou hodnotu. V dalším textu jsou občas použity. 4.1.2. Datové typy pro čísla s desetinnou částí Průvodce studiem:
Čísla s desetinnou částí jsou často v dalším textu nazývána reálná čísla. Je to v programátorské terminologii běžné, proto vás na to upozorňuji již zde v úvodních informacích. Taktéž vás chci upozornit na to, že i když do proměnné, kterou definujete jako reálnou, uložíte číslo celé (bez zadání desetinné části), je přesto toto číslo považováno za reálné a některé operace s ním tudíž nejsou dovoleny (např. celočíselné dělení). 41
Algoritmy a datové struktury 1
V BORLAND PASCALU je předdefinováno 5 datových typů pro reálná čísla: TYP Množina hodnot (rozsah) Velikost paměti v bytech REAL 2.9 * 10-39 .. 1.7 * 1038 6 -45 38 SINGLE 1.5 * 10 .. 3.4 * 10 4 DOUBLE 5.0 * 10-324 .. 1.7 * 10308 8 -4932 4932 EXTENDED 3.4 * 10 .. 1.1 * 10 10 COMP -263 + 1 .. 263 - 1 8 Nejpoužívanější je datový typ REAL. Tento datový typ má přesnost 11 až 12 platných číslic. Dovolené operace s proměnnými reálného datového typu: a) aritmetické: + … sčítání … odčítání * … násobení / … dělení Nelze použít operace DIV a MOD !!! b) relační : = … <> … > … >= … < … <= …
rovná se nerovná se větší než větší nebo rovno menší než menší nebo rovno
Výsledkem těchto operací je logická hodnota TRUE nebo FALSE. Předdefinované reálné konstanty - není třeba je zavádět v deklarační části programu. PI – Ludolfovo číslo, které má hodnotu 3,14 Průvodce studiem: Načtení nebo přiřazení celočíselné hodnoty do proměnné reálného typu nezpůsobí chybu. Dojde k automatické konverzi (převodu) celého čísla na číslo s desetinnou částí . Obráceně to neplatí ! Nelze tedy do proměnné celočíselného typu načíst nebo přiřadit číslo s desetinnou částí. Taktéž je dobré si uvědomit, že pokud je proměnná deklarována jako proměnná reálného typu, nelze s ní provést operace DIV a MOD, i když byste do ní uložili číslo celé. Již při uložení dojde ke konverzi celého čísla na číslo s desetinnou částí.
42
Algoritmy a datové struktury 1
Kontrolní otázky:
1. 2. 3. 4. 5. 6. 7. 8.
K čemu slouží datové typy ? Jak se dělí datové typy z hlediska jejich definice ? Kolik datových typů máme pro celá čísla ? Které operace jsou dovoleny pro celočíselné proměnné ? Kolik datových typů máme pro reálná čísla ? Které operace jsou dovoleny pro reálné proměnné ? Které znáte předdefinované celočíselné konstanty ? Které znáte předdefinované reálné konstanty ?
Shrnutí:
Ukládání dat do operační paměti, které je nutnou součástí programování, řeší programovací jazyk Borland Pascal prostřednictvím tzv. datových typů. Jsou stanovena klíčová slova, která přesně definují, zda budeme pracovat s číslem, znakem, řetězcem znaků či s logickou hodnotou. V této kapitole je uveden stručný přehled všech datových typů v Borland Pascalu, podrobněji jsou vysvětleny celočíselné datové typy a datové typy desetinných čísel. Ostatní možnosti ukládání dat nejsou předmětem tohoto studijního materiálu.
5. Příkazy jazyka Borland Pascal Cíl:
Záměrem této kapitoly je, abyste po jejím prostudování byli schopni: - rozdělit příkazy jazyka Borland Pascal podle vnitřní struktury - prakticky použít přiřazovací příkaz - vysvětlit pojem kompatibilita vzhledem k přiřazení - vysvětlit pojem složený příkaz - zapsat příkazy pro rozhodování v syntaxi Borland Pascalu a prakticky je využít - zapsat příkazy pro cyklickou činnost v syntaxi Borland Pascalu a prakticky je využít Klíčová slova: Příkaz, jednoduchý příkaz, přiřazovací příkaz, kompatibilita, strukturovaný příkaz, složený příkaz, příkaz větvení, IF, CASE, selektor větvení, příkaz cyklu, WHILE, REPEAT, FOR, řídící proměnná.
43
Algoritmy a datové struktury 1
Průvodce studiem:
Pokud jste dostatečně pečlivě prostudovali kapitolu o vývojových diagramech, budete mít nyní občas dojem, že se některé informace opakují. Je to způsobeno tím, že nyní se budete učit, jak k řešení již sestaveného algoritmu ve formě vývojového diagramu využít programovací jazyk. Zatímco jste při tvorbě vývojového diagramu měli určitou volnost, při přepisu do programovacího jazyka musíte nutně dodržet předem daná pravidla, neboli syntaxi programovacího jazyka. Proto se zde opět objevují vývojové diagramy, ale jsou již nyní vždy doplněny ukázkou, jak je nutné provést zápis ve zdrojovém kódu programovacího jazyka. Co chápeme pod pojmem příkaz: Obecně pod pojmem příkaz rozumíme pokyn k provedení nějaké činnosti. V běžném životě mohou být příkazy nejrůznějších druhů, např. prostuduj si tuto knihu, napiš svou adresu, když nemáš peníze, nechoď do kina, atd. Příkazy pro počítač však musí mít předepsaný tvar a smysl. V dalším textu jsou postupně probrány příkazy jazyka Borland Pascal. Příkazy dělíme na: a) jednoduché přiřazovací příkaz příkaz skoku příkaz volání procedury b) strukturované složený příkaz podmíněné příkazy příkazy cyklu
5.1.
Jednoduché příkazy
5.1.1. Přiřazovací příkaz
Přiřazovací příkaz přiřazuje hodnotu výrazu na pravé straně do proměnné uvedené na levé straně přiřazovacího příkazu !! Obecný tvar příkazu: P := v; název proměnné
- konstanta (číslo, znak, řetězec znaků) - výsledek volání funkce (např. SQR(x)) - název proměnné - výraz (libovolný výpočet, např. x:=z+1)
44
Algoritmy a datové struktury 1
Datový typ pravé strany přiřazovacího příkazu musí být kompatibilní vzhledem k přiřazení s datovým typem proměnné uvedené na levé straně přiřazovacího příkazu. Kompatibilita znamená, že musí být splněno: datové typy obou stran jsou stejné levá strana je reálná, pravá je celočíselná. Opačná situace je nepřípustná => nelze přiřadit reálný výraz do proměnné celočíselné Průvodce studiem:
Na tomto místě bych vás chtěla upozornit na to, že v prvních programech, které sestavíte, se často objeví chyba v kompatibilitě vzhledem k přiřazení. Překladač vám všechny tyto chyby bude hlásit. Abyste si dovedli s těmito chybami poradit, je důležité opravdu pečlivě prostudovat, co je pro ten který datový typ dovoleno a pak také to, jakého typu je výsledek vámi zařazeného výpočtu.
5.1.2. Příkaz skoku
Příkaz skoku slouží k přímému předání řízení z jednoho místa programu na jiné. Používáme pouze ve výjimečných situacích, pouze jako nástroj předčasného ukončení nějakého strukturovaného příkazu (např. příkazu cyklu) nebo k předčasnému ukončení těla procedury. Jako naprosto nevhodné je možno označit použití příkazu skoku pro vyjádření běžného větvení nebo cyklu. Pro větvení i pro cykly jsou k dispozici srozumitelné a přehledné strukturované příkazy. Pro realizaci skoku v programu je zařazen příkaz GOTO. Jeho syntaxe je následující: GOTO návěští ; Návěští musíme deklarovat v deklarační části programu v úseku LABEL. Průvodce studiem:
Zařadila jsem sice základní informaci o tom, že existuje příkaz skoku a jak funguje, ale tento příkaz nebude v dalším výkladu vůbec do zdrojových textů zařazován ! Je to ukázkou toho, že je plně nahraditelný jinými příkazy. Pokud by se ve vámi vypracovaných úkolech tento příkaz objevil, budete vždy požádáni, abyste program přepracovali (i když bude vaše verze programu funkční) !!
45
Algoritmy a datové struktury 1
5.2.
Strukturované příkazy
5.2.1. Složený příkaz
Ve většině strukturovaných příkazů je povoleno popsat alternativu výpočtu nebo opakovanou akci pouze ve formě jediného příkazu. Potřebujeme-li na takovém místě uvést posloupnost příkazů, musíme z této posloupnosti vytvořit složený příkaz. Ten vytvoříme tak, že posloupnost příkazů vložíme mezi klíčová slova BEGIN a END. Příklad:
BEGIN pom:=x; x:= y; y:=pom; END;
5.2.2. Příkaz pro rozhodování (IF)
Podmíněné příkazy umožňují větvení v programu. Máme k dispozici dva, a sice příkaz IF a CASE. Průvodce studiem:
Základní informace o větvení (rozhodování, alternativě) jste získali studiem kapitoly o vývojových diagramech. Nyní se naučíte, jak je nutné postupovat při přepisu do zdrojového kódu programovacího jazyka. Příkaz IF - má dva tvary: a) úplné větvení (úplná alternativa) Tento příkaz IF se provede tak, že se nejprve vyhodnotí výraz uvedený jako podmínka. Má-li výraz hodnotu TRUE, provede se příkaz1 ( za klíčovým slovem THEN). Má-li výraz hodnotu FALSE, provede se příkaz2 (za klíčovým slovem ELSE). Pokud se v kladné nebo záporné větvi má vykonat více než jeden příkaz (posloupnost příkazů), pak je nutné uložit tyto příkazy mezi klíčová BEGIN a END, čímž vlastně z nich vytvoříme složený příkaz.
46
Algoritmy a datové struktury 1 Zápis v Pascalu:
reslení ve vývojovém diagramu:
IF podmínka Then příkaz1 Else příkaz2;
+
Příkaz1
IF, THEN a ELSE jsou klíčová slova.
Podmínka
-
Příkaz2
Příklad: Přečtěte ze vstupního zařízení číslo A a zjistěte, zda je to číslo kladné. Zobrazte ve vývojovém diagramu a zapište v jazyce BORLAND PASCAL
Začátek Zadej číslo Čti: A -
+
A >= 0
Tisk: A není kladné
Tisk: A je kladné
Konec
Program zjisteni_zda_je_cislo_kladne; uses CRT; var A:integer; begin clrscr; write('Zadej cislo: '); readln(A); if A >= 0 then writeln('cislo je kladne') else writeln('cislo neni kladne'); end.
47
Algoritmy a datové struktury 1 b) neúplné větvení (neúplná alternativa)
Tento příkaz IF se provede tak, že se nejprve vyhodnotí výraz uvedený jako podmínka. Má-li výraz hodnotu TRUE, provede se příkaz1 ( za klíčovým slovem THEN). Má-li výraz hodnotu FALSE, neprovede se nic. Vy vývojovém diagramu musí být skutečnost, že se v záporné větvi nic neprovádí zakreslena. Při přepisu do zdrojového kódu pak je záporná větev vynechána (chybí klíčové slovo ELSE ) Zápis v Pascalu:
zakreslení ve vývojovém diagramu:
IF podmínka THEN příkaz1; +
podmínka
-
IF a THEN jsou klíčová slova. Příkaz1
c) vnořené větvení
Příkaz If může mít v kladné, případně v záporné větvi (nebo v obou) opět příkaz If. zakreslení ve vývojovém diagramu:
+
Podmínka
+
Příkaz1
Podmínka
-
Příkaz3
Příkaz2
48
Algoritmy a datové struktury 1
Zápis v Pascalu:
IF podmínka THEN IF podmínka THEN příkaz1 ELSE příkaz2 ELSE příkaz3; Příklad: Najděte největší číslo ze tří celých čísel. Předpokládáme, že každé číslo je jiné. Zobrazte ve vývojovém diagramu a zapište v jazyce BORLAND PASCAL Vývojový diagram:
Začátek Zadej 3 čísla Čti: A Čti: B Čti: C
(A>B) and (A>C )
-
Tisk: C je nejvetsi
B>C
+
+ Tisk: A je nejvetsi
Tisk: B je nejvetsi
Konec
49
Algoritmy a datové struktury 1 Zápis v Pascalu:
Program nalezeni_nejvetsiho_cisla; uses CRT; var A,B,C:integer; begin clrscr; write('Zadej 1. cislo: '); readln(A); write('Zadej 2. cislo: '); readln(B); write('Zadej 3. cislo: '); readln(C); if (A > B) and (A > C) then writeln('nejvetsi sislo je: ',A) else if (B > C) then writeln('nejvetsi cislo je: ',B) else writeln('nejvetsi cislo je: ',C); readln; end. Hlavní zásady, které musíte dodržet při konstrukci příkazu IF:
první zásada - před klíčovým slovem ELSE nesmí byt umístěn středník
IF podmínka THEN příkaz1 ELSE příkaz2; Za příkaz1 tedy nesmí být nikdy středník !!
druhá zásada – pokud za klíčovým slovem THEN nebo ELSE potřebujete umístit více než jeden příkaz, musíte tyto příkazy uzavřít mezi BEGIN a END, to znamená, že z nich vytvoříte složený příkaz.
IF podmínka Then Begin Příkaz1 ; Příkaz2 ; End Else Begin Příkaz3; Příkaz4; End;
50
Tady nesmí být středník
Algoritmy a datové struktury 1
Příklad:
Zapište v programovacím jazyku tento úkol: Pokud je hodnota A menší než hodnota B, pak uložte obsah A do B a do B přiřaďte nulu. V opačném případě nechejte obsahy obou proměnných beze změny. Rozbor: V případě, že podmínka bude pravdivá, je nutné vykonat dva příkazy. To znamená, že v kladné větví rozhodovacího příkazu musíte zařadit složený příkaz. Správné řešení:
IF A < B Then Begin
+
A := B; B := 0; End;
A
-
A := B B:=0
Chybné řešení: Chyba je v tom, že není zařazen složený příkaz a rozhodovací příkaz nabude jiného významu, jak je vidět ve vývojovém diagramu.,
+
IF A < B Then A := B; B := 0;
A
A := B
B:=0
51
-
Algoritmy a datové struktury 1 5.2.3. Příkaz pro rozhodování CASE
V jazyce BORLAND PASCAL je možné pro větvení použít kromě příkazu IF ještě příkaz CASE. Tento příkaz umožňuje předepsat větvení výpočtu do několika alternativ v závislosti na hodnotě tzv. selektoru větvení. Příkaz CASE má 2 formáty: 1. formát: CASE selektor_vetveni OF Návěští_1 : příkaz_1; Návěští_2 : příkaz_1; … Návěští_n: příkaz_n; END;
2. formát: CASE selektor_vetveni OF Návěští_1 : příkaz_1; Návěští_2 : příkaz_1; … Návěští_n: příkaz_n; ELSE Příkazy; END;
Postup provádění Nejprve se vyhodnotí selektor větvení a pak se provede ten dílčí příkaz, před nímž je uvedena konstanta označující stejnou hodnotu (návěští), jakou má selektor větvení. Jestliže žádný z dílčích příkazů není označen takovou konstantou, nenastane chyba, program pokračuje buď příkazem za klíčovým slovem ELSE , pokud je uvedeno, nebo provede příkaz, který je za příkazem CASE (za klíčovým slovem END). Jestliže pro několik hodnot selektoru větvení se má provést stejný příkaz, uvede se před tímto příkazem seznam všech příslušných konstant. Příklad:
Ve vývojovém diagramu je znázorněno vícenásobné větvení v závislosti na hodnotě proměnné OPER, která je typu CHAR.
OPER +
Vysl := x+y
-
*
Vysl := x-y
Vysl := x*y
52
/
Vysl := x/y
Algoritmy a datové struktury 1 Přepis do Pascalu:
CASE OPER OF ‘+’: vysl := x+y; ‘-’: vysl := x-y; ‘*’: vysl := x*y; ‘/’: vysl := x/y; END; Průvodce studiem:
Příkaz větvení CASE je příkaz, který je plně nahraditelný příkazem IF. Uvedla jsem jej až v této kapitole, při studiu vývojových diagramů jste jej nenašli. Důvodem je to, že tento příkaz je dosti nepřehledný pro zakreslení. Proto se obvykle postupuje tak, že ve vývojovém diagramu se větvení znázorní jako příkaz IF a teprve podle možnosti programovacího jazyka (tzn. zda má takový příkaz zvolený jazyk vůbec k dispozici) se ve zdrojovém kódu zařadí příkaz pro mnohonásobné větvení, tedy příkaz CASE. Velkou výhodou tohoto příkazu je přehlednost zdrojového kódu, proto doporučuji jej využít, vždy, když to je možné. Příklad: Zakreslete ve vývojovém diagramu a zapište v jazyce BORLAND PASCAL algoritmus zjištění, do kterého čtvrtletí patří kalendářní měsíc, jehož číslo přečteme ze vstupního zařízení.
Začátek Zadej číslo měsíce Čti: cis
cis 1,2,3
Tisk: 1.čtvtr.
4,5,6
Tisk: 2.čtvtr.
7,8,9
Tisk: 3.čtvtr.
Konec
53
10,11,12
Tisk: 4.čtvtr.
Algoritmy a datové struktury 1 Zápis v Pascalu: Program zjisteni_ctvrtleti; uses crt; var cis:integer; begin clrscr; write('zadej cislo mesice 1 - 12: '); readln(cis); writeln; case cis of 1,2,3: writeln('1. ctvrtleti'); 4,5,6: writeln('2. ctvrtleti'); 7,8,9: writeln('3. ctvrtleti'); 10,11,12:writeln('4. ctvrtleti'); else writeln('zadane cislo mesice je nespravne'); end; writeln; {prejde na novy radek} write('zmackni ENTER '); readln; {ceka na zmacknuti klavesy ENTER} end.
Nahrazení příkazu CASE neúplným příkazem IF: Program zjisteni_ctvrtleti; uses crt; var cis:integer; begin clrscr; write('zadej cislo mesice 1 - 12: '); readln(cis); writeln; IF (cis=1)or(cis=2)or(cis=3) then writeln('1. ctvrtleti'); IF (cis=4)or(cis=5)or(cis=6) then writeln('2. ctvrtleti'); IF (cis=7)or(cis=8)or(cis=9) then writeln('3. ctvrtleti'); IF (cis=10)or(cis=11)or(cis=12) then writeln('4. ctvrtleti'); IF (cis<1)or(cis >12)then writeln('cislo mesice neni dobre'); writeln; {prejde na novy radek} write('zmackni ENTER '); readln; {ceka na zmacknuti klavesy ENTER} end.
Shrnutí:
Příkazy pro realizaci rozhodování (větvení) jsou v Borland PASCALU dva příkaz IF a příkaz CASE. Příkaz If se objevuje ve formě úplného větvení, neúplného větvení a vnořeného větvení. Důsledně je třeba dodržovat syntaktická pravidla pro zápis příkazu IF, a sice před klíčovým slovem ELSE nesmí být středník a pokud je nutno za ELSE nebo THEN vložit více než jeden příkaz, musí se uzavřít mezi BEGIN a END. Příkaz CASE umožňuje větvení programu do více větví a svou konstrukcí velmi zpřehledňuje zdrojový text. Je ale plně nahraditelný příkazem IF. 54
Algoritmy a datové struktury 1
Kontrolní otázky:
1. 2. 3. 4. 5. 6.
Co chápeme pod pojmem příkaz ? Jak dělíme příkazy v jazyku Borland Pascal ? Co je to přiřazovací příkaz ? Co je to kompatibilita vzhledem k přiřazení ? Jak vypadá a kdy se dá použít složený příkaz ? Jak v syntaxi Borland Pascalu zapíšete úplné větvení, neúplné větvení a vnořené větvení ? 7. Jak vyřešíte situaci, kdy za THEN nebo ELSE potřebujete zařadit více než jeden příkaz ? 8. K čemu slouží příkaz Case ?
55
Algoritmy a datové struktury 1
5.2.4. Příkazy cyklů
Pomocí příkazu cyklu se předepisuje opakované provádění jednoho příkazu nebo posloupnosti příkazů (tělo cyklu). Kromě příkazů, které se mají opakovaně provádět, je součástí každého příkazu cyklu také specifikace řídící toto opakování. V příkazech se vstupní (while), respektive výstupní (repeat) podmínkou je tato specifikace dána podmínkou (logickým výrazem), jejíž splnění, resp. nesplnění znamená opětovné provedení těla cyklu. V příkazech s řídící proměnnou cyklu (for) se udává interval hodnot ordinálního typu, pro něž se má tělo cyklu postupně provést. Průvodce studiem:
Problematika správného zařazení cyklické činnosti do algoritmu vám byla vysvětlena v kapitole o vývojových diagramech. Jedná se hodně obtížnou problematiku a často se stává, že student po probrání cyklů, si začne plést rozhodování a cykly. Myslím si, že to způsobuje nedostatečné pochopení rozkladu algoritmu na jednotlivé kroky a určení, kdy se jen mám rozhodnout mezi dvěmi nebo více variantami (větvení) a kdy se musím v algoritmu vracet k vyhodnocení podmínky a na základě jejího vyhodnocení činnosti opakovat nebo ne (cykly). V dalším textu jsou podrobně vysvětlena pravidla pro zápis těchto příkazu ve zdrojovém kódu.
5.2.5. Příkaz cyklu s podmínkou na konci (REPEAT UNTIL)
Zápis v Pascalu:
Zakreslení ve vývojovém diagramu:
REPEAT Tělo cyklu (posloupnost příkazů)
Tělo cyklu
UNTIL podmínka; -
podmínka +
Postup provádění: Příkaz REPEAT se provádí tak, že se postupně provedou všechny příkazy, které tvoří tělo cyklu. Potom se vyhodnotí výraz udávající podmínku ukončení a je-li hodnotou tohoto výrazu FALSE, opakuje se tato činnost znovu. Provádění příkazu REPEAT tedy končí až tehdy, když výraz udávající podmínku, má hodnotu TRUE.
Příkaz REPEAT je sestaven tak, že tělo cyklu se provede vždy alespoň jednou ! 56
Algoritmy a datové struktury 1 Příklad: Sestavte vývojový diagram a program, který čte ze vstupu N čísel a zjistí, která hodnota byla největší. Rozbor: pro vyřešení nalezení maximální hodnoty potřebujeme zavést pomocnou proměnnou, do které na začátku uložíme hodně malou hodnotu. Pak každou načtenou hodnotu porovnáme s touto pomocnou proměnnou a pokud je načtená hodnota větší, než hodnota v pomocné proměnné, přesuneme načtenou hodnotu do pomocné proměnné. Říkáme, že v pomocné proměnné uchováváme tzv. „okamžité maximum“. Význam proměnných: N … počet čísel na vstupu a … proměnná pro uložení čísla ze vstupu MAX … pomocná proměnná pro uložení okamžitého maxima p … počítadlo
Začátek
Zadej počet čísel Čti: N
p := 1 MAX := - MAXINT
Čti: a
-
a > MAX
+
MAX := a
p := p + 1
-
p>N
+ Tisk: MAX
Konec
57
Algoritmy a datové struktury 1 Zápis algoritmu v syntaxi programovacího jazyka BORLAND PASCAL:
Program vyhledani_maximalni_hodnoty; var a,max,p,n:integer; begin MAX:=-maxint; p:=1; write('zadej pocet cisel: '); readln(n); repeat write('zadej ',p,'. cele cislo: '); readln(a); if a>MAX then MAX := a; p:=p+1; until p > N; writeln('maximalni hodnota: ',MAX); writeln; write('zmackni ENTER '); readln; end.
5.2.6. Příkaz cyklu se vstupní podmínkou – WHILE
Zápis v Pascalu:
Zakreslení ve vývojovém diagramu:
WHILE podmínka DO Tělo cyklu – jeden příkaz; podmínka nebo
-
+ Tělo cyklu
WHILE podmínka DO Begin Tělo cyklu – posloupnost příkazů; End;
Postup provádění: Příkaz WHILE se provádí tak, že se nejdříve vyhodnotí výraz udávající podmínku opakování, a je-li hodnotou tohoto výrazu TRUE, provedou se příkazy uvedené za klíčovým slovem DO. Po vykonání těla cyklu se automaticky provede návrat na vyhodnocení podmínky. Pokud podmínka je pravdivá, vše se opakuje. Pokud je podmínka nepravdivá, je příkaz cyklu ukončen a řízení programu je předáno na příkaz za tělem cyklu. Bude-li tělo cyklu tvořeno posloupností příkazů, je nutné z této posloupnosti vytvořit složený příkaz (vložit příkazy mezi BEGIN a END).
58
Algoritmy a datové struktury 1
Příkaz WHILE je sestaven tak, že může nastat situace, kdy se tělo cyklu neprovede ani jednou. Tato situace nastane tehdy, když podmínka opakování nabude hodnoty FALSE ihned při prvním vyhodnocení. Příklad: Sestavte vývojový diagram a program, který čte ze vstupu N čísel a zjistí, kolik načtených hodnot se rovná hodnotě X. Význam proměnných: N počet čísel na vstupu a proměnná pro uložení čísla ze vstupu X hledaná hodnota pocet pro uložení počtu hodnot rovnajících se X p počítadlo
Začátek Zadej počet čísel Čti: N Zadej hledané číslo Čti: X p := 0 pocet := 0
-
p < N
+
Tisk: pocet
Čti: a Konec
-
a = X
+ pocet := pocet + 1
p := p + 1
59
+
Algoritmy a datové struktury 1
Zápis algoritmu v syntaxi programovacího jazyka BORLAND PASCAL:
Program zjisteni_poctu_vyskytu_cisla_X; uses crt; var a,pocet,p,N,X:integer; begin clrscr; write('zadej pocet cisel: '); readln(N); write('zadej hledane cislo: '); readln(X); p:=0; pocet:=0; while p < n do begin write('zadej cele cislo: '); readln(a); If a = X then pocet:= pocet + 1; p:=p+1; end; writeln('pocet cisel rovnych hodnote v X: ',pocet); writeln; write('zmackni ENTER '); readln; end.
5.2.7. Příkaz cyklu s řídící proměnnou - FOR
Příkaz cyklu FOR použijeme tehdy, jestliže chceme předepsat opakování provádění těla cyklu, přičemž počet opakování je dán explicitně a nezávisí na činnosti prováděné v těle cyklu. Postup provádění: Cyklus je řízen řídící proměnnou rp, která musí být ordinálního typu. Hodnoty řídící proměnné jsou omezeny počáteční (initial) a koncovou (final) hodnotou cyklu. Hodnota řídící proměnné v dalším kroku závisí na tom, který formát příkazu FOR použijete: při použití formátu s klíčovým slovem TO je příští hodnota řídící proměnné definována jako následník současné hodnoty, tzn. hodnota, jejíž ordinální číslo je o 1 vyšší. Cyklus končí, když hodnota řídící proměnné bude mít hodnotu větší než je koncová hodnota. při použití formátu s klíčovým slovem DOWNTO je příští hodnota řídící proměnné definována jako předchůdce současné hodnoty, tzn. hodnota, jejíž ordinální číslo je o 1 nižší. Cyklus končí, když hodnota řídící proměnné bude mít hodnotu menší než je počáteční hodnota.
60
Algoritmy a datové struktury 1
Počet opakování cyklu je roven: - při použití formátu s TO: ORD(final) – ORD(initial) + 1 - při použití formátu s DOWNTO: ORD(initial) – ORD(final) + 1 Formát s klíčovým slovem TO:
Zápis v Pascalu:
Zakreslení ve vývojovém diagramu
For Rp := 1 To N Do Tělo cyklu – jeden příkaz;
Rp:=1,2,…,N
nebo For Rp := 1 To N Do Begin Tělo cyklu – posloupnost příkazů; End;
Tělo cyklu
Formát s klíčovým slovem DownTo:
For Rp := N DownTo N Do Tělo cyklu – jeden příkaz;
Rp:=N,N-1,...1
nebo Tělo cyklu
For Rp := N DownTo N Do Begin Tělo cyklu – posloupnost příkazů; End;
Příklad: Sestavte vývojový diagram a program, který čte ze vstupu N čísel a zjistí, kolik načtených hodnot bylo sudých a kolik lichých. Význam proměnných:
N a suda licha I
počet čísel na vstupu proměnná pro uložení čísla ze vstupu hledaná hodnota pro uložení počtu hodnot rovnajících se X Řídící proměnná cyklu
61
Algoritmy a datové struktury 1
Začátek Zadej počet čísel Čti: N suda := 0 licha := 0
I:=1,2,…,N Zadej číslo
Tisk: suda
Čti: a
-
Licha:=licha+1
Tisk: licha +
a mod 2 = 0
Konec
Suda:=suda+1
Zápis algoritmu v syntaxi programovacího jazyka BORLAND PASCAL:
Program zjisteni_poctu_sudych_a_lichych_cisel; uses crt; var a,suda,licha,I,N:integer; begin clrscr; write('zadej pocet cisel: '); readln(N); suda:=0; licha:=0; FOR I:= 1 to N do begin write('zadej cele cislo: '); readln(a);
62
Algoritmy a datové struktury 1
If a mod 2 = 0 then suda:=suda + 1 else licha:=licha + 1; end; writeln('pocet sudych cisel: ',suda); writeln('pocet lichych cisel: ',licha); writeln; write('zmackni ENTER '); readln; end.
Shrnutí: Pro zajištění cyklického opakování v algoritmech slouží v Borland Pascalu tři příkazy cyklu. Příkaz se vstupní podmínkou (WHILE) – je nejuniverzálnější, lze jej použít pro řešení všech úkolů. Vždy nejdříve se testuje podmínka opakování a teprve na základě výsledku buď se tělo cyklu vykoná (při hodnotě TRUE) nebo nevykoná (při hodnotě FALSE). Příkaz s výstupní podmínkou (REPEAT) – tento příkaz nejdříve provede tělo cyklu a teprve pak testuje podmínku, zda tělo cyklu zopakovat. Proto je třeba zvážit při zařazení tohoto příkazu, zda nevznikne díky této vlastnosti v algoritmu chyba. Cyklus je ukončen, pokud má podmínka hodnotu TRUE. V opačném případě se provede opakování těla cyklu. Příkaz s řídící proměnnou (FOR)- tento příkaz je velkým usnadněním práce programátora, protože je sestaven tak, aby automaticky vykonal tělo cyklu přesně tolikrát, kolik je třeba. Omezením je ale právě to, že musí být na začátku dáno, kolikrát se bude opakovat. Kontrolní otázky:
1. 2. 3. 4. 5. 6.
Jak se v jazyku Borland Pascal zapíše cyklus s podmínkou na začátku ? Jak se v jazyku Borland Pascal zapíše cyklus s podmínkou na konci ? Jak se v jazyku Borland Pascal zapíše cyklus s řídící proměnnou ? Jaké dvě podoby může mít příkaz s řídící proměnnou ? Jaká omezení má příkaz s řídící proměnnou ? Který příkaz cyklu je sestaven tak, že tělo cyklu vždy provede alespoň jednou ? 7. Který příkaz cyklu je sestaven tak, že se tělo cyklu nemusí provést ani jednou ?
5.3.
Korespondeční úkol č. 3
Zadání: Zapište ve zdrojovém kódu Borland Pascalu úkoly, které jste v korespondenčním úkolu č.2 a korespondenčním úkolu č.3 řešili formou vývojových diagramů.
63
Algoritmy a datové struktury 1
Závěr Společně jsme dospěli k závěru tohoto textu. Asi budu mít pravdu v tom, že i po prostudování všech kapitol se z vás nestanou profesionální programátoři. To také ani nebylo cílem. Měli byste ale nyní mít na problematiku tvorby algoritmu a jeho následné zpracování pomocí programovacího jazyka jiný pohled, než na začátku studia. Nutnost přesně definovat jednotlivé kroky řešeného problému a vědomí, že „počítač za vás nic nedomyslí“ vám bude k prospěchu i v jiných oblastech studia.
Literatura Základní literatura
Saptrapa, P.: Pascal pro zelenáče, Neokortex, 2000 Kvoch, M.: Programování v TURBO PASCALU 7.0, KOOP, 1994 Töpfer, P.: Programovací techniky, Prometheus, 1995 Doporučená literatura
Drozd, J., Kryl, M.: Začínáme s programováním, GRADA, 1992 Ježowicz, E., Laga, J.: Základy programování v PASCALU, Státní pedagogické nakladatelství, 1989 Mikula, P.: TURBO PASCAL 7.0 od příkladů k příkazům, GRADA 1993 Vogel, J.,Müller, K.,Jinoch, J.: Programování v jazyku PASCAL, SNTL 1988
64