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.


Zobrazeno 15 zpráv z 15.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.