4. diel - Načítanie hodnôt z konzoly a parsovanie v Jave
V minulej lekcii Java kurzu, Premenné a typový systém v Jave, sme si ukázali základné dátové
typy, boli to int
, String
a double
.
V dnešnom Java tutoriále sa pozrieme na parsovanie hodnôt z konzoly. Výsledkom bude niekoľko jednoduchých programov vrátane kalkulačky.
Program Parrot
Skúsme do programu zapojiť používateľa a nejako reagovať na jeho vstup.
Napíšeme program Parrot
, ktorý bude dvakrát opakovať to, čo
používateľ napísal.
Načítanie textu z konzoly
Ešte sme neskúšali z konzoly nič načítať. Slúži na to metóda
nextLine()
, ktorá používateľovi umožní zadať do konzoly
riadok textu a nám vráti zadaný textový reťazec. Aby sme mohli z konzoly
načítať, založíme si nový projekt s názvom Parrot
a jeho
kód upravíme tak, aby vyzeral takto:
package itnetwork; import java.util.Scanner; public class Parrot { public static void main(String[] args) { Scanner scanner = new Scanner(System.in, "Windows-1250"); } }
Windows-1250 je kódovanie príkazového riadka Windows pre strednú Európu.
Pre názornosť som vymazal sivú dokumentáciu, ale pokojne si ju tam nechajte.
Trieda Scanner
Zmena spočíva v importovaní java.util.Scanner
, čo nám
umožňuje prístup k metódam pre vstup z konzoly.
Ten dlhý riadok na začiatku metódy nerobí nič iné, než že nám
vytvorí premennú scanner
, na ktorú môžeme volať spomínanú
metódu nextLine()
, ktorá načíta z konzoly ďalší reťazec.
Vysvetliť si ho by bolo teraz príliš komplikované, berte to tak, že tam je,
časom ho pochopíme.
Pokiaľ budete potrebovať v ktoromkoľvek zo svojich
programov načítať text z konzoly, je nutné program takto upraviť a pridať
inštanciu triedy Scanner
!
Teraz sa presuňme k samotnému kódu programu a upravme obsah metódy
main()
do nasledujúcej 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("Hi I'm Lora, the virtual parrot, and I love to repeat!");
System.out.println("Type something in: ");
String input;
input = scanner.nextLine();
String output;
output = input + ", " + input + "!";
System.out.println(output);
}
}
To už je trochu zábavnejšie Prvý riadok sme si už vysvetlili vyššie, ďalšie dva riadky sú
jasné (vypisujú text). Ďalej deklarujeme textový reťazec
input
. Do premennej input
sa priradí hodnota z
metódy nextLine()
získanej z konzoly, teda to, čo používateľ
zadal. Pre výstup si pre názornosť zakladáme ďalšiu premennú
output
typu textový reťazec.
Spájanie reťazcov
Zaujímavé je, že keď do premennej output
priradíme, tak tam
využívame tzv. konkatenáciu (spájanie) reťazcov. Pomocou
operátora +
totiž môžeme spojiť niekoľko textových reťazcov
do jedného a je jedno, či je reťazec v premennej alebo je explicitne zadaný
v úvodzovkách v zdrojovom kóde. Do premennej output
teda
priradíme premennú input
, ďalej čiarku, znovu premennú
input
a potom výkričník. Premennú vypíšeme a skončíme:
Konzolová aplikácia
Hi I'm Lora, the virtual parrot, and I love to repeat!
Type something in:
Hello parrot
Hello parrot, Hello parrot!
Do premennej môžeme priraďovať hodnotu už v jej deklarácii, môžeme teda nahradiť:
String input;
input = scanner.nextLine();
Jedným riadkom:
String input = scanner.nextLine();
Program by šiel skrátiť ešte viac v mnohých ohľadoch, ale všeobecne je lepšie používať viac premenných a dodržiavať prehľadnosť než písať čo najkratší kód a po mesiaci zabudnúť, ako vôbec funguje.
Program Doubler
Program Doubler
si vyžiada na vstupe číslo a to potom
zdvojnásobí a vypíše. S doterajšími znalosťami by sme napísali asi
niečo takéto:
Scanner scanner = new Scanner(System.in, "Windows-1250"); System.out.println("Enter a number and I'll double it:"); int number = scanner.nextLine(); number = number * 2; System.out.println(number);
Všimnite si zdvojnásobenie čísla number
, ktoré sme vykonali
pomocou priradenia. Java nám teraz vynadá a podčiarkne riadok, v ktorom sa
snažíme hodnotu z konzoly dostať do premennej typu int
.
Narážame na typovú kontrolu, konkrétne nám metóda
nextLine()
vracia dátový typ String
a my sa ho
snažíme uložiť do premennej typu int
. Budeme ho potrebovať
tzv. naparsovať.
Parsovanie
Parsovaním sa myslí prevod z textovej podoby na nejaký špecifický typ,
napr. číslo. Mnoho dátových typov má v Jave už pripravené metódy na
parsovanie, pokiaľ budeme chcieť naparsovať napr. dátový typ
int
z dátového typu String
, budeme postupovať
takto:
String value = "56"; int number = Integer.parseInt(value);
Metóda parseInt()
sa volá na triede Integer
, ako
parameter berie textový reťazec a vráti číslo. Túto znalosť využijeme v
našom programe:
{JAVA_CONSOLE}
Scanner scanner = new Scanner(System.in, "Windows-1250");
System.out.println("Enter a number and I'll double it:");
String value = scanner.nextLine();
int number = Integer.parseInt(value);
number = number * 2;
System.out.println(number);
{/JAVA_CONSOLE}
Najprv si text z konzoly uložíme do textového reťazca value
.
Do celočíselnej premennej number
potom uložíme číselnú
hodnotu reťazca value
. Ďalej hodnotu v premennej
number
zdvojnásobíme a vypíšeme do konzoly:
Konzolová aplikácia
Enter a number and I'll double it:
1024
2048
Parsovanie sa samozrejme nemusí podariť, keď bude v texte namiesto čísla napr. slovo, ale tento prípad zatiaľ nebudeme ošetrovať.
Na skeneri existuje aj metóda nextInt()
, pri
ktorej by sa mohlo na prvý pohľad zdať, že nám vráti už naparsované
číslo, a teda aj ušetrí prácu. V skutočnosti táto metóda bohužiaľ
ponechá vo vstupe znak Enteru, ktorým používateľ číslo potvrdil. Tento
znak tam zostane tak dlho, kým ho nenačítate z konzoly spolu s ďalším
textom, čo môže spôsobiť neočakávané problémy vo vašich programoch.
Preto používajte na čítanie z konzoly vždy metódu
nextLine()
.
Jednoduchá kalkulačka
Ešte sme nepracovali s desatinnými číslami, skúsme si napísať sľubovanú kalkulačku. Bude veľmi jednoduchá, na vstup prídu dve čísla, program potom vypíše výsledky pre sčítanie, odčítanie, násobenie a delenie:
{JAVA_CONSOLE}
Scanner scanner = new Scanner(System.in, "Windows-1250");
System.out.println("Welcome to calculator!");
System.out.println("Enter first number:");
double a = Double.parseDouble(scanner.nextLine());
System.out.println("Enter second number:");
double b = Double.parseDouble(scanner.nextLine());
double sum = a + b;
double difference = a - b;
double product = a * b;
double quotient = a / b;
System.out.println("Addition: " + sum);
System.out.println("Subtraction: " + difference);
System.out.println("Multiplication: " + product);
System.out.println("Division: " + quotient);
System.out.println("Thank you for using calculator.");
{/JAVA_CONSOLE}
Po spustení kalkulačky a zadaní hodnôt bude výstup vyzerať takto:
Konzolová aplikácia
Welcome to calculator!
Enter first number:
3.14
Enter second number:
2.72
Addition: 5.86
Subtraction: 0.42
Multiplication: 8.5408
Division: 1.15441176470588
Thank you for using calculator.
Všimnite si dve veci:
- Po prvé, zjednodušili sme parsovanie z konzoly tak, aby sme nepotrebovali
premennú typu
String
, pretože by sme ju potom aj tak nepoužili. - Po druhé, na konci programu spájame reťazec s číslom pomocou znamienka plus.
Java pri spojení reťazca s číslom prekvapivo nezahlási chybu, ale
vykoná tzv. implicitnú konverziu a zavolá na čísle metódu
Double.toString()
alebo priamo na type String
zavolá
String.valueOf()
. Keby to tak nebolo alebo by sme sa dostali do
situácie, keď potrebujeme previesť čokoľvek na dátový typ
String
, zavoláme metódu String.valueOf()
a ako
parameter jej dáme našu premennú. Java to v tomto prípade urobila za nás, v
podstate vykoná:
System.out.println("Addition: " + String.valueOf(sum));
Práve sme sa teda naučili opak k parsovaniu – previesť čokoľvek do textovej podoby.
Všetky programy máte samozrejme opäť v prílohe, skúšajte si vytvárať nejaké podobné, znalosti už k tomu máte
V nasledujúcom kvíze, Kvíz - Konzoly a premenné v Jave, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 42x (7.3 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java