V dnešním dílu se opět vrátíme k vývojovým diagramům s tím, že začneme uvádět datové typy proměnných. Nejprve si ovšem uvedeme několik příkladů, kde si ukážeme, proč zvolit daný typ a co nám to přinese. A díl zakončíme dvěma vývojovými diagramy a ukázkou podprogramu.
Řekněme, že máme v programu proměnnou na uložení aktuálního roku. Jaký datový typ je pro ní nejvhodnější? Aktuální rok při psaní tohoto dílu je 2011, příští rok bude 2012 atd. Jedná se tedy o celé číslo, které není a nebude záporné. Nyní ještě určíme, která z nabízených variant se nám hodí rozsahově. Datový typ byte je malý, neboť i letošní rok je větší než jeho maximum (255). Dále se tedy nabízí word. Jeho maximum již bude dostatečné, protože než nastane rok 65535, tak náš program, i kdyby byl sebegeniálnější, bude dávno semletý kolem dějin. Nejvhodnější datový typ pro uložení aktuálního roku je tedy word.
V jiném programu bude zpracovávat pokojovou teplotu. Taková teplota může být např. 21.4
. Jedná se tedy o racionální číslo, takže použijeme jeden z typů pro jejich uložení. Nepotřebujeme žádnou velkou přesnost i rozsah není nikterak velký, a proto nám bude stačit datový typ single.
V jednom z dílů jsme načítali známky a počítali jejich průměr. Jaký datový typ použijeme na uložení načtené známky, celkového součtu a počtu známek a výsledného průměru? U známky je to jednoduché. Ta může být v rozsahu 1 až 5
, takže se pohodlně vejdeme do datového typu byte. Počet známek není zadáním nijak omezen, takže budeme předpokládat, že jich může být opravdu hodně (v tomto případě, kdy počítáme průměrnou známku za celou republiku). Tady nevystačíme s typem byte a ani s typem word, ale pro jistotu použijeme dword. A stejný typ použijeme i pro součet (ten může být teoreticky 5x větší než počet). Výsledný průměr je desetinné číslo, takže použijeme opět single.
Možná si říkáte, když jsme si v tomto příkladě dali pro jistotu rezervu a zvolili rozsahově větší typ, tak jestli by nebylo nakonec lepší všude volil datové typy long long integer nebo extend. Odpověď zní nebylo, ale některé vysokoúrovňové jazyky se vydaly touto cestou.
Vezměme si například výše uvedené školní známky. Řekněme, že všechny známky před zpracováním uložíme. Máme známky z celé republiky, kde je (počty jsou uvedeny pouze jako příklad) 5000 škol, na každé studuje v průměru 500 studentů, každý z nich má 8 předmětů a z každého dostane v průměru 10 známek za školní rok. Celkem budeme ukládat 5000x500x8x10
známek nebo-li 200 miliónů známek. Pokud bychom místo datového typu byte, který jsme určili jako nejvhodnější, použili "univerzální" long long integer, tak bychom na každé známce "prodělali" 7 bajtů. Celkem na všech známkách by to tedy dělalo 1.4 miliardy bajtů, a to téměř odpovídá 1.4GB, což rozhodně není nezanedbatelné množství.
Samozřejmě je ten příklad hodně vyumělkovaný, ale je na něm vidět jedna z oblastí, kde se vyplatí přemýšlet nad použitým typem - zpracování většího množství dat. Druhou oblast, kterou zvolený datový typ ovlivňuje, je rychlost zpracování. Čím "univerzálnější" typ, tak tím větší časové nároky na zpracování. Stejně jako v případě množství dat i zde platí, že pro jednoduché příklady to není kritická věc. Na druhou stranu, pokud by jste se chtěli udělat např. program na stříhání videa, tak by jste naháněli každou mikrosekundu, protože ve výsledku to může na dlouhém videu ušetřit i hodiny. A vhodně zvolený datový typ je pak základ.
Nic se ovšem nesmí přehánět a někdy nám mohou datové typy pěkně zatopit. Řekněme, že máme cyklus od 1 do 250
na zpracování nějakých dat. Vhodný datový typ je byte (rozsah se do něj vejde). Po čase se k programu vrátíme, protože potřebujeme přidat zpracování další dat - rozsah se změní na 1 až 300
. A chyba je na světe. Co že se to stane? Index cyklu bude v proměnné (např. A), která se bude měnit od 1. Chybou je to, že nikdy nedosáhne hodnoty 300, která by cyklus zastavila, protože byte má rozsah jen do 255. Ve chvíli kdy by měla být další hodnota 256 se hodnota změní na 0 (pro byte platí, že 255 + 1 = 0
, 255 + 2 = 1
, 1 - 2 = 255
atd.). Dostaneme nechtěně nekonečný cyklus.
Stejně to platí pro vícebajtové, ale i znaménkové typy. Například pro word platí podobně, že 65535 + 1 = 0
, 1 - 2 = 65535
atd. Pro znaménkové typy je přechod velmi podobný, tj. například pro short platí, že 127 + 1 = -128
, 1 - 2 = -1
, -128 - 1 = 127
apod. Někdy se této vlastnosti s výhodou i využije.
Dost bylo teoretizování, nyní si ukážeme jednoduché příklady, ve kterých definuje datové typu u všech použitých proměnných. Nebudeme vymýšlet nic nového, ale vezmeme některé příklady z minula.
Sčítání 2 čísel
Jako první vezmeme tento jednoduchý příklad, protože si chceme ukázat definici datových typů, tak není potřeba na začátek nic složitého. Abychom mohli definovat jaký datový typ by byl nejvhodnější pro tento příklad, tak si musíme trochu zpřesnit zadání. Pokud by byl příklad zadán obecně, tj. sčítání 2 čísel, tak bychom museli použít racionální datové typy (desetinná čísla). My si proto zpřesníme zadání, a to tak, že budeme tvořit algoritmus pro sčítání 2 celých čísel (tj. i záporných). Budeme proto volit z celočíselných znaménkových datových typů. Typy short integer a integer mají malé rozsahy (rozhodně budeme chtít, abychom uměli sečíst čísla větší než 32767). Typ long integer by již mohl vyhovět, protože má dostatečný rozsah na většinu běžných výpočtů.
Definice datových typů u vývojového diagramu se provádí zápisem mimo vývojový diagram. My si ho budeme zapisovat do barevně odlišeného obdélníčku. K vývojovému diagramu pro sčítání 2 celých čísel si můžeme připsat, že všechny použité proměnné (A, B, C) budou datového typu long integer.
Výpočet průměru známek
Tento algoritmus jsme vytvořili v 12. díle. Nyní k němu opět pouze přidáme definici datových typů jednotlivých použitých proměnných. Cyklus od 1 do 20 se úplně bezpečně vejde do nejmenšího typu byte (s rozsahem 0 - 255). Stejně tak zadávaná známka musí být v rozsahu 1 - 5, takže se také vejde do datového typu byte. Součet známek a počet známek, protože nevíme kolik jich bude, musíme dimenzovat na větší rozsah. Typ word (rozsah 0 - 65535) by mě stačit, protože by to znamenalo (minimálně) něco málo přes 13 tisíc známek (samé 5) na jednoho žáka. To je hodnota, které se nejspíše nedosáhne ani u dlouholetých studentů za celou dobu jejich studia, takže tento typ použijeme. Poslední je průměr. Průměr může být např. 1.2, takže se jedná o desetinné číslo, nebo-li musíme použít nějaký racionální datový typ (např. single, protože nám jeho přesnost pro výpočet průměru známek postačuje).
Podprogramy
A jak je to u podprogramů? U podprogramů je to stejné jako u hlavního programu. Každý podprogram doplní definice datových typů, které jsou v něm použité. Ukážeme si to na podprogramu pro výpočet faktoriálu. Výsledný vypočtený faktoriál je kladné celé číslo. Použijeme proto neznaménkový celočíselný datový typ s největším rozsahem, tj. qword. A nyní určíme nejvhodnější datový typ pro předávaný parametr do podprogramu (T) a potažmo pro index cyklu. Pro jak velké číslo nám qword umožní výpočet faktoriálu? Maximálně pro číslo 20 (21! = 51090942171709440000
, což už je skoro 3 větší než maximální číslo dané typem qword). Takže proměnné T a B mohou být byte. Vše opět zapíšeme vedle vývojového diagramu.
Určit správný je typ je jen otázkou cviku, takže příště postoupíme dál a začneme pole.