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í.
Avatar
petr.chatar.anton:11.9.2014 12:52

Znovu prosím o pomoc.
V tomto kódu mi po zadání jiného písmena než n,d,k proběhne sice znovu, ale třikrát. Po třetí teprve čeká na vstup z klávesnice. Prosím, poraďte, kde dělám chybu.

package dphator;
import java.io.IOException;
public class DPHator {
    public static void main(String[] args) throws IOException {
        char volba;
        do {
            System.out.println("\nZadejte odpovidajici volbu:\n");
            System.out.println("n - vypocet DPH nahoru");
            System.out.println("d - vypocet DPH dolu");
            System.out.println("k - konec programu");
            volba = (char) System.in.read();
        } while (!(volba == 'n' || volba == 'd' || volba == 'k'));
        switch (volba) {
            case 'n':
                System.out.println("zadano " + volba);
                break;
            case 'd':
                System.out.println("zadano " + volba);
                break;
            case 'k':
                System.out.println("zadano " + volba);
                break;
        }
    }
}
 
Odpovědět
11.9.2014 12:52
Avatar
Paul
Člen
Avatar
Odpovídá na petr.chatar.anton
Paul:11.9.2014 13:06

K čemu tam vůbec slouží ten while? Zdá se mi to zbytečné

 
Nahoru Odpovědět
11.9.2014 13:06
Avatar
Odpovídá na Paul
petr.chatar.anton:11.9.2014 13:11

Jasně, může se to pořešit pomocí if ... else. Ale zrovna ten cyklus studuju, tak si ho procvičuju. A je to proto, aby se zadání zopakovalo, pokud nebude stisknutá správná klávesa.

 
Nahoru Odpovědět
11.9.2014 13:11
Avatar
MrPabloz
Člen
Avatar
Odpovídá na petr.chatar.anton
MrPabloz:11.9.2014 13:44

Skus načítat znak z klávesnice jiným způsobem, nebo si před načtením znaku vymaž buffer :) = nauč se se třídou Scanner :)

Nahoru Odpovědět
11.9.2014 13:44
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
Odpovídá na MrPabloz
petr.chatar.anton:11.9.2014 13:48

Jojo, se Scannerem umím odtud, v knížce používají tohle řešení, tak jdu jejich cestou, no. Zkusím použít ten Scanner.

 
Nahoru Odpovědět
11.9.2014 13:48
Avatar
xxxvodnikxxx
Člen
Avatar
Nahoru Odpovědět
11.9.2014 13:50
Unix- svět, kde chcete být nulou :) (UID)
Avatar
Odpovídá na Paul
Lukáš Křehula:11.9.2014 14:22

Cyklus do-while je cyklus s podmínkou na začátku, od normálního cyklu while se liší tím, že mezi svorkami { } se kód vždycky provede alespoň 1x.

 
Nahoru Odpovědět
11.9.2014 14:22
Avatar
 
Nahoru Odpovědět
11.9.2014 14:26
Avatar
Odpovídá na petr.chatar.anton
Lukáš Křehula:11.9.2014 14:26

Jo moje chyba ^^

 
Nahoru Odpovědět
11.9.2014 14:26
Avatar
Paul
Člen
Avatar
Odpovídá na Lukáš Křehula
Paul:11.9.2014 14:26

Já vím co je a jak funguje while cyklus :-)
Jen mi přijde tady naprosto zbytečnej...

 
Nahoru Odpovědět
11.9.2014 14:26
Avatar
Tomáš Bitter
Tvůrce
Avatar
Odpovídá na Paul
Tomáš Bitter:11.9.2014 14:34

Není vůbec zbytečný a přijde mi to jako elegantní řešení. Mohlo by se to řešit ještě možná rekurzí a v nejhorším případě goto ...

 
Nahoru Odpovědět
11.9.2014 14:34
Avatar
Odpovídá na Tomáš Bitter
petr.chatar.anton:11.9.2014 14:37

Elegantní jo, kdyby se mi to neopakovalo 3x při nesprávném zadání ..... ;(

 
Nahoru Odpovědět
11.9.2014 14:37
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na petr.chatar.anton
tomisoka:11.9.2014 14:51

Do-while je nejlepší řešení, ale ty špatně načítáš znaky. Po načtení jednoho znaku tam ty zbylé necháš a při příštím pokusu tam ty zbylé načteš, zkus tam například napsat "test" a kolikrát se to zopakuje.
Můžeš je vyprázdnit například tímto:

while(System.in.read()!='\n');
 
Nahoru Odpovědět
11.9.2014 14:51
Avatar
Odpovídá na tomisoka
petr.chatar.anton:11.9.2014 15:03

Nemohl bys mi to prosím tošku víc rozvést? Co mi tam zůstane za znaky? Ten ENTER, kterým odešlu znak z klávesnice? Spustím, zadám 'L' a cyklus se 3x zopakuje než zůstane stát na tom System.in.read() - viz. obrázek. Na "test" se zopakuje 6x - i tady je to o 2 více.
A prosím trošku nakopnout, jak vyprázdním ty ostatní znaky navíc.

 
Nahoru Odpovědět
11.9.2014 15:03
Avatar
xxxvodnikxxx
Člen
Avatar
xxxvodnikxxx:11.9.2014 15:24

Problém bude v tom načítání- pokud tomu dobře rozumím, tak ty zadáš 'znak<ENTER>' - enter je bílej znak, ale je tam taky- nechápu teda proč to tiskne 3x, mělo by jako jen 2x, ale to je vcelku jedno, princip je to tenhle..

Trochu jsem to upravil- do-while slouží jako menu, do switche přidal default case (ten se použije když nevyhovuje žádnej jinej), a potom to funguje jak předpokládám, po zadání znaku ok, následně jednou špatně, a opakuje se nová volba..

Btw dávej si pozor teď nevim jak to je sw switchem

  • buďto v jave nejde string do case a nebo v jiných jazycích nejde dát char do case, nejsem si jistej, ale bejvá to úskalí :D

http://www.itnetwork.cz/dev-lighter/426

Když ti to upravim ještě pro tu třídu Scanner tak to bude vypadat takhle
http://www.itnetwork.cz/dev-lighter/427

Scanner.next() ti dá aktuální String ze standardního vstupu (cin, resp. klávesnice), následně .charAt(0) ti dá první znak z řetězce (požadovaný zadaný znak)

A jelikož je v jave možný přetékání Case u switche, tak to funguje i takhle
http://www.itnetwork.cz/dev-lighter/428

Nahoru Odpovědět
11.9.2014 15:24
Unix- svět, kde chcete být nulou :) (UID)
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na petr.chatar.anton
tomisoka:11.9.2014 15:26

Pokud načítáš znak tak se načtou všechny znaky dokud nezmáčkneš ENTER, tedy pokud napíšeš "test" tak se ti načte "test" + konec řádku.
Konec řádku se označuje '\n' (a jestli se nepletu tak před tento znak windows přidávají ještě '\r').
Pokud teda chceš odstranit ty navíc načtené znaky tak načítáš znaky dokud nenalezneš '\n'.

 
Nahoru Odpovědět
11.9.2014 15:26
Avatar
xxxvodnikxxx
Člen
Avatar
xxxvodnikxxx:11.9.2014 15:41

jak píše tomisoka - \r a \n by pak vysvětlovalo proč to vypisuje 3x

  • 2x chybně, 1x dobře :)
Editováno 11.9.2014 15:42
Nahoru Odpovědět
11.9.2014 15:41
Unix- svět, kde chcete být nulou :) (UID)
Avatar
petr.chatar.anton:12.9.2014 7:40

Klucí, díky moc všem.

 
Nahoru Odpovědět
12.9.2014 7:40
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.