4. diel - Typový systém druhýkrát - dátové typy
V predchádzajúcom cvičení, Riešené úlohy k 1.-3. lekciu Dart, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V minulej lekcii Dart kurzu, Riešené úlohy k 1.-3. lekciu Dart , sme si ukázali základné dátové
typy. Boli to int
, String
a double
. Teraz
sa na dátové typy pozrieme viac zblízka a vysvetlíme si, kedy aký použiť.
Dnešná lekcia bude veľa teoretická, ale o to viac bude praktická tá
budúci. Na konci si vytvoríme pár jednoduchých ukážok.
Väčšina programovacích jazykov rozoznáva 2 druhy dátových typov a to hodnotové a referenčné. Všetko v Dart je tzv. Objekt s čím ruka v ruke ide to, že typy v Dart sú referenčnej. K referenčným typom sa dostaneme podrobnejšie až u objektovo orientovaného programovania, kde si tiež všetko dopodrobna vysvetlíme.
Dátové typy Dart
Dart má podporu pre niekoľko dátových typov: čísla, reťazce, logické hodnoty, zoznamy, mapy, runy a symboly. Poslednými 3 sa nebudeme v tomto prvom kurze zaoberať.
Čísla
V Dart rozlišujeme 2 typy čísel, a to síce čísla celá
a desatinné. Pre celé čísla sa používa dátový typ
int
, pre desatinné čísla dátový typ double
. Typy
int
i double
sú podtypy typu num
.
V rámci typu num
sú definované základné operátormi
+
, -
, /
a *
a taktiež
základné metódy ako abs()
, ceil()
,
floor()
a mnoho ďalších. Bitové operátormi, ako napríklad
bitový posun vpravo >>
, sú definované v rámci typu
int
. Ďalšie matematické metódy môžete nájsť aj v knižnici
dart:math
.
Aj cez to, že Dart (Dart VM) podporuje ľubovoľnú presnosť celých čísel, čísla by mala byť v rozsahu -2 53 až 2 53, najmä ak používate Dart v prehliadači, kde platia obmedzenia JavaScriptu.
Desatinné čísla sú reprezentované ako 64bitová čísla s dvojitou presnosťou, ako je špecifikované v štandarde IEEE 754.
int a = 5; double b = 3.14; num c = 6; num d = 12.8
Logická hodnota
Pre logické hodnoty sa používa dátový typ bool
a môže
nadobúdať dvoch hodnôt: true
(pravda) alebo false
(nepravda). Budeme ho používať najmä vtedy, až sa dostaneme k podmienkam.
Do premennej typu bool
možno uložiť ako priamo hodnotu
true
/ false
, tak i logický výraz. Skúsme si
jednoduchý príklad:
bool b = false; bool vyraz = 15 > 5; print(b); print(vyraz);
Výstup programu:
Konzolová aplikácia
false
true
Vidíme, že výraz nadobúda hodnoty true
(pravda), pretože
15
je naozaj väčší ako 5
. Od výrazov je to len
krok k podmienkam, na ne sa pozrieme nabudúce.
Reťazca
Pre reťazca v Dart sa používa dátový typ String
a sú to
sekvencie znakov v UTF-16. Pre reťazca môžete použiť
apostrofy aj úvodzovky, obe možnosti sú v Dart ekvivalentné.
print('Vítám tě, čtenáři!'); print("Dart je skvělý jazyk."); print('A ty\'s skvělým čtenářem ITnetwork.'); print("Život je prostě \"ňuňu\".");
Okrem toho v Dart existujú aj viacriadkové reťazce, ktoré sa označujú trojitými apostrofy alebo úvodzovkami. Pozor si možno musíme dávať na medzery na začiatkoch riadkov a odriadkovanie pred / po trojitým apostrofom / uvozovce.
print(''' Jsem na více řádek!'''); print(""" Tady mi pak nějaká "uvozovka" v uvozovce nikde už nevadí. """);
Výstup v konzole potom bude vyzerať nejako takto:
Konzolová aplikácia
Vítám tě, čtenáři!
Dart je skvělý jazyk.
A ty's skvělým čtenářem ITnetwork.
Život je prostě "ňuňu".
Jsem na
více
řádek!
Tady mi pak
jedna "uvozovka" nikde už nevadí.
String
má na sebe rad naozaj užitočných metód. Niektoré si
teraz preberieme a vyskúšame:
StartsWith (), endsWith () a contains ()
Môžeme sa jednoducho opýtať, či reťazec začína, končí alebo či
obsahuje určitý podreťazec (substring). Podreťazcom myslíme časť
pôvodného reťazca. Všetky tieto metódy budú ako parameter brať samozrejme
podreťazec a vracať hodnoty typu bool
(true
/
false
). Zatiaľ na výstup nevieme reagovať, ale poďme si ho
aspoň vypísať:
String s = 'Krokonosohroch'; print(s.startsWith('krok')); print(s.endsWith('hroch')); print(s.contains('nos')); print(s.contains('roh'));
Výstup programu:
Konzolová aplikácia
false
true
true
false
Vidíme, že všetko funguje podľa očakávania. Prvý výraz samozrejme neprešiel vďaka tomu, že reťazec v skutočnosti začína veľkým písmenom.
ToUpperCase () a toLowerCase ()
Rozlišovanie veľkých a malých písmen môže byť niekedy na obtiaž.
Veľakrát sa budeme potrebovať opýtať na prítomnosť podreťazca tak, aby
nezáležalo na veľkosti písmen. Situáciu môžeme vyriešiť pomocou metód
toUpperCase()
a toLowerCase()
, ktoré vracia reťazec
vo veľkých a v malých písmenách. Uveďme si reálnejšie príklad ako je
Krokonosohroch. Budeme mať v premennej riadok konfiguračného súboru, ktorý
písal užívateľ. Keďže sa na vstupy od užívateľov nemožno spoľahnúť,
musíme sa snažiť eliminovať možné chyby, tu napr. S veľkými
písmenami.
String konfig = 'Fullscreen shaDows autosave'; konfig = konfig.toLowerCase(); print('Poběží hra ve fullscreenu?'); print(konfig.contains('fullscreen')); print('Budou zapnuté stíny?'); print(konfig.contains('shadows')); print('Přeje si hráč vypnout zvuk?'); print(konfig.contains('nosound')); print('Přeje si hráč hru automaticky ukládat?'); print(konfig.contains('autosave'));
Výstup programu:
Konzolová aplikácia
Poběží hra ve fullscreenu?
true
Budou zapnuté stíny?
true
Přeje si hráč vypnout zvuk?
false
Přeje si hráč hru automaticky ukládat?
true
Vidíme, že sme schopní zistiť prítomnosť jednotlivých slov v reťazci tak, že si najprv reťazec prevedieme celý na malé písmená (alebo na veľké) a potom kontrolujeme prítomnosť slová len malými (alebo veľkými) písmenami. Takto by mimochodom mohlo naozaj vyzerať jednoduché spracovanie nejakého konfiguračného skriptu.
Trim (), trimLeft () a trimRight ()
Problémom vo vstupoch od užívateľa môže byť aj diakritika, ale Dart našťastie pracuje plne v UTF-16. Nestane sa nám teda, že by sa diakritika nejako skomolila. Ďalšou nástrahou môžu byť medzery a všeobecne všetky tzv. Biele znaky, ktoré nie sú vidieť, ale môžu nám uškodiť. Vo všeobecnosti môže byť dobré trimovať všetky vstupy od užívateľa, môžeme trimovať buď celý reťazec alebo len biele znaky pred ním a za ním. Prezradím, že pri parsovacích funkciách Dart trimuje zadaný reťazec automaticky, než s ním začne pracovať. Skúste si v nasledujúcej aplikácii pred číslo a za číslo zadať niekoľko medzier:
print('Zadejte číslo:'); String s = stdin.readLineSync(encoding: UTF8); print('Zadal jste text: "$s"'); print('Text po funkci trim: "${s.trim()}"'); int a = int.parse(s); print('Převedl jsem zadaný text na číslo parsováním, zadal jste: $a');
ReplaceAll ()
Asi najdôležitejšie metódou na stringu je nahradenie určitej jeho časti
iným textom. Ako parametre zadáme dva podreťazca, jeden čo chceme
nahrádzať a druhý ten, ktorým to chceme nahradiť. Metóda vráti nový
string
, v ktorom prebehlo nahradenie. Keď daný podreťazec
metóda nenájde, vráti pôvodnú reťazec. Skúsme si to:
String s = "Java je nejlepší!"; s = s.replaceAll("Java", "Dart"); print(s);
Výstup programu:
Konzolová aplikácia
Dart je nejlepší!
PadLeft () a padRight ()
Ako posledný si spomenieme metódy, ktoré nám k textu naopak medzery
pridajú.:) K čomu to je dobré? Predstavte si, že máme 100 premenných a
budeme ich chcieť usporiadať do tabuľky. Text upravíme pomocou metódy
padRight()
s parametrom šírky stĺpca, teda napr. 20 znakov.
Pokiaľ bude mať text len 12 znakov, vypíše sa pred neho 8 medzier, aby mal
veľkosť 20. Obdobne metóda padLeft()
by vypísala 8 medzier za
neho. Keďže nemáme znalosti na vytvorenie takej tabuľky, budeme si metódy
len pamätať a vyskúšame si ich ďalej v seriáli.
Length
Posledný, ale najdôležitejšie vlastnosť (pozor, nie metóda) je
length
, teda dĺžka. Vracia celé číslo, ktoré predstavuje
počet znakov v reťazci. Za vlastnosti nepíšeme zátvorky, pretože nemajú
parametre.
print('Zadejte vaše jméno:'); String jmeno = stdin.readLineSync(encoding: UTF8); print('Délka vašeho jména je: ${jmeno.length}');
Je toho ešte veľa k vysvetľovaniu a sú ďalšie dátové typy, ktoré sme neprebrali. Aby sme však stále nepreberala len teóriu, ukážeme si už v nasledujúcej lekcii, Riešené úlohy k 4. lekcii Dart , podmienky a neskôr cykly. Potom bude naša programátorská výbava dostatočne veľká na to, aby sme tvorili zaujímavé programy.:)
V nasledujúcom cvičení, Riešené úlohy k 4. lekcii Dart, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.