Java-zahozeni spatne odpovedi

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod shockwave333 26. 10. 2021 13:10

Ahoj, marne tady badam, jak Java pozna z ktereho radku, ze nekdo vlozil jiny znak nez je ulozen v promenne odpoved.
Autor knihz sice napise poznamku // zahoď jakýkoli jiný znak ve vstupní mezipameti,ale uz nic vic
Jak ma clovek prelozit do lidske reci treba radek: while (ignoruj != '\n'); // promenna ignoruj ....co na novy radek, nevim??

Jestli dobre chapu, tak promenne ignoruj = (char) System.in.read(); a zn = (char) System.in.read(); uchovavaji stejny vstup z klavesnice, jak jako pak "zahod jakykoliv jiny znak?" Rad bych to pochopil, staci, kdyz naznacite, uz se snad chytnu. Dekuju

Kód: Vybrat vše
// Hra na uhodnutí písmene, 4. verze.
public class Hadani4 {
public static void main(String args[])
throws java.io.IOException {
char zn, ignoruj, odpoved = 'K';

do {
    System.out.println("Myslím na písmeno mezi A až Z.");
    System.out.print("Zkus jej uhodnout: ");
    // přečti znak
    zn = (char) System.in.read();



// zahoď jakýkoli jiný znak ve vstupní mezipaměti
do {
ignoruj = (char) System.in.read();
} while (ignoruj != '\n');

if(zn == odpoved) System.out.println("** Správně**");
    else {
    System.out.print(" ... Promiň, ale jsi ");
    if (zn < odpoved) System.out.println("příliš nízko");
    else System.out.println("příliš vysoko");
    System.out.println("Zkus to znovu!\n");

    }
   } while (odpoved != zn);
  }
}
shockwave333
Kolemjdoucí

Odeslat příspěvekod Wikan 26. 10. 2021 13:28

Přečte jeden znak a uloží ho do zn.
Pak čte další znaky dokud nenarazí na odřádkování, ale nic s nimi nedělá = ignoruje je.
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod shockwave333 28. 10. 2021 08:01

​Dekuji za vysvetleni, ale jak si mam prosim te prelozit ty dva radky do cestiny:


ignoruj = (char) System.in.read();

} while (ignoruj != '\n');

-- 28. 10. 2021 09:02 --

zejmena tem posledni radek, nevim jak prelouskat cesky ani z googlu nejsem moc chytrej. Dekuju
shockwave333
Kolemjdoucí

Odeslat příspěvekod misko256 28. 10. 2021 08:36

Ked zavolas System.in.read(), tak sa zastavi program (thread) a caka sa na vstup od pouzivatela. Vsimni si ale, ze hoci read vracia jeden znak, uzivatel je schopny zadat viac znakov az kym nestlaci enter - zada newline znak do konzole. Newline znak je control character (vid ASCII), ktory sa da zapisat aj pomocou \n.

Po tom co uzivatel zada enter, sa vsetko co napisal stane ako keby vstupom tvojho programu. Teda ak zadal viac ako jeden znak, tak nasledujuce volanie read() uz nezastavi program, ale pozrie sa na ten vstup (do medzipameti - bufferu), vidi ze tam uz je nieco, co zadal uzivatel, tak vrati to.

Teda tie riadky na ktore sa pytas citaju zadany riadok, az kym nenarazia na newline (ktory z definicie musi byt na konci riadku). Tym padom sa vycisti buffer, a ked sa najblizsie zavola read() tak sa znova zastavi program, lebo na vstupe uz nie su ziadne dalsie znaky.

V kontexte programu ide o to, aby si vzdy bral do uvahy iba prvy znak ktory napise pouzivatel, zvysne znaky je potrebne zahodit. Schvalne skus experimentovat a vymazat ten do... while, ako sa to bude spravat?
misko256
Junior

Odeslat příspěvekod shockwave333 29. 10. 2021 22:24

Opravte mne prosim, zda to napisi spravne,jak pracuje kod postupne s vlozenymi pismeny :

Pokud bych zadal vstup napr. znaky JKL, tak to prvni "read()" nacte "J" a skoci hned do If(patri do prvniho "Do-While") a pote pokracuje do "While".

Jaky je pak prubeh s dalsim pismenem "K" ? S tim uz se pokracuje jen do druheho "Do-While", stejne tak s tretim pismenem "L"? Aspon tak se mi to jevi.

Druhe a treti pismeno se jiz pak nikde nevypisi.
shockwave333
Kolemjdoucí

Odeslat příspěvekod Wikan 30. 10. 2021 11:03

Do "If" to po "J" rozhodně neskočí. Bude se to točit v tom "do-while" dokud nenačte znak konce řádku = "\n".
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod shockwave3 17. 11. 2021 11:29

Moc se omlouvam, ale mohli by jste mi strucne popsat prubeh temi cykly.

Pokud jako uzivatel zadam vstup JLM, jak to bude prosim prochazet tim programem?

1.Zaciname vnejsim do-while cyklem,priradim do promenne zn=J a postupujeme to do vnitrniho cyklu do-while , kde se priradi pres (char) System.in.read() do promenne ignoruj= L a dale pak znovu pres while (ignoruj != '\n'); pomoci (char) System.in.read() se vlozi do promenne ignoruj= M a postupujeme dale, dokud se nezmackne ENTER?

2.a az teprve nyni postupujeme do IF-ELSE? Jiz ale jen s hodnotou zn=J?

3.K cemu je tam pak ale to vnejsi while potom? Nebo to vnitrni do-while se aktivuje jen v pripade 1 a více pismen na vstupu, jinak pokud zadame pouze jedno pismeno na vstupu, tak se postupuje pouze pres vnejsi do-while?

Prosim opravte me, jinak uz nevim:(
shockwave3
Kolemjdoucí

Odeslat příspěvekod Wikan 17. 11. 2021 13:19

Tak to zkus bez toho cyklu a uvidíš.
Wikan
Moderátor
Uživatelský avatar