Diskuze: Prepis z C++ do Javy
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
A co ti to háže za chybu ? První bych zkusil smazat to System.exit(0);
Okay zmazal som to. Program prebehne, ukončí sa a na výstupe nevypíše nič. Toto je môj problém.
class Kod {
public static void main(String[] args) throws java.io.IOException{
String res = "";
char c = (char) System.in.read();
int i=0;
String code = "kod: ";
while(c != '\n') {
if(i == code.length()) {
while(c != ' ') {
res += c;
c = (char) System.in.read(); }
System.out.println(res); }
if(c == code.charAt(i)) {
i++;
c = (char) System.in.read(); }
if(i == 0) {
c = (char) System.in.read(); }
i = 0;}
}
}
Ahoj, v kódu je logická chyba.
Řekněme, že vstup je toto:
kod: ahoj
Když by jsi si pustil krokovani, tak problem uvidis., takze jedeme postupne:
char c = (char) System.in.read(); // c = 'k'
int i = 0;
String code = "kod: ";
Dále je tu cyklus, který čeká na znak odřádkování.
První podmínka je prakticky nedosažitelná, důvod bude o pár řádků
níže
if (i == code.length()) { // Není pravda, i == 0
while (c != ' ') {
res += c;
c = (char) System.in.read();
}
System.out.println(res);
}
Druhá podmínka napoprvé projde a je myšlena dobře.
if (c == code.charAt(i)) { // Je pravda, protože c == 'k'
i++; // Inkrementujeme index
c = (char) System.in.read(); // načteme nový znak
}
Třetí podmínka neprojde, protože i se již rovná 1
if (i == 0) { // Nepravda
c = (char) System.in.read();
}
A teď kámen úrazu:
i = 0;
Tímto vynuluješ index a jedeš opět od nuly, což je špatně.
Pak to opět skočí na testování podmínky ve whiile cyklu. Ta projde a opět
se testují se podmínky od začátku.
Tentokrát ale zafunguje pouze poslední podmínka a tak to bude až do
konce.
Celé bych to doporučil přepsat na něco více Javovského. Třeba:
public static void main(String[] args) throws java.io.IOException {
final String code = "kod: "; // Konstanta pro rozdělení vstupu
final Scanner scanner = new Scanner(System.in); // Vytvoříme scanner - pro Javu nejjednodušší způsob jak číst z příkazové řádky vstup
final String input = scanner.nextLine(); // Přečteme celou řádku až do konce
final String[] values = input.split(code); // Rozdělíme vstup podle konstanty co jsme definovali výše
System.out.println(Arrays.toString(values)); // Vypíšeme výstup.
}
Tak koukam, že mě někdo předběhl
Vďaka čo sa týka tých chýb, tak máte pravdu. Už som si to uvedomil. Len ten posledný "Javovský" zápis neviem zakomponovať do môjho programu. Pretože v zadaní mojej úlohy stojí: <slovo> je z oboch strán medzerami ohraničený kus textu. Ale pouvažujte prosím nad možnosťou - čo ak by bezprostredne za slovom nasledoval nový riadok? Teda, že naše <slovo> by bolo viac riadkové a až potom by nasledovala medzera. Presne tento problém som nevedel vyriešiť, tak som si našiel to riešenie v C++, ktoré je správne aj na túto možnosť. Píšete, že 2. podmienka je napísaná dobre a 1. a 3. nie je napísaná dobre. Napísali by ste mi teda ako to má byť, aby to fungovalo prosím? nemusíte premýšľať nad novým postupom. Len mi preložte to, čo je v hotovom riešení v C++ v obrázku, ktorý som pridal hore.
Že obsah může byt více řádkový nikde nebylo psáno, tak jsem to
neřešil.
Zkus odstranit ten poslední řádek s tím resetováním indexu, melo by to
začít fungovat.
Nikde jsem nepsal, ze ty podmínky jsou špatně.
Odstránil som resetovanie indexu a stále mi program neposkytuje žiaden výpis napadá ťa, ako to vyriešiť?
Tak to zkus krokovat ve svém oblíbeném vývojovém prostředí.
Jsi v Javě, proč se zabývat nízkoúrovňovitou ve stylu C/C++ a raději nepoužít regexy?
Viz například https://regex101.com/r/DpJb7o/2, nevím jestli, pokud, jsou nějaké odlišnosti od Java regexů, ale principiálně nějak takto.
Otázka je pak co s tím 4. řádkem, kde není na konci za "ahoj" mezera, jestli to splňuje zadání a nebo ne. Ale princip je asi jasný, jen ho dotáhnout do konce.
Pattern pattern = Pattern.compile("kod:[ ]([a-zA-Z]*)[ ]");
Matcher m = pattern.matcher("temp name(this is the data)");
if(m.matches()) {
System.out.println(m.group(1));
}
Teď mě tak napadlo, ze ta první podmínka
if(i == code.length()) {
while(c != ' ') {
res += c;
c = (char) System.in.read(); }
System.out.println(res); }
nikdy nemůže fungovat. Mělo by to byt takto:
if(i == code.length() - 1) { // zde musíme odečíst jednotku
while(c != ' ') {
res += c;
c = (char) System.in.read(); }
System.out.println(res);
i = 0; // tady to i vynuluj }
Možná je to blbost. Nemám to teď jak vyzkoušet.
K tej "nízkoúrovňovitě" ja sa zatiaľ zapodievam len takouto náročnosťou programov. Skutočne si cením tvoju snahu o zlepšenie kvality môjho kódu, ale po prvých mesiacoch štúdia Javy ešte všetkému nerozumiem. To, čo si napísal mi dáva logiku, ale zatiaľ som s Pattern / Matcher nepracoval. Neviem čo mám vpísať do "temp name(this is the data)" a ani čo znamená na konci tá 1ka. Tiež neviem, kam to mám zakomponovať . Preto som žiadal už od začiatku, aby mi niekto len preložil, čo v tom hotovom kóde v C++ píše. Väčšinu vecí som si preložil sám, ale nie všetko funguje rovnakým princípom v oboch jazykoch. Preto mi to nefunguje. Chcel by som prv plne porozumieť takto jednoduchým programom, než sa pustím do ich vylepšovania:)
"temp name(this is the data)" jsem tam zapomněl přepsat. Měl by tam být klidně celý vstup.
// co chceš hledat
Pattern pattern = Pattern.compile("kod:[ ]([a-zA-Z]*)[ ]");
// kde to chceš hledat
Matcher m = pattern.matcher("blablabla kod: zlato blablabla");
// pokud našel nějakou shodu
if(m.matches()) {
// vypiš první skupinu (skupiny jsou ty závorky v patternu, zjednodušeně)
System.out.println(m.group(1));
}
Každopádně, jak jsem již naznačil, nemá cenu psát v jednom jazyce tak, jak jsi zvyklý z jiného.
Zobrazeno 15 zpráv z 15.