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, "Windows-1250"); } }
Windows-1250 je kódování příkazové řádky Windows pro střední Evropu.
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:
package onlineapp;
import java.util.Scanner;
public class Program {
public static void main(String[] args) {
Scanner scanner = 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 = 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, "Windows-1250"); 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:
{JAVA_CONSOLE}
Scanner scanner = new Scanner(System.in, "Windows-1250");
System.out.println("Zadejte číslo k zdvojnásobení:");
String hodnota = scanner.nextLine();
int cislo = Integer.parseInt(hodnota);
cislo = cislo * 2;
System.out.println(cislo);
{/JAVA_CONSOLE}
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í:
{JAVA_CONSOLE}
Scanner scanner = new Scanner(System.in, "Windows-1250");
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.");
{/JAVA_CONSOLE}
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
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 380x (20.33 kB)
Aplikace je včetně zdrojových kódů v jazyce Java