Potrzebne wytłumaczenie

0

Witam, jestem dosyć początkującym programistą i bardzo prosiłbym o wytłumaczenie programu "Szyfr Cezara" napisanego w języku C++. Mianowicie chodzi mi o wytłumaczenie (krok po kroku) co dzieje się w funkcjach SZYFRUJ oraz DESZYFRUJ. Jest to program z podręcznika "Informatyka cz.I Piotr Broda, Danuta Smołucha". Z góry dziękuję ! // Program w załączniku.

#include <iostream>
#include <cstdio>
using namespace std;

void szyfruj(char tekst[], int klucz)
{
    int i=0;
    klucz = klucz%26;
    while (tekst[i]!='\0')
    {
        if ((int)tekst[i]>122-klucz)
            tekst[i] = (char)((int)tekst[i]+klucz-26);    
        else    
            tekst[i] = (char)((int)tekst[i]+klucz);    
        i++;
    }
}

void deszyfruj(char tekst[],int klucz)
{
    int i = 0;
    klucz = klucz%26;
    while (tekst[i]!='\0')
    {
        if ((int)tekst[i]-klucz<97)
            tekst [i] = (char)((int)tekst[i]-klucz+26);
        else
            tekst [i] = (char)((int)tekst[i]-klucz);
        i++;
    }
}

int main()
{ 
    char a[50];
    int klucz;
    cout<< "Podaj klucz(dla szyfru Cezara wpisz 3)"<<endl;
    cin>>klucz;
    cout<<"Tekst do zaszyfrowania: "<<endl;
    cin>>a;
    cout<<"Tekst zaszyfrowany: ";
    szyfruj(a,klucz);
    cout<<a<<endl;
    cout<< "Tekst odszyfrowany: ";
    deszyfruj(a,klucz);
    cout<<a<<endl;
    cin.ignore ();
    getchar ();
    return 0;
}
0

;_;

1

Wytłumaczę tylko to czego możesz nie rozumieć.

klucz = klucz%26; //w kodowaniu liczb ASCII alfabet od A do Z ma 26 znaków 

-> . Ustawiasz przesunięcie o 5.

klucz = klucz%5; //czyli  5  -->  jest ok

chcesz ustawić przesunięcie o np. 40 znaków.
Możesz napisać:

klucz = 40; //ale wtedy przekroczysz alfabet 26 znaków i wejdziesz w zakres innych znaków ASCII.

lepiej zastosować resztę z dzielenia, bo klucz%40 to będzie 14, czyli przeskakujesz cały alfabet i dodajesz 14. Klucz nigdy nie przekroczy 26.

 if ((int)tekst[i]>122-klucz)           ////Jeśli kodowany znak ma wartość liczbową większą niż (122 - klucz )
tekst[i] = (char)((int)tekst[i]+klucz-26); //// zwiększ wartość liczbową znaku o klucz i odejmij 26.

122 wzięło się stąd, że 122 to dziesiętnie wartość znaku "z", więc dalej w kodzie ASCII nie ma już liter, ta jest ostatnia. Więc jeśli kodowana litera będzie miała wartość większą niż wartość ostatniego znaku - klucz, to wtedy powiększ znak o klucz ale odejmij cały alfabet, czyli 26.

else(...)
po prostu zwiększ wartość znaku o klucz.

Resztę rozkmiń sam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1