#c
#c
Вопрос:
Я пытаюсь создать программу, которая будет генерировать шифр Atbash. На основе этого кода, как я могу поменять местами все буквы? Например, A = Z, B = Y, C = X?
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
string encrypt(string str);
int main(){
string text = "", result = "";
cout << "Enter text to encrypt: ";getline(cin, text);
result = encrypt(text);
cout << "Encrypted text: " << resu<
}
string encrypt(string str) {
string temp = str;
string sample;
char alphabeta[13] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'};
char alphabetb[13] = {'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
char Ualphabeta[13];
char Ualphabetb[13];
for(int i = 0;i < 13;i ){
Ualphabeta[i] = toupper(alphabeta[i]);
}
for(int i = 0;i < 13;i ){
Ualphabetb[i] = toupper(alphabetb[i]);
}
cout << endl;
return temp;
}
Комментарии:
1. Большинство кодировок символов, с которыми вы столкнетесь сегодня, хранят буквы в непрерывном блоке по возрастанию, что позволяет
int index = letter - 'a';
получить индекс буквы в массиве из 26 букв в порядке возрастания. Используйтеindex
в массив из 26 букв в порядке убывания, и вы в значительной степени закончили.2. Безумные случаи со скремблированным порядком или несмежным хранилищем… это требует большой работы, которая применима только к этой кодировке символов. В этом случае создайте карту символов
'A'
->'Z'
,'B'
->'Y'
и т.д…. Это всегда работает, но требует, чтобы вы выбросили код, который у вас уже есть.std::unordered_map
здесь полезно.
Ответ №1:
Массив поиска не нужен, так как вы можете просто вычислить расстояние от конца алфавита, а затем работать с этим. Смотрите:
#include <iostream>
#include <string>
#include <cctype>
int main()
{
const int letterCount = 'z' - 'a' 1 ;
std::string name = "Hello world!";
for(autoamp; letter: name){
if(!std::isalpha(letter)) {
continue;
}
const bool isUpper = std::isupper(letter);
const char baseOffset = isUpper? 'A': 'a';
const auto distanceFromAlphabetStart = letter - baseOffset;
letter = (baseOffset letterCount - 1) - distanceFromAlphabetStart;
// substract the initial position from z (either uppercase or lowercase).
}
std::cout << name;
}