Код Цезаря - PullRequest
       21

Код Цезаря

6 голосов
/ 11 декабря 2011
#include <stdio.h>

void caesar (char cipher[], int shift);

int main () {

char cipher[50];
int shift;

  printf("Enter text to be encrypted IN CAPITAL LETTERS ONLY: ");
  scanf("%s", cipher);

  printf("How many shifts do you prefer? 1-10 only: ");
  scanf("%d", &shift);

  caesar (cipher, shift);

  return 0;
}

void caesar (char cipher[], int shift) {
  int i = 0;

  while (cipher[i] != '\0') {
    if ((cipher[i] += shift) >= 65 && (cipher[i] += shift) <= 90) {
      cipher[i] += (shift);
    } else {
      cipher[i] += (shift - 25); 
    }
    i++;
  }
  printf("%s", cipher);
}

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

Например:

  • Ввод: ABCD, 1 смена
  • Вывод: DEFG <=, что фактически составляет 3 смены. </li>

Ответы [ 7 ]

9 голосов
/ 11 декабря 2011

Изменение

if ((cipher[i] += shift) >= 65 && (cipher[i] += shift) <= 90) ...

до

if ((cipher[i] + shift) >= 65 && (cipher[i] + shift) <= 90) ...

, поскольку += изменяет cipher[i].

5 голосов
/ 14 января 2012

(я попал сюда через http://codereview.stackexchange.com, поэтому я все еще в шапке для проверки кода).

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

  cipher[i] += (shift - 25); 

на что-то вроде

  cipher[i] += (shift - ('Z' - 'A')); 

Большинство людей, выполняющих шифры Цезаря, преобразуют только буквы и проходят через знаки препинания, числа, пробелы,и т.д. без изменений.Вы можете рассмотреть возможность включения стандартной библиотеки символов

#include <ctype.h>

и использования функций isalpha (), islower (), isupper () - в частности, изменение

if ((cipher[i]) >= 'A' && (cipher[i]) <= 'Z') {

на что-то вроде

if (isupper(cipher[i])) {

.

3 голосов
/ 04 мая 2013
void caesar (char cipher[], int shift) {
  int i = 0;

  while (cipher[i] != '\0') {
    if (cipher[i] >= 'A' && cipher[i]<='Z') {
        char newletter = cipher[i] - 'A';
        newletter += shift;
        newletter = newletter % 26;
        cipher[i] = newletter + 'A';
    }
    i++;
  }
  printf("%s", cipher);
}

Это будет игнорировать все, что не является заглавной буквой.

Если бы буквы имели коды 0-25, было бы очень легко выполнить сдвиг, потому что мы могли бы сохранить условие, используя толькоостаток от 26. Что я и сделал, вычитая «А», так что буква А будет 0, затем я добавляю сдвиг и вычисляю остаток, так что если вы добавите 1 к «Z», вы получитеснова «А» и так далее.И, наконец, мне пришлось снова добавить «А», потому что в ASCII «А» на самом деле не 0. 0. 1004 *

2 голосов
/ 16 октября 2017

Маленькая рабочая версия, без диапазона сдвига, кроме отрицательных значений:

#include <stdio.h>

void caesar (char cipher[], int shift);

int main () {

  char cipher[50];
  int shift;

  printf("Plaintext (Caps only): ");
  scanf("%s", cipher);

  printf("Shift: ");
  scanf("%d", &shift);

  caesar (cipher, shift);

  return 0;
}

void caesar (char cipher[], int shift) {

  for(int i=0; cipher[i] != '\0'; i++)
    cipher[i] = 65 + (cipher[i]-65+shift)%26;
  printf("Cipher text: %s\n", cipher);
}
2 голосов
/ 04 мая 2013

попробуйте заменить

if ((cipher[i] += shift) >= 65 && (cipher[i] += shift) <= 90) {
  cipher[i] += (shift);
 } else {
  cipher[i] += (shift - 25); 
 }

с

if ((cipher[i] += shift) >= 65 && (cipher[i] = shift) <= 90) {
 // do nothing
 } else {
  cipher[i] = 'A' + ('Z' - cipher[i]) -1; 
 }

Использование "+ =" будет изменять значение всякий раз, когда оно оценивается. это было оценено 3 раза в вашем коде, поэтому оно дает 3 смены!

1 голос
/ 04 августа 2017

Код Цезаря для C ++

#include<iostream>
#include<cctype>
using namespace std;

char cipher(char c, int k)
{
    if(isupper(c))
        return char( 'A' + (c - 'A' + k ) % 26);

    else if(islower(c))
        return char( 'a' + (c - 'a' + k ) % 26);

    else
        return c;
}

int main()
{
    int k;
    string str;
    cin>>str>>k;
    int l = str.size();

    for(int i=0; i<l; i++)
        cout<<cipher(str[i], k);
}
1 голос
/ 10 февраля 2017

Я изменил LtWorf в соответствии с моим текущим проектом.

диапазон сдвига: -9 ~ + 9

void caesar(char cipher[], int shift) {
  int i = 0;

  while (cipher[i] != '\0') {
    if (cipher[i] >= 'A' && cipher[i]<='Z') {
        char newletter = cipher[i] - 'A' + 26;
        newletter += shift;
        newletter = newletter % 26;
        cipher[i] = newletter + 'A';
    } else if (cipher[i] >= '0' && cipher[i]<='9') {
        char newletter = cipher[i] - '0' + 10;
        newletter += shift;
        newletter = newletter % 10;
        cipher[i] = newletter + '0';
    }
    i++;
  }
  printf("%s\n", cipher);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...