Chciałem stworzyć program, który będzie szyfrował wprowadzony ciąg znaków za pomocą szyfru cezara (czyli przesuwał litery o n pozycji). Jednakże mój program ma problem przy wracaniu do początku alfabetu, kiedy przekroczy się ich ilość.
main.cpp:
#include "headers.hpp"
using namespace std;
int przesuniecie, wszyfr;
string word;
int main()
{
cout << "Wprowadz slowo:" << endl;
cin >> word;
cout << endl;
cout << "O ile miejsc przesunac?" << endl;
cin >> przesuniecie;
cout << endl;
cout << word << endl;
cout << "Zaszyfrowac czy deszyrowac?" << endl;
cout << "1 - zaszyfrowac" << endl
<< "2 - deszyfrowac" << endl;
cin >> wszyfr;
cout << endl;
switch (wszyfr) {
case 1:
szyfr(przesuniecie, word);
break;
case 2:
deszyfr(przesuniecie, word);
break;
default:
cout << "Nie wybrano prawidlowej opcji" << endl;
}
//getch();
system("pause");
return (0);
}
headres.hpp:
#ifndef HEADERS_HPP
#define HEADERS_HPP
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
void szyfr(int przesuniecie,string word);
void deszyfr(int przesuniecie,string word);
#endif
funckcje.cpp:
#include "headers.hpp"
#include <iostream>
#include <math.h>
void szyfr(int przesuniecie, string word)
{
int iloscliter = 'z' - ('a' - 1);
//cout<<word<<endl;//wyswietlanie slowa przed deszyfrowaniem
int rozmiar = word.length();
//szyfrowanie
for (int i = 0; i < rozmiar; i++) {
word[i] = word[i] + przesuniecie;
//przejscie do poczatku alfabetu
while (word[i] > 'z') { //<-to nie działa
word[i] = word[i] - iloscliter;
}
}
cout << word << endl;
}
void deszyfr(int przesuniecie, string word)
{
int iloscliter = 'z' - ('a' - 1);
cout << word << endl; //wyswietlanie slowa przed deszyfrowaniem
int rozmiar = word.length();
//deszyfrowanie
for (int i = 0; i < rozmiar; i++) {
word[i] = word[i] - przesuniecie;
//przejscie do poczatku alfabetu
while (word[i] < 'a')
word[i] = word[i] + iloscliter;
} //<- to działa
cout << word << endl;
}
W pierwszej funkcji "szyfr" nie działa mi (wg moich obserwacji) prawidłowo pętla while. Gdy wprowadzam ilość przesunięć, które wymagają więcej niż 1 raz zmniejszenia word[i], to pokazuje mi dziwne znaczki z tablicy ASCII czyli prawdopodobnie dodaje dobrze przesunięcie, ale nie chce powrócić do alfabetu. Co jeszcze bardziej mnie dziwi to fakt, że przy funkcji "deszyfr" wszystko ładnie działa.
Gdzie zatem jest błąd?