September discount week
Tento týden až 80% sleva na e-learning týkající se jazyka C
50 % bodů zdarma na online výuku díky naší Slevové akci!

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

Z minulé lekce, NetBeans IDE a první konzolová aplikace, již umíme pracovat s NetBeans a vytvořit konzolovou aplikaci.

Dnes se 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é také vyhrazenou určitou velikost, kterou proměnná nesmí přesahnout (např. číslo nesmí být větší než 2 147 483 647).

Proměnná má vždy nějaký datový typ, může to být číslo, znak, text 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.

Java je staticky typovaný 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 kompiler před spuštěním 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í. Naopak Java nám nedovolí program ani zkompilovat a na chybu nás upozorní (to je další výhoda kompilace).

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: float
  • Textový řetězec: String

String píšeme s velkým písmenem na začátku, časem se dozvíme proč.

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;
System.out.println(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:

float a;
a = 56.6F;
System.out.println(a);
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Je to téměř stejné jako s celočíselným. Jako desetinný oddělovač používáme tečku a na konci desetinného čísla je nutné zadat tzv. suffix F, tím říkáme, že se jedná o float.

Deklarace a inicializace více proměnných najednou

Deklaraci i přiřazení je možné řetězit, což se dá použít, pokud chceme deklarovat více proměnných stejného typu a nebo jim nastavit stejnou hodnotu. Nemusíme pak psát:

int a;
int b;
a = 0;
b = 0;

ale můžeme zkráceně napsat jen:

int a, b; // deklarujeme dvě proměnné typu int najednou
a = b = 0; // a najednou jim oběma přiřadíme nulu

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. Slouží k tomu metoda nextLine(), která uživateli umožní zadat do konzole řádku textu a nám vrátí zadaný textový řetězec. Abychom mohli z konzole načítat, založíme si nový projekt s názvem Papousek a jeho kód upravíme tak, aby vypadal takto:

package papousek;

import java.util.Scanner;

public class Papousek {

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

    }
}

Pro názornost jsem vymazal šedou dokumentaci, ale klidně si ji tam nechte. Změna spočívá v importování java.util.Scanner, což nám umožňuje přístup k metodám pro vstup z konzole. Konečně ten dlouhý řádek na začátku metody nedělá nic jiného, než že nám vytvoří proměnnou sc, na které můžeme volat onu metodu nextLine(), která načte z konzole další řetězec. Vysvětlit si ho by bylo nyní příliš komplikované, berte ho jako že tam je, časem ho pochopíme.

Pokud budete potřebovat v kterémkoli ze svých programů načíst text z konzole, je nutné program takto upravit a přidat proměnnou sc!

Nyní se přesuňme k samotnému kódu programu a upravme obsah metody main() do následující podoby:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Ahoj, jsem virtuální papoušek Lóra, rád opakuji!");
System.out.println("Napiš něco: ");
String vstup;
vstup = sc.nextLine();
String vystup;
vystup = vstup + ", " + vstup + "!";
System.out.println(vystup);

To už je trochu zábavnější :) První řádek jsme ji již vysvětlili výše, další dva řádky jsou jasné (vypisují text). Dále deklarujeme textový řetězec vstup. Do vstup se přiřadí hodnota z metody nextLine() 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. konkatenace (spojování) řetězců. Pomocí operátoru + totiž můžeme spojit několik textových řetězců do jednoho a je jedno, jestli je řetězec v proměnné nebo je explicitně zadán v uvozovkách ve zdrojovém kódu. 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 = sc.nextLine();

za

String vstup = sc.nextLine();

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:

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

Všimněte si zdvojnásobení čísla a, které jsme provedli pomocí přiřazení. Java 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 nextLine() vrací String a my se ho snažíme uložit do proměnné typu int. 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 Javě již připraveny metody k parsování, pokud budeme chtít naparsovat např. int ze Stringu, budeme postupovat takto:

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

Metoda parseInt() se volá na třídě Integer, bere jako parametr textový řetězec a vrátí číslo. Využijeme této znalosti v našem programu:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Zadejte číslo k zdvojnásobení:");
String s = sc.nextLine();
int a = Integer.parseInt(s);
a = a * 2;
System.out.println(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.

Na skeneru existuje i metoda nextInt(), u které by se mohlo na první pohled zdát, že nám vrátí již naparsované číslo a tedy i ušetří práci. Ve skutečnosti tato metoda bohužel ponechá ve vstupu znak Enteru, kterým uživatel číslo potvrdil. Tento znak tam zůstane tak dlouho, dokud jej nenačtete z konzole spolu s dalším textem, což může způsobit neočekávané problémy ve vašich programech. Proto používejte ke čtení z konzole vždy metodu nextLine().

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í.

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Vítejte v kalkulačce");
System.out.println("Zadejte první číslo:");
float a = Float.parseFloat(sc.nextLine());
System.out.println("Zadejte 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("Součet: " + soucet);
System.out.println("Rozdíl: " + rozdil);
System.out.println("Součin: " + soucin);
System.out.println("Podíl: " + podil);
System.out.println("Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.");

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.15441176470588
Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.

Všimněte si dvou věcí. Zaprvé jsme zjednodušili parsování z konzole tak, abychom nepotřebovali Stringovou proměnnou, protože bychom ji stejně již poté nepoužili. Zadruhé na konci programu spojujeme řetězec s číslem pomocí znaménka plus. Java překvapivě nezahlásí chybu, ale provede tzv. implicitní konverzi a zavolá na čísle metodu Integer.toString() nebo přímo na typu String String.valueOf(). Kdyby tomu tak nebylo nebo jsme se dostali do situace, kdy potřebujeme převést cokoli na String, zavoláme metodu String.valueOf() a jako parametr ji dáme naši proměnnou. Java to v tomto případě udělala za nás, v podstatě vykoná:

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

Právě jsme se tedy naučili opak k parsování - převést cokoli do textové podoby.

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 :)

V následujícím cvičení, Řešené úlohy k 3. lekci Javy, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Stáhnout

Staženo 2953x (67.69 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

Předchozí článek
NetBeans IDE a první konzolová aplikace
Všechny články v sekci
Základní konstrukce jazyka Java
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
137 hlasů
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 university Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (24)

 

 

Komentáře
Zobrazit starší komentáře (288)

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).

 
Odpovědět
26.11.2019 22:33
Avatar
Nyssa
Člen
Avatar
Nyssa:22. února 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.

 
Odpovědět
22. února 19:37
Avatar
PatrikSubjak
Člen
Avatar
PatrikSubjak:7. března 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.

Odpovědět
7. března 17:22
What we do in life, echoes in eternity.
Avatar
Barbora Hladíková:8. března 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

 
Odpovědět
8. března 13:45
Avatar
Rozbita Zaluzie:16. dubna 18:00

Zajímalo by mě co přesně má znamenat "Float.parseFlo­at(sc.nextLine());" z nějakého důvodu mi to dělá problém a program potom nejde spustit

public class SimpleKalkulacka {
    public static void main(String[] args) {

        System.out.println("Vítejte v mojí kalkulačce ");
        System.out.println("Zadej prosím první číslo");
        float a = Float.parseFloat(sc.nextLine());
        System.out.println("Zadej prosím 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("Součet: " + soucet);
        System.out.println("Rozdíl: " + rozdil);
        System.out.println("Součin: " + soucin);
        System.out.println("Podíl: " + podil);
    }
}
 
Odpovědět
16. dubna 18:00
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Janis Lukepudis:18. dubna 13:17

Ahoj,
metoda Float.parseFlo­at() ti prevadi/parsuje text (String) na desetinna cisla (float). Dale pak metoda v parametru sc.nextLine() ti umozni ziskat vstup z konzole jako String, tj. to co napsal uzivatel.
U tebe program nepujde, protoze nikde nemas vytvorenou promennou sc, takze metoda parseFloat() nepozna, ze si ma vzit text ze vstupu.
Vytvor si promennou sc na zacatku v tele Main:

Scanner sc = new Scanner(System.in, "Windows-1250");

Diky tomu pak muzes pouzivat metody z tridy Scanner, mimojine i nextLine().

 
Odpovědět
18. dubna 13:17
Avatar
Petr Novotný:27. května 10:01

ahoj, když si spustím stažený zdvojnásobovač v NetBeans, tak vše funguje jak má. Když si ale vytvořím vlastní projekt a zkopíruji a vložím text kódu, tak mi zdvojnásobovač nefunguje. Poradíte? Díky..

 
Odpovědět
27. května 10:01
Avatar
Alesh
Překladatel
Avatar
Odpovídá na Petr Novotný
Alesh:27. května 13:36

Těžko říct, když nenapíšeš, co ti to hlásí za chybu. Nechybí ti import Scanneru?

import java.util.Scanner;
 
Odpovědět
27. května 13:36
Avatar
Lukáš Kučavík:3. července 14:39

Zatím je to snadné. Těším se na další lekce :)

 
Odpovědět
3. července 14:39
Avatar
Michal Maleňák:10. července 15:44

Super práce palec hore pro autory. Již si to po třech letech pročítám znovu a vždy mi to dá něco nového... Díky, už by to chtělo ne "jen jako" programovat ale "opravdu" už začít... tak snad se brzy uvidíme na jedné z Vašich "najelváren"

 
Odpovědět
10. července 15:44
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 10 zpráv z 298. Zobrazit vše