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
1
Polecenie 1

Przeanalizuj prezentację, z której dowiesz się, w jaki sposób można dokonać komputerowej realizacji algorytmu szyfru Cezara w języku C++.

RcIjzPcP3QjCe1
Krok pierwszy Napiszemy program, który zaszyfruje poniższy tekst przy użyciu szyfru Cezara: INFORMATYKA JEST SUPER Krok drugi Przyjmijmy, że będziemy posługiwać się wielkimi literami alfabetu łacińskiego. Składa się on z 26 liter. Szyfr Cezara ma klucz szyfrujący równy 3. Te dwie informacje są niezbędne do prawidłowej implementacji algorytmu. Krok trzeci Możemy zatem utworzyć zmienne i wpisać do nich podstawowe wartości.
int klucz = 3;
int alfabet = 26;
std::string tekst = "INFORMATYKA JEST SUPER";
Krok czwarty Kolejnym krokiem będzie użycie pętli, aby przejść po każdej literze z tekstu do zaszyfrowania. Mamy możliwość sprawdzenia długości ciągu znaków, jaki będzie poddawany szyfrowaniu, więc możemy użyć pętli for. Pętla ta wykona się dokładnie tekst.length() razy. Skoro tekst ma długość 22, pętla wykona się 22 razy.
int klucz = 3;
int alfabet = 26;
std::string tekst = "INFORMATYKA JEST SUPER";

for (int i = 0; i < tekst.length(); i++) {
    // Tutaj znajdować się będzie kod szyfrujący
}
Krok piąty Następnym elementem będzie wprowadzenie do pętli kodu, który umożliwi prawidłowe szyfrowanie tekstu. Teoretycznie moglibyśmy napisać to w ten sposób:
int klucz = 3;
int alfabet = 26;
std::string tekst = "INFORMATYKA JEST SUPER";

for (int i = 0; i < tekst.length(); i++) {
    tekst[i] = tekst[i] + klucz;
}
Jednak okazuje się, że powyższy kod nie jest uniwersalny. Dlaczego? Zastanów się chwilę, a następnie przejdź do kolejnego kroku. Krok szósty W kodzie z poprzedniego kroku są co najmniej dwa problemy. Pierwszy polega na tym, że szyfrowaniu poddawane będą również znaki spacji. Oczywiście chcemy te znaki pominąć. Drugi problem to taki, że jeżeli będziemy chcieli zaszyfrować np. literę Z, której kod w tablicy ASCII wynosi 90, to po dodaniu wartości klucz otrzymamy kod 93. Znak z kodem ASCII równym 93 to: ] (zamknięcie nawiasu kwadratowego). Jak wiemy, litera Z powinna być zaszyfrowana przy użyciu litery C. Poniżej znajdziesz propozycję, w jaki sposób można to osiągnąć.
int klucz = 3;
int alfabet = 26;
std::string tekst = "INFORMATYKA JEST SUPER";

for (int i = 0; i < tekst.length(); i++) {
    if (tekst[i] != ' ') {
        if (tekst[i] + klucz > 'Z') {
            tekst[i] = tekst[i] + klucz - alfabet;
        } else {
            tekst[i] = tekst[i] + klucz;
        }
    }
}
Jak widzisz, wystarczyło dodać dwie instrukcje warunkowe. Pierwsza, która sprawdzi, czy w ogóle mamy do czynienia z literą, a druga, która sprawdzi, czy po dodaniu wartości zmiennej klucz wyjdziesz poza alfabet (otrzymana wartość będzie większa od kodu litery Z). W takiej sytuacji należy odjąć liczbę liter w alfabecie zapisaną w zmiennej alfabet. Krok siódmy W ten oto sposób udało się nam napisać działającą implementację szyfru Cezara. Na zakończenie warto jeszcze dodać instrukcję wypisującą wartość tekst, aby zobaczyć zaszyfrowany tekst. Poniżej finalna wersja programu:
int klucz = 3;
int alfabet = 26;
std::string tekst = "INFORMATYKA JEST SUPER";

for (int i = 0; i < tekst.length(); i++) {
    if (tekst[i] != ' ') {
        if (tekst[i] + klucz > 'Z') {
            tekst[i] = tekst[i] + klucz - alfabet;
        } else {
            tekst[i] = tekst[i] + klucz;
        }
    }
}

std::cout << tekst;
Krok ósmy Zastanów się, czy napisany program będzie działał prawidłowo, jeżeli zmienimy wartość zmiennej klucz? Krok dziewiąty Odpowiedź brzmi: nie w każdym przypadku. Co się stanie, jeżeli podamy wartość klucz = 50? Nie ma tylu liter w alfabecie łacińskim. Jednak czy to problem? Gdy podana wartość klucza jest większa od 25, nastąpi zapętlenie i zaczniemy przechodzić po alfabecie po raz kolejny. Spójrz na przykład poniżej:
std::string tekst = "ABC";
int klucz = 26;
int alfabet = 26;
Skoro alfabet ma 26 liter, to przesunięcie litery A o 26 pozycji w alfabecie spowoduje przejście do końca alfabetu (aż do litery Z), a następnie powrót do litery A. Czyli klucz równy 26 jest tym samym co klucz równy 0, a klucz równy 27 to to samo co klucz równy 1. Krok dziesiąty Spostrzeżenie z ostatniego kroku umożliwia nam udoskonalenie naszej implementacji przez dodanie instrukcji modulo (reszty z dzielenia) na klucz. Wystarczy dodać % 26, gdy inicjujemy wartość zmiennej klucz. Przykład: int klucz = 30 % 26;. W tym przypadku klucz równy 30 to to samo co klucz równy 4. Krok jedenasty Zatem ostateczna wersja naszego programu wygląda następująco:
int klucz = 3 % 26;
int alfabet = 26;
std::string tekst = "INFORMATYKA JEST SUPER";

for (int i = 0; i < tekst.length(); i++) {
    if (tekst[i] != ' ') {
        if (tekst[i] + klucz > 'Z') {
            tekst[i] = tekst[i] + klucz - alfabet;
        } else {
            tekst[i] = tekst[i] + klucz;
        }
    }
}

std::cout << tekst;
Program wypisze zaszyfrowany tekst: LQIRUPDWBND MHVW VXSHU