Цезарь Шифр ​​в С ++ - PullRequest
5 голосов
/ 07 февраля 2009

Для начала я прохожу четыре недели на курсе C ++ и пока не знаю циклов, поэтому, пожалуйста, говорите, детка?

Хорошо, я должен прочитать строку из двенадцати символов (плюс NULL - тринадцать) из файла, а затем сдвинуть буквы назад на три, а затем распечатать результаты на экране и в файле. Я в порядке со всем, кроме сдвигающихся букв. Я не хочу писать мили кода для каждого символа по отдельности, вычитать три и заново собирать строку, но я не уверен, как работать со всей строкой сразу. Может кто-нибудь порекомендовать действительно простой способ сделать это?

Ответы [ 6 ]

6 голосов
/ 07 февраля 2009

Если вы имеете дело с простыми буквами (от А до Я или от А до Я), то вы можете предположить, что внутренние коды являются линейными.

Буквы кодируются в виде чисел от 0 до 127. A кодируется как 65, B как 66, C как 67, Z как 90.

Чтобы сдвигать буквы, вам просто нужно изменить внутренний буквенный код, как если бы это был номер, так что в основном просто вычитая 3 из символа. Однако остерегайтесь крайних случаев, потому что вычитание 3 из «A» даст вам «>» (код 62), а не «X» (код 88). Вы можете справиться с ними, используя операторы if или оператор по модулю ("%").

Вот таблица символов ASCII , чтобы помочь вам

5 голосов
/ 09 февраля 2009

После того, как вы загрузили свою строку, вы можете использовать модульный оператор для вращения, не выходя за пределы пространства A-Z.

Я бы отслеживал, была ли буква заглавной:

bool isCaps = ( letter >= 'A' ) && ( letter <= 'Z' );
if( isCaps )
  letter -= 'A'-'a';

, а затем просто сделайте шифрование следующим образом:

int shift = -3;
letter -= 'a'; // to make it a number from 0-25
letter = ( letter + shift + 26 ) % 26;
        // add 26 in case the shift is negative
letter += 'a'; // back to ascii code

наконец закончим с

if( isCaps )
  letter += 'A'-'a';

Итак, сложив все это вместе, мы получим:

char *mystring; // ciphertext
int shift = -3; // ciphershift

for( char *letter = mystring; letter; ++letter )
{
  bool isCaps = ( *letter >= 'A' ) && ( *letter <= 'Z' );
  if( isCaps )
    *letter -= 'A'-'a';

  letter -= 'a';
  letter = ( letter + shift + 26 ) % 26;
  letter += 'a';

  if( isCaps )
    letter += 'A'-'a';
}
2 голосов
/ 07 февраля 2009

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

Редактировать: Если вы еще не ожидали, что узнаете о циклах в своем курсе, возможно, они захотят, чтобы вы сделали это:

string[0] -= 3; // this is short for "string[0] = string[0] - 3;"
string[1] -= 3;
string[2] -= 3;
...

Это приведет только к 12 строкам кода, а не милям. Вам не нужно «заново собирать» строку таким образом, вы можете просто редактировать каждый символ на месте. Тогда я держу пари, что после того, как вы заставите вас это сделать, вам покажут быстрый способ сделать это, используя петли.

1 голос
/ 07 февраля 2009

Мне немного непонятно, что вы подразумеваете под "сдвигать буквы назад на 3"? Означает ли это, что D ==> A?
Если это так, вот простой цикл.

(я не делал чтения из файла или записи в файл ... Это ваша часть)

#include <string.h>

int main(void)
{                      
    char input[13] = "ABCDEFGHIJKL";
    int i;

    int len = strlen(input);

    for(i=0; i<len; ++i)
    {
        input[i] = input[i]-3;
    }

    printf("%s", input);  // OUTPUT is: ">?@ABCDEFGHI"
}
1 голос
/ 07 февраля 2009
for(int i=0; i<12; i++){
  string[i] = string[i] - 3;
}

Где строка - это ваш массив символов (строка). Это немного сложнее, если вы хотите сделать его периодическим (т. Е. Сделать переход к Z, но приведенный выше код должен помочь вам начать работу)

1 голос
/ 07 февраля 2009

Перебирайте символы с помощью цикла for. И делай, что хочешь, с символом *. Затем положите новый символ обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...