Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Jak sprawdzić, czy dany ciąg liter lub cyfr jest palindromempalindrompalindromem, czyli czy wyrażenie odczytywane w obie strony brzmi tak samo?

Będziemy zajmować się ciągami znaków, a zatem skorzystamy z biblioteki:

Linia 1. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny.

Zapiszemy również wykorzystanie przestrzeni nazw:

Linia 1. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny. Linia 2. using namespace std średnik.

Dzięki wykorzystaniu biblioteki <string> możemy wykonywać różne działania na ciągach znaków, np. porównywanie, dodawanie kilku łańcuchów do siebie, wyszukanie konkretnego znaku w łańcuchu.

Aby zadeklarować ciąg znaków, używamy string nazwa_zmiennej.

Dla zainteresowanych

Czasami kompilatory dołączają niektóre biblioteki automatycznie, bez potrzeby deklaracji ich w kodzie. Np. po dołączeniu <iostream> może się okazać, że już jest w niej zawarty nagłówek <string>. Jednak, dla pewności, w implementacji należy dodawać niezbędne biblioteki. Program bowiem może nie działać przy użyciu  innego kompilatora lub w innej wersji kompilatora przez ciebie używanego.

Odwracanie wyrażenia w łańcuchu znaków

Załóżmy, że chcemy sprawdzić, czy słowo „kajak” jest palindromem. Jednym ze sposobów badania ciągu znaków będzie odwrócenie go i porównanie z oryginałem.

Zaczniemy od zdefiniowania łańcucha znaków string, któremu nadamy nazwę tekst. Przypiszemy mu wartość kajak. Utworzymy również pusty łańcuch odwrot. Znajdzie się w nim sprawdzane wyrażenie, zapisane wspak.

Linia 1. string tekst znak równości cudzysłów kajak cudzysłów średnik. Linia 2. string odwrot średnik.

Następnie użyjemy pętli for w celu wprowadzenia do zmiennej odwrot znaków łańcucha tekst zapisanych w odwrotnej kolejności.

Licznikowi w pętli for (zmiennej i) przypiszemy wartość ostatniego indeksu łańcucha znaków tekst. Wynosi ona tekst.size() - 1, ponieważ indeksowanie łańcucha zaczynamy od liczby 0 (słowo kajak składa się z pięciu znaków ponumerowanych od 0 do 4). W każdym przejściu pętli będziemy dekrementowaćdekrementacjadekrementować zmienną i, aż do momentu, gdy osiągnie ona wartość 0 (czyli taką samą, jak indeks pierwszego znaku łańcucha tekstowego).

Linia 1. for otwórz nawias okrągły int i znak równości tekst kropka size otwórz nawias okrągły zamknij nawias okrągły minus 1 średnik i zamknij nawias ostrokątny znak równości 0 średnik i minus minus zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. odwrot plus znak równości tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik. Linia 4. zamknij nawias klamrowy.

Poszczególne elementy łańcucha znaków odwrot wprowadzamy za pomocą operatora przypisania +=.

Gdy gotowe są już dwa łańcuchy znaków – jeden ze sprawdzanym wyrażeniem, a drugi z jego lustrzanym odbiciem – możemy porównać  je za pomocą instrukcji warunkowej if. Jeśli okażą się one identyczne, mamy do czynienia z palindromem.

Linia 1. if otwórz nawias okrągły tekst znak równości znak równości odwrot zamknij nawias okrągły. Linia 2. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Palindrom cudzysłów średnik. Linia 3. else. Linia 4. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów To nie jest palindrom cudzysłów średnik.

Po zbadaniu słowa „kajak” otrzymalibyśmy odpowiedź Palindrom.

Porównywanie znaków o skrajnych indeksach

Inna metoda badania, czy wyrażenie jest palindromem, polega na porównywaniu jego skrajnych znaków. Ponieważ palindrom brzmi tak samo czytany w obie strony, to pierwszy znak jest taki sam jak ostatni, drugi taki sam jak przedostatni itd.

Znowu zaczniemy od zdefiniowania wyrażenia, które chcemy zbadać. Tworzymy łańcuch znaków string o nazwie tekst i wpisujemy do niego słowo rower. Definiujemy również zmienną typu logicznego (bool):

Linia 1. string tekst znak równości cudzysłów rower cudzysłów średnik. Linia 2. bool palindrom znak równości true średnik.

Zmienną logiczną nazwaliśmy palindrom – przechowywana w niej będzie informacja o tym, czy wyrażenie jest palindromem. Wstępnie nadaliśmy jej wartość true. W przypadku, gdy znaki o skrajnych indeksach nie będą sobie równe, zmienimy ją na false. Innymi słowy, początkowo zakładamy, że sprawdzany tekst jest palindromem, a następnie weryfikujemy, czy mieliśmy rację.

Następnie użyjemy pętli for. Posłuży ona do badania znaków na obu końcach wyrażenia. Zadeklarujemy dwie zmienne iteracyjne (licznikowe). Początkową wartością jednej z nich będzie indeks pierwszego znaku (0), natomiast wartość drugiej wstępnie ustalimy jako tekst.size() - 1 (odpowiada to indeksowi ostatniego znaku wyrażenia).

Linia 1. for otwórz nawias okrągły int i znak równości 0 przecinek j znak równości tekst kropka size otwórz nawias okrągły zamknij nawias okrągły minus 1 średnik i otwórz nawias ostrokątny tekst kropka size otwórz nawias okrągły zamknij nawias okrągły prawy ukośnik 2 średnik i plus plus przecinek j minus minus zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. if otwórz nawias okrągły tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy wykrzyknik znak równości tekst otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły palindrom znak równości false średnik. Linia 4. zamknij nawias klamrowy.

Pętla będzie wykonywana dopóty, dopóki prawdziwy będzie warunek i < tekst.size() / 2. Znaki sprawdzamy parami, a zatem liczba powtórzeń pętli odpowiada połowie długości kontrolowanego łańcucha. Zmienna palindrom przyjmie wartość zależną od tego, czy mamy do czynienie z palindromem, czy też nie.

Zmienne logiczne mogą służyć za wyrażenie sterujące działaniem funkcji warunkowej if. Uzupełnimy więc kod:

Linia 1. if otwórz nawias okrągły palindrom zamknij nawias okrągły cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Palindrom cudzysłów średnik. Linia 2. else cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów To nie jest palindrom cudzysłów średnik.

Po zbadaniu słowa „rower” otrzymamy odpowiedź: To nie jest palindrom.

Słownik

dekrementacja
dekrementacja

zmniejszenie wartości zmiennej o jeden

palindrom
palindrom

słowo lub wyrażenie, które brzmi tak samo odczytywane zarówno od strony lewej do prawej, jak i w odwrotnym kierunku