Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] Czy podany wyraz jest palindromem?

marcin03_1989 11 Cze 2011 19:07 4351 5
  • #1 11 Cze 2011 19:07
    marcin03_1989
    Poziom 2  


    Program ma za zadanie sprawdzić, czy podany wyraz jest Palindromem, czyli od tyłu jest identyczny jak czytany od przodu. Obraca mi wyrazy, ale ciągle nie potrafię poradzić sobie z tym, że by porównywało po kolei litery. Szukałem juz odpowiedzi na innych forach i na elektrodzie, ale nic pomocnego nie znalazłem.


    Code:
    #include <string>
    
    using namespace std;

    string Obrocony(string slowo)
    {
        string napis;
        int dlugosc = slowo.length();
        for(int i=0; i<=dlugosc; i++)
        {
            napis = slowo[i] + napis;
        }

        return napis;
    }

    bool Palindrom(string slowo)
    {
        for (int i; i<slowo.length(); i++)
        {
            if(Obrocony(slowo)[i] == slowo[i])
            {
                return true;
            }

        }
    }

    int main()
    {
        string wyraz;

        cout << "Podaj wyraz: ";
        getline(cin, wyraz);

        if(Palindrom(wyraz))
        {
            cout << "Podany wyraz jest PALINDROMEM: \n" << wyraz << " - " << Obrocony(wyraz) << endl;
        }
        else
        {
            cout << "Podany wyraz nie jest palindromem.\n";

        }

        return 0;
    }

    0 5
  • Pomocny post
    #3 11 Cze 2011 19:40
    piotr_go
    Poziom 27  

    Code:
    string Obrocony(string slowo)
    
    {
        string napis;
        int dlugosc = slowo.length();
        for(int i=0; i<dlugosc; i++)
        {
            napis = slowo[i] + napis;
        }
        return napis;
    }

    bool Palindrom(string slowo)
    {
        for (int i = 0; i<slowo.length(); i++)
        {
            if(Obrocony(slowo)[i] != slowo[i])
            {
                return false;
            }
        }
        return true;
    }


    Błąd pierwszy, przy obracaniu obracasz o jeden znak za dużo.
    Błąd drugi, w palindromie nie zwracasz false i trochę to inaczej powinno być.

    0
  • Pomocny post
    #4 11 Cze 2011 22:22
    #
    Poziom 13  

    Cytat:
    Obraca mi wyrazy, ale ciągle nie potrafię poradzić sobie z tym, że by porównywało po kolei litery.

    Problem można rozwiązać stosując jedną pętlę sprawdzającą i-ty znak oraz znak o indeksie powstałym z odjęcia od długości ciągu iteratora pętli (i chyba 1 bo długość jest podana razem ze znakiem końca ciągu '\0').
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #5 11 Cze 2011 22:33
    marcin03_1989
    Poziom 2  

    Wielkie dzięki za szybkie odpowiedzi, sposób 'piotr_go' działa tak jak chciałem :D

    0
  • #6 12 Cze 2011 06:20
    Xitami
    Poziom 29  

    należy zrobić tak jak proponuje # albo tak:

    Code:
    bool Palindrom(string slowo){
    
       for(int i=0,j=slowo.length-1; i<j; )
          if(slowo[i++]!=slowo[j--])
             return false;
       return true;
    }
    funkcja Obrocony jest zbędna, a pętla for(i=0; i<slowo.length.. porównuje te same pary znaków dwukrotnie.

    0