NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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.

Aktivity
Avatar
Neaktivní uživatel:10.8.2017 21:43

Ahoj, potreboval by som poradiť prosím. V stručnosti - na vstupe dostanem niekoľko riadkový text, v ktorom mám vyhľadať kod. Kód vyzerá nasledovne: “kod: <slovo>”, kde <slovo> je z oboch strán medzerami ohraničený kus textu. Na výstup potrebujem vypísať to <slovo>. Úlohe rozumiem, len svoje riešenie neviem správne previesť do programovacieho jazyka :-D . Našiel som si preto ukážkové riešenie v C++ (v Jave nebolo) a skúsil som ho do Javy prepísať. Lenže program mi nefunguje tak, ako by mal. Snažím sa to naučiť, zatiaľ nie som žiaden odborník. Pomohli by ste mi prosím? Prikladám obrázok SPRÁVNEHO kódu v C++ aj môjho NESPRÁVNEHO v Jave.

Odpovědět
10.8.2017 21:43
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
vlastajuracka:10.8.2017 23:25

A co ti to háže za chybu ? První bych zkusil smazat to System.exit(0);

 
Nahoru Odpovědět
10.8.2017 23:25
Avatar
Odpovídá na vlastajuracka
Neaktivní uživatel:11.8.2017 8:41

Okay zmazal som to. Program prebehne, ukončí sa a na výstupe nevypíše nič. Toto je môj problém.

Nahoru Odpovědět
11.8.2017 8:41
Neaktivní uživatelský účet
Avatar
vlastajuracka:11.8.2017 9:25

Hoď sem prosím kód

 
Nahoru Odpovědět
11.8.2017 9:25
Avatar
Odpovídá na vlastajuracka
Neaktivní uživatel:11.8.2017 10:10
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;}
                }
}
Nahoru Odpovědět
11.8.2017 10:10
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Petr Štechmüller:11.8.2017 12:04

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.
    }
Nahoru Odpovědět
11.8.2017 12:04
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
vlastajuracka:11.8.2017 12:28

Tak koukam, že mě někdo předběhl :D

 
Nahoru Odpovědět
11.8.2017 12:28
Avatar
Odpovídá na Petr Štechmüller
Neaktivní uživatel:11.8.2017 18:01

Vďaka :-D č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.

Nahoru Odpovědět
11.8.2017 18:01
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Petr Štechmüller:11.8.2017 18:19

Ž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ě.

Nahoru Odpovědět
11.8.2017 18:19
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Neaktivní uživatel:11.8.2017 18:34

Odstránil som resetovanie indexu a stále mi program neposkytuje žiaden výpis :-D napadá ťa, ako to vyriešiť? :-D

Nahoru Odpovědět
11.8.2017 18:34
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Petr Štechmüller:11.8.2017 18:52

Tak to zkus krokovat ve svém oblíbeném vývojovém prostředí.

Nahoru Odpovědět
11.8.2017 18:52
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Honza Bittner:11.8.2017 19:25

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));
}
Editováno 11.8.2017 19:26
Nahoru Odpovědět
11.8.2017 19:25
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Odpovídá na Neaktivní uživatel
Petr Štechmüller:11.8.2017 19:26

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.

Nahoru Odpovědět
11.8.2017 19:26
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Honza Bittner
Neaktivní uživatel:11.8.2017 21:57

K tej "nízkoúrovňovitě" :-D :-D :-D 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ť :-D . 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:)

Nahoru Odpovědět
11.8.2017 21:57
Neaktivní uživatelský účet
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Honza Bittner:12.8.2017 8:38

"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.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
12.8.2017 8:38
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
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 15 zpráv z 15.