Программа шифрования Atbash A = Z, B = Y, C = X

#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;
}
  

https://repl.it/repls/ThornyPowerfulHexadecimal