2013-11-27 2 views
2

Это немного больше сложнее, чем я думал ..Как бы я обволакивал алфавит?

Я создаю программу Java, который зашифрован:

вход «а» и переложить письмо на 5, который идет в «F»

, который прост в ASCII, но когда я добираюсь до буквы zi, я хочу, чтобы программа зацикливалась на «а» и начиналась, если это имеет смысл, просто я понятия не имею, с чего начать!

+0

Я имею в виду, что мне не с того, с чего начать в этом цикле – user3042332

+1

Вы должны google 'caesar cipher java'. Также google 'Java Modulo'. – buzzsawddog

ответ

3

Ключ модуль деление:

char c; 
c = (char)((c - 'a' + 5) % 26 + 'a'); 

c - 'a' дает вам номер письма 0-25, который затем сдвигается вверх на 5, а остаток после деления на 26 затем добавляют к 'a' отказаться обратно символ для буквы.

3

Используйте mod % Оператор.

char translated = (char) ('a' + (charOriginal -'a' + 5) % ('z' - 'a' + 1)); 
1

Здесь:

public char encrypt(char c) 
{ 
    return Character.isLowerCase(c) ? (char)((c - 'a' + 5) % 26 + 'a') : (char)((c - 'A' + 5) % 26 + 'A'); 
} 

Я редактировал свой пост, теперь он проверяет нижний/верхний регистр.

Если у вас нет и минус 'a' для прописных букв, это не сработает. Например, шифрование («Y») вернуло бы «^» вместо «D».

0

Вы могли бы попробовать что-то вроде этого:

/** 
* Shifts a letter 5 letters, if the char is a letter, 
* other wise (if a number or symbol) just returns the char. 
* Jumps back to 'a' or 'A' when it goes past 'z' or 'Z'. 
*/ 
public char shift5(char letter) { 
    char letterToReturn = letter; 
    if(letterToReturn >= 'a' && letter <= 'z') { 
     // letter is lowercase 
     letterToReturn = shiftLetter(letterToReturn , 5); 
    } else if(letter >= 'A' && letter <= 'Z') { 
     // letter is uppercase 
     letterToReturn = shiftLetter(letterToReturn , 5); 
    } 
    return letterToReturn; 
} 

/** 
* Shifts a letter to the next letter the specified amount of times. 
* Jumps back to 'a' or 'A' when it goes past 'z' or 'Z'. 
*/ 
public char shiftLetter(char letter, int amountToShift) { 
    char letterToReturn = letter; 
    for (int i = 1; i <= amountToShift; i++) { 
     letterToReturn ++; 
     if(letterToReturn == (char)((int)'z' + 1) { 
      // letter has gone past 'z', so change to 'a' 
      letterToReturn = 'a' 
     } else if(letterToReturn == (char)((int)'Z' + 1) { 
      // letter has gone past 'Z', so change to 'A' 
      letterToReturn = 'A' 
     } 
    } 
    return letterToReturn;   
} 

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

+0

'public char shift5()' немного негибкий, если вы спросите меня. Я имею в виду, что вы уже даете возможность ниже сдвигаться на 'amountToShift', почему бы не следовать этому шаблону повсюду? – buzzsawddog

Смежные вопросы