Проблема отрицательных чисел Цезаря Шифра - PullRequest
0 голосов
/ 26 августа 2018

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

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


int encrypt(int character, int shift);

int main(int argc, char * argv[]) {

    int shift = atoi(argv[1]);
    if (shift >= 26) {
        shift = ((shift + 26) % 26);
    }

    int character = getchar();

    while (character != EOF) {
        int new_character = encrypt(character, shift);
        putchar(new_character);
        character = getchar();
    }

    return 0;

}

int encrypt(int character, int shift) {
    int ch = character;
    int negShift = shift;

    if (ch >= 'a' && ch <= 'z') {
        ch = ch + shift;
        if (ch > 'z') {
            ch = ch - 'z' + 'a' - 1;
        }
    } else if (ch >= 'A' && ch <= 'Z') {
        ch = ch + shift;
        if (ch > 'Z') {
            ch = ch - 'Z' + 'A' - 1;
        }
    }

    return ch;
}

1 Ответ

0 голосов
/ 26 августа 2018

Вы можете просто add от 26 до ch при ch < 'a' or ch <'A'. Рассмотрим пример ниже.

    if(ch < 'a')
     {
      ch  = ch + 26;
     } 

Полный код.

int encrypt(int character, int shift) {
    int ch = character;
    int negShift = shift;

    if (ch >= 'a' && ch <= 'z') {
        ch = ch + shift;
        if (ch > 'z') {
            ch = ch - 'z' + 'a' - 1;
        }

         else if(ch < 'a')
         {
            ch  = ch + 26; //Here
         } 

    } else if (ch >= 'A' && ch <= 'Z') {
        ch = ch + shift;
        if (ch > 'Z') {
            ch = ch - 'Z' + 'A' - 1;
        }

        else if(ch < 'A')
        {
            ch = ch + 26; // Here 
        }

    }

    return ch;
}
...