Na egzaminie maturalnym z informatyki od czasu do czasu pojawiają się zadania związane z szyframi – w tym z szyframi przesuwającymi, do których należy szyfr Cezara. Warto umieć z niego korzystać: sprawdźmy się, rozwiązując przykładowe zadania maturalne.

Zadanie maturalne

W pliku dane_6_1.txt znajduje się 100 słów. Słowa umieszczono w osobnych wierszach.

Fragment pliku dane_6_1.txt:
INTERPRETOWANIE
ROZWESELANIE
KONSERWOWANIE

Napisz program, który zaszyfruje słowa z pliku dane_6_1.txt z użyciem klucza k = 107. Wynik zapisz w pliku wyniki_6_1.txt. Każde słowo umieść w osobnym wierszu, w porządku odpowiadającym kolejności słów z pliku z danymi.

Uwaga:

Dla pierwszego słowa z pliku dane_6_1.txt (INTERPRETOWANIE) wynikiem jest słowo LQWHUSUHWRZDQLH.

Przedstawione zadanie zostało opracowane przez Centralną Komisję Egzaminacyjną i pojawiło się na maturze z informatyki w maju 2016 roku (poziom rozszerzony, cześć II). Z pełnym arkuszem można się zapoznać na oficjalnej stronie CKE.

Załóżmy, że słowa – zamiast w pliku – znajdują się w tablicy łańcuchów znaków słowa.

Ponieważ podczas egzaminu maturalnego każdy uczeń może wybrać dowolny z dostępnych języków programowania, przedstawimy rozwiązanie zadania w pseudokodzie. Twoją rolą będzie przełożenie proponowanego pseudokodu na język, w którym programujesz.

W kodzie użyjemy funkcji pobierz_ASCII(), która zwróci kod ASCII podanego znaku.

Wykorzystamy również funkcję długość(), która zwróci długość podanego łańcucha znaków.

Ostatnią z funkcji, które wykorzystamy, będzie znak_ASCII(), zamieniająca kod ASCII w znak odpowiadający mu w tablicy ASCII.

Rozwiązywanie zadania zaczniemy od zadeklarowania tablicy łańcuchów znaków zawierającej 100 słów. Zainicjujemy również zmienną k, w której umieścimy klucz szyfrowaniaklucz szyfrowaniaklucz szyfrowania.

Linia 1. słowa otwórz nawias kwadratowy 100 zamknij nawias kwadratowy znak równości tablica łańcuchów znaków zawierająca 100 słów. Linia 2. k znak równości 107 mod 26.

Jako klucz wprowadziliśmy resztę z dzielenia 107 przez 26. Wynika to z faktu, że stosując szyfr Cezara nie możemy użyć klucza dłuższego niż liczba znaków składających się na alfabet łaciński. A to właśnie miałoby miejsce, gdyby klucz był większy od 26, czyli od liczby liter w alfabecie łacińskim.

Następnie rozpoczniemy pętlę dla, której zmienna iteracyjna będzie przyjmować wartości od 0 do 99. Inaczej mówiąc, przyjmie ona kolejno wartość indeksu każdego elementu w tablicy ze słowami. Pętla ta będzie służyć do pobierania kolejnych słów z tablicy łańcuchów znaków słowa w celu ich zaszyfrowania.

Linia 1. słowa otwórz nawias kwadratowy 100 zamknij nawias kwadratowy znak równości tablica łańcuchów znaków zawierająca 100 słów. Linia 2. k znak równości 107 mod 26. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły słowa zamknij nawias okrągły minus 1 wykonuj dwukropek.

Wewnątrz pętli zadeklarujemy łańcuch znaków szyfrowanie, któremu przypiszemy poszczególne elementy tablicy słowa[i]. Następnie utworzymy kolejną pętlę dla, w której będziemy przesuwać znaki z podanego słowa na kolejne pozycje w alfabecie.

Linia 1. słowa otwórz nawias kwadratowy 100 zamknij nawias kwadratowy znak równości tablica łańcuchów znaków zawierająca 100 słów. Linia 2. k znak równości 107 mod 26. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły słowa zamknij nawias okrągły minus 1 wykonuj dwukropek. Linia 5. szyfrowanie znak równości slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 7. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły szyfrowanie zamknij nawias okrągły minus 1 wykonuj dwukropek. Linia 8. kod znak równości pobierzASCII otwórz nawias okrągły szyfrowanie otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły. Linia 9. kod znak równości kod plus k. Linia 11. jeżeli kod zamknij nawias ostrokątny pobierzASCII otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły wykonaj dwukropek. Linia 12. kod znak równości kod minus 26.

Zaczniemy od pobrania kodu ASCII każdej litery szyfrowanego słowa, a następnie dodamy do niego zmienną k, czyli resztę z dzielenia klucza szyfrowania przez 26.

Zastosujemy dalej instrukcję warunkową jeżeli, która zostanie wykonana, gdy kod szyfrowanego znaku po przesunięciu o k miejsc znajdzie się poza alfabetem łacińskim. W takim przypadku zmniejszymy wartość kodu ASCII o 26. W rezultacie kod ASCII odpowiadający literze znowu znajdzie się w zakresie przypisanym alfabetowi.

Teraz pozostaje przypisać zawartość łańcucha znaków szyfrowanie, w której znajduje się zaszyfrowane słowo, do odpowiadającego jej miejsca w tablicy łańcuchów znaków słowa.

Linia 1. słowa otwórz nawias kwadratowy 100 zamknij nawias kwadratowy znak równości tablica łańcuchów znaków zawierająca 100 słów. Linia 2. k znak równości 107 mod 26. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły słowa zamknij nawias okrągły minus 1 wykonuj dwukropek. Linia 5. szyfrowanie znak równości slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 7. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły szyfrowanie zamknij nawias okrągły minus 1 wykonuj dwukropek. Linia 8. kod znak równości pobierzASCII otwórz nawias okrągły szyfrowanie otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły. Linia 9. kod znak równości kod plus k. Linia 11. jeżeli kod zamknij nawias ostrokątny pobierzASCII otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły wykonaj dwukropek. Linia 12. kod znak równości kod minus 26. Linia 14. szyfrowanie otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości znakASCII otwórz nawias okrągły kod zamknij nawias okrągły. Linia 15. slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości szyfrowanie.

W ten sposób udało się rozwiązać zadanie. Po wykonaniu przedstawionego wyżej kodu w tablicy słowa znajdą się zaszyfrowane wyrazy.

Praca domowa

Zapisz program w wybranym przez siebie języku programowania.

Schemat oceniania

3 p. – za poprawny plik wynikowy

2 p. – za pominięcie ostatniego wiersza

1 p. – za plik z błędnym wykonaniem zawinięcia cyklicznego albo bez zawijania

0 p. – za odpowiedź błędną albo za brak odpowiedzi

Słownik

klucz szyfrowania
klucz szyfrowania

w przypadku szyfru przesuwającego (np. szyfru Cezara) – liczba miejsc w alfabecie, o które ma zostać przesunięta każda litera tekstu jawnego