Przeczytaj
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 szyfrowania.
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.
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.
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
.
W ten sposób udało się rozwiązać zadanie. Po wykonaniu przedstawionego wyżej kodu w tablicy słowa
znajdą się zaszyfrowane wyrazy.
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
w przypadku szyfru przesuwającego (np. szyfru Cezara) – liczba miejsc w alfabecie, o które ma zostać przesunięta każda litera tekstu jawnego