Программа Caesar Cipher, как использовать только символы az?

Шифр Цезаря применяется индивидуально к каждой букве в строке. Каждая буква должна быть сдвинута вперед на n шагов в алфавите. Если буква смещается за конец алфавита («z»), то она смещается полностью назад к началу алфавита («a»). `

import java.util.*;

class question7{

    public static void main (String[] args ){

        String str = "";
        //allowing program to take user input using the keyboard
        Scanner kb = new Scanner(System.in);
        Scanner s = new Scanner(System.in);

        int n = 0;
        System.out.println("increasing the letters in string by n");

        while (true){
            System.out.println("Please enter your string");
            str = kb.nextLine(); 

            System.out.println("Please enter your n value");
            n = s.nextInt(); 

            String incrementedword=new String();
            for (int i=0;i<str.length();i++){
                incrementedword+=(char)(str.charAt(i)+n);
            }

            System.out.println ("your word is "+incrementedword);

        }
    }
}

например, следующий ввод («hello world», 1) должен возвращать «ifmmp xpsme».

однако, когда я печатаю («hello world», 1), вывод «ifmmp!xpsme»

Что я делаю не так?


person Ryan Cordon    schedule 06.02.2018    source источник
comment
Вы также увеличиваете символ пробела. Исключите это!   -  person Seelenvirtuose    schedule 06.02.2018
comment
Кроме того, ваш код не будет работать для «z».   -  person Johnny Mopp    schedule 06.02.2018
comment
Я хочу, чтобы «z» было «а», но «z» будет «{», я немного растерялся   -  person Ryan Cordon    schedule 06.02.2018
comment
Java не будет автоматически возвращаться к «a», если вы добавите 1 к «z», и не будет автоматически исключать пробелы и другие небуквенные символы. Вы должны сказать ему, чтобы он делал эти вещи.   -  person azurefrog    schedule 06.02.2018
comment
Вам понадобится несколько ifs: if (Character.isLetter(str.charAt(i))) {....}   -  person Johnny Mopp    schedule 06.02.2018


Ответы (4)


Здесь у вас две проблемы:

  • Вы получите небуквенно-цифровые символы после увеличения некоторых символов, близких к концу алфавита (например, z+1 станет фигурной скобкой { — см. таблица ASCII). Попробуйте использовать оператор остатка (%). Например, 117 % 100 будет 17, 13 % 3 будет 1. Таким образом, (x + 1) % 10 никогда не превысит 10, а начнет отсчет с 0 и снова вверх по мере увеличения x.
  • Если вы хотите зашифровать только символы в диапазоне a..z и A..Z, исключите другие. Работает простое сравнение: if (x>='a' && x ‹='z') .

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

person Audrius Meskauskas    schedule 06.02.2018
comment
стоит упомянуть, почему появляются эти небуквенно-цифровые символы, например, при связывании таблицы ASCII/UNICODE:› - person Fureeish; 06.02.2018
comment
Продлен, как было предложено. - person Audrius Meskauskas; 06.02.2018

Возможно, вы могли бы преобразовать буквы в ascii, а затем увеличить их таким образом?

Я имею в виду, что вам нужно было бы установить ограничения: «a» равно 97, а «z» равно 122. Это гарантировало бы, что оно останется в пределах символов нижнего регистра, и вы могли бы указать ему вернуться к «a».

person Belum    schedule 06.02.2018

Вам нужно будет контролировать перенос, если буква не находится в пределах досягаемости. Обтекание нужно делать для букв, сдвинутых за букву z. Код ниже будет сдвигать только буквы в строке.

import java.util.*;

class question7{

public static void main (String[] args ){

    String str = "";
    //allowing program to take user input using the keyboard
    Scanner kb = new Scanner(System.in);
    Scanner s = new Scanner(System.in);

    int n = 0;
    int a = 'a';
    int z = 'z';

    System.out.println("increasing the letters in string by n");

      while (true){
        System.out.println("Please enter your string");
        str = kb.nextLine().toLowerCase(); 

        System.out.println("Please enter your n value");
        n = s.nextInt(); 

        int newCharValue;
        int currentChar;

        String incrementedword=new String();
        for (int i=0;i<str.length();i++){

          currentChar = str.charAt(i);

          if(!Character.isLetter(currentChar)){
            incrementedword+=currentChar;
            continue;
          }

          newCharValue = currentChar + n;

          if(newCharValue <= z)
            incrementedword+=(char)newCharValue;
          else
            incrementedword+=(char)(a + (newCharValue - a + 1)%26);
        }
        System.out.println ("your word is "+incrementedword);
      }
 }
}
person cdaiga    schedule 06.02.2018

Поместите условие внутри цикла, который будет проверять, является ли текущий символ буквой от «a» до «z» в нижнем регистре:

Фрагмент кода для проверки того, является ли текущий символ буквой нижнего регистра (от a до z):

if (currentChar >= 'a' && currentChar <= 'z') {
//Process the shifting of the characters here
}

Теперь для сдвига каждой буквы вперед на n шагов в алфавите попробуйте следующую формулу:

if (currentChar >= 'a' && currentChar <= 'z') {
   currentChar = (char) ((currentChar - 'a' + k) % 26 + 'a');
//Where n is the number of shifts forward (ex: a + 2 = c)
}
person Community    schedule 25.12.2018