IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

4. diel - Načítanie hodnôt z konzoly a parsovanie v Jave Nové

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:

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

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:

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);

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:

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.");

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 :)


 

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é 1x (47.76 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Premenné a typový systém v Jave
Všetky články v sekcii
Základné konštrukcie jazyka Java
Preskočiť článok
(neodporúčame)
Kvíz - Konzoly a premenné v Jave
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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 sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity