Python týden Jarní BF
100% homeoffice, 100% časově flexibilní fulltime programátor pro ITnetwork.cz. #bezdeadlinu Mám zájem!
Využij Jarní akci a získej od nás 50 % bodů navíc zdarma! Zároveň také probíhá Python týden se slevou na e-learning až 80 %

3. diel - Premenné, typový systém a parsovanie

Z minulej lekcie, NetBeans IDE a prvý konzolová aplikácie , už vieme pracovať s NetBeans a vytvoriť konzolovú aplikáciu. Dnes sa 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 tiež vyhradenú určitú veľkosť, ktorú premenná nesmie presiahnuť (napr. Číslo nesmie byť väčšie ako 2 147 483 647).

Premenná má vždy nejaký dátový typ, môže to byť číslo, znak, text 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é.

Java je staticky typizovanom jazyk, 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 kompiler pred spustením 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í. Naopak Java nám nedovolí program ani skompilovať a na chybu nás upozorní (to je ďalšia výhoda kompilácia).

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: float
  • Textový reťazec: String

String píšeme s veľkým písmenom na začiatku, časom sa dozvieme prečo.

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;
System.out.println(a);
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

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:

float a;
a = 56.6F;
System.out.println(a);

Je to takmer rovnaké ako s celočíselným. Ako desatinný oddeľovač používame bodku a na konci desatinného čísla je nutné zadať tzv. Suffix F, tým hovoríme, že sa jedná o float.

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ť. Slúži na to metóda nextLine(), ktorá užívateľovi umožní zadať do konzoly riadku textu a nám vráti zadaný textový reťazec. Aby sme mohli z konzoly načítavať, založíme si nový projekt s názvom Papousek a jeho kód upravíme tak, aby vyzeral takto:

package papousek;

import java.util.Scanner;

public class Papousek {

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in, "Windows-1250");

    }
}

Pre názornosť som vymazal šedú dokumentáciu, ale pokojne si ju tam nechajte. Zmena spočíva v importovanie java.util.Scanner, čo nám umožňuje prístup k metódam pre vstup z konzoly. Konečne ten dlhý riadok na začiatku metódy nerobí nič iné, než že nám vytvorí premennú sc, na ktoré môžeme volať onú metódu nextLine(), ktorá načíta z konzoly ďalšej reťazec. Vysvetliť si ho by bolo teraz príliš komplikované, berte ho ako že tam je, časom ho pochopíme.

Ak budete potrebovať v ktoromkoľvek zo svojich programov načítať text z konzoly, je potrebné program takto upraviť a pridať premennú sc !

Teraz sa presuňme k samotnému kódu programu a upravme obsah metódy main() do nasledujúcej podoby:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Ahoj, som virtuálne papagáj Lora, rád opakujem!");
System.out.println("Napíš niečo: ");
String vstup;
vstup = sc.nextLine();
String vystup;
vystup = vstup + ", " + vstup + "!";
System.out.println(vystup);

To už je trochu zábavnejšia :) Prvý riadok sme ju už vysvetlili vyššie, ďalšie dva riadky sú jasné (vypisujú text). Ďalej deklarujeme textový reťazec vstup. Do vstup sa priradí hodnota z metódy nextLine() 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. Konkatenace (spájanie) reťazcov. Pomocou operátora + totiž môžeme spojiť niekoľko textových reťazcov do jedného a je jedno, či je reťazec v premennej alebo je explicitne zadaný v úvodzovkách v zdrojovom kóde. 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, som virtuálne papagáj Lora, rád opakujem!
Napíš niečo:
Nazdar vtákovi
Nazdar vtákovi, Nazdar vtákovi!

Do premennej môžeme priraďovať už v jej deklarácii, môžeme teda nahradiť:

String vstup;
vstup = sc.nextLine();

za

String vstup = sc.nextLine();

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:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Zadajte číslo k zdvojnásobeniu:");
int a = sc.nextLine();
a = a * 2;
System.out.println(a);

Všimnite si zdvojnásobenie čísla a, ktoré sme vykonali pomocou priradenia. Java 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 nextLine() vracia String a my sa ho snažíme uložiť do premennej typu int. 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 Jave už pripravené metódy k parsovanie, ak budeme chcieť naparsovat napr. Int zo String u, budeme postupovať takto:

String s = "56";
int a = Integer.parseInt(s);

Metóda parseInt() sa volá na triede Integer, berie ako parameter textový reťazec a vráti číslo. Využijeme tejto znalosti v našom programe:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Zadajte číslo k zdvojnásobeniu:");
String s = sc.nextLine();
int a = Integer.parseInt(s);
a = a * 2;
System.out.println(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 v a zdvojnásobíme a vypíšeme do konzoly.

Konzolová aplikácia
Zadajte číslo k zdvojnásobeniu:
1024
2048

Parsovanie sa samozrejme nemusí podariť, keď bude v texte namiesto čísla napr. Slovo, ale tento prípad zatiaľ nebudeme ošetrovať.

Na skeneru existuje aj metóda nextInt(), u ktorej by sa mohlo na prvý pohľad zdať, že nám vráti už naparsované číslo a teda aj ušetrí prácu. V skutočnosti táto metóda žiaľ ponechá vo vstupe znak enter, ktorým užívateľ číslo potvrdil. Tento znak tam zostane tak dlho, dokiaľ ho nenačítavajú z konzoly spolu s ďalším textom, čo môže spôsobiť neočakávané problémy vo vašich programoch. Preto používajte na čítanie z konzoly vždy metódu nextLine().

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.

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Vitajte v kalkulačke");
System.out.println("Zadajte prvé číslo:");
float a = Float.parseFloat(sc.nextLine());
System.out.println("Zadajte druhé číslo:");
float b = Float.parseFloat(sc.nextLine());
float soucet = a + b;
float rozdil = a - b;
float soucin = a * b;
float podil = a / b;
System.out.println("Súčet: " + soucet);
System.out.println("Rozdiel: " + rozdil);
System.out.println("Súčin: " + soucin);
System.out.println("Podiel: " + podil);
System.out.println("Ďakujem za použitia kalkulačky, aplikáciu ukončíte ľubovoľnou klávesou.");

Konzolová aplikácia
Vitajte v kalkulačke
Zadajte prvé číslo:
3.14
Zadajte druhé číslo:
2.72
Súčet: 5.86
Rozdiel: 0.42
Súčin: 8.5408
Podiel: 1.15441176470588
Ďakujem za použitia kalkulačky, aplikáciu ukončíte ľubovoľnou klávesou.

Všimnite si dvoch vecí. Po prvé sme zjednodušili parsovanie z konzoly tak, aby sme nepotrebovali String ovú premennú, pretože by sme ju rovnako už potom nepoužili. Po druhé na konci programu spájame reťazec s číslom pomocou znamienka plus. Java prekvapivo neohlási chybu, ale vykoná tzv. Implicitné konverziu a zavolá na čísle metódu Integer.toString() alebo priamo na typu String String.valueOf(). Keby tomu tak nebolo, alebo sme sa dostali do situácie, keď potrebujeme previesť čokoľvek na String, zavoláme metódu String.valueOf() a ako parameter ju dáme našu premennú. Java to v tomto prípade urobila za nás, v podstate vykoná:

System.out.println("Súčet: " + String.valueOf(soucet));

Práve sme sa teda naučili opak k parsovanie - previesť čokoľvek do textovej podoby. V budúcej lekcii, Riešené úlohy k 3. lekcii Javy , si povieme viac o typovom systému v Jave 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 3. lekcii Javy si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Stiahnuť

Stiahnuté 2912x (67.69 kB)
Aplikácia je vrátane zdrojových kódov v jazyku java

 

 

Článok pre vás napísal David Čápka
Avatar
Ako sa ti páči článok?
Ešte nikto nehodnotil, buď prvý!
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sa informačné technológie naučil na Unicorn College - prestížnej súkromnej vysokej škole IT a ekonómie.
Predchádzajúci článok
NetBeans IDE a prvý konzolová aplikácie
Všetky články v sekcii
Základné konštrukcie jazyka Java
Miniatúra
Nasledujúci článok
Riešené úlohy k 3. lekcii Javy
Aktivity (1)

 

 

Komentáre

Avatar
Marek Navrátil:9.10.2019 14:34

Ahoj, jsem úplný nováček.
V programu papoušek tento kód import java.util.Scanner; napíši jen tak pod package? Dále public class main mám tedy ručně přepsat na papoušek? Zkoušel jsem to tam celé napsat ručně ale nefunguje to.
díky
Marek

 
Odpovedať
9.10.2019 14:34
Avatar
Odpovedá na Marek Navrátil
Michal Šmahel:9.10.2019 15:50

Ahoj, doporučil bych to přečíst si první článek této série.

Nejprve je třeba založit nový projekt. Spouštěcí třída by se ti měla vygenerovat automaticky. Do ní potom už píšeš zdrojový kód, který chceš. Importy se dávají nad blok se třídou, zpravidla pod balíček (package).

Příště prosím pro vložení zdrojového kódu použij druhou ikonku zleva nad polem pro psaní komentáře.

Odpovedať
9.10.2019 15:50
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Tomáš Weiter:27.10.2019 9:53

Velmi uzitecna lekce.

 
Odpovedať
27.10.2019 9:53
Avatar
Aleš Fiala
Člen
Avatar
Aleš Fiala:23.11.2019 20:37

Neví někdo zda mám tvořit v Java with Gradle, Java with Maven nebo Java with Int? Z jistých důvodů aktuálnosti jsem si stáhl nejnovější verzi NetBeans a teď budu mít to poslední určitě napsaný špatně protože se mi tam tvoří nový projekt a stále mi to neodpovídá. Dík za radu.

 
Odpovedať
23.11.2019 20:37
Avatar
Aleš Fiala
Člen
Avatar
Odpovedá na Aleš Fiala
Aleš Fiala:23.11.2019 20:40

To je vlastně Java with Ant

 
Odpovedať
23.11.2019 20:40
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Aleš Fiala
Člen
Avatar
Aleš Fiala:26.11.2019 16:21

Abych si to ujasnil, to Windows-1250 ošetřuje diakritiku aby to ve Windows příkazovém řádku nevypsalo nesmyslné s****y?

 
Odpovedať
26.11.2019 16:21
Avatar
Rateo
Člen
Avatar
Rateo:26.11.2019 22:33

Ahoj,
pro tebe to asi přínos už nebude vzhledem ke stáří dotazu, ale pro ostatní ještě může..."program" totiž čeká až napíšeš dole do console text (u papouška) a nebo číslo (u zdvojnásobovače).

 
Odpovedať
26.11.2019 22:33
Avatar
Nyssa
Člen
Avatar
Nyssa:22. februára 19:37

Celkem bych uvítala aktualizaci výuky, protože Net Beans prošel určitým vývojem a postup v jednotlivých oknech se tedy mírně liší od návodu... Nejspíš zkusím někde splašit starou verzi a 11.2 si nechám na "až to budu umět" :D.

 
Odpovedať
22. februára 19:37
Avatar
PatrikSubjak
Člen
Avatar
PatrikSubjak:7. marca 17:22

Tak len som sa začal učiť programovanie v Jave. Začal som pred 3 ma dnami na Codeacademy každopádne mal som problém s dokonalym porozumením OOP a teda som si našiel tento návod. Hneď ako prvé som musel googlit prečo sa používa float miesto double. A tiež som akosi mimo z použitia scannera,povoluje nám to vlastne Font Windows-1250 aby tam fungovala CZ/SK diakritika ? Neviem,idem dalej a dúfam že to časom pochopím.

Odpovedať
7. marca 17:22
What we do in life, echoes in eternity.
Avatar
Barbora Hladíková:8. marca 13:45

Všechno se povedlo :) je fajn že to jde zde rozkliknout a podívat se jak to mělo být a pak si člověk uvědomí, kde udělal chybu i v maličkosti ( jako nextline a nextLine :D :D ) ale zatím super daří se :) děkuji za članek

 
Odpovedať
8. marca 13:45
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!