3. diel - Premenné, typový systém a parsovanie
Z minulej lekcie Dart kurzu, IntelliJ IDEA a prvý konzolová aplikácie , už vieme pracovať s IntelliJ IDEA a vytvoriť konzolovú aplikáciu. Dnes sa v tutoriálu pozrieme na tzv. Typový systém, ukážeme si základné dátové typy a prácu s premennými. Výsledkom budú 4 jednoduché programy vrátane kalkulačky.
Premenné
Než začneme riešiť dátové typy, poďme sa zhodnúť na tom, čo je to
premenná (programátori mi teraz iste odpustí zbytočné vysvetľovanie).
Určite poznáte z matematiky premennou (napr. x
), do ktorej sme si
mohli uložiť nejakú hodnotu, najčastejšie číslo. Premenná je v
informatike úplne to isté, je to miesto v pamäti počítača, kam si môžeme
uložiť nejaké dáta (meno používateľa, aktuálny čas alebo databázu
článkov). Toto miesto má podľa typu premennej obvykle tiež vyhradenú
určitú veľkosť, ktorú premenná nesmie presiahnuť.
Premenná má vždy nejaký dátový typ, môže to byť číslo, text, zoznam a podobne, záleží na tom, na čo ju chceme používať. Väčšinou musíme pred prácou s premennou túto premennú najskôr tzv. Deklarovať, či povedať jazyku ako sa bude volať a akého dátového typu bude (aký v nej bude obsah). Jazyk ju v pamäti založia a až potom s ňou môžeme pracovať. Podľa dátového typu premennej si ju jazyk dokáže z pamäti načítať, modifikovať, prípadne ju v pamäti založiť. O každom dátovom typu jazyk vie, koľko v pamäti zaberá miesta a ako s týmto kusom pamäte pracovať.
Typový systém
Existujú dva základné typové systémy: statický a dynamický.
Dynamický typový systém nás plne odtieňuje od toho, že premenná má vôbec nejaký dátový typ. Ona ho samozrejme vnútorne má, ale jazyk to nedáva najavo. Dynamické typovanie ide mnohokrát tak ďaleko, že premenné nemusíme ani deklarovať, akonáhle do nejakej premennej niečo uložíme a jazyk zistí, že nebola nikdy deklarovaná, sám ju založí. Do tej istej premennej môžeme ukladať text, potom objekt používateľa a potom desatinné číslo. Jazyk sa s tým sám pobije a vnútorne automaticky mení dátový typ. V týchto jazykoch ide vývoj rýchlejšie vďaka menšiemu množstvo kódu, zástupcovia sú napr. PHP alebo Ruby.
Statický typový systém naopak striktne vyžaduje definovať typ premennej a tento typ je ďalej nemenný. Akonáhle premennú raz deklarujeme, nie je možné jej dátový typ zmeniť. Akonáhle sa do textového reťazca pokúsime uložiť objekt užívateľ, dostaneme vynadané.
S Dart to je trochu komplikovanejšie, pretože zatiaľ podporuje oba prístupy. Jeho vývoj však smeruje k prechodu na iba statické typovanie, takže ho aj tu budem prezentovať ako staticky typizovanom.
Pri staticky typovaných jazykov, všetky premenné musíme najprv deklarovať s ich dátovým typom. Nevýhodou je, že vďaka deklaráciám je zdrojový kód trochu objemnejší a vývoj pomalší. Obrovskou výhodou však je, že nám statický analyzátor skontroluje, či všetky dátové typy sedia. Dynamické typovanie síce vyzerá ako výhodné, ale zdrojový kód nie je možné automaticky kontrolovať a keď niekde očakávame objekt používateľ a príde nám tam namiesto toho desatinné číslo, odhalí sa chyba až za behu a interpret program zhodí.
Poďme si teraz niečo naprogramovať, nech si nadobudnuté vedomosti trochu osvojíme, s teóriou budeme pokračovať až nabudúce. Povedzme si teraz tri základné dátové typy:
- Celé čísla:
int
- Desatinné čísla:
double
- Textový reťazec:
String
Program Vyhlasujúca premennú
Skúsime si nadeklarovat celočíselnú premennú a
, dosadiť do
nej číslo 56
a jej obsah vypísať do konzoly. Založte si nový
projekt, pomenujte ho vypis (i ku všetkým ďalším príkladom si vždy
založte nový projekt). Kód samozrejme píšeme do tela metódy
main()
(ako minule), čiže ju tu už nebudem opisovať.
int a; a = 56; print(a);
Prvý príkaz nám nadeklaruje novú premennú a
dátového typu
int
, premenná teda bude slúžiť na ukladanie celých čísel.
Druhý príkaz vykonáva priradenie do premennej, slúži na to operátor
"rovná sa". Posledný príkaz je nám známy, vypíše do konzoly obsah
premennej a
. Konzola je múdra a vie vypísať aj číselné
premenné.
Konzolová aplikácia
56
Pre desatinnú premennú by kód vyzeral takto:
double a; a = 56.6; print(a);
Je to takmer rovnaké ako s celočíselným. Ako desatinný oddeľovač používame bodku.
Program Papagáj
Minulý program bol trochu nudný, skúsme nejako reagovať na vstup od
užívateľa. Napíšeme program papagáj, ktorý bude dvakrát opakovať to,
čo používateľ napísal. Ešte sme neskúšali z konzoly nič načítavať,
ale je to veľmi jednoduché. Slúži na to metóda
stdin.readLineSync()
, ktorá nám vráti textový reťazec z
konzoly.
Najprv si musíme naimportovať dart:io
, čo je Dart knižnica
pre prácu so vstupom a výstupom. Tým sa nám sprístupní stdin
,
čo je objekt (zatiaľ nebudeme rozvádzať, čo objekt znamená) pre prácu so
vstupom z konzoly, jednoducho povedané. Súčasne si importujeme aj knižnicu
dart:convert
, aby sme mohli určiť kódovanie UTF8 pre naše
načítanie.
Skúsme si napísať nasledujúci kód:
import 'dart:convert'; import 'dart:io'; void main() { print('Ahoj, jsem virtuální papoušek Lóra, rád opakuji!'); print('Napiš něco:'); String vstup; vstup = stdin.readLineSync(encoding: UTF8); String vystup; vystup = '$vstup, $vstup!'; print(vystup); }
To už je trochu zábavnejšia.:) Prvé dva riadky sú jasné, ďalej
deklarujeme textový reťazec vstup. Do vstup sa priradí hodnota z metódy
stdin.readLineSync()
na konzolu, teda to, čo používateľ zadal.
Pre výstup si pre názornosť zakladáme ďalšie premennú typu textový
reťazec. Zaujímavé je, ako do vystup
priradíme, tam využívame
tzv. Interpolácie (vkladanie) reťazcov. Pomocou operátora $
totiž môžeme v reťazci určiť, že nasledujúce znaky budú definovať
názov premennej, ktorú chceme vložiť. Ak by sme navyše potrebovali za vstup
ihneď napísať iné znaky abecedy, napríklad "ahoj"
, môžeme
názov premennej vložiť do zložených zátvoriek, čo by vo výsledku mohlo
vyzerať ako "${vstup}ahoj"
. Do premennej teda priradíme
vstup
, ďalej čiarku, znovu vstup
a potom
výkričník. Premennú vypíšeme a skončíme.
Konzolová aplikácia
Ahoj, jsem virtuální papoušek Lóra, rád opakuji!
Napiš něco:
Nazdar ptáku
Nazdar ptáku, Nazdar ptáku!
Do premennej môžeme priraďovať už v jej deklarácii, môžeme teda nahradiť:
String vstup;
vstup = stdin.readLineSync(encoding: UTF8);
za
String vstup = stdin.readLineSync(encoding: UTF8);
Program by išiel skrátiť ešte viac v mnohých ohľadoch, ale všeobecne je lepšie používať viac premenných a dodržiavať prehľadnosť, než písať čo najkratšie kód a po mesiaci zabudnúť, ako vôbec funguje.
Program zdvojnásobovač
Zdvojnásobovač si vyžiada na vstupe číslo a to potom zdvojnásobí a vypíše. Asi by sme s doterajšími znalosťami napísali niečo takéto:
print('Zadejte číslo k zdvojnásobení:'); int a = stdin.readLineSync(encoding: UTF8); a = a * 2; print(a);
Všimnite si zdvojnásobenie čísla a, ktoré sme vykonali pomocou
priradenia. Dart nám teraz vynadá a podčiarkne riadok, v ktorom sa snažíme
hodnotu z konzoly dostať do premennej typu int
. Narážame na
typovú kontrolu, konkrétne nám stdin.readLineSync()
vracia
string
a my sa ho snažíme uložiť do int
u.
Čokoľvek príde z textovej konzoly je vždy text a to aj keď zadáme číslo.
Budeme ho potrebovať tzv. Naparsovat.
Parsovanie
Parsováním sa myslí prevod z textovej podoby na nejaký špecifický typ,
napr. Číslo. Mnoho dátových typov má v Dart už pripravené metódy k
parsovanie, ak budeme chcieť naparsovat napr. int
zo
string
u, budeme postupovať takto:
String s = '56'; int a = int.parse(s);
Vidíme, že dátový typ int
má na sebe priamo metódu
parse()
, ktorá berie ako parameter textový reťazec a vráti
číslo. Využijeme tejto znalosti v našom programe:
print('Zadejte číslo k zdvojnásobení:'); String s = stdin.readLineSync(encoding: UTF8); int a = int.parse(s); a = a * 2; print(a);
Najprv si text z konzoly uložíme do textového reťazca s
. Do
celočíselné premenné a potom uložíme číselnú hodnotu reťazca
s
. Ďalej hodnotu va zdvojnásobíme a vypíšeme do konzoly.
Konzolová aplikácia
Zadejte číslo k zdvojnásobení:
1024
2048
Parsovanie sa samozrejme nemusí podariť, keď bude v texte namiesto čísla napr. Slovo, ale tento prípad zatiaľ nebudeme ošetrovať.
Jednoduchá kalkulačka
Ešte sme nepracovali s desatinnými číslami, skúsme si napísať sľubovanú kalkulačku. Bude veľmi jednoduchá, na vstup prídu dve čísla, program potom vypíše výsledky pre sčítanie, odčítanie, násobenie a delenie.
print('Vítejte v kalkulačce'); print('Zadejte první číslo:'); double a = double.parse(stdin.readLineSync(encoding: UTF8)); print('Zadejte druhé číslo:'); double b = double.parse(stdin.readLineSync(encoding: UTF8)); double soucet = a + b; double rozdil = a - b; double soucin = a * b; double podil = a / b; print('Součet: $soucet'); print('Rozdíl: $rozdil'); print('Součin: $soucin'); print('Podíl: $podil'); print('Děkuji za použití kalkulačky.');
Výstup programu:
Konzolová aplikácia
Vítejte v kalkulačce
Zadejte první číslo:
3.14
Zadejte druhé číslo:
2.72
Součet: 5.86
Rozdíl: 0.42
Součin: 8.5408
Podíl: 1.1544117647058822
Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.
Všimnite si, že sme zjednodušili parsovanie z konzoly tak, aby sme nepotrebovali stringové premennú, pretože by sme ju rovnako už potom nepoužili.
V budúcej lekcii, Riešené úlohy k 1.-3. lekciu Dart , si povieme viac o typovom systému a predstavíme si ďalšie dátové typy.
Všetky programy máte samozrejme opäť v prílohe, skúšajte si vytvárať nejaké podobné, vedomosti už k tomu máte.:-)
V nasledujúcom cvičení, Riešené úlohy k 1.-3. lekciu Dart, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 15x (2.21 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Dart