Programování Delphi 7 Object Pascal



Podobné dokumenty
Algoritmizace a programování

Nerovnice s absolutní hodnotou

( ) Kreslení grafů funkcí metodou dělení definičního oboru I. Předpoklady: 2401, 2208

Kvadratické rovnice pro studijní obory

AUTORKA Barbora Sýkorová

Sada 2 - MS Office, Excel

Každý jednotlivý záznam datového souboru (tzn. řádek) musí být ukončen koncovým znakem záznamu CR + LF.

Kvadratické rovnice pro učební obory

2.8.9 Parametrické rovnice a nerovnice s absolutní hodnotou

Sada 2 Microsoft Word 2007

Číselné soustavy Ing. M. Kotlíková, Ing. A. Netrvalová Strana 1 (celkem 7) Číselné soustavy

1. Programování, typy programovacích jazyků, historie.

Plán předmětu Název předmětu: Školní rok: Ročník: Semestr: Typ předmětu: Rozsah předmětu: Počet kreditů: Přednášející: Cvičící: Cíl předmětu

PŘÍRUČKA K POUŽÍVÁNÍ APLIKACE HELPDESK

16. února 2015, Brno Připravil: David Procházka

CERTIFIKOVANÉ TESTOVÁNÍ (CT) Výběrové šetření výsledků žáků 2014

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

1.3.1 Kruhový pohyb. Předpoklady: 1105

2.7.2 Mocninné funkce se záporným celým mocnitelem

BlueJ a základy OOP. Programování II 1. cvičení Alena Buchalcevová

( ) ( ) ( ) 2 ( ) Rovnice s neznámou pod odmocninou II. Předpoklady: 2715

M - Rovnice - lineární a s absolutní hodnotou

Tvorba trendové funkce a extrapolace pro roční časové řady

DUM 16 téma: Dávkové soubory

Dopravní úloha. Jiří Neubauer. Katedra ekonometrie FEM UO Brno

Inovace výuky prostřednictvím ICT v SPŠ Zlín, CZ.1.07/1.5.00/ Vzdělávání v informačních a komunikačních technologií

JAZYK C PRO MIKROKONTROLÉRY

JAK PŘIDAT UŽIVATELE PRO ADMINISTRÁTORY

Programovací jazyk Pascal

Sada 2 - MS Office, Excel

= musíme dát pozor na: jmenovatel 2a, zda je a = 0 výraz pod odmocninou, zda je > 0, < 0, = 0 (pak je jediný kořen)

Metodika pro učitele

Lokální a globální extrémy funkcí jedné reálné proměnné

Ministerstvo pro místní rozvoj. podprogram

Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49

Svobodná chebská škola, základní škola a gymnázium s.r.o. pochopení pojmů a výpočtů objemů a obvodů

Google Apps. pošta 2. verze 2012

Vstup a přihlášení do systému. Dokumentace k programu. Zápis hodnocení studentů 1. možnost zápis po jednotlivých studentech

Studijní informační systém. Nápověda pro vyučující 2 Práce s rozvrhem a předměty

Důkazové metody. Teoretická informatika Tomáš Foltýnek

1.1.1 Kvadratické rovnice (dosazení do vzorce) I

Systém zvukové signalizace a spouštění motoru na základě stavu světla

Využití EduBase ve výuce 2

Postup práce s elektronickým podpisem

Důležité zásady pro vytváření korektních souborů pro import do databáze IWAM

IMPORT A EXPORT MODULŮ V PROSTŘEDÍ MOODLE

1. Kruh, kružnice. Mezi poloměrem a průměrem kružnice platí vztah : d = 2. r. Zapíšeme k ( S ; r ) Čteme kružnice k je určena středem S a poloměrem r.

E-ZAK. metody hodnocení nabídek. verze dokumentu: QCM, s.r.o.

{ } Kombinace II. Předpoklady: =. Vypiš všechny dvoučlenné kombinace sestavené z těchto pěti prvků. Urči počet kombinací pomocí vzorce.

A. Struktura grafického kódu na dokladech o získání základního vzdělání

INFORMACE K POKUSNÉMU OVĚŘOVÁNÍ ORGANIZACE PŘIJÍMACÍHO ŘÍZENÍ SŠ S VYUŽITÍM JEDNOTNÝCH TESTŮ

Mobilní aplikace pro ios

Výsledky testování školy. Druhá celoplošná generální zkouška ověřování výsledků žáků na úrovni 5. a 9. ročníků základní školy. Školní rok 2012/2013

2.7.1 Mocninné funkce s přirozeným mocnitelem

Elektronický formulář

Klientský formát POHLEDÁVKY platný od

Průvodce e learningem

Poznámky k verzi Remote Support Platform 3.0

Sada 1 CAD Registrace studentů a učitelů středních škol pro účely stažení legálního výukového SW firmy Autodesk

PROGRAMOVÁNÍ SVĚTELNÝCH OZDOB

Modul účetnictví: Kontrolní výkaz DPH (SK) Podklady ke školení

imedicus - internetové objednávání

( ) Neúplné kvadratické rovnice. Předpoklady:

Vzdělávací oblast: Matematika a její aplikace. Obor vzdělávací oblasti: Seminář z matematiky. Ročník: 7. Poznámky

PŘÍLOHA č. 2B PŘÍRUČKA IS KP14+ PRO OPTP - ŽÁDOST O ZMĚNU

Verzovací systémy (systémy pro správu verzí)

Google AdWords - návod

Zvyšování kvality výuky technických oborů

DUM 11 téma: Nástroje pro transformaci obrázku

Poznámky k verzi. Scania Diagnos & Programmer 3, verze 2.27

DUM téma: KALK Výrobek sestavy

Aritmetika s didaktikou I.

A7B39PDA Deliverable D3 ČVUT FEL, 2014/2015 Daniil Barabash, Adam Samec, Tatiana Okonechnikova. Principy tvorby mobilních aplikací (A7B39PDA)

PHP formátování řetězců

Vrtání závitů bez vyrovnávací hlavičky (G331, G332)

Název: VY_32_INOVACE_PG3309 Booleovské objekty ve 3DS Max - sčítání a odčítání objektů

Aplikované úlohy Solid Edge. SPŠSE a VOŠ Liberec. Ing. Aleš Najman [ÚLOHA 18 TVORBA PLOCH]

Windows 10 (6. třída)

9.2.5 Sčítání pravděpodobností I

Uživatelská dokumentace

DS SolidWorks PDM Workgroup

Klientský portál leasing24.cz. KLIENTSKÝ PORTÁL 24 NÁVOD NA PŘIHLÁŠENÍ A REGISTRACI UŽIVATELE Leasing24.cz. Stránka 1 z 15

Výsledky testování školy. Druhá celoplošná generální zkouška ověřování výsledků žáků na úrovni 5. a 9. ročníků základní školy. Školní rok 2012/2013

3.2.4 Podobnost trojúhelníků II

Sekvenční logické obvody

Srovnání posledních dvou verzí studijních plánů pro studijní obor. Informační systémy. (studijní program Aplikovaná informatika)

Pohyb v listu. Řady a posloupnosti

Microsoft Office. Word styly

(a) = (a) = 0. x (a) > 0 a 2 ( pak funkce má v bodě a ostré lokální maximum, resp. ostré lokální minimum. Pokud je. x 2 (a) 2 y (a) f.

Virtuální přístroje. Použití grafického programování v LabVIEW. Ing. Pavel Mlejnek

Výukový materiál zpracován v rámci projektu EU peníze školám

Pravidla pro publicitu v rámci Operačního programu Doprava

KIV/ZI Základy informatiky. MS Excel maticové funkce a souhrny

Signály Mgr. Josef Horálek

Využití ICT pro rozvoj klíčových kompetencí CZ.1.07/1.5.00/

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Operační program Rybářství

Zvyšování IT gramotnosti zaměstnanců vybraných fakult MU MS POWERPOINT 2010


ELEKTROTECHNICKÁ MĚŘENÍ PRACOVNÍ SEŠIT 2-3

Transkript:

MASARYKOVA UNIVERZITA PEDAGOGICKÁ FAKULTA Programování Delphi 7 Object Pascal (Příloha diplomové práce) Pavel Dohnal 2008/2009

OBSAH ÚVOD... 3 1. ODDÍL I. ZÁKLADY... 4 1.1 CO JE TO PROGRAM?... 4 1.2 DELPHI 7... 4 1.2.1 Vývojové prostředí... 4 1.2.2 Spuštění vývojového prostředí... 4 1.2.3 Ukázka a popis vývojového prostředí... 5 1.3 ZÁKLADNÍ STRUKTURA PROGRAMU... 5 1.4 ZÁKLADNÍ POJMY... 6 1.4.1 Co je to příkaz?... 6 1.4.2 Klíčová slova... 6 1.4.3 Rezervovaná slova... 6 1.4.4 Poznámky... 6 1.4.5 Pravidla zápisu zdrojového kódu... 6 1.5 PŘÍKAZY VÝSTUPU... 7 1.6 IDENTIFIKÁTORY... 8 1.7 DATOVÉ TYPY... 8 1.7.1 Ordinální typy... 8 1.7.2 Datové typy reálných čísel... 10 1.7.3 Datové typy řetězců... 10 1.8 PROMĚNNÉ, KONSTANTY A JEJICH DEKLARACE... 10 1.9 VÝRAZY... 11 1.10 PŘIŘAZOVACÍ PŘÍKAZ... 12 1.11 PŘÍKAZ VSTUPU... 13 SAMOSTATNÁ PRÁCE K PRVNÍ ČÁSTI... 14 2. ODDÍL II. ŘÍZENÍ CHODU PROGRAMU... 15 2.1 VĚTVENÍ PROGRAMU... 15 2.1.1 Neúplný podmíněný příkaz... 15 2.1.2 Úplný podmíněný příkaz... 16 2.1.3 Relační operátory... 17 2.1.4 Volba náhodných čísel... 18 2.2 CYKLY... 19 2.2.1 Cyklus s příkazem While... 20 2.2.2 Cyklus s příkazem Repeat... 21 2.2.3 Cyklus s příkazem For... 23 3. ODDÍL III POLE A ŘETĚZEC... 26 3.1 STATICKÉ JEDNOROZMĚRNÉ POLE A PŘÍKAZ ARRAY... 26 3.1.1 Přístup k prvkům pole... 28 3.1.2 Plnění polí... 28 3.2 STRING A PRÁCE S ŘETĚZCEM... 30 3.2.1 Přehled příkazů a funkcí pro práci s řetězci... 31 4. ODDÍL IV PODPROGRAMY... 34 4.1 PROCEDURY... 34 4.1.1 Procedury a parametry... 35 4.2 FUNKCE... 37 4.2.1 Funkce a parametry... 38 DOPORUČENÁ LITERATURA:... 40 MOŽNÁ ŘEŠENÍ PŘÍKLADŮ NA PROCVIČENÍ:... 41 MOŽNÁ ŘEŠENÍ PŘÍKLADŮ SAMOSTATNÉ PRÁCE:... 69 2

Úvod Programovací jazyky jsou umělé jazyky vytvořené pro zápis počítačového programu. Mají přesně definovanou syntaktickou stavbu a sémantiku a pracují s lexikálními jednotkami. Z tohoto pohledu by se dalo říci, že fungují stejně jako jazyky přirozené. Existují různé přirozené jazyky a stejně tak existují i různé jazyky umělé. Od přirozených jazyků se však tyto jazyky výrazně liší. Zatímco přirozené jazyky vznikaly svou vlastní cestou a neustále se kontinuálně vyvíjejí, umělé jazyky jsou vytvářeny cíleně a k jejich změnám dochází pouze v případě, že stávající podoba jazyka přestane vyhovovat požadavkům tvorby programů, pro jejichž vytváření je programovací jazyk určen. Změny nejsou postupné, nýbrž skokové. Programovací jazyky a jejich vývojová prostředí slouží k vývoji a realizaci nejrůznějších programů a systémů. Každý program má svůj zdrojový kód, tedy textový soubor, který obsahuje popis algoritmu v daném programovacím jazyce. Přeložený a sestavený program je uceleným souborem instrukcí zapsaných ve strojovém kódu, který je schopen spouštění na počítači. Tento text se bude věnovat strukturované formě programování v jazyce Object Pascal a ve vývojovém prostředí Delphi 7 Personal Edition. Bude možné ho využít jako materiál pro výuku základů programování na základních školách, jako referenční příručku ho zároveň budou moct využít všichni, kdo se s programováním zatím nesetkali a chtěli by do základů programování proniknout. Dokument je rozdělen do čtyř oddílů: Základy, Řízení chodu programu, Pole a řetězec a Podprogramy. Každý oddíl obsahuje teoretické informace, obecné vysvětlení problematiky a příklady na procvičení. Na konci textu jsou uvedena řešení jednotlivých úkolů. Materiál je k dispozici rovněž na CD-ROMu a na webových stránkách www.programovaninazs.wz.cz, kde je také zprovozněno fórum, ve kterém si uživatelé mohou navzájem předávat zkušenosti, diskutovat o problémech, řešit nové úlohy a komentovat studijní materiál jako takový. 3

1. Oddíl I. Základy 1.1 Co je to program? Zjednodušeně by se dalo říct, že program je text zapsaný v některém z programovacích jazyků. Tento text (zdrojový kód) je tvořen posloupností instrukcí a příkazů, již zpravidla označujeme pojmem algoritmus. Programátor text vytváří v podobě srozumitelné člověku. Po spuštění programu je však text programu pomocí překladače programovacího jazyka přeložen do jazyka srozumitelného počítači (procesoru počítače), do tzv. strojového kódu, jinak by počítač nebyl schopný s textem programu pracovat. Program vždy pracuje s konkrétními daty s přesně stanovenými vlastnostmi. Kromě dat jsou vždy specifikovány i příkazy neboli operace, jež mají být s daty provedeny. Výsledkem programu jsou opět data, jež byla získána provedením požadovaných operací. K výsledným datům je možné se dopracovat několika různými způsoby, a není proto výjimkou, že zdrojové kódy programů se u jednotlivých programátorů do značné míry liší, a to i v případech, že programátoři řeší stejné zadání. 1.2 Delphi 7 1.2.1 Vývojové prostředí Vývojovým prostředím se rozumí software (aplikace), která programátorovi umožňuje vytvářet programy. Tyto aplikace bývají často vázány na jeden programovací jazyk a tomuto jazyku jsou rovněž přizpůsobeny, např. vývojové prostředí Delphi je založeno na jazyku Object Pascal. Téměř každé vývojové prostředí se skládá ze tří částí, a to z textového editoru, překladače a debuggeru. Textový editor slouží k samotnému zápisu zdrojového kódu, překladač daného jazyka překládá zdrojový kód zapsaný programátorem do strojového kódu, tj. do podoby, se kterou může pracovat procesor, a debugger je ladicí nástroj sloužící k ladění programů. Delphi, ale i některá jiná vývojová prostředí obsahují navíc systém pro rychlý vývoj aplikací (RAD), který umožňuje snadné vytváření vizuálních návrhů grafického uživatelského rozhraní. 1.2.2 Spuštění vývojového prostředí Spuštění vývojového prostředí: Ikona na ploše Delphi 7 nebo Start programy Borland Delphi 7 Delphi 7 Spuštění konzoly: File New Other... Console Application Spuštění programu: Klávesa F9 4

1.2.3 Ukázka a popis vývojového prostředí Na následujícím obrázku je zobrazena pracovní plocha vývojového prostředí Delphi 7. Červeně jsou zvýrazněny prvky, které budeme využívat: pracovní okno pro zápis zdrojového kódu (editor kódu) a zelený trojúhelník pro spuštění programu. Nezvýrazněné ikony panelu nástrojů se zpravidla využívají při tvorbě programů v rámci objektového programování. 1.3 Základní struktura programu program Název programu; {hlavička programu je povinná a obsahuje název programu} {V této části se deklarují globálně dostupné prvky programů, které se budou později využívat. Jsou jimi konstanty (za klíčovým slovem const); proměnné (za klíčovým slovem var); typy (za klíčovým slovem type); procedury a funkce.} {příkazová část je tvořena posloupností příkazů} 5

1.4 Základní pojmy 1.4.1 Co je to příkaz? Příkaz v tomto smyslu přestavuje předpis pro vykonání určité operace. Příkazy se vykonávají ve stejné posloupnosti, v jaké byly zapsány, není-li řídicí strukturou určeno jinak. Příkazy se dělí na ty, které mění tok programu (cykly, větvení atd.), a na ty, které mění stav paměti (vstupní/výstupní příkazy atd.). 1.4.2 Klíčová slova Klíčová slova vyznačují jednotlivé konstrukce jazyka, podle nichž se překladač orientuje ve zdrojovém kódu. Mají jednoznačně definovaný význam, nelze je měnit a nemohou být použita v jiném významu. Klíčovými slovy v Object Pascalu jsou např. výrazy, end, if, else, do, div, var, while, and, array, class, for, in, or, repeat, set, type atd. 1.4.3 Rezervovaná slova Rezervovaná slova se od klíčových slov liší tím, že mají svůj význam pouze v určitém bloku. Mimo tento blok je možné tato slova použít jako identifikátory, z důvodu přehlednosti se však toto použití nedoporučuje. Rezervovanými slovy Object Pascalu jsou např. výrazy default, private, public, published apod. 1.4.4 Poznámky Poznámka ve zdrojovém kódu je část textu, kterou překladač při spouštění programu ignoruje. Slouží k vytváření vlastních záznamů a vysvětlivek, kterými programátor pro vlastní potřebu popisuje jednotlivé části kódu a zvyšuje tak jeho přehlednost. Object Pascal nabízí několik možností, jak poznámku zapsat. Chceme-li zapsat poznámku na více řádků, je vhodné použít složené závorky {,} a text vepsat mezi ně. Pro krátkou poznámku, tedy pro poznámku na jeden řádek je vhodnější použít dvojité lomítko //. Překladač ignoruje veškerý text, který je zapsán od tohoto znaku až do konce řádku. 1.4.5 Pravidla zápisu zdrojového kódu Zdrojový text programu se formátuje tak, aby byl co nejpřehlednější. Každý programátor si může vytvořit svůj vlastní styl podle toho, co mu vyhovuje. Existuje však několik obecných pravidel, které je vhodné při psaní programu dodržovat: každý příkaz začíná na samostatném řádku středník oddělující dva příkazy se píše za prvním z nich vnořené příkazy jsou od levého okraje odsazeny více než jejich obalující konstrukce dvojice k sobě příslušejících klíčových slov jsou psány pod sebe (např. a end, if a else) významnější části programu jsou odděleny prázdnými řádky a doplněny o komentáře do záhlaví programu se vkládá komentář, který stručně rekapituluje zadání problému, jejž program řeší 6

1.5 Příkazy výstupu Aby byl program užitečný, musí být schopný zveřejnit vypočtené výsledky. K tomu slouží příkazy výstupu. Standardní výstup (výstup na obrazovku) se zajistí příkazy Write a Writeln. Obecný tvar zápisu příkazů je: Write (P 1, P 2,, P n ); - zobrazí na standardní výstup hodnoty parametrů P 1 - P n nebo Writeln (P 1, P 2,, P n ); - zobrazí na standardní výstup hodnoty parametrů P 1 - P n, a navíc provede přechod na následující řádek Parametry P 1, P 2,, P n mohou být výrazy, proměnné nebo texty (řetězce). Výstupní text se uzavírá do apostrofů ( ) a od proměnných a výrazů se odděluje čárkami. Jednoduché výrazy jsou před vlastním výstupem vypočteny za použití příkazů Write a Writeln. Příklad výstupu na obrazovku Write ( Adresa skoly: ); - na obrazovku se vypíše text Adresa skoly: Write (20 + 30); - na obrazovku se vypíše výsledek výrazu, čili 50 Write ( Obvod ctverce je:, 4*15, cm ); - na obrazovku se vypíše text Obvod ctverce je: 60 cm Problematika výstupu je značně rozsáhlá. Výše uvedený přehled bude v budoucnu dále rozšiřován. * * * Procvičení: Všechny programy opatřete poznámkou, ve které bude uvedeno jméno programu a k jakým výpočtům je určen. (01) Napište program, který na obrazovku vypíše pozdrav (např. Zdravím všechny!). (02) Vytvořte program, který na obrazovku vypíše název a adresu vaší školy. Jednotlivé položky adresy budou uvedeny na samostatných řádcích. (03) Rozšiřte předchozí program (02) tak, aby mezi názvem školy a adresou byl jeden volný řádek. (04) Napište program, který na obrazovku vypíše obvod a obsah obdélníka, jehož velikosti stran jsou: a = 5 cm, b = 7 cm. (Program vypíše informaci o tom, co bude počítat, rozměry obdélníka a na samostatných řádcích bude vypsán obsah a obvod.) 7

1.6 Identifikátory Identifikátory (jména) se používají jako označení proměnných, konstant, typů, procedur, funkcí a mnoha dalších objektů, které jsou programem používány. Identifikátorem je posloupnost písmen a číslic, která začíná písmenem a je různá od klíčových a rezervovaných slov. V identifikátoru mohou být použita malá a velká písmena anglické abecedy spolu se znakem podtržítka _, a číslic 0 až 9. Příklady SPRÁVNĚ vytvořených identifikátorů Cislo, SoucetCisel, Pocet_znaku, X_1, ZNAK apod. Příklady NESPRÁVNĚ vytvořených identifikátorů Identifikátor 1pomoc Číslo X>Y B-A Pocet znaku DO POZOR! G4d8ee5_bl Popis chyby Identifikátor musí začínat písmenem. Znaky české abecedy, které nejsou zároveň znaky abecedy anglické, nepatří mezi písmena (č, š, ř, ž, ě apod.). Speciální symboly nelze použít. Znak minus (pomlčka) nelze použít, nejedná se o znak podtržítka. Oddělovač (mezera) nesmí být součástí identifikátoru. Klíčové slovo nemůže být použito jako identifikátor. Znak vykřičníku nesmí být použit. Syntakticky správný identifikátor, ale nesrozumitelný. 1.7 Datové typy Object Pascal je silně typizovaný programovací jazyk, a každá proměnná proto musí mít svůj datový typ. Datový typ určuje, jaké operace může kompilátor (překladač) s proměnnou provádět a jakým způsobem jsou data v proměnné uložena na harddisku. Object Pascal má k dispozici širokou škálu standardních datových typů, které lze rozšířit o typy, jež si nadefinuje sám uživatel. Datové typy se v Object Pascalu dělí na typy ordinální, číselné s pohyblivou desetinnou čárkou (reálná čísla), řetězcové, strukturované, ukazatelové a na typ Variant. 1.7.1 Ordinální typy Ordinálními typy se rozumí všechny takové typy, které mají omezený počet hodnot a které můžeme navíc snadno seřadit jeden za druhým. Na ordinálních typech potom můžeme definovat funkce Pred (z angl. Predecessor předchůdce) a Succ (z angl. Successor následník), které vracejí předchůdce, resp. následníka zadaného prvku. Mezi ordinální prvky patří všechny celočíselné datové typy, znakové sady, booleovské typy a typ výčtový. Celočíselné datové typy Object Pascal nabízí pro reprezentaci celých čísel hned několik datových typů. Tyto typy se liší svým rozsahem (tj. intervalem hodnot, jež mohou proměnné daného typy nabývat) a také nároky na místo v paměti. 8

Přehled celočíselných datových typů Typ Rozsah hodnot Formát ShortInt -128... 127 8 bitů se znaménkem Byte 0... 255 8 bitů bez znaménka SmallInt -32 768... 32 767 16 bitů se znaménkem Integer podle prostředí 16 nebo 32 bitů se LongInt -2 147 483 648... 2 147 483 647 znaménkem 32 bitů se znaménkem Znakový datový typ Char Datový typ Char je výchozím typem pro práci se znaky. Do proměnné tohoto typu je možné uložit jeden libovolný znak, který se ve zdrojovém kódu ohraničuje apostrofy ( ). Je-li v programu napsáno 5, znamená to konstanta s číselnou hodnotou pět. Je-li v programu napsáno 5, znamená to konstanta pro znak pětky. Jednotlivé hodnoty typu Char jsou v počítači ukládány pomocí kódu, tj. každému znaku je přiřazeno konkrétní číslo (vychází z ASCII tabulky). Díky tomu lze mezi sebou jednotlivé hodnoty typu Char porovnávat (menší znak má menší číslo v ASCII tabulce). Ukázka uspořádání číslic a písmen anglické abecedy: 0 < 1 < 2 <... < 9 < A < B <... < Z < a < b <...< z Typ Boolean Booleovský typ reprezentuje pouze dvě hodnoty pravda (true) a nepravda (false). Pravda je reprezentovaná hodnotou jedna (1) a nepravda hodnotou nula (0). Výčtový typ Tento typ si definuje každý uživatel sám podle svých potřeb, a to buď vyjmenováním všech hodnot, jakých může proměnná nabývat, nebo pomocí intervalu. Definice může vypadat následovně: var rocniobdobi : (jaro, leto, podzim, zima); var nabytek : (zidle, skrin, postel, stul); var pocetstenat : 0..12; var cislice : 0..9; Při definici výčtového typu vyjmenováním všech hodnot nelze použít jako hodnoty číslice či znaky (např. A ). Musí se definovat vlastní prvky pomocí platných identifikátorů (hodnota zde vystupuje jako konstanta, tedy identifikátor). Při definici pomocí intervalu musí být tento interval ordinálního typu. Interval musí být spojitý, to znamená, že nemůže být složen např. ze dvou různých intervalů. Jednotlivým prvkům tohoto typu jsou přiřazeny hodnoty od nuly, tedy: Ord (jaro) = 0 Ord (leto) = 1 Ord (podzim) = 2 Ord (zima) = 3 // význam Ord bude vysvětlen vyučujícím 9

1.7.2 Datové typy reálných čísel Provádění nejrůznějších operací nad reálnými čísly je při programování velmi častým jevem. K tomu účelu Object Pascal nabízí hned několik datových typů reálných čísel. Tak jako celočíselné datové typy se i tyto datové typy liší svým rozsahem hodnot a nároky na místo v paměti. Přehled datových typů pro reálná čísla Typ Rozsah hodnot Počet bytů Real 5,0x10-324.. 1,7x10 308 v závislosti na platformě Single 1,5x10-45.. 3,4x10 38 4 Double 5,0x10-324.. 1,7x10 308 8 Extended 3,6x10-4951.. 1,1x10 4932 10 1.7.3 Datové typy řetězců Řetězcové datové typy se používají k uchovávání celých znakových řetězců, tj. řetězců, které jsou složeny z konečného počtu jednotlivých znaků (Char). Pro krátké řetězce se používá datový typ String, kde je délka řetězce omezena na 255 znaků. Více o výčtových a strukturovaných typech později. 1.8 Proměnné, konstanty a jejich deklarace Pojem proměnná je v programování chápán jako symbolické označení (jméno) pro určitou oblast paměti, ve které jsou uložena data daného typu. Hodnoty proměnných mohou být za chodu programu měněny. Každá použitá proměnná musí být nejprve nadeklarována v bloku deklarací tak, že se za klíčové slovo var uvede jméno proměnné, dvojtečka a její datový typ. Konstanty se od proměnných liší tím, že jejich hodnotu nelze za chodu programu měnit. Konstanty se deklarují pomocí klíčového slova const. Obecná deklarace proměnné: var název_proměnné(identifikátor): typ; Příklad deklarace proměnných: var Cislo, Soucet2: integer; Znak: char; Obecná deklarace konstanty: const název_konstanty(identifikátor) = hodnota; Příklad deklarace konstant: const Dny_v_tydnu = 7; PrvniDen = pondělí ; Výpis proměnných a konstant na obrazovku (tj. na standardní výstup) se provádí pomocí příkazů výstupu write a writeln tak, že se jako parametr uvede identifikátor proměnné. V mnoha případech je třeba výstupní parametr naformátovat do požadovaného tvaru, tj. číselná hodnota se například bude vypisovat na předem daný počet znaků. 10

Formátování celého čísla writeln (parametr:n); číslo, které je formátováno počet znaků výstupní hodnoty Příklad formátovaného výstupu celočíselných parametrů: writeln ( Obvod obdélníka je:, vysledek:5); Na obrazovku se vypíše text Obvod obdélníka je:, za kterým bude uvedena hodnota proměnné výsledek. Tato hodnota bude zobrazena na pět míst. Formátování reálného čísla writeln (parametr:n:d); číslo, které je formátováno celkový počet znaků výstupní hodnoty počet znaků na desetinných místech Příklad formátovaného výstupu reálných parametrů: writeln ( Obvod kruhu je:, vysledek:7:3); Na obrazovku se vypíše text Obvod kruhu je:, za kterým bude uvedena hodnota proměnné výsledek. Tato hodnota bude zobrazena celkem na 7 míst, z nichž 3 místa budou vyhrazena pro desetinnou část. 1.9 Výrazy Výraz je předpis pro získání hodnoty, který je tvořen z operandů, operátorů a okrouhlých závorek. operandy jsou číslice, číselné proměnné, číselné konstanty operátory jsou +, -, *, / a další výraz uzavřený v závorkách bude vyhodnocován jako první násobení a dělení je vyhodnoceno dříve než sčítání a odčítání (není-li závorkami stanoveno jinak) 11

Příklad správně vytvořeného výrazu PI v tomto příkladě vystupuje jako konstanta. Operandy (3 + 6) * 8 / PI Operátory * * * Procvičení: Všechny programy opatřete poznámkou, ve které bude uvedeno jméno programu a k jakým výpočtům je určen. (05) Rozšíření předchozího příkladu (04). Napište program, který na obrazovku vypíše obvod a obsah obdélníka, jehož strany mají velikost: a = 5 cm, b = 7 cm. (Program vypíše informaci o tom, co bude počítat, rozměry obdélníka a na samostatných řádcích bude vypsán obsah a obvod. Řešte s použitím konstant.) (06) Vytvořte program, který na obrazovku vypíše obvod a obsah kruhu, jehož poloměr je 15 cm. (Program vypíše informaci o tom, co bude počítat, velikost poloměru a na samostatných řádcích bude vypsán obsah a obvod. Řešte s použitím konstant.) (07) Rozšiřte předchozí příklad (06) o formátování výstupu. Výsledek bude vypsán na 9 míst, z nichž 3 místa budou vymezena pro desetinnou část. 1.10 Přiřazovací příkaz Jde o nejzákladnější a nejčastěji používaný příkaz, jehož prostřednictvím se mění hodnota proměnné. Přiřazovací příkaz má tvar: proměnná := výraz Příklad přiřazovacího příkazu: Cislo_1 := 5; Cislo_2 := 66; SoucetCisel := Cislo_1 + Cislo_2; Postup zpracování přiřazovacího příkazu: 1. Určí se cíl přiřazení (proměnná na levé straně). 2. Vyhodnotí se výraz na pravé straně. 3. Získaná hodnota se uloží do stanovené cílové proměnné. 12

1.11 Příkaz vstupu Každý program potřebuje odněkud získávat informace, které bude zpracovávat, případně přijímat pokyny ovlivňující jeho další činnost. K tomuto účelu slouží vstup. Pro standardní vstup neboli načítání údajů z klávesnice slouží příkaz Readln (seznam_proměnných); Readln (p1, p2,...); Seznam_proměnných je seznam identifikátorů proměnných, jejichž hodnoty mají být načteny, identifikátory jsou odděleny čárkami. Příklad vstupu z klávesnice Readln (Cislo_1); Bude-li na klávesnici jako vstup zadána např. hodnota 45, bude mít po provedení uvedeného příkazu proměnná Cislo_1 hodnotu 45. Readln (Cislo_2, Cislo_3); Bude-li na klávesnici jako vstup zadáno např. 454 6, bude mít po provedení uvedeného příkazu proměnná Cislo_2 hodnotu 454 a proměnná Cislo_3 hodnotu 6. Poznámka: Všimněte si zápisu vstupu, pro oddělení hodnot proměnných se využívá mezera. * * * Procvičení: Všechny programy opatřete poznámkou, ve které bude uvedeno jméno programu a k jakým výpočtům je určen. (08) Napište program, který vyzve uživatele k zadání dvou celých čísel a vypíše na obrazovku jejich součet. (09) Upravte program (05) na výpočet obvodu a obsahu obdélníka tak, aby hodnoty pro výpočet byly zadány uživatelem (datový typ proměnných si zvolte libovolně). (10) Upravte program (07) na výpočet obvodu a obsahu kruhu tak, aby hodnota π vystupovala ve zdrojovém kódu jako konstanta a velikost poloměru byla zadávána uživatelem. (11) Napište program, který převede zadanou hodnotu v metrech na kilometry, decimetry, centimetry a milimetry. Program vypíše všechny převody. (12) Přizpůsobte předešlý program (11) na převod čtverečních jednotek. Program bude převádět čtverečné metry na decimetry čtverečné, centimetry čtverečné a milimetry čtverečné. 13

(13) Vytvořte program na převod české měny do zahraniční. Uživatel zadá částku v českých korunách a kurz a program na obrazovku vypíše částku v cílové měně. (14) Napište program, který vypočítá váš index tělesné hmotnosti (BMI). Program vyzve uživatele k zadání vstupních hodnot výška postavy v metrech a tělesnou hmotnost v kilogramech. BMI se vypočítá jako podíl tělesné hmotnosti a druhé mocniny výšky postavy v metrech. Program zároveň vypíše tabulku s jednotlivými kategoriemi BMI (hodnoty BMI pro podváhu, průměr a nadváhu). (15) Vytvořte program, který spočítá konečný zůstatek na vašem spořicím účtu. Uživatel zadá výši vkladu, dobu spoření (v měsících) a úrok u spořicího učtu (p.a.). (Předpokládejte, že se každý měsíc připisuje úrok pouze z původního vkladu a neuvažujte daň z úroku.) Samostatná práce k první části * * * Máte před sebou dva měsíce letních prázdnin. Doma v kasičce se objevilo nečekaně velké množství peněz, a proto jste se rozhodli, že letošní dovolená bude trochu neobvyklá. Poletíte na dovolenou se svými kamarády a vyberete si kam. 1) Prázdniny: Rozmyslete si, kam byste se v létě chtěli podívat, a napište program, který na obrazovku vypíše text: O prázdninách poletím... [doplňte]. 2) Cena letenky: Společnost, se kterou chcete letět, uvádí zvlášť ceny letenky a zvlášť veškeré letištní poplatky. Napište program, který spočítá celkovou cenu, již za let budete muset zaplatit (tj. uživatel do programu vždy zadá cenu letenky a cenu letištních poplatků, ceny uvažujeme pouze v celých číslech). 3) Počet cestujících: Některým vašim kamarádům je více než 24 let, a cena jejich letenky je proto odlišná. Napište program, který spočítá celkovou částku, kterou budete muset za cenu letenek zaplatit (tj. uživatel do programu vždy zadá počet studentů do 24 let, počet dospělých, cenu letenky pro studenta, cenu letenky pro dospělého a letištní poplatky). 4) Zpáteční let: V internetových vyhledávačích spojení uživatel vždy vyplňuje políčka Odkud a Kam. Většina z nich disponuje i funkcí, která umožňuje hodnoty vyměnit. Napište program, který prohodí jednotlivé proměnné (tj. uživatel zadá proměnnou Odkud a proměnnou Kam a program vypíše zpáteční let tak, že prohodí obsah proměnných). 5) Vstupenky: Jedním z míst, kam se během svých prázdnin dostanete, je Paříž. Stejně jako na většinu památek je i na Eiffelovu věž rozdílné vstupné pro studenty a pro dospělé. Napište program, který spočítá celkovou cenu, již musíte za vstup zaplatit (tj. uživatel vypíše počet studentů, počet dospělých, cenu vstupenky pro studenta a cenu vstupenky pro dospělého). 6) Zmrzlina: Přímo pod Eiffelovou věží prodávají zmrzlinu. Návštěvníci si mohou vybrat, zda si koupí zmrzlinu točenou nebo kopečkovou, jejich cena není stejná. Napište program, který spočítá celkovou cenu, již zaplatíte za kopečkovou zmrzlinu, a celkovou cenu zmrzliny točené (tj. uživatel vypíše cenu točené zmrzliny, cenu kopečku a jejich celkové počty). 14

2. Oddíl II. Řízení chodu programu Tento blok se bude věnovat základním programovacím strukturám, které se používají pro řízení chodu programu. Jsou to struktury, které se běžně používají při programování i těch nejjednodušších programů a se kterými se můžete setkat téměř ve všech programovacích jazycích. Jde především o větvení programu pomocí podmínek a opakované provádění příkazů pomocí cyklů. 2.1 Větvení programu Velmi často je zapotřebí provést některou část kódu pouze v případě, že jsou splněny určité podmínky. K těmto účelům slouží podmíněný příkaz, který je buď neúplný, nebo úplný. 2.1.1 Neúplný podmíněný příkaz if podmínka then příkaz; Zpracování příkazu začne vyhodnocením podmínky. Je-li podmínka splněna, provede se příkaz (skupina příkazů), v opačném případě se neprovede žádná operace a program pokračuje. Příklad: if Cislo<0 then Cislo := -Cislo; Uvedený příklad se vyhodnotí takto: zjistí se, je-li hodnota v proměnné Cislo menší než nula. Je-li to pravda (tj. jde o záporné číslo), provede se příkaz za klíčovým slovem then, který změní záporné číslo na kladné. Není-li to pravda (tj. jde o kladné číslo), příkaz za klíčovým slovem then se neprovede. Po průchodu programu touto podmínkou je hodnota v proměnné Cislo vždy kladné číslo. Má-li se při splnění podmínky provést více příkazů, musejí být tyto příkazy napsány mezi klíčovými slovy a if podmínka then příkaz_1; příkaz_2; M příkaz_n; 15

2.1.2 Úplný podmíněný příkaz if podmínka then příkaz1; else příkaz2; Úplný podmíněný příkaz definuje i to, co se má stát, je-li podmínka nesplněna. Má-li se v každé větvi provést více příkazů, musejí být tyto příkazy opět ohraničeny klíčovými slovy a Zpracování příkazu začne rovněž vyhodnocením podmínky. Je-li podmínka splněna, provede se příkaz1 (skupina příkazů), v opačném případě se provede příkaz2 (skupina příkazů). Před klíčovým slovem else se nepíše středník, tento znak patří až na konec celého podmíněného příkazu. Podmíněné příkazy lze do sebe vnořovat. if podmínka1 then if podmínka2 then příkaz1 else příkaz2 end Rozdělit program najednou do více větví je možné pomocí několika podmíněných příkazů If, kdy každý tento příkaz představuje jednu větev. Pro rozvětvení programu do více větví (tj. 3 a více) je vhodnější použít speciální druh podmíněného příkazu Case, který má obecný tvar: case výraz of hodnoty_1: příkaz_1 hodnoty_2: příkaz_2 M hodnoty_n: příkaz_n end 16

Výraz mezi klíčovými slovy case a of může být libovolný výraz ordinálního typu. (Většinou se používá jednoduchá proměnná.) Hodnoty_1, hodnoty_2,..., hodnoty_n v levé části jsou navzájem disjunktní hodnoty (nebo intervaly), kterých může výraz po vyhodnocení nabývat. V pravé části za dvojtečkou jsou příkazy (příkaz_1, příkaz_2,..., příkaz_n), jež se v závislosti na hodnotě výrazu provádějí. Zpracování příkazu spočívá ve vyhodnocení výrazu. Následně se v levé části najde větev, která má stejnou hodnotu jako vyhodnocený výraz, a provede se příslušný příkaz za dvojtečkou. Vždy se provede jen jedna větev. Příkaz case lze rozšířit o nepovinnou větev else, která se provede v případě, že se vyhodnocený výraz nerovná žádné hodnotě uvedené vlevo od dvojtečky. Není-li větev else uvedena a hodnota výrazu je různá od všech nabízených hodnot, je příkaz case ekvivalentní prázdnému příkazu. Příklad: case cislo_dne of 7,12: write('šťastné dny v měsíci.'); 13: write('špatné dny v měsíci.'); 1..6: write('neutrální dny v měsíci.'); else write('n/a'); V uvedeném příkladu je proměnná cislo_dne ordinálního typu integer. Zpracování proběhne tak, že se porovná hodnota v proměnné cislo_dne s hodnotami uvedenými v levé části. je-li hodnota proměnné 7 nebo 12, vypíše se na obrazovku text Šťastné dny v měsíci. je-li hodnota proměnné 13, vypíše se na obrazovku text Špatné dny v měsíci. je-li hodnota proměnné v intervalu 1 až 6 (psáno 1..6), vypíše se na obrazovku text Neutrální dny v měsíci. je-li hodnota proměnné jiná než 1..6, 7, 12, 13, vypíše se na obrazovku text N/A Poznámka: proměnná mezi klíčovými slovy case a of musí být ordinálního typu (tj. celočíselný datový typ, znakový typ Char, booleovský datový typ nebo datový typ výčtový) hodnoty v levé části musí být disjunktní 2.1.3 Relační operátory Pomocí relačních operátorů lze porovnávat jak hodnoty číselné, tak i hodnoty jiné (podrobné vysvětlení bude uvedeno později). A = B A <> B A < B A je rovno B A není rovno B A je menší než B A<=B A > B A>=B A je menší rovno B A je větší B A je větší rovno B Složitější výrazy lze vytvářet pomocí pravdivostních operací, které vycházejí z matematické logiky. Negace se značí klíčovým slovem not, konjunkce neboli logický součin se značí klíčovým slovem and a pro disjunkci neboli logický součet se používá or. 17

Logické operace P Q not P P and Q P or Q True True False True True True False False False True False True True False True False False True False False 2.1.4 Volba náhodných čísel Většina programovacích jazyků umožňuje provést náhodný výběr prvku z dané množiny, čehož se často využívá například při programování her nebo při testování a ladění programů. Object Pascal náhodný výběr umožňuje také, a to pomocí spuštění generátoru náhodných čísel randomize a funkce random. Funkce random se používá k náhodnému výběru (volbě) přirozeného čísla, kdy se jako parametr do závorek uvádí horní mez, která je vždy o jedna menší než zadané číslo v závorce. Například pro náhodný výběr čísla od jedné do dvaceti se jako parametr uvede číslo 21 tj. random(21). Dále je možné funkci random použít k náhodnému výběru desetinného čísla v intervalu 0 x < 1. V takovém případě se neuvádí parametr, tj. random. Aby bylo možné s náhodně zvoleným číslem dále pracovat, je třeba je uložit do proměnné. nahodnecislo := random(10); Kdyby byla v programu použita pouze funkce random, generoval by program při spuštění vždy tatáž čísla. Aby byl výběr při každém spuštění programu jiný, musí se do příkazové části zdrojového kódu (tj. mezi a end) zápisem randomize spustit generátor náhodných čísel. Příklady volby náhodného čísla: randomize; // spuštění generátoru náhodných čísel x:= random(10); // náhodný výběr čísla od 0 do 9 y:= 1 + random(10); // náhodný výběr čísla od 1 do 10 z:= 100 * random; // náhodný výběr reálného čísla v intervalu 0 x < 100 * * * Procvičení: Všechny programy opatřete poznámkou, ve které bude uvedeno jméno programu a k jakým výpočtům je určen. (16) Napište program, který vyzve uživatele k zadání dvou celých (reálných) čísel a zadaná čísla porovná. Výsledek vypíše na obrazovku. 18

(17) Vytvořte program, který rozhodne, zda číslo zadané uživatelem bylo liché, nebo sudé. (Použijte operaci mod vrací celočíselný zbytek po dělení. Syntaxi vyhledejte pomocí nápovědy F1 nebo v referenčních příručkách jazyka Object Pascal.) (18) Napište program, který uživatele vyzve k zadání tří celých (reálných) čísel, zadaná čísla porovná a vypíše největší z nich. (19) Vytvořte program, který převede zadanou hodnotu v metrech na jinou jednotku délky. Uživatel si sám vybere, zda chce provést převod na kilometry, decimetry, centimetry či milimetry. Jako základ můžete použít předchozí příklad (11). (20) Upravte program (14) na výpočet BMI tak, aby nevypisoval celou tabulku s jednotlivými kategoriemi BMI, ale jen jednu kategorii, která odpovídá výsledné hodnotě BMI uživatele. (21) Vytvořte program, do něhož uživatel zadá tři libovolná čísla, a program je poté sečtěte. Dále určí, zda je součet zároveň dělitelný šesti i devíti. (22) Vytvořte program, který vyzve uživatele k zadání libovolného znaku z klávesnice. Program poté vypíše na obrazovku, zda se jedná o číslici (0-9), malé písmeno, velké písmeno nebo jiný znak. (23) Naprogramujte program, který vypočítá cenu za jízdu taxíkem. Uživatel zadá vzdálenost (může být i desetinné místo), jakou taxíkem urazil, a program mu podle sazby vypočítá cenu, kterou má zaplatit. Neuvažujeme nástupní taxu. Sazba za jízdu je: 0 14 km 40 Kč/km 15 34 km 36 Kč/km 35 59 km 32 Kč/km 60 a více 25 Kč/km Poznámka: Je-li zadaná vzdálenost 14,8 km, sazba je stále 40 Kč/km. Řešte pomocí příkazu case a použijte funkci trunc(r), která vrací celou část reálného čísla. Použití této funkce nastudujte z nápovědy F1 nebo v referenčních příručkách jazyka Object Pascal. (24) Vytvořte program, který uživatele vyzve k zadání tří libovolných čísel, tato čísla pak seřadí podle velikosti a ve správném pořadí vypíše na obrazovku. 2.2 Cykly Opakované provádění příkazů je v programování velice častým jevem, a proto je nezbytné se s touto problematikou seznámit. Zjednodušeně by se dalo říci, že se používají dva základní druhy cyklů cyklus řízený podmínkou a cyklus s pevně daným počtem opakování. Cykly řízené podmínkou Object Pascal nabízí dvě různé konstrukce cyklů, jež jsou řízeny podmínkou. Prvním z nich je cyklus s příkazem While, který má podmínku na začátku, druhým je cyklus s příkazem Repeat s podmínkou na konci. 19

Cyklus s podmínkou na začátku Cyklus s podmínkou na konci 2.2.1 Cyklus s příkazem While Cyklus s příkazem while má následující tvar: while podmínka do příkaz (tento příkaz se nazývá tělo cyklu) Význam cyklu s příkazem while by bylo možné zapsat následovně: dokud platí podmínka, opakuj příkaz. Zpracování cyklu probíhá takto: 1. vyhodnotí se podmínka 2. jestliže podmínka neplatí (není pravda), cyklus se ukončí a program pokračuje příkazem, který následuje za tělem cyklu 3. jestliže podmínka platí (je pravda), provede se tělo cyklu 4. provádění programu se vrátí k bodu 1 (opakuje se celý postup) Je-li tělo cyklu tvořeno více než jedním příkazem, musejí být tyto příkazy ohraničeny klíčovými slovy a Poznámka: Zpracování While-cyklu začíná vyhodnocením podmínky. Není-li tato podmínka splněna hned na začátku, tělo cyklu se neprovede ani jednou. Celý cyklus se ukončí a program pokračuje příkazem, který následuje za tělem cyklu. Tento příkaz používáme tehdy, neznáme-li předem přesný počet opakování potřebných k dosažení cílového stavu. Ukončení je reprezentováno splněním dané podmínky. 20

Poznámka: Dávejte pozor na to, aby vaše podmínka mohla někdy nabýt hodnoty nepravda. V opačném případě by se cyklus prováděl do nekonečna (tzv. nekonečný cyklus) a program by nikdy nemohl skončit. V takovém případě se program ukončuje násilným zásahem zvenku. Ukázkový příklad cyklu s příkazem While: Zadání: Program vyzve uživatele k zadání přirozeného čísla n. Poté vypíše čísla od 1 do n, každé na nový řádek. (Předpokládáme, že uživatel nezadá jiné číslo než přirozené.) program While_1; var n,i:integer; // název programu //deklarace proměnných write('zadej pocet vypisovanych cisel: '); // vyzve uživatele k zadání čísla readln(n); // načtení čísla do proměnné n i:=0; // proměnná i je nastavena na hodnotu nula while i<n do i:=i+1; writeln(i); // začátek cyklu... podmínka zní: jestliže i je menší než n, proveď tělo cyklu. Mezi klíčovými slovy /end je tělo cyklu. Při jednom průchodu tělem se zvýší hodnota i o jedničku a vypíše se jeho hodnota. 2.2.2 Cyklus s příkazem Repeat Cyklus s příkazem Repeat má následující tvar: repeat příkaz_1 příkaz_2 M příkaz_n until podmínka Význam tohoto cyklu by bylo možné vyjádřit takto: opakuj příkazy, dokud nezačne platit podmínka. Zpracování cyklu probíhá následovně: 1. provedou se příkazy v těle cyklu 2. poté se vyhodnotí podmínka 3. jestliže je podmínka neplatná (není pravda), opakuje se postup od bodu 1 4. je-li podmínka splněna (pravda), cyklus se ukončí a program pokračuje prvním příkazem za cyklem 21

Poznámka: Cyklus Repeat (s podmínkou na konci) začíná provedením příkazů, které tvoří tělo cyklu. Z toho vyplývá, že se tělo cyklu provede alespoň jednou, což u cyklu s podmínkou na začátku neplatí. Pomůcka: while Máš hlad? do repeat Tak jez. Najez se. until Jsi syt? Jednotlivé cykly lze vzájemně zaměňovat. To znamená, že je zpravidla jedno, použije-li se cyklus While nebo Repeat. V některých případech je však výhodnější použít jeden, v jiných zase druhý. Volba cyklu záleží na charakteru úlohy i na osobním vkusu programátora. Ukázkový příklad cyklu s příkazem Repeat: Cykly s podmínkou na začátku a na konci je v mnoha případech možné vzájemně zaměňovat, proto je pro ukázkový příklad cyklu s příkazem Repeat použito stejné zadání jako pro cyklus s příkazem While. Zadání: Program vyzve uživatele k zadání přirozeného čísla n. Poté vypíše čísla od 1 do n, každé na nový řádek. (Předpokládáme, že uživatel nezadá jiné číslo než přirozené.) program Repeat_1; var n,i:integer; // název programu //deklarace proměnných write('zadej pocet vypisovanych cisel: '); // vyzve uživatele k zadání čísla readln(n); // načtení čísla do proměnné n i:=0; // proměnná i je nastavena na hodnotu nula repeat i:=i+1; writeln(i); until i=n; //začátek cyklu... nejprve se provedou příkazy (tělo cyklu) mezi klíčovými slovy repeat/until, tj. zvýší se hodnota proměnné i o jedničku a její hodnota se vypíše na obrazovku. Poté se vyhodnotí podmínka. Je-li podmínka pravdivá, cyklus se ukončí, v opačném případě se tělo cyklu provede znovu. * * * Procvičení: Všechny programy opatřete poznámkou, ve které bude uvedeno jméno programu a k jakým výpočtům je určen. (25) Program (19) má zásadní nedostatek v tom, že zadá-li uživatel jiný znak, než je požadováno, převod se neprovede. Upravte proto program tak, aby vždy došlo k požadovanému převodu jednotek, tj. v případě, že uživatel zadá špatný znak, program vyčká na zadání znaku odpovídajícího. 22

(26) Naprogramujte hru na hádání čísla. Program náhodně vygeneruje číslo z intervalu 1..100, úkolem hráče je toto číslo uhodnout. Vytvořte hru tak, aby hádající věděl, zda je jeho tip větší nebo menší než hádané číslo. (27) Upravte předchozí hru tak, aby měl hráč na uhodnutí čísla jen osm pokusů a aby měl přehled o tom, kolik pokusů mu ještě zbývá. V případě neúspěchu se na konci vypíše hledané číslo a informace, že hráč číslo neuhodl. (28) Zdramatizujte hru hádání čísla tak, že tipne-li si hráč číslo o jedničku větší nebo menší, než je číslo hledané, program automaticky vygeneruje nové číslo a bude o tom hráče informovat. Počet pokusů omezte podle vlastního uvážení. Cyklus s pevně daným počtem opakování: Object Pascal nabízí pro cyklus s předem daným počtem opakování konstrukci s příkazem For. 2.2.3 Cyklus s příkazem For Cyklus s příkazem For má následující tvar: nebo for počítadlo := DolníMez to HorníMez do příkaz for počítadlo := HorníMez downto DolníMez do příkaz Počítadlo je proměnná ordinálního typu, při každém průchodu programu cyklem se mění její hodnota o jedničku. Je-li použit tvar s to, počítadlo se při průchodu o jedničku zvyšuje, je-li použit tvar s downto, počítadlo se při průchodu o jedničku snižuje. Cyklus končí v okamžiku, kdy počítadlo dosáhne stejné hodnoty, jako je krajní mez cyklu. Tento cyklus se používá tehdy, známe-li předem přesný počet průchodů. Je-li tělo cyklu tvořeno více než jedním příkazem, musejí být tyto příkazy ohraničeny klíčovými slovy a Ukázkový příklad cyklu s příkazem For: Pro demonstraci příkladu cyklu s příkazem For bude použito stejné zadání jako pro cyklus s příkazem While a Repeat. program For_1; var n,i:integer; 23

write('zadej pocet vypisovanych cisel: '); readln(n); for i:=1 to n do writeln(i); //začátek cyklu //při každém průchodu cyklem se bude //provádět příkaz writeln(i) * * * Procvičení: Všechny programy opatřete poznámkou, ve které bude uvedeno jméno programu a k jakým výpočtům je určen. (29) Vytvořte program, který na obrazovku počítače vypíše všechna sudá čísla z intervalu 1 < x < 30. Pro výpis použijte cyklus s příkazem For. (30) Vytvořte program, jenž na obrazovku vypíše tabulku druhých mocnin čísel od 1 do 20. (31) Napište program, jehož výstup na obrazovce bude vypadat takto: 1 6 2 5 3 4 4 3 5 2 6 1 Počet čísel ve sloupcích bude zadán uživatelem. (32) Vytvořte program, který na obrazovku vypíše pyramidu ze znaku * tak, aby byl vrchol pyramidy přibližně šest řádků od horního okraje obrazovky a aby byl horizontálně zarovnán doprostřed okna. Počet vypisovaných řádků pyramidy si uživatel určí sám. (Předpokládejme, že uživatel zadá nejvíce 30 řádků.) Pyramida na šest řádků bude vypadat takto: * * * * * * * * * * * * * * * * * * * * * (33) Upravte předchozí příklad (32) s pyramidou tak, aby se pyramida vypsala převráceně, tj. vrcholem dolů. Převrácená pyramida na šest řádků bude vypadat takto. * * * * * * * * * * * * * * * * * * * * * 24

(34) Představte si posloupnost přirozených čísel, ve které se každá číslice opakuje tolikrát, jaká je její hodnota, tj. 1,2,2,3,3,3,4,4,4,4, atd. (posloupnost je vzestupná). Vytvořte program, který bude umět určit číslici na libovolné pozici posloupnosti. Pozici posloupnosti bude opakovaně zadávat uživatel. Pro ukončení programu uživatel zadá nulu. (35) Rozšiřte jeden z předchozích příkladů s pyramidou tak, aby si uživatel sám zvolil znak, ze kterého bude pyramida postavena. (36) Vytvořte program na výpočet zůstatku na spořicím účtu. Uživatel zadá částku, kterou chce na spořicí učet vložit, úrok spořicího účtu (p.a.) a délku spoření v měsících. Úrok se bude na účet připisovat každý měsíc z aktuálního zůstatku na účtu. Program bude brát v úvahu i patnáctiprocentní daň z úroku. 25

3. Oddíl III Pole a řetězec Tento blok se bude věnovat základnímu strukturovanému datovému typu pole, který se objevuje téměř ve všech programovacích jazycích. Datový typ pole lze rozdělit na pole statická a dynamická, případně na pole jednorozměrná a vícerozměrná. Problematika polí je značně rozsáhlá, tento blok se proto bude věnovat jen jednomu typu, a to poli statickému jednorozměrnému. Dále se tento blok bude věnovat datovému typu String, ke kterému lze přistupovat obdobně jako k datovému typu pole. 3.1 Statické jednorozměrné pole a příkaz Array Strukturovaný datový typ pole umožňuje snadně zpracovávat skupinu souvisejících dat. Pod pojmem statické jednorozměrné pole je možné si představit konečnou skupinu prvků stejného datového typu (tj. všechny prvky pole mají stejný typ, např. integer nebo char). Počet prvků pole je dán při deklaraci a za běhu programu jej nelze měnit. Každý prvek (položka) pole je přímo přístupný a má své jedinečné označení, tzv. index. Ordinální hodnota indexu následujícího prvku je vždy o jedničku větší než ordinální hodnota prvku výchozího. Při práci s poli se velmi často využívá cyklu s příkazem For. Datový typ pole se v Object Pascalu definuje pomocí klíčového slova array: array[typ_indexu] of typ_položky typ_indexu je libovolný ordinální typ, který stanoví, jak budou prvky pole indexovány a kolik jich bude. Zpravidla bývá používán interval datového typu Integer typ_položky je libovolný datový typ, který určuje, jaký typ budou mít jednotlivé prvky pole Deklaraci pole v Object Pascalu je možné provést v zásadě dvěma způsoby. Pro účely tohoto studijního materiálu postačí, bude-li předvedena deklarace typu pole, v němž bude pomocí klíčového slova type vytvořen (nadefinován) datový typ pole a za klíčovým slovem var nadeklarován potřebný počet proměnných toho typu. Tato deklarace vypadá následovně: Obecně: type název_pole = array[typ_indexu] of typ_položky var název_proměnné_pole(identifikátor):typ_pole; název_pole je identifikátor, který slouží k identifikaci pole a přístupu k němu 26

Příklady deklarací polí: type poledny = array [1..7] of string; polemesice = array [1..12] of string; var dny : poledny; mesice : polemesice; Výše uvedený příklad ukazuje deklaraci strukturovaného datového typu pole. Za klíčovým slovem type jsou vytvořena dvě pole. První typ pole s názvem poledny má sedm prvků typu String (řetězec), typ_indexu je od jedné do sedmi. Dvanáct prvků druhého typu pole polemesic má stejný datový typ String (řetězec), prvky jsou indexovány od jedné do dvanácti. Za klíčovým slovem var jsou vytvořeny dvě proměnné těchto polí. Proměnná dny má sedm prvků, proměnná mesice má prvků dvanáct. Poznámka: Budeme-li ve zdrojovém kódu pracovat s poli, použijeme pro ně proměnné typu pole. V tomto případě proměnné dny, mesice (práce s poli bude upřesněna níže). Další způsoby deklarace polí pomocí klíčového slova type. Příklady jsou uvedeny bez deklarace proměnných za klíčovým slovem var. type polecisel = array [1..20] of real; Deklarace typu pole s názvem polecisel, které má dvacet prvků typu Real, jež jsou indexovány od jedné do dvaceti. const min=1; max=20; type polecisel = array [min..max] of integer; Typ_indexu může obsahovat i konstanty, jako je tomu v tomto příkladě. Důležité je, aby byly konstanty vytvořeny před samotnou deklarací pole. const min=1998; max=2008; type polecisel = array [min..max] of integer; Typ_indexu nemusí vždy začínat (být indexován) od jedničky. Je možné použít jiné indexování, viz výše uvedený příklad. type poleznaku = array [1..10] of char; Zde je uveden příklad deklarace pole znaků, které má deset prvků typu Char a typ_indexu je od jedné do deseti. 27

3.1.1 Přístup k prvkům pole K jednotlivým položkám pole lze přistupovat (číst nebo měnit jejich hodnotu) tak, že se ve zdrojovém kódu nejprve uvede identifikátor (název) proměnné daného typu pole, za který se do hranatých závorek přidá index požadované položky. Při přístupu k položkám pole nesmí index v hranatých závorkách překročit (přetéct) meze indexu pole. Jinými slovy, index nesmí odkazovat mimo pole. 3.1.2 Plnění polí Ukážeme si dva způsoby, jimiž je možné pole naplnit. První způsob je ten, že programátor hodnoty jednotlivých složek pole vyplní ve zdrojovém kódu. Tento způsob se v programátorské praxi zpravidla nepoužívá. Jeho využití je omezeno především pro účely výuky práce s poli. Druhý způsob je dynamický, tj. pole se naplní teprve při běhu programu. Hodnoty jednotlivých položek může program získat různými způsoby: jsou zadány uživatelem, program je náhodně vygeneruje nebo načte z externího souboru apod. Příklady plnění pole: Vytvoříme pole poledny, které bude mít sedm prvků (složek) typu String. Prvky pole budou obsahovat jednotlivé dny v týdnu, viz obr.: První způsob pole naplní programátor ve zdrojovém kódu type poledny = array [1..7] of string; var dny : poledny; dny[1]:= 'Pondělí'; dny[2]:= 'Úterý'; dny[3]:= 'Středa'; dny[4]:= 'Čtvrtek'; dny[5]:= 'Pátek'; dny[6]:= 'Sobota'; dny[7]:= 'Neděle'; // v tomto okamžiku je pole naplněno a můžeme s jeho daty pracovat 28

Druhý způsob pole naplní uživatel poté, co jej program vyzve k zadání jednotlivých dnů type poledny = array [1..7] of string; var dny : poledny; i:integer; for i:= 1 to 7 do write('zadej ',i,' den v tydnu: '); readln(dny[i]); // v tomto okamžiku je pole naplněno, následující příkaz For jednotlivé prvky pole vypíše na obrazovku for i:= 1 to 7 do writeln(dny[i]); * * * Procvičení: Všechny programy opatřete poznámkou, ve které bude uvedeno jméno programu a k jakým výpočtům je určen. (37) Vytvořte jednoduchý program tak, že nadefinujete pole, které bude mít pět prvků, prvky budou mít datový typ Integer. Pole naplňte libovolnými hodnotami a poté je pomocí cyklu s příkazem For vypište na obrazovku do dvou řádků. V prvním řádku budou hodnoty jednotlivých složek pole vypsány v pořadí, v jakém jste je zadali, v druhém řádku budou tyto hodnoty vypsány v pořadí obráceném. (38) Upravte předcházející program (37) tak, že hodnoty zadá uživatel. Podmínky pro výpis zůstávají nezměněny. (39) Vytvořte program, který vygeneruje 15 náhodných čísel v intervalu 1 < x < 100. Tato čísla vypíše na obrazovku stejně jako v příkladu (37). (40) Rozšiřte předcházející program o nalezení největšího a nejmenšího prvku. Oba prvky se vypíší na obrazovku. 29

3.2 String a práce s řetězcem Datovému typu řetězce String byla pozornost věnována již výše. Nyní se zaměříme na jeho vlastnosti a způsob použití. Definice má tvar: string[délka_řetězce] Délka_řetězce udává maximální délku daného řetězce v intervalu od 1 do 255. Není-li délka_řetězce v definici za klíčovým slovem String uvedena, je délka řetězce automaticky nastavena na maximální velikost, tj. na velikost 255. Kratší řetězce se používají z důvodu úspory místa v operační paměti. Příklady deklarací řetězců: type Str[50] = string [50]; // zde se zavádí typ Str[50] pro ukládání řetězců o délce max. 50 znaků var jmeno: string [15]; prijmeni: string [20]; nadpis: string; // zde jsou deklarovány proměnné jmeno (max. 15 znaků), prijmeni (max. 20 znaků) a nadpis (max. 255 znaků) Datový typ String má obdobné vlastnosti jako typ pole, tj. typ String[N] je reprezentován jako array [0..N] of Char. Na pozici s indexem nula je uložena informace o aktuální délce řetězce a samotný řetězec začíná na pozici s indexem jedna. K jednotlivým pozicím (položkám) je možné přistupovat obdobně, jako je tomu u pole, tj. pomocí indexu pozice uzavřeného v hranatých závorkách. Např. jmeno[1] je první znak řetězce uloženého v proměnné jmeno. Čtení a zápis řetězců Řetězce se čtou pomocí příkazů Read a Readln tak, že se přečtou všechny znaky na řádku a přiřadí se do dané proměnné typu String. Je-li počet znaků v řetězci (na řádku) delší než deklarovaná hodnota, např. 280 znaků, jsou přebývající znaky ignorovány a do proměnné se uloží jen max. nadeklarovaná délka. Je-li počet načítaných znaků menší než max. deklarovaná hodnota, načtou se jen tyto znaky. Pro výpis proměnné typu String se používají příkazy Write a Writeln, které vždy vypíší tolik znaků, jaká je aktuální délka řetězce. 30

3.2.1 Přehled příkazů a funkcí pro práci s řetězci V následující části je uveden přehled nejpoužívanějších operací, které lze s řetězci provádět. Pro více informací je možné použít nápovědu vývojového prostředí nebo dostupné referenční příručky jazyka Object Pascal. Copy (řetězec, začátek, délka) Funkce, která vrátí podřetězec z řetězce, jehož počet znaků je zadán hodnotou délka a začíná na pozici začátek. Příklad: Copy( ZakladniSkola,4,5) // vrátí podřetězec ladni Length (řetězec) Funkce, která vrací aktuální délku řetězce zadaného v závorkách. Výsledek je typu Integer. Příklad: delka := Length ( ZakladniSkola ); // do proměnné délka vloží hodnotu 13 delka := Length (jmeno); // do proměnné délka se vloží aktuální počet znaků řetězce jmeno Delete (řetězec, odkud, delka ) Procedura, která vymaže z řetězce podřetězec s počátkem na pozici odkud, jehož počet znaků je dán hodnotou délka. Příklad: nadpis:= Základní_škola ; Delete (nadpis,3,6); // Výsledná hodnota se uloží do proměnné nadpis, jejíž hodnota je: nadpis = Zá_škola Concat (řetězec_1, řetězec_2,..., řetězec_n) Funkce spojující řetězce uvedené v závorce v jeden celek. Je-li délka zřetězeného řetězce větší než deklarovaná délka, je řetězec automaticky zakrácen na tuto délku. Výsledek má typ String. 31