Avatar
petr.chatar.anton:

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:

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:

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:

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  +1 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:

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
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Paul
Lukáš Křehula:

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
Paul
Člen
Avatar
Odpovídá na Lukáš Křehula
Paul:

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
Odpovídá na Paul
Tomáš "CrashTest" Bitter:

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
Need for Steve
Avatar
Odpovídá na Tomáš "CrashTest" Bitter
petr.chatar.anton:

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
Redaktor
Avatar
Odpovídá na petr.chatar.anton
tomisoka:

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:

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:

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
Redaktor
Avatar
Odpovídá na petr.chatar.anton
tomisoka:

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  +1 11.9.2014 15:26
Avatar
xxxvodnikxxx
Člen
Avatar
xxxvodnikxxx:

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:

Klucí, díky moc všem.

 
Nahoru Odpovědět  +1 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.