3. díl - Proměnné, typový systém a parsování

Dart Základy Proměnné, typový systém a parsování

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Z minulé lekce Dart kurzu, IntelliJ IDEA a první konzolová aplikace, již umíme pracovat s IntelliJ IDEA a vytvořit konzolovou aplikaci. Dnes se v tutoriálu podíváme na tzv. typový systém, ukážeme si základní datové typy a práci s proměnnými. Výsledkem budou 4 jednoduché programy včetně kalkulačky.

Proměnné

Než začneme řešit datové typy, pojďme se shodnout na tom, co je to proměnná (programátoři mi teď jistě odpustí zbytečné vysvětlování). Určitě znáte z matematiky proměnnou (např. x), do které jsme si mohli uložit nějakou hodnotu, nejčastěji číslo. Proměnná je v informatice naprosto to samé, je to místo v paměti počítače, kam si můžeme uložit nějaká data (jméno uživatele, aktuální čas nebo databázi článků). Toto místo má podle typu proměnné obvykle také vyhrazenou určitou velikost, kterou proměnná nesmí přesáhnout.

Proměnná má vždy nějaký datový typ, může to být číslo, text, seznam a podobně, záleží na tom, k čemu ji chceme používat. Většinou musíme před prací s proměnnou tuto proměnnou nejdříve tzv. deklarovat, čili říci jazyku jak se bude jmenovat a jakého datového typu bude (jaký v ní bude obsah). Jazyk ji v paměti založí a teprve potom s ní můžeme pracovat. Podle datového typu proměnné si ji jazyk dokáže z paměti načíst, modifikovat, případně ji v paměti založit. O každém datovém typu jazyk ví, kolik v paměti zabírá místa a jak s tímto kusem paměti pracovat.

Typový systém

Existují dva základní typové systémy: statický a dynamický.

Dynamický typový systém nás plně odstiňuje od toho, že proměnná má vůbec nějaký datový typ. Ona ho samozřejmě vnitřně má, ale jazyk to nedává najevo. Dynamické typování jde mnohdy tak daleko, že proměnné nemusíme ani deklarovat, jakmile do nějaké proměnné něco uložíme a jazyk zjistí, že nebyla nikdy deklarována, sám ji založí. Do té samé proměnné můžeme ukládat text, potom objekt uživatele a potom desetinné číslo. Jazyk se s tím sám popere a vnitřně automaticky mění datový typ. V těchto jazycích jde vývoj rychleji díky menšímu množství kódu, zástupci jsou např. PHP nebo Ruby.

Statický typový systém naopak striktně vyžaduje definovat typ proměnné a tento typ je dále neměnný. Jakmile proměnnou jednou deklarujeme, není možné její datový typ změnit. Jakmile se do textového řetězce pokusíme uložit objekt uživatel, dostaneme vynadáno.

S Dartem to je trochu komplikovanější, jelikož zatím podporuje oba přístupy. Jeho vývoj však směřuje k přechodu na pouze statické typování, takže jej i zde budu prezentovat jako staticky typovaný.

U staticky typovaných jazyků, všechny proměnné musíme nejprve deklarovat s jejich datovým typem. Nevýhodou je, že díky deklaracím je zdrojový kód poněkud objemnější a vývoj pomalejší. Obrovskou výhodou však je, že nám statický analyzátor zkontroluje, zda všechny datové typy sedí. Dynamické typování sice vypadá jako výhodné, ale zdrojový kód není možné automaticky kontrolovat a když někde očekáváme objekt uživatel a přijde nám tam místo toho desetinné číslo, odhalí se chyba až za běhu a interpret program shodí.

Pojďme si nyní něco naprogramovat, ať si nabyté znalosti trochu osvojíme, s teorií budeme pokračovat až příště. Řekněme si nyní tři základní datové typy:

  • Celá čísla: int
  • Desetinná čísla: double
  • Textový řetězec: String

Program vypisující proměnnou

Zkusíme si nadeklarovat celočíselnou proměnnou a, dosadit do ní číslo 56 a její obsah vypsat do konzole. Založte si nový projekt, pojmenujte ho vypis (i ke všem dalším příkladům si vždy založte nový projekt). Kód samozřejmě píšeme do těla metody main() (jako minule), čili ji zde již nebudu opisovat.

int a;
a = 56;
print(a);

První příkaz nám nadeklaruje novou proměnnou a datového typu int, proměnná tedy bude sloužit pro ukládání celých čísel. Druhý příkaz provádí přiřazení do proměnné, slouží k tomu operátor "rovná se". Poslední příkaz je nám známý, vypíše do konzole obsah proměnné a. Konzole je chytrá a umí vypsat i číselné proměnné.

Konzolová aplikace
56

Pro desetinnou proměnnou by kód vypadal takto:

double a;
a = 56.6;
print(a);

Je to téměř stejné jako s celočíselným. Jako desetinný oddělovač používáme tečku.

Program Papoušek

Minulý program byl poněkud nudný, zkusme nějak reagovat na vstup od uživatele. Napíšeme program papoušek, který bude dvakrát opakovat to, co uživatel napsal. Ještě jsme nezkoušeli z konzole nic načítat, ale je to velmi jednoduché. Slouží k tomu metoda stdin.readLineSync(), která nám vrátí textový řetězec z konzole.

Nejprve si musíme naimportovat dart:io, což je Dart knihovna pro práci se vstupem a výstupem. Tím se nám zpřístupní stdin, což je objekt (prozatím nebudeme rozvádět, co objekt znamená) pro práci se vstupem z konzole, jednoduše řečeno. Současně si importujeme i knihovnu dart:convert, abychom mohli určit kódování UTF8 pro naše načítání.

Zkusme si napsat následující 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ábavnější. :) První dva řádky jsou jasné, dále deklarujeme textový řetězec vstup. Do vstup se přiřadí hodnota z metody stdin.readLineSync() na konzoli, tedy to, co uživatel zadal. Pro výstup si pro názornost zakládáme další proměnnou typu textový řetězec. Zajímavé je, jak do vystup přiřadíme, tam využíváme tzv. interpolace (vkládání) řetězců. Pomocí operátoru $ totiž můžeme v řetězci určit, že následující znaky budou definovat název proměnné, kterou chceme vložit. Pokud bychom navíc potřebovali za vstup ihned napsat jiné znaky abecedy, například "ahoj", můžeme název proměnné vložit do složených závorek, což by ve výsledku mohlo vypadat jako "${vstup}ahoj". Do proměnné tedy přiřadíme vstup, dále čárku, znovu vstup a poté vykřičník. Proměnnou vypíšeme a skončíme.

Konzolová aplikace
Ahoj, jsem virtuální papoušek Lóra, rád opakuji!
Napiš něco:
Nazdar ptáku
Nazdar ptáku, Nazdar ptáku!

Do proměnné můžeme přiřazovat již v její deklaraci, můžeme tedy nahradit:

String vstup;
vstup = stdin.readLineSync(encoding: UTF8);

za

String vstup = stdin.readLineSync(encoding: UTF8);

Program by šel zkrátit ještě více v mnoha ohledech, ale obecně je lepší používat více proměnných a dodržovat přehlednost, než psát co nejkratší kód a po měsíci zapomenout, jak vůbec funguje.

Program zdvojnásobovač

Zdvojnásobovač si vyžádá na vstupu číslo a to poté zdvojnásobí a vypíše. Asi bychom s dosavadními znalostmi napsali něco takového:

print('Zadejte číslo k zdvojnásobení:');
int a = stdin.readLineSync(encoding: UTF8);
a = a * 2;
print(a);

Všimněte si zdvojnásobení čísla a, které jsme provedli pomocí přiřazení. Dart nám nyní vyhubuje a podtrhne řádek, ve kterém se snažíme hodnotu z konzole dostat do proměnné typu int. Narážíme na typovou kontrolu, konkrétně nám stdin.readLineSync() vrací string a my se ho snažíme uložit do intu. Cokoli přijde z textové konzole je vždy text a to i když zadáme číslo. Budeme ho potřebovat tzv. naparsovat.

Parsování

Parsováním se myslí převod z textové podoby na nějaký specifický typ, např. číslo. Mnoho datových typů má v Dartu již připraveny metody k parsování, pokud budeme chtít naparsovat např. int ze stringu, budeme postupovat takto:

String s = '56';
int a = int.parse(s);

Vidíme, že datový typ int má na sobě přímo metodu parse(), která bere jako parametr textový řetězec a vrátí číslo. Využijeme této znalosti v našem programu:

print('Zadejte číslo k zdvojnásobení:');
String s = stdin.readLineSync(encoding: UTF8);
int a = int.parse(s);
a = a * 2;
print(a);

Nejprve si text z konzole uložíme do textového řetězce s. Do celočíselné proměnné a poté uložíme číselnou hodnotu řetězce s. Dále hodnotu v a zdvojnásobíme a vypíšeme do konzole.

Konzolová aplikace
Zadejte číslo k zdvojnásobení:
1024
2048

Parsování se samozřejmě nemusí povést, když bude v textu místo čísla např. slovo, ale tento případ zatím nebudeme ošetřovat.

Jednoduchá kalkulačka

Ještě jsme nepracovali s desetinnými čísly, zkusme si napsat slibovanou kalkulačku. Bude velmi jednoduchá, na vstup přijdou dvě čísla, program poté vypíše výsledky pro sčítání, odčítání, násobení a dělení.

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á aplikace
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šimněte si, že jsme zjednodušili parsování z konzole tak, abychom nepotřebovali stringovou proměnnou, protože bychom ji stejně již poté nepoužili.

V příští lekci, Typový systém podruhé - datové typy, si řekneme více o typovém systému a představíme si další datové typy.

Všechny programy máte samozřejmě opět v příloze, zkoušejte si vytvářet nějaké podobné, znalosti již k tomu máte. :-)


 

Stáhnout

Staženo 2x (2.21 kB)
Aplikace je včetně zdrojových kódů v jazyce Dart

 

 

Článek pro vás napsal Honza Bittner
Avatar
Jak se ti líbí článek?
2 hlasů
Milovník Dartu. Student FIT ČVUT. Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Miniatura
Všechny články v sekci
Základní konstrukce jazyka Dart
Miniatura
Následující článek
Cvičení k 1.-3. lekci Dartu
Aktivity (5)

 

 

Komentáře

Avatar
nogare
Člen
Avatar
nogare:29.12.2017 13:20

Čau, nemělo by to být v tom ukázkovym kódu "double" místo "int"?
Hledej text "Pro desetinnou proměnnou by kód vypadal takto:"

Odpovědět  +1 29.12.2017 13:20
Zkoušely jste to vypnout a zapnout?
Avatar
Honza Bittner
Šupák
Avatar
Odpovídá na nogare
Honza Bittner:29.12.2017 13:47

Jasně, tam je chyba. Díky. :-)

Odpovědět 29.12.2017 13:47
Milovník Dartu. Student FIT ČVUT. Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.