Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 4 - Načítání hodnot z konzole a parsování v Javě

V minulé lekci Java kurzu, Proměnné a typový systém v Javě, jsme si ukázali základní datové typy, byly to int, String a double.

V dnešním Java tutoriálu se podíváme na parsování hodnot z konzole. Výsledkem bude několik jednoduchých programů včetně kalkulačky.

Program Papoušek

Zkusme do programu zapojit uživatele a nějak reagovat na jeho vstup. Napíšeme program papoušek, který bude dvakrát opakovat to, co uživatel napsal.

Načtení textu z konzole

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 cz.itnetwork.papousek;

import java.util.Scanner;

public class Papousek {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

    }
}

Pro názornost jsem vymazal šedou dokumentaci, ale klidně si ji tam nechte.

Třída Scanner

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 scanner, 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 instanci třídy Scanner!

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

Scanner scanner = new Scanner(System.in);
System.out.println("Ahoj, jsem virtuální papoušek Lóra, rád opakuji!");
System.out.println("Napiš něco: ");
String vstup;
vstup = scanner.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 proměnné vstup se přiřadí hodnota z metody nextLine() získanou z konzole, tedy to, co uživatel zadal. Pro výstup si pro názornost zakládáme další proměnnou vystup typu textový řetězec.

Spojování řetězců

Zajímavé je, jak do proměnné 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é vystup tedy přiřadíme proměnnou vstup, dále čárku, znovu proměnnou 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 hodnotu již v její deklaraci, můžeme tedy nahradit:

String vstup;
vstup = scanner.nextLine();

Za jeden řádek:

String vstup = scanner.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 scanner = new Scanner(System.in);
System.out.println("Zadejte číslo k zdvojnásobení:");
int cislo = scanner.nextLine();
cislo = cislo * 2;
System.out.println(cislo);

Všimněte si zdvojnásobení čísla cislo, 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 metoda nextLine() vrací datový typ 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ř. datový typ int z datového typu String, budeme postupovat takto:

String hodnota = "56";
int cislo = Integer.parseInt(hodnota);

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

Nejprve si text z konzole uložíme do textového řetězce hodnota. Do celočíselné proměnné cislo poté uložíme číselnou hodnotu řetězce hodnota. Dále hodnotu v proměnné cislo 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 scanner = new Scanner(System.in);
System.out.println("Vítejte v kalkulačce");
System.out.println("Zadejte první číslo:");
double a = Double.parseDouble(scanner.nextLine());
System.out.println("Zadejte druhé číslo:");
double b = Double.parseDouble(scanner.nextLine());
double soucet = a + b;
double rozdil = a - b;
double soucin = a * b;
double 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.");

Po spuštění kalkulačky a zadání hodnot bude vypadat výstup takto:

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.

Všimněte si dvou věcí:

  • Zaprvé jsme zjednodušili parsování z konzole tak, abychom nepotřebovali proměnnou typu String, protože bychom ji stejně již poté nepoužili.
  • Zadruhé na konci programu spojujeme řetězec s číslem pomocí znaménka plus.

Java při spojení řetězce s číslem překvapivě nezahlásí chybu, ale provede tzv. implicitní konverzi a zavolá na čísle metodu Double.toString() nebo přímo na typu String zavolá String.valueOf(). Kdyby tomu tak nebylo nebo jsme se dostali do situace, kdy potřebujeme převést cokoli na datový typ 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 kvízu, Kvíz - Konzole a proměnné v Javě, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 542x (56.81 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Proměnné a typový systém v Javě
Všechny články v sekci
Základní konstrukce jazyka Java
Přeskočit článek
(nedoporučujeme)
Kvíz - Konzole a proměnné v Javě
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
760 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity