3.2. Návrh programu pro výpočet výšky dítěte
Nyní zkusíme navrhnout první program, který bude dělat něco užitečného. Program, který napíšeme v této kapitole, bude na základě známé výšky rodičů v centimetrech počítat očekávanou výšku jejich dítěte v dospělosti. Tento program bude navíc používat jen tyto ovládací prvky: tlačítka, přepínače, políčka k zaškrtnutí a text.
Algoritmus, kterým se cílová výška počítá, je popisován jako metoda midparenta - od součtu výšek obou rodičů se (podle toho, zda dítě bude chlapec nebo dívka) přičte nebo odečte 13cm a výsledek se vydělí dvěma. Výška dítěte v dospělosti bude s pravděpodobností 95% ležet v pásmu plus minus 10cm od této hodnoty. Tento algoritmus byl získán empiricky a přes svoji jednoduchost patří stále k nejpřesnějším odhadům výšky dítěte v dospělosti (zájemce odkazuji na Krásničanová Lesný: Kompendium pediatrické auxologie, Galén 2000 nebo úvodní kapitolu Lebl, Krásničanová: Růst a jeho poruchy u dětí, Galen 1996).
Prvním vstupem tohoto algoritmu je výška matky v centimetrech, která má smysl pouze v rozmezí normální ženské výšky. Průměrná výška 18-leté dívky v roce 1991 byla přibližně 166 centimetrů a směrodatná odchylka byla asi 6 cm. Druhým vstupem je výška otce - průměrný 18-letý muž měřil obdobně v roce 1991 přibližně 179 centimetrů a směrodatná odchylka byla 7 cm a algoritmus je spolehlivý pro normálně vysoké otce (viz V. Celostátní antropometrický výzkum 1991). (Za pásmo normy je považováno rozmezí plus minus dvě směrodatné odchylky od normální výšky.) V následující tabulce jsou tyto hodnoty shrnuty:
Průměrná hodnota | Směrodatná odchylka | Spodní povolená hodnota | Horní povolená hodnota | |
---|---|---|---|---|
Matka | 166 cm | 6 cm | 166 - 2*6 = 154 cm | 166 + 2*6 = 178 cm |
Otec | 179 cm | 7 cm | 179 - 2*7 = 165 cm | 179 + 2*7 = 193 cm |
V. celostátní antropometrický výzkum dětí a mládeže 1991 |
Dále budeme potřebovat pohlaví dítěte, jehož výšku odhadujeme. Výstupem budou dvě čísla: nejnižší pravděpodobná výška dítěte a nejvyšší pravděpodobná výška dítěte. To bude pro uživatele pohodlnější, než kdybychom uvedli jako výsledek jen střední hodnotu a pásmo plus mínus deset cm.
Ve své první verzi nebude tento program ukládat žádná data, bude používat pouze globální a lokální proměnné jazyka C/C++. Návrh datových struktur tedy přeskočíme a vrhneme se po hlavě do návrhu uživatelského rozhraní.
Uživatelské rozhraní
Jednoduchým programům, jako je například ten, který navrhujeme, stačí jediný formulář, ve kterém uživatel zadá hodnoty výšky matky a otce a pohlaví dítěte. V tomto formuláři také bude zobrazen výsledek. Potřebujeme tedy jeden základní formulář. K formuláři nebude přiřazena žádná uživatelská nabídka (menu). Prázdný formulář bude vypadat takto:
Formulář si pojmenujeme FormularHlavni a jeho definice je v následujícím rámečku:
FORM ID FormularHlavni AT (0 0 160 160) BEGIN TITLE "Cilová vyska" END |
Formulář bude organizován odshora dolů - zadávané údaje budou nahoře a výsledek bude zobrazen dole, tak jak je uživatel zvyklý číst. Opačný postup by byl zobrazit výslednou hodnotu nahoře, aby ji uživatel nestínil rukou při zadávání dat (podobně jako u kalkulačky).
Cílem této kapitoly bude naučit se používat tlačítka, zaškrtávátka a přepínače na formulářích. Proto bude celý tento program používat pouze tyto prvky pro vstup i zobrazení údajů. Pro vstup výšky matky a otce použijeme, podobně jako v dialogu pro nastavení času, který je na obrázku vespod, kombinaci přepínačů (použijeme tři - pro každou číslici výšky jeden) a opakovacích tlačítek tvaru trojúhelníčků. Přepínače budou sdruženy do skupiny, aby byl vždy aktivní (inverzně zobrazený) jen jeden z nich.
Vstup výšky matky a otce bude na řádcích pod sebou. Na začátku řádku bude tučný text označující o jakou hodnotu se jedná, za ním budou tři přepínače, každý s jednou číslicí, a za nimi bude jednotka (centimetry). Na konci řádku budou nad sebou dvě opakovací tlačítka. Při zmáčknutí opakovacích tlačítek se číslice ve zvýrazněném přepínači o jedničku zvětší nebo zmenší. Teď to zapíšeme do definice formuláře:
FORM ID FormularHlavni AT (0 0 160 160) BEGIN TITLE "Cilová vyska" LABEL "Vyska matky:" AUTOID AT (5 30) FONT 1 PUSHBUTTON "1" ID TlacitkoMatka100cm AT (PREVRIGHT+4 PREVTOP-2 12 15) FONT 2 GROUP SkupinaMatka PUSHBUTTON "6" ID TlacitkoMatka10cm AT (PREVRIGHT+1 PREVTOP PREVWIDTH PREVHEIGHT) FONT 2 GROUP SkupinaMatka PUSHBUTTON "0" ID TlacitkoMatka1cm AT (PREVRIGHT+1 PREVTOP PREVWIDTH PREVHEIGHT) FONT 2 GROUP SkupinaMatka LABEL "cm" AUTOID AT (PREVRIGHT+4 PREVTOP+2) FONT 1 REPEATBUTTON "\001" ID OpakujMatkaPlus AT (PREVRIGHT+2 PREVTOP-3 AUTO AUTO) NOFRAME FONT 5 REPEATBUTTON "\002" ID OpakujMatkaMinus AT (PREVLEFT PREVBOTTOM AUTO AUTO) USABLE LEFTANCHOR NOFRAME FONT 5 END |
Všimněmě si, že kromě umístění prvního textu na řádku (5 30) a šířky a výšky jednotlivých přepínačů s číslicemi jsou všechny souřadnice relativní. Pokud bychom chtěli velikost všech tlačítek zvětšit nebo zmenšit, stačí nám to udělat na jediném místě. Nesmíme zapomenout vytvářet hlavičkový soubor, ve kterém definujeme použité konstanty. Abychom viděli, jak budou čísla zobrazená, vložíme již teď jako texty tlačítek nějaké číslice. Popsaný formulář je na následujícím obrázku:
Výšku otce zpracujeme obdobně. Pro zadání pohlaví dítěte použijeme - pro odlišení - dvě políčka k zaškrtnutí umístěná pod sebou. U prvního z nich (Chlapec) nastavíme atribut CHECKED, aby byl na začátku vybrán. Také tyto dva přepínače budou tvořit skupinu.
Jsou-li prvky uživatelského rozhraní definovány s atributem DISABLED, tak jsou zobrazeny, ale nereagují na vstup uživatele. Pro zobrazení výsledného pásma výšky (od - do) umístíme na formulář dva přepínače, které nebudou reagovat na vstup uživatele (a budou se tedy chovat jen jako text v rámečku). Toto zobrazení výsledků však použijeme pouze proto, abychom se naučili nastavovat text zobrazený v tlačítku. Pro zobrazení výsledků nabízí jinak PalmOS velmi komfortní políčka pro zobrazení textu - ta se však naučíme obsluhovat až v další kapitole.
Z popisovaných prvků uživatelského rozhraní chybí už jenom tlačítka. Kam je dát? Každý správný program (a pro "lékařské programy" to platí dvojnásobně) by měl obsahovat alespoň základní nápovědu a informace o autorech. Toto tlačítko umístíme někam do volného místa ve formuláři, třeba vedle políček k zaškrtnutí pohlaví, a místo textu umístíme do tlačítka otazník. Pro zobrazení textu nápovědy a informací o autorovi použijeme později standardní formulář nápovědy PalmOS.
Celý formulář se všemi prvky, které obsahuje, je na následujícím obrázku. V definici tlačítek pro zobrazení výsledku uvedeme nějaká čísla dávající smysl, abychom viděli při prvním zobrazení formuláře, zda se tato čísla do tlačítek vejdou.
Kompletní definice formuláře je v následujícím rámečku:
FORM ID FormularHlavni AT (0 0 160 160) BEGIN TITLE "Cilová vyska" LABEL "Vyska matky:" AUTOID AT (5 30) FONT 1 PUSHBUTTON "1" ID TlacitkoMatka100cm AT (PREVRIGHT+4 PREVTOP-2 12 15) FONT 2 GROUP SkupinaMatka PUSHBUTTON "6" ID TlacitkoMatka10cm AT (PREVRIGHT+1 PREVTOP PREVWIDTH PREVHEIGHT) FONT 2 GROUP SkupinaMatka PUSHBUTTON "0" ID TlacitkoMatka1cm AT (PREVRIGHT+1 PREVTOP PREVWIDTH PREVHEIGHT) FONT 2 GROUP SkupinaMatka LABEL "cm" AUTOID AT (PREVRIGHT+4 PREVTOP+2) FONT 1 REPEATBUTTON "\001" ID OpakujMatkaPlus AT (PREVRIGHT+2 PREVTOP-3 AUTO AUTO) NOFRAME FONT 5 REPEATBUTTON "\002" ID OpakujMatkaMinus AT (PREVLEFT PREVBOTTOM AUTO AUTO) USABLE LEFTANCHOR NOFRAME FONT 5 LABEL "Vyska otce:" AUTOID AT (5 60) FONT 1 PUSHBUTTON "1" ID TlacitkoOtec100cm AT (PREVRIGHT+4 PREVTOP-2 12 15) FONT 2 GROUP SkupinaOtec PUSHBUTTON "8" ID TlacitkoOtec10cm AT (PREVRIGHT+1 PREVTOP PREVWIDTH PREVHEIGHT) FONT 2 GROUP SkupinaOtec PUSHBUTTON "0" ID TlacitkoOtec1cm AT (PREVRIGHT+1 PREVTOP PREVWIDTH PREVHEIGHT) FONT 2 GROUP SkupinaOtec LABEL "cm" AUTOID AT (PREVRIGHT+4 PREVTOP+2) FONT 1 REPEATBUTTON "\001" ID OpakujOtecPlus AT (PREVRIGHT+2 PREVTOP-3 AUTO AUTO) NOFRAME FONT 5 REPEATBUTTON "\002" ID OpakujOtecMinus AT (PREVLEFT PREVBOTTOM AUTO AUTO) NOFRAME FONT 5 CHECKBOX "Chlapec" ID ZaskrtniChlapec AT (5 85 AUTO AUTO) GROUP SkupinaPohlavi CHECKBOX "Divka" ID ZaskrtniDivka AT (PREVLEFT PREVBOTTOM+1 AUTO AUTO) GROUP SkupinaPohlavi LABEL "Bude pravdepodobne vysoky/a" AUTOID AT (5 120) FONT 1 LABEL "od" AUTOID AT (5 140) FONT 1 PUSHBUTTON "155" ID TlacitkoVyskaOd AT (PREVRIGHT+4 PREVTOP-2 30 AUTO) DISABLED FONT 2 GROUP 0 LABEL "do" AUTOID AT (PREVRIGHT+4 PREVTOP+2) USABLE FONT 1 PUSHBUTTON "200" ID TlacitkoVyskaDo AT (PREVRIGHT+4 PREVTOP-2 30 AUTO) DISABLED FONT 2 GROUP 0 LABEL "cm" AUTOID AT (PREVRIGHT+4 PREVTOP+2) FONT 1 BUTTON "?" ID TlacitkoOProgramu AT (140 90 AUTO AUTO) FRAME END |
Program se bude chovat následujícím způsobem: pokud změníme libovolný údaj ve formuláři, tak budou výsledné hodnoty okamžitě přepočítány a zobrazeny. Pokud nebudou vyhovovat vstupní data (výška matky nebo otce), bude místo cílové výšky zobrazen otazník.
Nyní jsme program navrhli a nezbývá, než jej realizovat.
V příštím díle zkusíme dát podle vzoru z druhé kapitoly dohromady první program, který jen zobrazí tento formulář na obrazovce (to byste ale měli už zvládnout za domácí úkol). Pak se pustíme do trochu odtažitého popisu paměti Palm Pilotu, který je nutný pro pochopení základních funkcí operačního systému.