Почему мой код не возвращает исходное сообщение? - PullRequest
2 голосов
/ 12 мая 2019

Вот ссылка на мое задание: pict

Пользовательский ввод и шифрование были простыми, но я не могу расшифровать шифрование. Задача состоит в том, чтобы ввести одну букву, она пошла бы вперед на десять букв (что было бы шифрованием), а затем вернулась бы назад на десять букв (что было бы расшифровкой.

Я пробовал возиться с циклами for, но на самом деле я не работал.

#include <iostream>

using namespace std;

int main()
{
    char m; //Declare character
    cin >> m; // Input Character
    int ma = (int)m; // Convert character to integer
    int c; // Declare ciphertext
    for (int i=0; i<=10; i++) {
        c = ma + i;
        if (c > 122) {
            c = 97;
        }
    }

    char cc = char(c);
    cout << " " << endl;
    cout << "You ciphertext is:" << endl;
    cout << cc << endl;
    int cb = (int)cc;
    //cb = cb - 10;
    int nm;
    for (int b = 0; b>=10; b++) {
        nm = cb - b;
        if (nm < 97) {
            nm = 122;
        }
    }
    char mb = (char)nm;
    cout << "You message is" << endl;
    cout << mb << endl;
}

Итак, вот что я ожидаю: когда я ввожу "a", зашифрованный текст должен быть "k", а дешифрованное сообщение должно быть "a".

Ответы [ 3 ]

1 голос
/ 12 мая 2019

Ваш цикл дешифрования никогда не выполняется:

for (int b = 0; b>=10; b++) {

Это для цикла говорит: начните с b = 0, затем цикл до тех пор, пока он больше 10. Ну, 0 не больше 10, так что цикл не будет.

Чтобы отменить первый цикл, вы, вероятно, хотели это:

for (int b = 0; b<=10; b++) {

Кстати, циклы просто повторяют одну и ту же операцию 10 раз, так что вы можете просто отбросить циклы:

int OFFSET = 10;
int LOWER_LIMIT = (int)'a';
int UPPER_LIMIT = (int)'z';
int RANGE_LENGTH = UPPER_LIMIT - LOWER_LIMIT + 1;

// encrypt
c = ma + OFFSET;
if (c > UPPER_LIMIT) {
    c -= RANGE_LENGTH;
}

// decrypt
nm = cb - OFFSET;
if (nm < LOWER_LIMIT) {
    nm += RANGE_LENGTH;
}
0 голосов
/ 13 мая 2019

Как я сказал в замечании

for (int i=0; i<=10; i++) {
    c = ma + i;
    if (c > 122) {
        c = 97;
    }
}

делает

{
   int i = 10;

    c = ma + i;
    if (c > 122) {
        c = 97;
    }
}

потому что там c переназначен, так что предыдущий ход не влияет на текущий, а учитывается только последний.

Также

for (int b = 0; b>=10; b++) {
    nm = cb - b;
    if (nm < 97) {
        nm = 122;
    }
}

ничего не делает, потому что тест b>=10 сразу ложен b со значением 0

Независимо от этих ошибок используемая кодировка необратима для большого количества значений, и нет никаких ограничений на кодируемый символ, он может иметь любой код, поддерживаемый char .

Простой способ кодирования и декодирования состоит в том, чтобы выполнить xor с заданным значением, независимо от того, X для данного Y ((X^Y)^Y) == X), таким же образом, для кодирования и декодирования , просто делаю ^Y в обоих случаях.

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

Другим способом является кодирование обмена некоторыми битами (например, младшие 4 бита с четырьмя старшими, предполагающими char как минимум 8 бит), и то же самое для декодирования.

Конечно, вы можете смешивать эти способы, а не просто делать один из них.

Конечно, вы можете использовать способ, не основанный на формуле, например, решить для каждой буквы другую для ее замены (a -> Z, b -> 0 и т. Д. И наоборот для декодирования)

Существует бесконечное количество способов кодирования / декодирования

0 голосов
/ 12 мая 2019

Вот еще одно решение. Когда вы проверяете, больше ли значение ascii для персонажа, чем 122, вам необходимо выполнить некоторые математические операции. Вы не можете просто сказать

if (c > 122) {
   c = 97;
}

потому что все последние 10 символов будут преобразованы в "a".

Я думаю, что более элегантный способ шифрования / дешифрования одного символа заключается в следующем:

int main() {
    char c; //Declare character
    cin >> c; // Input Character

    int ciphertext = c + 10;
    if (ciphertext > 122)
        ciphertext = ciphertext - 123 + 97;
    cout << "You ciphertext is:" << (char)ciphertext << endl;

    int deciphertext = ciphertext - 10;
    if (deciphertext < 97)
        deciphertext = 123 - (97 - deciphertext);
    cout << "You original is:" << (char)deciphertext << endl;

}

Обратите внимание, что если значение ascii символа превышает верхний предел, оно начинает отсчитываться от буквы "a".

...