Palindrom
Ostatnio zmodyfikowano 2015-08-21 09:56
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ń ? #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;
|
|
notabigthreat |
» 2015-08-17 20:12:19 Po co w ogóle specjalnie traktować spacje? |
|
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. |
|
notabigthreat |
» 2015-08-17 20:41:50 Dobra, łapię. Usuń najpierw spacje i po sprawie. Z interpunkcją, znakami specjalnymi podobnie, prawda? |
|
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. |
|
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. |
|
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; }
|
|
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 :) #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 ? |
|
« 1 » 2 |