Как повторить алфавит с циклом for в Цезарь шифр в C # - PullRequest
0 голосов
/ 01 октября 2011

Я делаю шифр Цезаря и хочу сделать буквы в цикле, поэтому, например, если нужно сместить букву «z», она должна вернуться к «a» как для заглавных, так и для строчных букв.

//Array that holds each char in the plaintext inputed is declared and initiated
char[] chars = plainTextInput.ToCharArray();

//For loop that will go through each letter and change the value of each letter by adding the shiftAmount
for (int i = 0; i < plainTextInput.Length; ++i)
{   
    chars[i] = (char)(((int)chars[i]) + shiftAmount);

    if (chars[i] >= 97 && chars[i] <= 122)
    {
        if (chars[i] > 122)
        {
            int x = chars[i] - 123;
            chars[i] = (char)((int)(97 + x));
        }
    }
}  

//Variable for ciphertext output holds char array chars as a string
cipherTextOutput = new string(chars); 

Если я ввожу 'xyz' и сдвигаюсь на единицу, я получаю 'yz{'.

1 Ответ

1 голос
/ 01 октября 2011

Использовать арифметику по модулю:

new_pos = (current_pos + shift) % 26

current_pos должно быть относительной позицией букв (например: a=0, b=1... z=25). Что-то вроде:

if ('A' <= c && c <= 'Z')      // uppercase
{
    current_pos = (int) c - (int) 'A';
}
else if ('a' <= c && c <= 'z') // lowercase
{
    current_pos = (int) c - (int) 'a';
}

См. Рабочий демо: http://ideone.com/NPZbT


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

...