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

Co to jest palindrom?

Palindrom to słowo lub ciąg wyrazów, które zapisane i czytane od lewej do prawej strony brzmią tak samo, jak zapisane i czytane od prawej do lewej. Przykładami palindromów są:

  • łapał za kran, a kanarka złapał,

  • wół utył i ma miły tułów.

Poznaliśmy już dwa sposoby implementacji algorytmu sprawdzającego, czy dane słowo jest palindromem. Zapiszemy obie implementacje i dokonamy porównania, by ocenić, która z nich jest efektywniejsza.

Komputerowa realizacja w języku Java

Przed rozpoczęciem implementacji algorytmu sprawdzającego, czy dane słowo jest palindromem, warto przypomnieć kilka aspektów związanych ze składnią języka Java.

  • pętla – to w niej będziemy porównywać słowa indeks po indeksie,

  • funkcja wbudowanafunkcja wbudowanafunkcja wbudowana charAt() umożliwia dostęp do pojedynczego znaku typu String, co okaże się niezwykle przydatne,

  • funkcje – najpierw napiszemy program, wykorzystując główną funkcję programu main(), a następnie dokonamy modyfikacji i wykonamy osobną funkcję do rozwiązania tego problemu,

  • operacje wejścia/wyjścia – w szczególności użycie klasy Scanner, która umożliwi użytkownikowi samodzielne wpisanie słowa do sprawdzenia w naszym programie.

I sposób

Zaimplementujemy sposób z porównywaniem znaków o skrajnych indeksach. Przypomnijmy, na czym on polegał: słowo, które jest palindromem, napisane od przodu i od tyłu wygląda tak samo. Oznacza to, że konkretne pary znaków muszą być takie same: pierwsza i ostatnia, druga i przedostatnia itp. Zacznijmy od napisania kodu, który umożliwi użytkownikowi wpisanie własnego słowa w celu sprawdzenia, czy jest ono palindromem. Zrobimy to z pomocą klasy Scanner. Przeanalizujmy następujący fragment kodu:

Linia 1. Scanner scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik. Linia 3. System kropka out kropka println otwórz nawias okrągły cudzysłów Podaj słowo do sprawdzenia cudzysłów zamknij nawias okrągły średnik. Linia 5. String slowoTest znak równości scanner kropka nextLine otwórz nawias okrągły zamknij nawias okrągły średnik.

Najpierw deklarujemy obiekt klasy Scanner – tu został on nazwany scanner. Standardowe wejście System.in pozwala na sczytywanie tego, co wpisujemy z klawiatury. Następnie tworzymy zmienną typu String o nazwie slowoTest, do której zapisujemy to, co podał użytkownik za pomocą funkcji wbudowanej nextLine(). Jej dokładne działanie polega na pobieraniu tego, co się wpisuje aż do wciśnięcia przycisku Enter na klawiaturze.

Kolejnym krokiem będzie zadeklarowanie pętli, w której będą porównywane skrajne znaki.

Linia 1. for otwórz nawias okrągły int i znak równości 0 przecinek j znak równości slowoTest kropka length otwórz nawias okrągły zamknij nawias okrągły minus 1 średnik i otwórz nawias ostrokątny slowoTest kropka length otwórz nawias okrągły zamknij nawias okrągły ampersant ampersant j zamknij nawias ostrokątny znak równości 0 średnik i plus plus przecinek j minus minus zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. zamknij nawias klamrowy.

Jest to nietypowa pętla for. Czy widzisz dlaczego?

Posiada ona dwie zmienne sterującezmienna sterującazmienne sterujące: i oraz j. Pozwala to na jednoczesne porównywanie liter danego słowa. Zmienna i startuje od pierwszego indeksu słowa i zwiększa się, natomiast zmienna j zaczyna od ostatniego i zmniejsza się. To w zasadzie jeden z najważniejszych aspektów w implementacji tego sposobu.

Wypełnijmy teraz blok tej pętli i dodajmy zmienną boolean czyPalindrom.

Linia 1. boolean czyPalindrom znak równości false średnik. Linia 3. for otwórz nawias okrągły int i znak równości 0 przecinek j znak równości slowoTest kropka length otwórz nawias okrągły zamknij nawias okrągły minus 1 średnik i otwórz nawias ostrokątny slowoTest kropka length otwórz nawias okrągły zamknij nawias okrągły ampersant ampersant j zamknij nawias ostrokątny znak równości 0 średnik i plus plus przecinek j minus minus zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. if otwórz nawias okrągły slowoTest kropka charAt otwórz nawias okrągły i zamknij nawias okrągły wykrzyknik znak równości slowoTest kropka charAt otwórz nawias okrągły j zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. czyPalindrom znak równości false średnik. Linia 6. break średnik. Linia 7. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 8. czyPalindrom znak równości true średnik. Linia 9. zamknij nawias klamrowy. Linia 10. zamknij nawias klamrowy.

Dodaliśmy blok if-else, który w przypadku niewykrycia zgodności liter od razu przerywa pętlę (słowo kluczowe break). W przeciwnym razie, jeżeli po przejściu całej pętli, zmiennej logicznej czyPalindrom nie zostanie przypisana wartość false, to oznacza, że wprowadzone słowo na pewno jest palindromem.

Ostatnią częścią naszego programu będzie wypisanie użytkownikowi komunikatu tekstowego powiadamiającego, czy słowo jest palindromem, czy nie.

Linia 1. if otwórz nawias okrągły czyPalindrom znak równości znak równości true zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. System kropka out kropka println otwórz nawias okrągły cudzysłów Wyraz jest palindromem cudzysłów zamknij nawias okrągły średnik. Linia 3. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 4. System kropka out kropka println otwórz nawias okrągły cudzysłów Wyraz nie jest palindromem cudzysłów zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy.

Zobaczmy teraz cały program.

Linia 1. import java kropka util kropka Scanner średnik. Linia 3. public class Palindrom otwórz nawias klamrowy. Linia 4. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. Scanner scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik. Linia 8. System kropka out kropka println otwórz nawias okrągły cudzysłów Podaj słowo do sprawdzenia cudzysłów zamknij nawias okrągły średnik. Linia 10. String slowoTest znak równości scanner kropka nextLine otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 11. boolean czyPalindrom znak równości false średnik. Linia 13. for otwórz nawias okrągły int i znak równości 0 przecinek j znak równości slowoTest kropka length otwórz nawias okrągły zamknij nawias okrągły minus 1 średnik i znak równości 0 średnik i plus plus przecinek j minus minus zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. if otwórz nawias okrągły slowoTest kropka charAt otwórz nawias okrągły i zamknij nawias okrągły wykrzyknik znak równości slowoTest kropka charAt otwórz nawias okrągły j zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. czyPalindrom znak równości false średnik. Linia 16. break średnik. Linia 17. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 18. czyPalindrom znak równości true średnik. Linia 19. zamknij nawias klamrowy. Linia 20. zamknij nawias klamrowy. Linia 22. if otwórz nawias okrągły czyPalindrom znak równości znak równości true zamknij nawias okrągły otwórz nawias klamrowy. Linia 23. System kropka out kropka println otwórz nawias okrągły cudzysłów Wyraz jest palindromem cudzysłów zamknij nawias okrągły średnik. Linia 24. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 25. System kropka out kropka println otwórz nawias okrągły cudzysłów Wyraz nie jest palindromes cudzysłów zamknij nawias okrągły średnik. Linia 26. zamknij nawias klamrowy. Linia 27. zamknij nawias klamrowy. Linia 28. zamknij nawias klamrowy.

Wersja z funkcją

Zobaczmy, jak wygląda cały program, ale napisany przy pomocy funkcji.

Linia 1. import java kropka util kropka Scanner średnik. Linia 3. public class Palindrom otwórz nawias klamrowy. Linia 4. public static boolean czyPalindrom otwórz nawias okrągły String slowo zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. for otwórz nawias okrągły int i znak równości 0 przecinek j znak równości slowo kropka length otwórz nawias okrągły zamknij nawias okrągły minus 1 średnik i otwórz nawias ostrokątny slowo kropka length otwórz nawias okrągły zamknij nawias okrągły ampersant ampersant j zamknij nawias ostrokątny znak równości 0 średnik i plus plus przecinek j minus minus zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. if otwórz nawias okrągły slowo kropka charAt otwórz nawias okrągły i zamknij nawias okrągły wykrzyknik znak równości slowo kropka charAt otwórz nawias okrągły j zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. return false średnik. Linia 8. zamknij nawias klamrowy. Linia 9. zamknij nawias klamrowy. Linia 11. return true średnik. Linia 12. zamknij nawias klamrowy. Linia 14. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. Scanner scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik. Linia 17. System kropka out kropka println otwórz nawias okrągły cudzysłów Podaj słowo do sprawdzenia cudzysłów zamknij nawias okrągły średnik. Linia 19. String slowoTest znak równości scanner kropka nextLine otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 21. if otwórz nawias okrągły czyPalindrom otwórz nawias okrągły slowoTest zamknij nawias okrągły znak równości znak równości true zamknij nawias okrągły otwórz nawias klamrowy. Linia 22. System kropka out kropka println otwórz nawias okrągły cudzysłów Wyraz jest palindromem cudzysłów zamknij nawias okrągły średnik. Linia 23. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 24. System kropka out kropka println otwórz nawias okrągły cudzysłów Wyraz nie jest palindromem cudzysłów zamknij nawias okrągły średnik. Linia 25. zamknij nawias klamrowy. Linia 26. zamknij nawias klamrowy. Linia 27. zamknij nawias klamrowy.

Program napisany przy pomocy funkcji posiada więcej zalet w porównaniu do wcześniejszej implementacji. Niepotrzebna nam jest dodatkowa zmienna boolean czyPalindrom. Teraz cała funkcja zwraca typ logicznego boolean. Dodatkowo, gdybyśmy chcieli sprawdzić kilka słów, w poprzedniej implementacji musielibyśmy powielać ten sam kod – tu wystarczy wywołać jeszcze raz funkcję i przekazać sprawdzane słowo jako parametr.

II sposób

Drugi sposób polega na tym, że w nowej zmiennej zapisujemy słowo, które podamy do sprawdzenia – od tyłu. Jeżeli oba słowa są równe, to wyraz ten jest palindromem.

W następnej sekcji zaimplementujemy algorytm i dokładnie go omówimy.

Słownik

funkcja wbudowana
funkcja wbudowana

gotowa funkcja mająca swoje zastosowanie, należy do jednej z bibliotek lub klas; przykładami takich funkcji z języka Java są: length(), charAt(), nextLine()

zmienna sterująca
zmienna sterująca

zmienna umożliwiająca sterowanie pętlą; pozwala na przejście do kolejnych iteracji (iterator)