Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)
Avatar
Michal Klein
Člen
Avatar
Michal Klein:10. srpna 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. srpna 21:43
Avatar
Odpovídá na Michal Klein
vlastajuracka:10. srpna 23:25

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

 
Nahoru Odpovědět 10. srpna 23:25
Avatar
Michal Klein
Člen
Avatar
Odpovídá na vlastajuracka
Michal Klein:11. srpna 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. srpna 8:41
Avatar
vlastajuracka:11. srpna 9:25

Hoď sem prosím kód

 
Nahoru Odpovědět 11. srpna 9:25
Avatar
Michal Klein
Člen
Avatar
Odpovídá na vlastajuracka
Michal Klein:11. srpna 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. srpna 10:10
Avatar
Odpovídá na Michal Klein
Petr Štechmüller:11. srpna 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  +1 11. srpna 12:04
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
vlastajuracka:11. srpna 12:28

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

 
Nahoru Odpovědět 11. srpna 12:28
Avatar
Michal Klein
Člen
Avatar
Odpovídá na Petr Štechmüller
Michal Klein:11. srpna 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. srpna 18:01
Avatar
Odpovídá na Michal Klein
Petr Štechmüller:11. srpna 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. srpna 18:19
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Michal Klein
Člen
Avatar
Odpovídá na Petr Štechmüller
Michal Klein:11. srpna 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. srpna 18:34
Avatar
Odpovídá na Michal Klein
Petr Štechmüller:11. srpna 18:52

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

Nahoru Odpovědět 11. srpna 18:52
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Honza Bittner
Šupák
Avatar
Odpovídá na Michal Klein
Honza Bittner:11. srpna 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. srpna 19:26
Nahoru Odpovědět 11. srpna 19:25
Milovník Dartu. Student FIT ČVUT. Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/...
Avatar
Odpovídá na Michal Klein
Petr Štechmüller:11. srpna 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. srpna 19:26
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Michal Klein
Člen
Avatar
Odpovídá na Honza Bittner
Michal Klein:11. srpna 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. srpna 21:57
Avatar
Honza Bittner
Šupák
Avatar
Odpovídá na Michal Klein
Honza Bittner:12. srpna 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í
+1 bodů
Řešení problému
Nahoru Odpovědět 12. srpna 8:38
Milovník Dartu. Student FIT ČVUT. Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/...
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.