Zadanie 1

Zapisz w wybranej przez siebie notacji (w postaci pseudokodu lub w wybranym języku programowania) algorytm, który z podanego słowa będącego ciągiem znaków składającym się z wielkich liter alfabetu łacińskiego (z pominięciem litery J) usuwa drugie i kolejne wystąpienia znaku (zachowuje jedynie pierwsze wystąpienie danej litery).

Uwaga: W zapisie algorytmu możesz wykorzystać tylko operacje arytmetyczne: dodawanie, odejmowanie, mnożenie, dzielenie, dzielenie całkowite, resztę z dzielenia, oraz porównywanie liczb; instrukcje sterujące i przypisania do zmiennych lub samodzielnie napisane funkcje zawierające wyżej wymienione operacje.

Specyfikacja problemu:

Dane:

  • haslo[0..n - 1] – tablica przechowująca litery słowa, z którego mają zostać  usunięte powtarzające się litery (z zachowaniem ich pierwszych wystąpień); tablica znaków zawierająca wyłącznie wielkie litery alfabetu łacińskiego (bez litery J)

  • n – zmienna przechowująca długość słowa; liczba naturalna

Wynik:

  • hasloWynik[0..k - 1] – tablica przechowującą litery słowa, z którego zostały usunięte powtarzające się znaki (liczba tych liter wynosi k – rozmiar tablicy); tablica znaków zawierająca wyłącznie wielkie litery alfabetu łacińskiego (bez litery J).

Praca domowa

Przedstaw rozwiązanie zadania w postaci programu w języku C++, Java lub Python. 

Przykładowe rozwiązanie

Zaczynamy od utworzenia funkcji usunPowtorzenia. Przyjmuje ona jako parametry tablicę znaków haslo przechowującą podane słowo, a także długość tej tablicy, czyli n. Funkcja ma na celu usunięcie powtarzających się znaków z ciągu znaków haslo o długości n.

Linia 1. funkcja usunPowtorzenia otwórz nawias okrągły haslo przecinek n zamknij nawias okrągły dwukropek.

Funkcja porówna każdą literę (element tablicy) ze znakami po niej następującymi, aby sprawdzić, czy dany znak nie został powtórzony. Rozpoczynamy pierwszą iterację pętli porównującej elementy tablicy. Indeks początkowy ustawiamy na 0, ponieważ pierwsza litera (indeks 0) nie może być powtórzeniem.

Linia 1. funkcja usunPowtorzenia otwórz nawias okrągły haslo przecinek n zamknij nawias okrągły dwukropek. Linia 2. i ← 0. Linia 3. dopóki i otwórz nawias ostrokątny n wykonuj dwukropek.

Indeks i wskazuje na konkretną literę. Szukając powtórzeń, dla każdego i sprawdzamy wszystkie elementy o większym indeksie. Rozpoczynamy od ostatniej litery hasła, a kończymy na elemencie tablicy o indeksie i + 1. Tworzymy kolejną pętlę.

Linia 1. funkcja usunPowtorzenia otwórz nawias okrągły haslo przecinek n zamknij nawias okrągły dwukropek. Linia 2. i ← 0. Linia 3. dopóki i otwórz nawias ostrokątny n wykonuj dwukropek. Linia 4. j ← n minus 1. Linia 5. dopóki j zamknij nawias ostrokątny i wykonuj dwukropek.

Sprawdźmy, czy element o indeksie j ma przypisaną tę samą literę, co element o indeksie i. Jeśli tak, sprawdzany znak jest powtarzającą się literą, więc powinniśmy go usunąć. Usuwamy element o indeksie j, ponieważ przechowuje on kolejne wystąpienie litery. Wykorzystamy do tego funkcję pomocniczą usun, która usuwa znak z określonej pozycji w ciągu znaków. Funkcja przyjmuje trzy argumenty: ciąg znaków haslo, pozycję znaku do usunięcia j oraz długość ciągu n.

Linia 1. funkcja usunPowtorzenia otwórz nawias okrągły haslo przecinek n zamknij nawias okrągły dwukropek. Linia 2. i ← 0. Linia 3. dopóki i otwórz nawias ostrokątny n wykonuj dwukropek. Linia 4. j ← n minus 1. Linia 5. dopóki j zamknij nawias ostrokątny i wykonuj dwukropek. Linia 6. jeżeli haslo otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości haslo otwórz nawias kwadratowy j zamknij nawias kwadratowy dwukropek. Linia 7. usun otwórz nawias okrągły haslo przecinek j przecinek n zamknij nawias okrągły.

Działanie funkcji polega na zastępowaniu wybranych elementów tablicy elementami o indeksie powiększonym o jeden, zaczynając od usuwanego znaku, a kończąc na przedostatniej literze w tablicy, a następnie usuwaniu ich.

Funkcja iteruje przez indeksy od j do n - 1. Danemu elementowi o indeksie i przypisuje wartość elementu o indeksie i + 1.

Po wyjściu z pętli dla ostatni element tablicy jest usuwany.

Analizując działanie funkcji usun(), możemy dojść do wniosku, że wcześniejszy wybór kolejności sprawdzania znaków w kluczu (od ostatniej litery klucza do elementu tablicy o indeksie i + 1) nie jest przypadkowy. Gdybyśmy przyjęli odwrotną kolejność, mogłoby dojść do sytuacji, w której w miejsce sprawdzonego już, powtarzającego się znaku zostałaby umieszczona ta sama litera. W rezultacie znak ten nie zostałby sprawdzony, a w kluczu znalazłyby się powtarzające się litery.

Definicja funkcji usun():

Linia 1. funkcja usun otwórz nawias okrągły haslo przecinek j przecinek n zamknij nawias okrągły dwukropek. Linia 2. dla i znak równości j przecinek j plus 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek. Linia 3. haslo otwórz nawias kwadratowy i zamknij nawias kwadratowy ← haslo otwórz nawias kwadratowy i plus 1 zamknij nawias kwadratowy.

Minusem takiego rozwiązania jest duplikowanie ostatniego elementu tablicy – po wykonaniu przedstawionych operacji ten sam znak znajduje się na przedostatniej i ostatniej pozycji w tablicy. Tymczasem ostatnia litera powinna zostać usunięta. Aby tego dokonać, przeprowadzamy operację zmniejszenia wartości zmiennej przechowującej rozmiar tablicy po każdym wykonaniu funkcji usun(). W ten sposób pierwsza pętla funkcji usunPowtorzenia() nie będzie odczytywała znaków, które powinny zostać usunięte, czyli powtarzających się liter na końcu tabeli powstałych w wyniku działania funkcji usun(). Dodatkowo po zakończeniu operacji usuwania powtarzających się liter wartość zmiennej n będzie równa rozmiarowi tablicy z unikalnymi (niepowtarzającymi się) znakami.

Linia 1. funkcja usunPowtorzenia otwórz nawias okrągły haslo przecinek n zamknij nawias okrągły dwukropek. Linia 2. i ← 0. Linia 3. dopóki i otwórz nawias ostrokątny n wykonuj dwukropek. Linia 4. j ← n minus 1. Linia 5. dopóki j zamknij nawias ostrokątny i wykonuj dwukropek. Linia 6. jeżeli haslo otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości haslo otwórz nawias kwadratowy j zamknij nawias kwadratowy dwukropek. Linia 7. usun otwórz nawias okrągły haslo przecinek j przecinek n zamknij nawias okrągły. Linia 8. n ← n minus 1.

Kolejnym krokiem jest dodanie inkrementacji i dekrementacji zmiennych sterujących:

Linia 1. funkcja usunPowtorzenia otwórz nawias okrągły haslo przecinek n zamknij nawias okrągły dwukropek. Linia 2. i ← 0. Linia 3. dopóki i otwórz nawias ostrokątny n wykonuj dwukropek. Linia 4. j ← n minus 1. Linia 5. dopóki j zamknij nawias ostrokątny i wykonuj dwukropek. Linia 6. jeżeli haslo otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości haslo otwórz nawias kwadratowy j zamknij nawias kwadratowy dwukropek. Linia 7. usun otwórz nawias okrągły haslo przecinek j przecinek n zamknij nawias okrągły. Linia 8. n ← n minus 1. Linia 9. j ← j minus 1. Linia 10. i ← i plus 1.

Następnie tworzymy nową tablicę o rozmiarze n przechowującą słowo bez powtarzających się znaków. Deklarujemy tablicę hasloWynik, a następnie zapełniamy ją pierwszymi n znakami tablicy haslo.

Linia 1. funkcja usunPowtorzenia otwórz nawias okrągły haslo przecinek n zamknij nawias okrągły dwukropek. Linia 2. i ← 0. Linia 3. dopóki i otwórz nawias ostrokątny n wykonuj dwukropek. Linia 4. j ← n minus 1. Linia 5. dopóki j zamknij nawias ostrokątny i wykonuj dwukropek. Linia 6. jeżeli haslo otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości haslo otwórz nawias kwadratowy j zamknij nawias kwadratowy dwukropek. Linia 7. usun otwórz nawias okrągły haslo przecinek j przecinek n zamknij nawias okrągły. Linia 8. n ← n minus 1. Linia 9. j ← j minus 1. Linia 10. i ← i plus 1. Linia 12. hasloWynik otwórz nawias kwadratowy 0 kropka kropka n minus 1 zamknij nawias kwadratowy. Linia 14. k ← 0. Linia 15. dopóki k otwórz nawias ostrokątny n wykonuj dwukropek. Linia 16. hasloWynik otwórz nawias kwadratowy k zamknij nawias kwadratowy ← haslo otwórz nawias kwadratowy k zamknij nawias kwadratowy. Linia 17. k ← k plus 1.

Na koniec zwracamy tablicę hasloWynik z niepowtarzającymi się literami.

Oto gotowy algorytm:

Linia 1. funkcja usun otwórz nawias okrągły ciagZnakow przecinek pozycja przecinek n zamknij nawias okrągły dwukropek. Linia 2. dla i znak równości pozycja przecinek pozycja plus 1 przecinek kropka kropka kropka przecinek otwórz nawias okrągły n minus 1 zamknij nawias okrągły wykonuj dwukropek. Linia 3. ciagZnakow otwórz nawias kwadratowy i zamknij nawias kwadratowy ← ciagZnakow otwórz nawias kwadratowy i plus 1 zamknij nawias kwadratowy. Linia 5. funkcja usunPowtorzenia otwórz nawias okrągły haslo przecinek n zamknij nawias okrągły dwukropek. Linia 6. i ← 0. Linia 7. dopóki i otwórz nawias ostrokątny n wykonuj dwukropek. Linia 8. j ← n minus 1. Linia 9. dopóki j zamknij nawias ostrokątny i wykonuj dwukropek. Linia 10. jeżeli haslo otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości haslo otwórz nawias kwadratowy j zamknij nawias kwadratowy dwukropek. Linia 11. usun otwórz nawias okrągły haslo przecinek j przecinek n zamknij nawias okrągły. Linia 12. n ← n minus 1. Linia 13. j ← j minus 1. Linia 14. i ← i plus 1. Linia 16. hasloWynik otwórz nawias kwadratowy 0 kropka kropka n minus 1 zamknij nawias kwadratowy. Linia 18. k ← 0. Linia 19. dopóki k otwórz nawias ostrokątny n wykonuj dwukropek. Linia 20. hasloWynik otwórz nawias kwadratowy k zamknij nawias kwadratowy ← haslo otwórz nawias kwadratowy k zamknij nawias kwadratowy. Linia 21. k ← k plus 1. Linia 23. zwróć hasloWynik. Linia 25. usunPowtorzenia otwórz nawias okrągły haslo przecinek n zamknij nawias okrągły.

Funkcję usun() można zaimplementować również na inne sposoby. Mogłaby na przykład zastępować powtarzające się litery białymi znakami (np. spacją).

Przykład implementacji:

Linia 1. funkcja usun otwórz nawias okrągły ciagZnakow otwórz nawias kwadratowy 0 kropka kropka n minus 1 zamknij nawias kwadratowy przecinek pozycja zamknij nawias okrągły dwukropek. Linia 2. ciagZnakow otwórz nawias kwadratowy pozycja zamknij nawias kwadratowy ← apostrof apostrof.

W takim wypadku należy pamiętać, aby nie odczytywać białych znaków w kolejnych funkcjach będących elementem algorytmu.

Słownik

tekst jawny
tekst jawny

tekst przed zaszyfrowaniem lub po odszyfrowaniu; jest to zwyczajny, niezaszyfrowany tekst, który można swobodnie przeczytać

klucz szyfrujący
klucz szyfrujący

słowo lub wyrażenie, które służy jako „hasło” konieczne do szyfrowania tekstu jawnego i odszyfrowywania szyfrogramu (zaszyfrowanego tekstu); niektóre szyfry wykorzystują osobne klucze do operacji szyfrowania i odszyfrowywania