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);
}
}
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}
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}
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 827x (56.81 kB)
Aplikace je včetně zdrojových kódů v jazyce Java