
"přeskočení" tečky
Dobrý večer ve spolek,
rád bych se zeptal zkušenějších... mám takový problém. Mám udělat consolovou aplikaci v c sharpu, která rozliší zda vstup od uživatele je nebo není palindrom. Pokud je to palindrom vypíše na výstupu 1, pokud není tak vypíše 0. Máme k tomu využít cykly, ne pole. Vše už mám, program převede vše na malá písmena potom porovnává char po charu, bere vse krome cisel, malych i velkych (asi trochu zbytecne) pismen... preskakovani jinych znaku jsem udelal pres podminku a ascii hodnoty znaku. Ale jakmile je na konci tečka, program nefunguje a automaticky pise ze to palindrom neni. Zkusil jsem snad vsechno, ale program si asi mysli ze je to integer a ne obycejna tecka.
Pokud by jste mi nekdo dokazal poradit byl bych Vam vdecny. Dekuji
Program si určitě nemyslí, že je to integer. A jde to mimochodem vyřešit jediným cyklem, nepotřebuješ jich víc.
Pokud chceš poradit, budeš muset uvést kód.
jeden cyklus tam mám.
Ta podmínka (stejně jaké všechny podobné ostatní) nemůže být nikdy splněna.
Proměnné by měly být pojmenované tak, aby z názvu bylo poznat, co je v nich uložené. Index1 nebo Index1_1 fakt není vhodné.
zas taková banalita -_- ani mě nenapadlo ty podminky poradne zkontrolovat.
Ani teď ty podmínky nedělají to, co od nich asi očekáváš.
A taky se vůbec neposouváš po jednotlivých znacích. Přečteš si ze vstupu první a poslední a to je vše.
a jo musi to byt (a<48 || (a>57 && a<65) || (a>90 && a< 97)|| a>122)
po jednotlivych znacich? Nevim co tím myslíš... načtu první a poslední a poté postupuji vždy na další, z prvního na druhý a z posledniho na predposledni... a takhle porad dokud se neminou a cyklus se ukonci. V tom je chyba?
Take jsem prisel na kuriozitu: kdyz napisu na vstup: Prilis zlutoucky kun upel silene ody na Mesic. tak si proram mysli ze jde o palindrom. Jinak funguje bezchybne.
Ne, právě že nepostupuješ na další. Přečteš si znak a pak neustále zvyšuješ jeho hodnotu. Ale ty nechceš zvýšit hodnotu znaku, ale hodnotu indexu, který má na ten znak ukazovat.
no ale ve chvili kdy hledam palindrom tak ty hodnoty musi byt stejne takze to ten palindrom hleda stejne dobre nebo ne?
Ne.
no a myslis ze mi prozradis jak se da zvysit hodnota indexu o jedna? Googlil jsem to kdyz jsem to resil a nic jsem nenasel, pak me napadlo udelat to takhle pres promennou.
nechapu jak tohle muze fungovat... min > max (true)... nedava mi to smysl kazdopadne jsem tam zakomponoval ty chary a porovnavam chary. Funguje to porad stejne.
Evidentne nechápeš... Máš index min a max, začne sa porovnávanie...min sa zvyšuje a max sa znižuje...pokiaľ sa k sebe tie hodnoty "priblížia", znamená to, že už je porovnávanie na polceste. Akonáhle je index za polovicou porovnávania textu tzn. min > max, nie je treba ďalej porovnávať...
ach jaj...
Vypracovanie za jedna :) ale s malou mínuskou, názvy min a max sú zavádzajúce. Výstižnejšie by bolo napr left, right.
Hodnota indexu se zvyšuje stejně jako jakékoliv jiné číslo. Jenže pak ještě musíš ze vstupu přečíst ten znak na pozici indexu. A to neděláš.
dobre dekuju... neco nedelam, nedelam to proto protoze nevim jak a proto jsem se se mprisel zeptat... ten kod znaku uz prevadim zpet na znak a porovnavam znaky. Nevim co jinyho tim myslis. Pri delsich retezcich to blbne.
Kód znaku nemusíš převádět zpět na znak. Pokud jsou stejné kódy, tak jsou stejné i znaky. A navíc znak a kód znaku je v podstatě to samé.
tak ja fakt nevim... dole navysuju hodnotu promenny kterou mam zaroven v tom indexu.... Nevim jak jinak zvetsit index o jedna. A porovnavam tam kody charu. Tak co je spatne?
Tohle děláš jenom pro první a poslední znak. Ale ty to potřebuješ udělat pro všechny znaky.
Příklad jak projít všechny znaky:
mam tam uplne to stejny.... akorat s intem:
opravdu nerozumim jakej rozdil je mezi tvoji verzi a tou moji.
Třeba to, že já to dělám v cyklu a ty ne.
presunul jsem ty dve promenny do cyklu a nefunguje to vubec.
Ne všechno se má dělat v cyklu. Podívej se, co mám v cyklu a co před ním.
no ano... tu promenou s nulou jsem nechal nad cyklem... prestala mi fungovat ta tecka ale to uz predtim.
Takže jak to máš teď?
mam v tom ted spis curbes a vubec tomu nerozumim.
kod_znaku2--; stejně jako kod_znaku1++; je nesmysl a nemá tam co dělat.
to tam ale byt musi protoze kdyz to narazi na mezero tak ji to diky tomu preskoci a posune se to za ni a pri dalsi podmince uz je tam dalsi znak ktery uz se porovnava s tim z druhe strany. Bez nej to nefunguje... kdyz napisu Kobyla ma maly bok... vypise to 0... s tim to vypise 1 protoze to mezery preskoci a kontroluje to bez nich.
Ach jo. Prostě si nenecháš poradit. Jediné co máš zvyšovat/snižovat jsou indexy. Ne kódy samotných znaků. Však se podívej na příklad od "pme", tam je to správně. Jen teda neřeší přeskakování znaků. Ale to se opět dělá změnou indexu.
snažím se si nechat poradit... ted jsem to vsechno zmenil jak jste mi poradili... smazal jsem to co jsi ted psal. A ten prgram uz vubec nefunguje. Vubce! A uz ani nevim proc... Uz nepreskakuje ani mezery. Nefunguje s teckou. Cely je to spatne.
Ono to totiž bylo celé špatně už na začátku a ne až teď. A aby se to zprovoznilo, tak je potřeba odstranit všechny chyby a ne jenom některé, na které jsem zatím upozornil. Dneska jsem asi moc měkký, takže uvedu příklad, jak by to mohlo vypadat. Ale dělám to fakt výjimečně.
aha, promin toho jsem si nevsiml. To continue je hodne uzitecne... funguje to tak ze to prejde k dalsi podmince? Take bych se te rad zeptal jak funguje to
v zavorce si ulozis nejakou promennou v ktere je ulozena ta podminka a kdyz tuto funkci potom nekde zavolas tak to projede zda dany char plni podminky toho v te funkci?
a to true false... kdyz vrati false cyklus se ukonci a dolu si dam podminku
a v pripade true zase "1"?
a neni to nahodou nejaka preddefinovana metoda? Promin za mozna stupidni otazky ale ve skole nam rekl neco o indexu na konci hodiny s tim ze se nam to bude hodit na tohle...
Continue vrací vykonávání programu na začátek cyklu.
C# žádné funkce nemá, je to objektový jazyk. A vy jste ještě nebrali metody?
Je metoda přijímající argument chr typu char (tedy znak) a vracející bool(ean). O znaku ti tak říká, zda má být přeskočen.
Je podmínka, která nemůže být nikdy splněna.
Vy jste ještě nebrali boolean? Základní datové typy se snad berou na jedné z prvních přednášek. Co je to za školu?
a nebrali jsme jeste boolean takze o tom taky vubec nic nevim... nevim jak ho dat do chodu a jka to pouzivat.
Áno mám to tam správne, ale - mám už vopred ošetrený vstup = žiadne nežiadúce znaky a celý text je prevedený na malé písmená a až potom sa to pošle funkcii IsPalindrome a tam sa testuje...
poradis jak presne se pouziva ten regex? prosim
Regex ti ve škole neuznají.
tak ja se vratim k poslednimu kodu co fungoval.
kdyz presunu:
do tela cyklu a smazu kod_znaku 1 a kod_znaku 2 ++,-- tak by to melo fungovat?
Tenhle kód ale nikdy nefungoval.
tak ja nevim... snazim se dat priklad na tom.
Podívej se na ten můj příklad a zkus o něm popřemýšlet.
čiže vstup môže byť aj číslo aj reťazec znakov.... nerozumiem, prečo " bere vse krome cisel, "
promin to jsem se upsal... melo to byt ze bere jen cisla, mala a velka pismena... zbytek by to melo preskocit kdyz na to narazi...
jenze mi to ty znaky nepreskakuje vubec jak jsem zjistil. Az na mezery... ty to uspesne preskakuje.
Zbytočne a navyše ešte zle testuješ a ošetruješ zadaný vstup... Použi regulárny výraz, kde si ošetríš nepotrebné znaky:
Regex pattern = new Regex("[ ;:,.-?'!\"]");
v zadani je, osetrit znaky pomoci ascii hodnot.