Lekce 5 - Načítání hodnot z konzole a parsování v Javě
V minulé lekci, Využití umělé inteligence při studiu programování, jsme si ukázali, jak využívat umělou inteligenci při studiu programování.
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
Zatím jsme nezkoušeli z konzole něco 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 jsme vymazali šedou dokumentaci, ale bez obav 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.
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()
. Ta načte z konzole další řetězec. Vysvětlit si
celý řádek by bylo nyní příliš komplikované, proto ho teď berme pouze
na vědomí, č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); 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); } }
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Pokud tvá aplikace vyžaduje vstup od uživatele, musíš použít Scanner a proměnná se musí jmenovat buďto scanner nebo sc.
To už je trochu zábavnější První řádek jsme si 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ískaná z konzole, tedy to, co uživatel zadal.
Pro výstup si pro názornost zakládáme další proměnnou vystup
typu textového řetězce.
Spojování řetězců
Zajímavé je, jak jsme do proměnné vystup
přiřadili
hodnotu. Využili jsme k tomu tzv. konkatenaci (spojování)
řetězců. Pomocí operátoru +
totiž můžeme spojit několik
textových řetězců do jednoho. 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
jsme tedy přiřadili proměnnou vstup
, dále
čárku s mezerou, 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 bylo možné 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. S dosavadními znalostmi bychom asi 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ěme 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
. Datový typ budeme
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
,
jako parametr bere textový řetězec a vrátí číslo. Této znalosti
využijeme v našem programu:
{JAVA_CONSOLE} 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); {/JAVA_CONSOLE}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Pokud tvá aplikace vyžaduje vstup od uživatele, musíš použít Scanner a proměnná se musí jmenovat buďto scanner nebo sc.
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. To může
způsobit neočekávané problémy ve vašich programech. Proto ke čtení z
konzole vždy používejte metodu nextLine()
.
Jednoduchá kalkulačka
Ještě jsme nepracovali s desetinnými čísly, proto si zkusme napsat slibovanou kalkulačku. Bude velmi jednoduchá. Na vstup přijdou dvě čísla a 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); 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}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Pokud tvá aplikace vyžaduje vstup od uživatele, musíš použít Scanner a proměnná se musí jmenovat buďto scanner nebo sc.
Po spuštění kalkulačky a zadání hodnot bude výstup vypadat 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ěme si dvou věcí:
- Zaprvé jsme zjednodušili parsování z konzole tak, abychom nepotřebovali
proměnnou typu
String
, protože bychom ji poté již stejně 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 na čísle zavolá metodu
Double.toString()
nebo přímo na typu String
zavolá
String.valueOf()
. Kdyby tomu tak nebylo nebo kdybychom se dostali
do situace, kdy potřebujeme převést cokoli na datový typ
String
, zavoláme metodu String.valueOf()
a jako
parametr jí 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 831x (56.81 kB)
Aplikace je včetně zdrojových kódů v jazyce Java