Klasický podprogram, který nazýváme procedura. Jedná se v podstatě o příkaz. 1



Podobné dokumenty
Programovací jazyk Pascal

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

NPRG030 Programování I, 2015/16 1 / :25:32

dovolují dělení velkých úloh na menší = dekompozice

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

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

NPRG030 Programování I, 2018/19 1 / :25:37

NPRG030 Programování I, 2016/17 1 / :58:13

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

PODPROGRAMY PROCEDURY A FUNKCE

NPRG030 Programování I, 2010/11

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

Podprogramy; procedury a funkce

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

Pracovní listy - programování (algoritmy v jazyce Visual Basic) Algoritmus

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

NPRG030 Programování I, 2017/18 1 / :22:16

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Binární soubory (datové, typované)

Úvod do programování

Závěrečná zkouška z informatiky 2011

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Některé základní úlohy algoritmizace

Činnost: 1) Vyhodnotí se výraz E. 2) Jeho hodnota se uloží do proměnné V.

II. Úlohy na vložené cykly a podprogramy

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Přijímací zkouška z informatiky Dz

ALGORITMIZACE A PROGRAMOVÁNÍ

Programování 2 (NMIN102) Soubory. RNDr. Michal Žemlička, Ph.D.

Programy na PODMÍNĚNÝ příkaz IF a CASE

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Sada 1 - Základy programování

2 Strukturované datové typy Pole Záznam Množina... 4

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Poslední nenulová číslice faktoriálu

Sada 1 - Základy programování

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

Přijímací zkouška na navazující magisterské studium 2015

Program a životní cyklus programu

Basic256 - úvod do programování Příklady. ing. petr polách

Implementace LL(1) překladů

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Jednoduché příkazy jazyka Pascal

Programovací jazyk PASCAL Turbo

16. Goniometrické rovnice

Identifikátory označují objekty v programu používané (proměnné, typy, podprogramy).

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

ALGORITMIZACE Příklady ze života, větvení, cykly

Sada 1 - Základy programování

VISUAL BASIC. Přehled témat

Základy algoritmizace

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Typové a netypové soubory

(Úlohy z MO kategorie P, 32. část)

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Sada 1 - Základy programování

Sada 1 - Základy programování

Anotace. Soubory a práce s nimi, rekurze podruhé, struktury (datový typ record), Martin Pergel,

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

3. Derivace funkce Definice 3.1. Nechť f : R R je definována na nějakém okolí U(a) bodu a R. Pokud existuje limita f(a + h) f(a) lim

Algoritmizace. 1. Úvod. Algoritmus

2 Datové typy v jazyce C

Jednoduché cykly

Digitální učební materiál

Základy algoritmizace a programování

Základy algoritmizace a programování

Časová a prostorová složitost algoritmů

Pseudonáhodná čísla = algoritmicky generovaná náhrada za náhodná čísla

Dynamické datové typy a struktury

Už známe datové typy pro representaci celých čísel i typy pro representaci

Úvod do programování. Lekce 3

ALGORITMY A PROGRAMOVÁNÍ (ÚVOD)

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

VY_32_INOVACE_08_2_04_PR

Řízení toku programu Programátor musí být schopen nějak ovlivňovat běh programu a k tomu má několik možností:

NPRG030 Programování I, 2018/19 1 / :03:07

Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno

Několik příkladů v Turbo Pascalu

Sada 1 - Základy programování

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

Dynamické programování

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Algoritmizace a programování

Iterační výpočty. Dokumentace k projektu č. 2 do IZP. 24. listopadu 2004

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Řídicí struktury. alg3 1

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Digitální učební materiál

Úvod do programování. Lekce 1

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

Lekce 01 Úvod do algoritmizace

Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově orientované programování.

Poslední aktualizace: 14. října 2011

Uplatnění metod na zvolený jazyk

PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Transkript:

Kapitola 3 Podprogramy Jak již název napovídá, podprogram je část programu ( malý program), která může být kdykoliv v příkazové části programu (hlavního, velkého programu) aktivována. V jazyce Pascalu rozeznáváme dva druhy podprogramů (podrobně je o nich pojednáno v [3]): Klasický podprogram, který nazýváme procedura. Jedná se v podstatě o příkaz. 1 Funkční podprogram, který nazýváme funkce. Jeho úkolem je poskytnout určitou hodnotu (funkční hodnotu). Podprogramy (podalgoritmy) umožňují při algoritmizaci určitého problému použití systematické tvorby postupu řešení. Hovoříme o tzv. strukturovaném programování. Moderní postup algoritmizace vycházející z metody strukturovaného programování předpokládá rozčlenění (dekompozici) řešeného problému na podproblémy samostatně algoritmizovatelné. Podproblémy můžeme zapsat jako podprogramy, případně provést další stupeň dekompozice určitého podproblému (hovoříme o programování shora dolů). Podprogramy, na jejichž řešení se může podílet řada lidí, tvoří základní stavební prvky, z nichž komponujeme výsledný program (programování zdola nahoru).podprogramy velmi napomáhají k čitelnosti programů. Osvojení si způsobů jejich výroby (deklarace) a použití (volání) umožňuje aplikovat systematičnost a dělbu práce na tvorbě programů. Nezanedbatelná je rovněž možnost vhodně použitým podprogramem podstatně zkrátit celý program. Jak norma jazyka, tak především implementace jazyka přináší řadu standardních podprogramů, jejichž existence nám přináší zmíněné výhody: zkrácení a zpřehlednění textu programu. Vždyť bez procedur např. read, readln, write, writeln či funkcí např. sin, sqrt a dalších, si algoritmizaci v Pascalu nedovedeme ani představit. Pronikněme nejprve do problematiky algoritmů vyřešením jednoduchého problému v následujícím Příkladě 3.1. Příklad 3.1: Sestavte podprogram pro výpočet součtu celočíselných hodnot z intervalu <A,B> s přírůstkem C za předpokladu, že A,B jsou celočíselné hodnoty. Úkolem je tedy vypočítat S = B i=a i, je-li přírůstek i = 1 a platí, že A<B. Řešení podprogramu je, jak jsme již uvedli, buď v podobě procedury, nebo v podobě funkce. Podprogram, řešící určitý problém, lze sestavit vždy v podobě procedury. Uvedený problém řešíme deklarací procedury např. ve tvaru: Procedure SUMA(FA,FB:integer; var FS:integer); var I:integer; begin FS:=0; I:=FA; while I<=FB do begin FS:=FS + I; I:=I + 1 end 1 Celý program lze chápat jako jeden příkaz. Již jsme uvedli příkazy: Najdi nejmenší hodnotu z řady čísel, Vyřeš kvadratickou rovnici atp. Čtenář asi cítí, že oba uvedené příkazy lze dekomponovat vždy na např. tři příkazy: Sežeň (načti) potřebné hodnoty, Proveď zpracování vstupních hodnot a Přehledně vytiskni požadované výsledky. Řešení uvedených podproblémů může být v podobě podprogramů. 35

36 KAPITOLA 3. PODPROGRAMY Poněvadž výsledkem požadovaného úkonu má být pouze jedna hodnota jednoduchého typu, je možno zadaný problém řešit také deklarací funkce např. ve tvaru: Function SOUCET(FA,FB:integer):integer; var I,POM:integer; begin POM:=0; I:=FA; while I<=FB do begin POM:=POM+I; I:=I+1 SOUCET:=POM V obou předvedených podprogramech mohlo být místo cyklu while do použito cyklu repeat until a vzhledem k práci s proměnnými A,B ordinálního typu a přírůstku 1 (a jen právě proto) použito cyklu for to do (kdyby byl přírůstek různý od 1, popř. obě nebo některá ze vstupních proměnných A,B by byla typu desetinného čísla, pak by nebylo lze příkaz cyklu for to do použít). Kompletní program s ukázkou použití deklarovaných podprogramů může mít např. následující podobu: Program UKAZKA; var A,B,VYSL:integer; Procedure SUMA(FA,FB:integer;var FS:integer); var begin I:integer; FS:=0; I:=FA; repeat FS:=FS + I; I:=I + 1 until I>FB; Function SOUCET(FA,FB:integer):integer; var I,POM:integer; begin POM:=0; I:=FA; repeat POM:=POM+I; I:=I+1 until I>FB; SOUCET:=POM; begin write( Zadej meze od - do: );readln(a,b); SUMA(A,B,VYSL); writeln( Hodnota součtu od,a, do,b, je:,vysl); VYSL:=SOUCET(A,B); writeln( Stejnou hodnotu bychom měli vytisknout i nyní:,vysl);... konec Příkladu 3.1 konec Příkladu 3.1 Demonstrujme dále vliv podprogramů na zpřehlednění popř. i zkrácení zápisu programu. Příklad 3.2: Sestavme podprogram pro výpočet kombinačního čísla. KC = ( n k ) = n! (n k)!.k! Platí, že X! = X (X 1) (X 2)... 2 1 0!, kde 0! = 1. Program, v podstatě bez myšlenky, s prokázáním pouze určité manuální zručnosti může mít tvar: Program KOMBCISLO; {Ve standardním Pascalu: } var P,KC:longint; { Program KOMBCISLO(input,output);} N,K,I:byte; { var P,KC,N,K,I:integer; }

37 begin write( Zadej hodnoty pro výpočet N nad K: ); readln(n,k); P:=1; for I:=2 to N do P:=P*I; KC:=P; P:=1; for I:=2 to K do P:=P*I; KC:=KC div P; P:=1; for I:=2 to (N-K) do P:=P*I; KC:= KC div P; writeln( Výsledek,N, nad,k, je:,kc); Realizací myšlenky zapsat obecně (formálně) algoritmus pro výpočet faktoriálu v podobě podprogramu a ten pak v programu třikrát použít, jistě dospějeme ke kratšímu zápisu programu. Poněvadž od podprogramu očekáváme poskytnutí jedné jednoduché (v našem případě celočíselné) hodnoty, budeme ho deklarovat v podobě funkce: Program KOMBCISLO; var KC:longint; N,K:byte; Function FAKT(X:byte):longint; var I:byte; POM:longint; begin POM:=1; for I:=2 to X do POM:=POM*I; FAKT:=POM begin write( Zadej hodnoty pro výpočet N nad K: ); readln(n,k); KC:=FAKT(N) div FAKT(K) div FAKT(N-K); writeln( Výsledek,N, nad,k, je:,kc); Z hlediska našeho zadání není nezbytné deklarovat funkci pro výpočet kombinačního čísla. Jistě si však ( dovedeme ) představit program, kde by bylo třeba v různých místech získávat hodnotu kombinačního n čísla. k Podprogram (funkce) pro poskytnutí kombinačního čísla pak bude mít zřejmě v sobě deklarovanán další podprogram funkci pro výpočet faktoriálu tak jak ukazuje následující řešení: Program KOMBCISLO; var KC:longint; N,K:byte; Function KOMB(H,D:byte):longint; Function FAKT(X:byte):longint; var I:byte; POM:longint; begin POM:=1; for I:=2 to X do POM:=POM*I; FAKT:=POM {* Konec funkce FAKT *} begin KOMB:=FAKT(H) div FAKT(D) div FAKT(H-D); {* Konec funkce KOMB *} begin write( Zadej hodnoty pro výpočet N nad K : ); readln(n,k); KC:=KOMB(N,K); writeln( Výsledek,N, nad,k, je:,kc); Příkazová část výše uvedeného programu může být pochopitelně též ve tvaru begin write( Zadej hodnoty pro výpočet N nad K : ); readln(n,k);

38 KAPITOLA 3. PODPROGRAMY writeln( Výsledek,N, nad,k, je:,komb(n,k)) Uvedenou funkci FAKT pro výpočet faktoriálu je možno zapsat také jako funkci rekurzivní, tj. funkci, která volá sama sebe. Vycházíme při tom z definice faktoriálu podle vztahu: x! = x (x 1)!, přičemž 0! = 1. Function FAKT(X:byte);longint; begin if N<2 then FAKT:1 else FAKT:=N*FAKT(N-1) Těm čtenářům, kteří si činí ambice na tvorbu rekurzivních podprogramů doporučujeme porovnat rekurzivní i nerekurzivní funkce FAKT, které jsou výše uvedeny a uvědomit si, že každý cyklus lze převést na rekurzi a naopak. Tak, jako cyklus for I:=N downto 2 do POM:=POM I resp. I:=N; while I>1 do begin POM:=POM I; I:=I 1 resp. I:=N; repeat until I< 2; POM:=POM I; I:=I 1 (všechny tři zápisy vedou ke stejnému efektu) má svoji koncovou podmínku I<2 resp. not(i>1) resp. I<2 má i rekurze svoji podmínku (N<2) při jejímž splnění již není dále rozvíjena. Ve výše uvedených algoritmech je jedno úzké místo: výpočet faktoriálu i pro poměrně malá čísla dává vysokou hodnotu výsledku. Tak např. již 8! je 40320, což je hodnota větší, než je v Turbo Pascalu maximální zobrazitelná hodnota typu integer. A již 13! je 6 227 020 800, což je hodnota větší, než v Turbo Pascalu maximální zobrazitelná hodnota (typu longint) 2 147 483 647 (je to totéž, jako ve škále implementací PASCALu hodnota integer). Tuto nevýhodu odstraňuje následující strategie algoritmizace výpočtu hodnoty X!, kdy výsledná hodnota není vytvářena v (malé) proměnné jednoduchého typu, ale v poli číslic, které obsahuje výslednou hodnotu: const MAX = 30; {* maximální délka výsledku *} type CISLICE = array [1..MAX] of 0..9; procedure FAKT(X: byte; var F: CISLICE); var P, {* přenos *} I, {* index *} POM :byte; {* mezivýsledek násobení *} begin for I:= 1 to MAX - 1 do F[I] := 0; F[MAX] := 1; while X > 1 do {* cyklus 1*2*...*X *} begin P := 0; I := MAX; repeat POM := F[I] * X + P; F[I] := POM mod 10; {* jedna řádová číslice *} P := POM div 10; {* přenos do vyššího řádu *} I := I - 1 until I = 0; X := X - 1; {* konec procedury FAKT *} Závěrem tohoto příkladu uveďme ještě vskutku již fundovaný způsob řešení výpočtu kombinačního čísla, při kterém se zároveň vyhneme výpočtům faktoriálů. Z uvedeného vzorce pro výpočet kombinačního čísla lze odvodit vztah

39 ( n k ) = n k ( n 1 k 1 ) přičemž platí, že ( n 0 ) = 1. Pak řešení v podobě rekurzivní funkce je Function KOMB(H, D : byte) : longint; begin if D=0 then KOMB := 1 else KOMB := KOMB(H-1, D-1)*H div D; Funkce KOMB uvedená výše nám poslouží stejnými výsledky, jako funkce KOMB uvedená na straně 37. Porovnání přehlednosti a úspornosti necháváme na čtenáři. konec Příkladu 3.2 konec Příkladu 3.2 Snad první úloha, se kterou se každý začínající student programátor setká, je úloha výpočtu hodnot podle nějakého vzorce. Vždyť jak nás dokáže potrápit zpracování provedených měření v rámci laboratorních cvičení z fyziky. Výpočet podle určitého vzorce je však pouze jednou stránkou problému. Neméně důležitá je však i úprava výstupní sestavy protokolu z měření. V následujícím příkladu uvedeme problém tabelace funkce s předpokládanými výstupy na obrazovku. Přesměrování případných výstupů na tiskárnu je již jen rutinní záležitostí s uvědoměním si, že zatímco jedna obrazovka pojme např. 25 řádků po 80 znacích, na jeden list papíru můžeme umístit např. 60 řádků po 60 znacích. Příklad 3.3: Tabelujte funkci y= f(x) pro všechna x A, B, s přírůstkem x = C. Řešením pro funkci např. W=mgh (potenciální energie) pro výšku h od A (např. 1m) do B (např. 10m) po kroku h = C (např. 0.1m) je tabulka čítající cca X(100) řádků s výsledky. Vyřešení hlavičky tabulky je dílem vhodně poskládaných příkazů tisku, vlastní výpočet provedeme přiřazovacím příkazem a tisk každého z výsledkových řádků tabulky příkazem procedury writeln. Nelze však chaoticky vytisknout např. na obrazovku všech X řádků za sebou, neboť bychom po ukončení viděli na obrazovce pouze posledních 24 řádků (ostatní řádky by utekly ). Tuto skutečnost je třeba ošetřit. Program TABELACE; const G=9.80665; var A,B,C,W,M,H : real; PR : byte; Z : char; Procedure PODTRH(ZNAK:char; POCET:byte); var I : integer; begin for I:=1 to POCET do write(znak); writeln; Procedure HLAVICKA; begin writeln( Tabulka výpočtu potenciální energie ); write( :4); PODTRH( -,35); writeln; PODTRH( *,49); writeln( výška hmotnost g energie ); PODTRH( *,49); begin write( Zadej hmotnost tělesa: ); readln(m); write( Zadej meze výšky pro měření (OD - DO - PO): ); readln(a,b,c); writeln( *** Pozor, první výsledky tabelace přichazejí *** ); writeln; HLAVICKA; H:=A; PR:=0; while H<=B do

40 KAPITOLA 3. PODPROGRAMY begin W:=M*G*H; PR:=PR+2; if (PR mod 18) = 0 then begin write( Až budeš chtít pokračovat, odešli znak: ); readln(z); HLAVICKA; writeln(,h:8:2,,m:8:4,,g:9:5,,w:9:4, ); PODTRH( -,49) end else begin writeln(,h:8:2,,m:8:4,,g:9:5,,w:9:4, ); PODTRH( -,49) H := H + C; writeln; write( *** konec tabelace *** - odešli znak: ); readln(z); konec Příkladu 3.3 konec Příkladu 3.3 Příklad 3.4: Vytvořte podprogram pro výpočet funkce sin(x) Pro výpočet aproximace funkcí sin(x), cos(x), exp(x) (tj. e x ), aproximace integrálů aj. využíváme rozvoje daných funkcí v nekonečnou řadu. Tak např. Řešení: Součet řady je dán obecně sin(x) = x x3 3! + x5 5! x7 7! + x9 9! cos(x) = 1 x2 2! + x4 4! x6 6! + x8 8! e x = 1 + x + x2 2! + x3 3! + x4 4! + x 0 e u2 du = x x3 3.1! + x5 5.2! x7 7.3! + x9 9.4! S = (např. sin(x)) = T 0 + T 1 + T 2 + T 3 + Nejjednodušší způsob sestavení algoritmu představuje tedy definování součtu jednotlivých členů řady. Uvědomíme-li si však, že např. hodnota 9! = 362880 je zhruba o řád větší, než maximální zobrazitelné číslo celé (u mikropočítačů zpravidla 32767) a že při práci s desetinnými hodnotami počítáme na poměrně malý počet platných cifer (vzniká nežádoucí zaokrouhlování) je vhodné zamyslet se nad jiným postupem řešení. Vycházíme z předpokladu, že se dá vyjádřit vztah mezi dvěma sousedními členy řady, tj. že platí Tak např. pro funkci sin(x) může platit, že např. T i = f(t i 1 ) pro i = 1, 2, 3,... T 3 : T 2 = x7 7! : x5 5! a tedy T 3 /T 2 = x2 7.6

41 což zobecníme na neboli T i /T i 1 = x 2 /(2i. (2i + 1)) T i = T i 1. x 2 /(2i. (2i + 1)). Uvědomíme-li si, že význam posledního zápisu je postihnutelný zápisem v podobě přiřazovacího příkazu T := T sqr(x)/(2 I (2 I+1)); (uvědomme si způsob zpracování přiřazovacího příkazu počítačem nejprve je zpracováván výraz, nějaká hodnota v proměnné T (stará hodnota), po vyčíslení celého výrazu je nová hodnota umístěna opět do proměnné T (stará (předchozí) hodnota přepsána novou hodnotou)), pak sestavení úplného algoritmu je již manuální záležitostí. Podprogram, samozřejmě v podobě funkce, může mít následující podobu: Function SINUS(X:real) : real; const EPS = 0.00001; var SUMA, T : real; I : byte; begin I := 0; SUMA := X; T := X; repeat I := I + 1; T := -T * sqr(x)/(2*i*(2*i+1)); SUMA := SUMA + T until abs(t) < EPS; SINUS := SUMA; Podotkněme ještě, že deklarace funkce s názvem SIN má za důsledek znepřístupnění standardní funkce sin. konec Příkladu 3.4 konec Příkladu 3.4 Příklad 3.5: Deklarujte proceduru, která ze standardního textového souboru čte po znacích číslice a převádí je na hodnotu typu integer (do vnitřní reprezentace). Číslu v textovém souboru může předcházet libovolný počet mezer. Před prvou číslicí čísla může být znaménko. Poté následuje souvislá posloupnost číslic, ukončená mezerou. procedure CTICISLO(var CISLO:integer); var ZNAK:char; ZNAMENKO:-1..1; {*DEKLAROVALI JSME DVE LOKALNI PROMENNE*} begin ZNAMENKO :=1; CISLO :=0; read(znak); while ZNAK = do read(znak); while ZNAK <> do begin case ZNAK of + : ; - : ZNAMENKO:=-1; 0 : CISLO :=CISLO*10; 1 : CISLO := CISLO*10 + 1; 2 : CISLO := CISLO*10 + 2; 3 : CISLO := CISLO*10 + 3; 4 : CISLO := CISLO*10 + 4; 5 : CISLO := CISLO*10 + 5; 6 : CISLO := CISLO*10 + 6; 7 : CISLO := CISLO*10 + 7; 8 : CISLO := CISLO*10 + 8; 9 : CISLO := CISLO*10 + 9;

42 KAPITOLA 3. PODPROGRAMY read(znak) CISLO :=ZNAMENKO * CISLO Vidíme, že použití příkazu case vede k potřebnému cíli přes řadu příkazů majících stejný význam. Příkazy, které jsou součástí příkazu case, je možno jistě zjednodušit (např. násobit deseti můžeme až po příkazu case, pokud příkaz case použijeme pouze k definování hodnoty pomocné proměnné typu 0..9), avšak podstata zůstává stejná realizujeme řadu příkazů, které jsou natolik podobné, že musí existovat možnost podstatného zkrácení celého algoritmu. Jistě je čtenáři již známo, že podmnožina znaků 0, 1, až 9 je uspořádaná a souvislá. Zná také význam standardní funkce ord a tedy může zkonstruovat příkaz CISLO:= CISLO 10 + (ord(znak) ord( 0 )); přičemž výraz ord(znak) - ord( 0 ) poskytuje celočíselnou hodnotu z intervalu 0..9 podle hodnoty v proměnné ZNAK, která je z intervalu 0.. 9 a je typu char. Pak příkaz case může mít tvar: case ZNAK of + : ; - : ZNAMENKO:=-1; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 : CISLO:=CISLO*10+(ord(ZNAK)-ord( 0 )) Označující konstanta (možnost, případ) je konstanta popřípadě seznam konstant. Řada implementací však umožňuje jako označující konstantu použít i interval, tedy např. case ZNAK of + : ; - : ZNAMENKO := -1; 0.. 9 : CISLO:=CISLO*10+(ord(ZNAK)-ord( 0 )) Uvedenou strategií není mj. ošetřen případný výskyt znaménka mezi číslicemi. Tvar vstupu vede k vytvoření celočíselné hodnoty +467. Správným řešením je algoritmus ve tvaru: 4 6 + 7 begin ZNAMENKO :=1; CISLO :=0; read(znak); while ZNAK = do read(znak); if ZNAK= + then read(znak) else if ZNAK= - then begin ZNAMENKO:=-1; read(znak); while ZNAK <> do begin CISLO:=CISLO*10+(ord(ZNAK)-ord( 0 )); read(znak) CISLO :=ZNAMENKO * CISLO Případné doplnění algoritmu o příkazy potřebné k vyřešení situace, která nastane po přečtení nějakého jiného znaku než mezery, znaménka nebo číslice, necháváme na úvaze studenta. Mechanismus převodu vnějši (textové) reprezentace celého čísla na vnitřní (binární) reprezentaci je součástí procedury read resp. readln. Součástí těchto procedur pracujících mj. i nad textovým souborem, je i algoritmus převodu vnější reprezentace desetinného čísla do vnitřní reprezentace a v mnoha implementacích i algoritmus čtení několika znaků (řetězce) do příslušné proměnné. Zpětné algoritmy převodu celočíselných, reálných i řetězcových hodnot vnitřní reprezentace do vnější (člověku čitelné) reprezentace, obsahují podprogramy write resp. writeln pracující nad textovým souborem. konec Příkladu 3.5 konec Příkladu 3.5