Liczby 97, 98, ..., 122 to kolejno liczby z kodu ASCII: a, b, ... ,z.
Ogólnie text (zmienna string) to tak naprawdę tablica znaków, dlatego można się do niej odwołać tak jak to zostało podane w kodzie.
Nie wiem czy jest sens tłumaczyć ci kod który i tak nie działa poprawnie. Zamiast tego podam Ci swoją implementację (która też nie działa do końca poprawnie) ale nie chciałem nad tym spędzać więcej czasu.
Działa wyłącznie dla dodatnich przesunięć oraz tylko dla kilku przesunięć do przodu np. 10. Jeżeli podasz np. liczbe przesunięć 101 to wyświetlą się bzdury :). W kodzie masz komentarze, jak czegoś nie zrozumiesz to pisz.
// Duże Liczby z kodu ASCII: A - 65, B - 66, ..., Z - 90
// Małe Liczby z kodu ASCII: a - 97, b - 98, ..., z - 122
static const int DUZE_A_ASCII = 65;
static const int DUZE_Z_ASCII = 90;
static const int MALE_A_ASCII = 97;
static const int MALE_Z_ASCII = 122;
static const int SPACJA_ASCII = 32;
static const int WRONG_ARGUMENT_ERROR = -1;
string text;
cout << "wpisz tekst do zaszyfrowania >> ";
getline(cin, text); // wpisywanie musi być w takiej formie ponieważ był problem ze spacją. Z wykorzystaniem cin napis ze spacją był traktowany jako drugi parametr
// cin >> text;
int liczba;
cout << "podaj liczbe przesuniecia >> ";
cin >> liczba; //o ile miejsc zamieniamy litery
for (int i = 0; i <= text.length() -1; i++)
{
// Jeżeli jest spacja to zostawiamy taki sam znak
if (text[i] == SPACJA_ASCII)
continue;
// sprawdzam czy podany znak jest z zakresu małych liczb
else if((text[i] >= MALE_A_ASCII) && (text[i] <= MALE_Z_ASCII))
{
// jeżeli podany znak jest z zakresu małych liczb ale jego wartość z przesunięciem jest większa od (z - 122) to w takim wypadku
// zaczynamy liczenie od początku (a - 97)
if (text[i] + liczba > MALE_Z_ASCII)
{
int suma = text[i] + liczba;
int test = suma - MALE_Z_ASCII;
text[i] = MALE_A_ASCII + test - 1;
// -1 dlatego że liczbę 97 również musimy wziąć pod uwagę.
}
else
text[i] = text[i] + liczba; //liczymy przesuniecia
}
// to samo robimy dla wielkich liter. Jezeli podamy duże litery to zwracamy również duże litery z odpowiednim przesunięciem
else if((text[i] >= DUZE_A_ASCII) && (text[i] <= DUZE_Z_ASCII))
{
if (text[i] + liczba > DUZE_Z_ASCII)
{
int suma = text[i] + liczba;
int test = suma - DUZE_Z_ASCII;
text[i] = DUZE_A_ASCII + test - 1;
}
else
text[i] = text[i] + liczba; //duże litery
}
else
{
cout << "Podales niepoprawne wartosci. Nalezy podac wylacznie litery a-z lub A-Z." << endl;
return WRONG_ARGUMENT_ERROR;
}
}
cout << text << endl;
Pomocne strony:
Tabela kodu ASCII: http://www.algorytm.edu.pl/wstp-do-c/66.html
Szyfr cezara z Wiki: https://pl.wikipedia.org/wiki/Szyfr_Cezara
Przykładowa implementacja online: http://marcinmazurek.com.pl/szyfr-cezara-deszyfracja-online