Programátorská sociální síť a materiálová základna pro C#, Java, PHP, HTML, CSS, JavaScript a další.


Přihlásit se Registrace  

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

Zpět do sekce Základní konstrukce jazyka Java

Z minulého tutoriálu o Javě 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ž 32.000).

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á nejevo. 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é.

Výpis čísla z konzole

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 za řádek se Scanner píšeme:

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

Program papoušek opakování textu z konzole v Javě

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é zvojnásobí a vypíše. Asi bychom s dosavadními znalostmi napsali něco takového:

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 intu. Budeme ho potřebovat tzv. naparsovat.

Parsování

Parsováním se myslí převod z textové podoby na nějakou specifickou hodnotu, 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:

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.

Zdvojnásobení čísla z konzole

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

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.");
Jednoduchá konzolová kalkulačka v Javě

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 Stringu 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. Příště si řekneme více o typovém systému v Javě 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

3. díl - Proměnné, typový systém a parsování 273x (67.69 kB)

Program je včetně zdrojových kódů v jazyce java

 

Autor: sdraco
Autor je C# a PHP programátor, dále se věnuje webovým technologiím a redaktorské činnosti na portálu devbook. Rád své znalosti sdílí s komunitou a tak je rozšiřuje, věří, že smysl života je v poznání.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.


Jak se vám líbí článek?
Celkem (3 hlasů):
5 5 5 5 5


 


Předchozí článek
NetBeans IDE a první konzolová aplikace
V tutoriálu si ukážeme instalaci NetBeans a základy práce s ním. Vytvoříme si jednoduchou konzolovou aplikaci v Javě - Hello world.
Všechny články v sekci
Základní konstrukce jazyka Java
Tutoriály v sekci se věnují vysvětlení základních konstrukcí jazyka Java pro úplné začátečníky. Naučíte se jednoduché konzolové aplikace.
Další článek
Typový systém podruhé: Datové typy
Tutoriál obsahuje tabulky základních datových typů jazyka Java, dále si popíšeme metody na stringu, jako je např. práce s podřetězci.


 

 

Vaše komentáře:
Zobrazit starší komentáře (41)

30.04.2013 12:18:16
Avatar
Lukaaash
Redaktor
Skill: 286/16MHz
DotDotDotDotDotDotDotDotDotDot

Zdravím, skvělý seriál. Ta tučná věta pomohla, žádný chyby mi to nehlásí, paráda. Sice ještě čtu o Javě na jiném webu, ale tady jsem si třeba už mohl načítat text přímo z konzole, což je fajn.
Články jsou velice srozumitelné.


Odpovědět   i++; | i--; ( +1 )
Trocha poezie do toho umírání
13.05.2013 19:11:39
Avatar
mr.forstak
Člen
Skill: Vědecká kalkulačka
DotDotDotDotDotDotDotDotDotDot

pro zadávání zvláštních znaků je podle mě lepší toto (" - Alt+34, ; - Alt+59, { - Alt+123, } - Alt+125) než furt přehazovat klávesnici.


Odpovědět   i++; | i--;
Realita hm... pěkný místo, ale žít bych tam nechtěl.
13.05.2013 19:57:52
Avatar
mr.forstak
Člen
Skill: Vědecká kalkulačka
DotDotDotDotDotDotDotDotDotDot

při sc.nextLine mě to červeně podtrhává sc i když zkopíruji celej zdroják :(:(:(


Odpovědět   i++; | i--;
Realita hm... pěkný místo, ale žít bych tam nechtěl.
13.05.2013 20:00:41
Avatar
Zirko
Moderátor
Skill: Core 2 Duo
DotDotDotDotDotDotDotDotDotDot
Odpovídá na mr.forstak:

Pošli tu část kódu kde ti to podtrhává ;)


Odpovědět   i++; | i--;
Pokrok nezastavíš, neusni a jdi s ním vpřed
13.05.2013 20:05:47
Avatar
mr.forstak
Člen
Skill: Vědecká kalkulačka
DotDotDotDotDotDotDotDotDotDot

System.out.prin­tln("Vítejte v kalkulačce");
System.out.prin­tln("Zadejte první číslo:");
float a = Float.parseFlo­at(sc.nextLine());
System.out.prin­tln("Zadejte druhé číslo:");
float b = Float.parseFlo­at(sc.nextLine());

P.S. pouze všechny sc

Editováno 13. května


Odpovědět   i++; | i--;
Realita hm... pěkný místo, ale žít bych tam nechtěl.
13.05.2013 20:06:38
Avatar
Zirko
Moderátor
Skill: Core 2 Duo
DotDotDotDotDotDotDotDotDotDot
Odpovídá na mr.forstak:

A máš založený Scanner ?
Přečti si celý tutoriál znoa a nalezneš odpověď :)

Editováno 13. května


Odpovědět   i++; | i--;
Pokrok nezastavíš, neusni a jdi s ním vpřed
13.05.2013 20:12:46
Avatar
mr.forstak
Člen
Skill: Vědecká kalkulačka
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Zirko:

jo já zapomněl že je to taky proměná takže sem ho tam nahor nenapsal - omlouvám se moje blbost


Odpovědět   i++; | i--;
Realita hm... pěkný místo, ale žít bych tam nechtěl.
13.05.2013 20:21:00
Avatar
mr.forstak
Člen
Skill: Vědecká kalkulačka
DotDotDotDotDotDotDotDotDotDot
Odpovídá na mr.forstak:

a už jede... juchů :D

dik

Editováno 13. května


Odpovědět   i++; | i--;
Realita hm... pěkný místo, ale žít bych tam nechtěl.
14.05.2013 08:32:01
Avatar
sdraco
Moderátor
Skill: Kvantový počítač
DotDotDotDotDotDotDotDotDotDot
Odpovídá na mr.forstak:

Lidi, proč mi to děláte? :D Dal jsem vám to tam dokonce tučně, že to bez scanneru nejde! A stejně tu jsou pořád ty samé dotazy že vám to nejde, když tam nemáte scanner :D já už opravdu rezignuji.


Odpovědět   i++; | i--; ( +1 )
You only get one shot, do not miss your chance to blow. This opportunity comes once in a lifetime.
14.05.2013 14:03:55
Avatar
mr.forstak
Člen
Skill: Vědecká kalkulačka
DotDotDotDotDotDotDotDotDotDot
Odpovídá na sdraco:

já nezapomněl že do promněných potřebuješ scanner - já zapomněl že kalkulačka je taky proměný


Odpovědět   i++; | i--;
Realita hm... pěkný místo, ale žít bych tam nechtěl.

 

Zobrazeno 10 z 51 zpráv

Zobrazit všechny komentáře k článku

Přidat novou zprávu

Avatar
Neregistrovaný

Pro výhody se přihlaš. Pokud ještě nemáš účet, zaregistruj se.

Jméno:
E-mail:
Web:

Šťastný Smutný S vyplazeným jazykem Mrkající Smějící se Plačící Cool Nemocný Naštvaný S brýlemi Stydící se On to nebyl Překvapený Hodně překvapený Šokovaný Srdce sdraco
Vložení obrázků Obrázky mohou nahrávat pouze registrovaní uživatelé
Vložení dlouhého zdrojáku Pouze pro registrované

 

Pro ověření prosím zaškrtněte pravdivá tvrzení:
Registrovaní uživatelé se tímto zdržovat nemusí. Zaregistrovat se

Nejsem robot
Nejsem člověk
Píši zprávu i přesto, že nemá žádný význam
Jsem robot