NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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í.

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:

Klikni pro editaci
  • 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:

    Klikni pro editaci
    • 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);
      
      • 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í:

      Klikni pro editaci
      • 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.");
        
        • 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

         

        Jak se ti líbí článek?
        Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
        Předchozí článek
        Využití umělé inteligence při studiu programování
        Všechny články v sekci
        Základní konstrukce jazyka Java
        Přeskočit článek
        (nedoporučujeme)
        Kvíz - Konzole a proměnné v Javě
        Článek pro vás napsal David Hartinger
        Avatar
        Uživatelské hodnocení:
        1145 hlasů
        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 se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
        Aktivity