строка — C ++ Caesar Encryption Project (ASCII)

Для класса я должен разработать проект шифрования Цезаря на C ++, который принимает строку и сдвигает все коды ASCII случайным целым числом. У меня проект работает отлично, а код написан ниже:

#include <iostream>
#include <string>
#include <stdlib.h>
#include <time.h>

using namespace std;
int main(int argc, const char * argv[]) {

string sentence = "";
int shifter, counter = 0, position = 0;
srand(time(NULL));
shifter = (rand() % 25) + 1;
cout << "Enter a sentence, and this program will encrypt it: " << endl;
getline(cin, sentence);
cout << "\n\n\n";
for (int i = 0; i < sentence.length(); i++) {
sentence[i] = sentence[i] + shifter;
cout << sentence[i];
}

return 0;
}

Моя единственная проблема в том, что мой учитель хочет, чтобы их переводили только на буквы. Если буква «z» и сдвиг «2», она хочет, чтобы результат был «b». Я не уверен, как это будет сделано.

Возможна ли простая процедура по этому вопросу? Если так, как это будет сделано?

0

Решение

Первым шагом является осознание того, что буквы должны быть сопоставлены с числами, повернуты каким-то образом и затем сопоставлены с буквами.

@vsoftco уже пытался вывести вас на правильный путь с помощью своих комментариев, поэтому внимательно прочитайте их, потому что он дает вам очень хорошие советы.

Я постараюсь заполнить некоторые пробелы, которые пропустил @vsoftco.

Вот как вы можете сопоставить букву с номером:

char letter = 'B';
int number = letter - 'A';

Буквы — это просто числа, которые компьютер знает как буквы. На самом деле буква «B» 66 в ASCII. Так что, если мы сделаем это в C:

char letter = 'B';
int number = 100 - 'B'; // <- this is equal to 100 - 66 which is 34

number становится 34.

Так что это хорошо, но мы хотим, чтобы наши числа находились в диапазоне от 0 до 25 (чтобы было легко применить операцию по модулю).

Думаю об этом. Если вы добавите 5 к неизвестному числу от 0 до 25, как вы убедитесь, что результат будет меньше 26? Используйте по модулю, и это будет заворачивать операция для вас.

Но вернемся к преобразованию букв в цифры. Чтобы превратить любую заглавную букву (обратите внимание, что строчные буквы имеют разные цифры) в число от 0 до 25, вы можете вычесть «А» следующим образом:

char letter = 'C';
int number = letter - 'A'; // <- this is 'C' - 'A' = 67 - 65 = 2 ( which is the 3rd number if we start counting from zero )

Чтобы преобразовать цифры в буквы, просто добавьте «A».

int number = 5; // This is the 6th letter since we start counting from zero
char letter = 'A' + number; // Now letter is 'A' + 5 = 65 + 5 = 70 which is 'F'...

С этим преобразованием и операцией по модулю @vsoftco, описанной в комментариях, вы сможете создать алгоритм цезаря самостоятельно.

0

Другие решения

Пусть это решит вашу проблему 🙂
http://ideone.com/6AzY2i

#include <bits/stdc++.h>
#define ll long long int
#define MOD 1000000007

using namespace std;
char st[10000000], s[1000000];

int main(){
cout << "Enter your Ceaser Chipher to decrypt:\n";
cin >> s;
ll t;
t = strlen(s);
ll n;
strcpy(st,s);
/*cout << "Shift of how many characters:\n";
cin >> n;*/
cout << "Shift in which direction (r(right) or l(left)) :\n";
char c;
cin >> c;
srand(time(NULL));
n = (rand() % 25) + 1;
cout << "Your String is shifted by:" << n <<endl;
ll f;
if(c=='r'){
for(int i=0;i<strlen(st);i++){
f = st[i] + n;
if(f>122)
f = f - 26;
st[i] = f;
}
}
else if(c=='l'){
for(int i=0;i<strlen(st);i++){
f = st[i] - n;
if(f<97)
f = f + 26;
st[i] = f;
}
}
cout <<"Your encrypted String :-> "<< st <<endl;
return 0;
}
0