Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem "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

Předmět Autor Datum
Program si určitě nemyslí, že je to integer. A jde to mimochodem vyřešit jediným cyklem, nepotřebuje…
Wikan 04.11.2016 20:15
Wikan
jeden cyklus tam mám. string vstup = Console.ReadLine(); vstup = vstup.ToLower(); int delka = vstu…
roadicek 04.11.2016 20:18
roadicek
index2 < 65 && index2 > 90 Ta podmínka (stejně jaké všechny podobné ostatní) nemůže být nikdy splně…
Wikan 04.11.2016 20:24
Wikan
zas taková banalita -_- ani mě nenapadlo ty podminky poradne zkontrolovat. string vstup = Console.…
roadicek 04.11.2016 20:35
roadicek
Ani teď ty podmínky nedělají to, co od nich asi očekáváš. A taky se vůbec neposouváš po jednotlivých…
Wikan 04.11.2016 20:46
Wikan
a jo musi to byt (a<48 || (a>57 && a<65) || (a>90 && a< 97)|| a>122) po jednotlivych znacich? Nevim…
roadicek 04.11.2016 20:59
roadicek
Ne, právě že nepostupuješ na další. Přečteš si znak a pak neustále zvyšuješ jeho hodnotu. Ale ty nec…
Wikan 04.11.2016 21:01
Wikan
no ale ve chvili kdy hledam palindrom tak ty hodnoty musi byt stejne takze to ten palindrom hleda st…
roadicek 04.11.2016 21:03
roadicek
Ne.
Wikan 04.11.2016 21:05
Wikan
no a myslis ze mi prozradis jak se da zvysit hodnota indexu o jedna? Googlil jsem to kdyz jsem to re…
roadicek 04.11.2016 21:09
roadicek
static bool IsPalindrome(string text) { int min = 0; int max = text.Length - 1; while (true) { if (m…
pme 04.11.2016 21:11
pme
nechapu jak tohle muze fungovat... min > max (true)... nedava mi to smysl kazdopadne jsem tam zakomp…
roadicek 04.11.2016 21:28
roadicek
Evidentne nechápeš... Máš index min a max, začne sa porovnávanie...min sa zvyšuje a max sa znižuje..…
pme 04.11.2016 21:47
pme
Vypracovanie za jedna :) ale s malou mínuskou, názvy min a max sú zavádzajúce. Výstižnejšie by bolo…
čitateľ 04.11.2016 22:27
čitateľ
Hodnota indexu se zvyšuje stejně jako jakékoliv jiné číslo. Jenže pak ještě musíš ze vstupu přečíst…
Wikan 04.11.2016 21:20
Wikan
dobre dekuju... neco nedelam, nedelam to proto protoze nevim jak a proto jsem se se mprisel zeptat..…
roadicek 04.11.2016 21:31
roadicek
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 zn…
Wikan 04.11.2016 21:35
Wikan
tak ja fakt nevim... dole navysuju hodnotu promenny kterou mam zaroven v tom indexu.... Nevim jak ji…
roadicek 04.11.2016 21:40
roadicek
kod_znaku1 = vstup[prvni_znak] Tohle děláš jenom pro první a poslední znak. Ale ty to potřebuješ ud…
Wikan 04.11.2016 21:46
Wikan
mam tam uplne to stejny.... akorat s intem: int prvni_znak = 0; int kod_znaku1 = vstup[prvni_znak];…
roadicek 04.11.2016 21:51
roadicek
Třeba to, že já to dělám v cyklu a ty ne.
Wikan 04.11.2016 21:52
Wikan
presunul jsem ty dve promenny do cyklu a nefunguje to vubec.
roadicek 04.11.2016 21:56
roadicek
Ne všechno se má dělat v cyklu. Podívej se, co mám v cyklu a co před ním.
Wikan 04.11.2016 21:57
Wikan
no ano... tu promenou s nulou jsem nechal nad cyklem... prestala mi fungovat ta tecka ale to uz pred…
roadicek 04.11.2016 21:59
roadicek
Takže jak to máš teď?
Wikan 04.11.2016 22:02
Wikan
mam v tom ted spis curbes a vubec tomu nerozumim. string vstup = Console.ReadLine(); int delka = vs…
roadicek 04.11.2016 22:03
roadicek
kod_znaku2--; stejně jako kod_znaku1++; je nesmysl a nemá tam co dělat.
Wikan 04.11.2016 22:04
Wikan
to tam ale byt musi protoze kdyz to narazi na mezero tak ji to diky tomu preskoci a posune se to za…
roadicek 04.11.2016 22:09
roadicek
Ach jo. Prostě si nenecháš poradit. Jediné co máš zvyšovat/snižovat jsou indexy. Ne kódy samotných z…
Wikan 04.11.2016 22:12
Wikan
snažím se si nechat poradit... ted jsem to vsechno zmenil jak jste mi poradili... smazal jsem to co…
roadicek 04.11.2016 22:16
roadicek
Ono to totiž bylo celé špatně už na začátku a ne až teď. A aby se to zprovoznilo, tak je potřeba ods…
Wikan 04.11.2016 22:22
Wikan
aha, promin toho jsem si nevsiml. To continue je hodne uzitecne... funguje to tak ze to prejde k dal…
roadicek 04.11.2016 22:52
roadicek
Continue vrací vykonávání programu na začátek cyklu. C# žádné funkce nemá, je to objektový jazyk. A… poslední
Wikan 05.11.2016 08:46
Wikan
a nebrali jsme jeste boolean takze o tom taky vubec nic nevim... nevim jak ho dat do chodu a jka to…
roadicek 04.11.2016 23:13
roadicek
Áno mám to tam správne, ale - mám už vopred ošetrený vstup = žiadne nežiadúce znaky a celý text je p…
pme 04.11.2016 22:17
pme
poradis jak presne se pouziva ten regex? prosim
roadicek 04.11.2016 22:22
roadicek
Regex ti ve škole neuznají.
Wikan 04.11.2016 22:23
Wikan
tak ja se vratim k poslednimu kodu co fungoval. string vstup = Console.ReadLine(); vstup = vstup.T…
roadicek 04.11.2016 22:27
roadicek
Tenhle kód ale nikdy nefungoval.
Wikan 04.11.2016 22:30
Wikan
tak ja nevim... snazim se dat priklad na tom.
roadicek 04.11.2016 22:32
roadicek
Podívej se na ten můj příklad a zkus o něm popřemýšlet.
Wikan 04.11.2016 22:36
Wikan
Mám udělat consolovou aplikaci v c sharpu, která rozliší zda vstup od uživatele je nebo není palindr…
pme 04.11.2016 20:20
pme
promin to jsem se upsal... melo to byt ze bere jen cisla, mala a velka pismena... zbytek by to melo…
roadicek 04.11.2016 20:23
roadicek
Zbytočne a navyše ešte zle testuješ a ošetruješ zadaný vstup... Použi regulárny výraz, kde si ošetrí…
pme 04.11.2016 20:59
pme
v zadani je, osetrit znaky pomoci ascii hodnot.
roadicek 04.11.2016 21:05
roadicek
Ja by som použil jednoduchší algoritmus. V prvom kroku vytvoril kópiu vstupu očistenú o všetky nežia…
čitateľ 04.11.2016 20:39
čitateľ

jeden cyklus tam mám.

            string vstup = Console.ReadLine();
            vstup = vstup.ToLower();
            int delka = vstup.Length;
            double porovnani_suda = delka/2;
            double porovnani_licha = porovnani_suda + 0.5;
            int tecka = 46;
            int index1_1 = 0;
            int index2_2 = delka - 1;
            int index1 = vstup[index1_1];
            int index2 = vstup[index2_2];
            int result = 0;
            while (index1_1 < index2_2)
            {
                if ((index2 < 65 && index2 > 90) || (index2 < 97 && index2 > 122) || (index2 < 48 && index2 > 57) || (index2 == tecka))
                    index2--;
                else if ((index1 < 65 && index1 > 90) || (index1 < 97 && index1 > 122) || (index1 < 48 && index1 > 57) || (index1 == tecka))
                    index1++;
                else if (index1 == index2)
                    result++;
                else if (index1 != index2)
                    result--;
                index1_1++;
                index2_2--;
            }
            if ((result == porovnani_suda) || (result == porovnani_licha))
                Console.WriteLine("1");
            else
                Console.WriteLine("0");

zas taková banalita -_- ani mě nenapadlo ty podminky poradne zkontrolovat.

           string vstup = Console.ReadLine();
            vstup = vstup.ToLower();
            int delka = vstup.Length;
            double porovnani_suda = delka/2;
            double porovnani_licha = porovnani_suda + 0.5;
            int tecka = 46;
            int prvni_znak = 0;
            int posledni_znak = delka - 1;
            int kod_znaku1 = vstup[prvni_znak];
            int kod_znaku2 = vstup[posledni_znak];
            int result = 0;
            while (prvni_znak < posledni_znak)
            {
                if ((kod_znaku2 < 65 || kod_znaku2 > 90) || (kod_znaku2 < 97 || kod_znaku2 > 122) || (kod_znaku2 < 48 || kod_znaku2 > 57) || (kod_znaku2 == tecka))
                {
                    kod_znaku2--;
                    result++;
                }
                else if ((kod_znaku1 < 65 || kod_znaku1 > 90) || (kod_znaku1 < 97 || kod_znaku1 > 122) || (kod_znaku1 < 48 || kod_znaku1 > 57) || (kod_znaku1 == tecka))
                {
                    kod_znaku1++;
                    result++;
                }
                else if (kod_znaku1 == kod_znaku2)
                    result++;
                else if (kod_znaku1 != kod_znaku2)
                    result--;
                prvni_znak++;
                posledni_znak--;
            }
            if ((result == porovnani_suda) || (result == porovnani_licha))
                Console.WriteLine("1");
            else
                Console.WriteLine("0");

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.

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

mam v tom ted spis curbes a vubec tomu nerozumim.

string vstup = Console.ReadLine();
            int delka = vstup.Length;
            double porovnani_suda = delka/2;
            double porovnani_licha = porovnani_suda + 0.5;
            int prvni_znak = 0;
            int posledni_znak = delka - 1;
            int result = 0;
            while (prvni_znak < posledni_znak)
            {
                int kod_znaku1 = vstup[prvni_znak];
                int kod_znaku2 = vstup[posledni_znak];
                if (kod_znaku2 < 48 || (kod_znaku2 > 57 && kod_znaku2 < 65) || (kod_znaku2 > 90 && kod_znaku2 < 97) || kod_znaku2 > 122)
                {
                    kod_znaku2--;
                    result++;
                }
                else if (kod_znaku1 < 48 || (kod_znaku1 > 57 && kod_znaku1 < 65) || (kod_znaku1 > 90 && kod_znaku1 < 97) || kod_znaku1 > 122)
                {
                    kod_znaku1++;
                    result++;
                }
                else if (kod_znaku1 == kod_znaku2)
                    result++;
                else if (kod_znaku1 != kod_znaku2)
                    result--;
                prvni_znak++;
                posledni_znak--;
            }
            if ((result == porovnani_suda) || (result == porovnani_licha))
                Console.WriteLine("1");
            else
                Console.WriteLine("0");

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.

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

bool isPalindrome(string input)
{
    var first = 0;
    var last = input.Length - 1;
    while (first < last)
    {
        var firstChar = input[first];
        if (shouldSkip(firstChar))
        {
            first++;
            continue;
        }

        var lastChar = input[last];
        if (shouldSkip(lastChar))
        {
            last--;
            continue;
        }

        if (char.ToLower(firstChar) != char.ToLower(lastChar))
            return false;

        first++;
        last--;
    }
    return true;
}

bool shouldSkip(char chr)
{
    return chr < 48 || (chr > 57 && chr < 65) || (chr > 90 && chr < 97) || chr > 122;
}

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

bool shouldSkip(char chr)

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

if (false)
console.writeLine("0");

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?

bool shouldSkip(char chr)

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.

if (false) ...

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?

tak ja se vratim k poslednimu kodu co fungoval.

            string vstup = Console.ReadLine();
            vstup = vstup.ToLower();
            int delka = vstup.Length;
            double porovnani_suda = delka / 2;
            double porovnani_licha = porovnani_suda + 0.5;
            int tecka = 46;
            int prvni_znak = 0;
            int posledni_znak = delka - 1;
            int kod_znaku1 = vstup[prvni_znak];
            int kod_znaku2 = vstup[posledni_znak];
            int result = 0;
            while (prvni_znak < posledni_znak)
            {
                if ((kod_znaku2 < 65 || kod_znaku2 > 90) || (kod_znaku2 < 97 || kod_znaku2 > 122) || (kod_znaku2 < 48 || kod_znaku2 > 57) || (kod_znaku2 == tecka))
                {
                    kod_znaku2--;
                    result++;
                }
                else if ((kod_znaku1 < 65 || kod_znaku1 > 90) || (kod_znaku1 < 97 || kod_znaku1 > 122) || (kod_znaku1 < 48 || kod_znaku1 > 57) || (kod_znaku1 == tecka))
                {
                    kod_znaku1++;
                    result++;
                }
                else if (kod_znaku1 == kod_znaku2)
                    result++;
                else if (kod_znaku1 != kod_znaku2)
                    result--;
                prvni_znak++;
                posledni_znak--;
            }
            if ((result == porovnani_suda) || (result == porovnani_licha))
                Console.WriteLine("1");
            else
                Console.WriteLine("0");

kdyz presunu:

            int kod_znaku1 = vstup[prvni_znak];
            int kod_znaku2 = vstup[posledni_znak];

do tela cyklu a smazu kod_znaku 1 a kod_znaku 2 ++,-- tak by to melo fungovat?

Zpět do poradny Odpovědět na původní otázku Nahoru