Anniversary - BF C/C++ week
80 % bodů zdarma na online výuku díky naší Narozeninové akci!
Pouze tento týden sleva až 80 % na e-learning týkající se C/C++
Avatar
jip123
Člen
Avatar
jip123:12.3.2019 17:12

Testuji následující program:
// Cyklus běží do zapsání klávesy S.
class TestFor {
public static void main(String args[])
throws java.io.IOException {
int i;

System.out.prin­tln("Stiskněte S pro zastavení.");

for (i = 0; (char) System.in.read() != 'S'; i++)
System.out.prin­tln("Průchod č." + i);
}
}

A výstup je následující:
Stiskněte S pro zastavení.
1
Průchod č.0
Průchod č.1
10
Průchod č.2
Průchod č.3
Průchod č.4

Když zadám jedničku, proběhne průchod 2x, když 10, děje se tak 3x. Nějak nechápu, proč se tak děje. Domnívám se, že to má spojitost se znakem nový řádek a znakem posunutí na začátek nového řádku. Ale nevím proč zrovna 2x či vícekrát.

Existuje nějaký způsob,jak si prohlédnout vyrovnávajíci paměť po zadání příkazu
"(char) System.in.read()" ?

Zkusil jsem: Teprve se učím.

 
Odpovědět
12.3.2019 17:12
Avatar
SolusLupusUmbra
Redaktor
Avatar
Odpovídá na jip123
SolusLupusUmbra:12.3.2019 20:34

ponejprv bych chtěl říci, že tohle není ideální příklad na použití for cyklu, tohle je ukázkový while cyklus
nevím, k čemu přesně ten kod chceš, ale tady optimalizovaný a funkční kod, co děláto, co jsi chtěl

package common;

import java.io.IOException;
import java.util.Scanner;

class TestFor {

        public static void main(String[] args) throws IOException {
                final Scanner in = new Scanner(System.in);
                int i = 0;

                System.out.println("Stiskněte S pro zastavení.");
                String input = in.nextLine();
                while ( ! "S".equals(input)) {
                        System.out.println("Průchod č." + ++i);
                        input = in.nextLine();
                }
                in.close();
                System.out.println("Konec");
        }

}

použil jsem while cyklus a pro načítání dat z konzole třídu Scanner

Nahoru Odpovědět
12.3.2019 20:34
Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód.
Avatar
jip123
Člen
Avatar
Odpovídá na SolusLupusUmbra
jip123:13.3.2019 17:42

Děkuji za odpověď, ale ten příklad je z české učebnice H. Schildt Java 8, třetí kapitola. V této kapitole se používá System.in.read() a zrovna tento příklad není vysvětlen. Takže jsem si myslel, že odpověď získám zde, popř. nějaký odkaz na tento jev.

 
Nahoru Odpovědět
13.3.2019 17:42
Avatar
SolusLupusUmbra
Redaktor
Avatar
Odpovídá na jip123
SolusLupusUmbra:13.3.2019 20:05

Teda jestli jsi ten příklad opsal přesně, tak je to dost blbej příklad, pan Schild promine.
Nevím přesně, jak funguje System.in.read() - můžu se ti na to podívat - ale minimálně to použíti fór cyklu je hodně podivné.
Můžu zkusit vyřešit původní problém, jestli máš zájem

Nahoru Odpovědět
13.3.2019 20:05
Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:14.3.2019 7:45

tak původní problém je právě v metodě read().
Když si v podstatě zaměníš tu metodu read() za scanner.next(), tak dosáhneš kýženého výsledku.
Ale jak říká SolusLupusUmbra... pokud tě takhle učí v té učebnici cykly, tak nejlepší, co pro sebe můžeš udělat, tak hodit tu knížku do skartovačky.

Drž se toho, co ti tady ukázal Solus. Toto je skutečně ukázkový příklad, kdy je vhodné využít while.

PS: říkejme tomu klidně produce placement:), ale jestli se chceš naučit skutečně dobře programovat, tak před tím, než si koupíš knížku, tak si projdi zdejší tutoriály. Máš sto procentní jistotu, že ti bude všechno fungovat, že to, co se budeš učit, nebude na škodu a hlavně že tady získáš přímou zpětnou vazbu na celý příklad.
Získáš tak základy a pak už je v knížkách budeš rozšiřovat.
Jinak myslím, že z toho, jak a co tady píšeš, tak se ubíráš dobrým směrem;) Tak by byla škoda zkazit budoucího programátora

Nahoru Odpovědět
14.3.2019 7:45
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
jip123
Člen
Avatar
Odpovídá na SolusLupusUmbra
jip123:14.3.2019 19:51

Děkuji za názor, jsem vděčný za každou radu. Pokud bys chtěl pomoci vyřešit problém, bylo by to fajn. Přikládám stránku z učebnice a řešení tohoto problému na internetu.
Je mi jasné, že zachycení nějakého znaku je doplněno znaky cr/lf v ASCII.
Lze to, co napíšu metodou read() nějak přečíst, abych viděl, co tam je?

 
Nahoru Odpovědět
14.3.2019 19:51
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na jip123
Robert Michalovič:15.3.2019 7:12

Cituji : Existuje nějaký způsob,jak si prohlédnout vyrovnávajíci paměť po zadání příkazu
"(char) System.in.read()" ?

Ne i ano

Ne, pokud bys chtěl získat informace přímo z JVM. Protože ještě na to nemáš znalosti. Ano, pokud používáš IDE co bys se svými znalostmi zvládl. Takže stačí přejit do debug módu v IDE a kód si odkrokovat(označit breakpointy). Většinou v tooltipu uvidíš danou hodnotu.
https://ibb.co/JH7p97F
https://ibb.co/VCk1NQr

A vy dva byste se měly stydět. Zapomenou na debug, to je fakt ostuda.

(viz. API ) System.in.read : Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the streamhas been reached, the value -1 is returned. This methodblocks until input data is available, the end of the stream is detected,or an exception is thrown. A subclass must provide an implementation of this method.

Problém System.in.read je že patří to první verze API a je nejstarší. Z důvodu multiplatformovosti Javy se nechová na různých OS(každý OS řeší streamy trochu jinak a to mělo za následek nestejné výsledky z pohledu Java vývojářů) vždy stejně a proto byl nahrazen objektem Scanner, kde již načítání z klávesnice nebo souboru je standardizováno. Ono to je dáno i historickým kontextem, v té době se od Javy se nikdy nečekalo že bude načítat data z konzole.

 
Nahoru Odpovědět
15.3.2019 7:12
Avatar
jip123
Člen
Avatar
Odpovídá na Robert Michalovič
jip123:17.3.2019 15:38

Děkuji za radu použít debugger. Používám NetBeans a musel jsem nastudovat základy debug mód tam. Je to šikovná věcička a pomohla mně.
Jinak posílám na
https://uloz.to/…-schildt-rar
dvě knihy Java 11, které vyšly loni v prosinci. Mohl by někdo napsat, zda jsou vhodné ke studiu? Děkuji předem.

 
Nahoru Odpovědět
17.3.2019 15:38
Avatar
Vít Vlach
Člen
Avatar
Odpovídá na jip123
Vít Vlach:17.3.2019 16:08

Ahoj, nevím jak jsou na tom ty tvoje knížky, ale já jsem od Schildta četl Java 7 a byl jsem celkem spokojenej. Líbilo se mně na ni cvičení a otázky pro experta. Podle mě to byla dobře napsaná knížka s dobrými příklady. Dle mě je nejlepší si přečíst článek na ITnetworku a v knize si to "obohatit" a procvičit.

Nahoru Odpovědět
17.3.2019 16:08
My code doesn't work. Let's change nothing and run it again.
Avatar
jip123
Člen
Avatar
Odpovídá na jip123
jip123:17.3.2019 17:52

Jejich název je
java-schildt.rar
a jsou samozřejmě v EN. Jsou kompletní.

 
Nahoru Odpovědět
17.3.2019 17:52
Avatar
Odpovídá na jip123
Robert Michalovič:19.3.2019 7:27

Ale jo, Schildt patří mezi ty lepší. Ovšem čeština pro začátečníka je prostě čeština.

 
Nahoru Odpovědět
19.3.2019 7:27
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 11 zpráv z 11.