Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Palindrom

Ostatnio zmodyfikowano 2015-08-21 09:56
Autor Wiadomość
Braile
Temat założony przez niniejszego użytkownika
Palindrom
» 2015-08-17 19:43:57
Witam,
Mam problem z działaniem algorytmu sprawdzającego, czy podany tekst jest palindromem. Jeśli wpiszemy ciąg znaków będący palindromem bez spacji, to program prawidłowo wypisuje komunikat, natomiast gdy słowa oddzielimy spacją to wypisuje zły komunikat. Przypisałem znak spacji do zmiennej spacja typu char i w pętli sprawdzam, czy w danym indeksie tablicy znajduje się spacja, jeśli tak to przeskakuje do następnego znaku lub cofam się w przypadku, gdy spacja znajdzie się podczas czytania tekstu od tyłu. Wymyśliłem, że można stworzyć drugą tablicę pomocniczą, do której będę wrzucał ten sam tekst bez spacji i dopiero wtedy sprawdzać czy jest palindromem, jednak czy jest możliwość aby ten problem rozwiązać łatwiej, coś w ten deseń ?
C/C++
#include<iostream>
#include<cstring>
using namespace std;

bool is_palindrom( char slowo[], int dl )
{
    char spacja = ' ';
    for( int i = 0; i < dl - i; i++ )
    {
        if( slowo[ i ] == spacja )
             i++;
       
        if( slowo[ dl - i ] == spacja )
             dl--;
       
        if( slowo[ i ] != slowo[ dl - i ] )
             return false;
       
    }
    return true;
P-136434
notabigthreat
» 2015-08-17 20:12:19
Po co w ogóle specjalnie traktować spacje?
P-136436
Braile
Temat założony przez niniejszego użytkownika
» 2015-08-17 20:39:28
Traktować specjalnie, tzn. ? Nie zrozumiałem do końca Twojej wypowiedzi. W przypadku tekstu: "kobyla ma maly bok" pisanym ze spacjami wyskakuje komunikat ze podany tekst nie jest palindromem, a pisząc ten tekst bez spacji wypisuje już poprawny komunikat.
P-136438
notabigthreat
» 2015-08-17 20:41:50
Dobra, łapię. Usuń najpierw spacje i po sprawie. Z interpunkcją, znakami specjalnymi podobnie, prawda?
P-136439
Braile
Temat założony przez niniejszego użytkownika
» 2015-08-17 22:54:29
A nie można zrobić tego tak jak ja zapisałem ? Być może w czymś jest mały błąd, którego ja nie dostrzegam. W przypadku natrafienia na znak spacji przechodzę do następnej litery i sprawdzam dalej.
P-136456
michal11
» 2015-08-18 12:01:30
A nie można zrobić tego tak jak ja zapisałem ?
A działa ?

Usuń spacje i po problemie.
P-136462
Monika90
» 2015-08-18 13:32:15
A może tak?

#include <iostream>
#include <cctype>

bool palindrom(const std::string& str)
{
    auto boring = [](unsigned char c) { return !std::isalnum(c); };
    auto eq = [](unsigned char c1, unsigned char c2) { return std::toupper(c1) == std::toupper(c2); };
    auto i = str.begin();
    auto j = str.rbegin();
    while (i < j.base())
    {
        if (boring(*i))
            ++i;
        else if (boring(*j))
            ++j;
        else if (eq(*i, *j))
            ++i, ++j;
        else
            return false;           
    }

    return true;
}

int main()
{
    std::cout << palindrom("Madam, I'm Adam.")
        << palindrom("Kobyla ma maly bok.")
        << palindrom("")
        << palindrom("niepalindrom")
        << std::endl;
}

P-136467
Braile
Temat założony przez niniejszego użytkownika
» 2015-08-20 23:21:10
Okej, zrobiłem po swojemu, jednak już działa tak jak powinno. Wystarczyło delikatnie 'apgrejdować' wyrażenie zmieniające wartość zmiennej w instrukcji for :) Mimo wszystko dziękuję za pomoc :)
C/C++
#include<iostream>
#include<cstring>
#include<string>
using namespace std;

bool is_palindrom( string slowo )
{
    int dl = slowo.size() - 1;
    for( int i = 0; i < dl; i++, dl-- )
    {
        if( slowo[ i ] == ' ' )
             i++;
       
        if( slowo[ dl ] == ' ' )
             dl--;
       
        if( slowo[ i ] != slowo[ dl ] )
             return false;
       
    }
    return true;
}

int main()
{
    string slowo;
    cout << "Podaj zdanie do 100 znakow: " << endl;
    getline( cin, slowo );
   
    if( is_palindrom( slowo ) )
         cout << "Podane zdanie '" << slowo << "' jest palindromem." << endl;
    else
         cout << "Podane zdanie '" << slowo << "' nie jest palindromem." << endl;
   
    return 0;
}

EDIT: Mam pytanie czysto teoretyczne. Czy zmienne przekazywane do funkcji jako argumenty mogą mieć takie same nazwy jak ich odpowiedniki w funkcji main(), czy raczej powinienem użyć czegoś w stylu string sSlowo ?
P-136622
« 1 » 2
  Strona 1 z 2 Następna strona