2017-01-11 7 views
1

Я новичок в Java, и мне нужно сделать программу Caesar Cipher. Это мой код. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу сдвинуть ее более чем на 1. Например, если я напишу «помогите мне» и введите значение сдвига 2, он все еще сдвигается только на 1 -> 'ifmq nf'Cant shift Caesar Cipher более чем 1

public static void main(String[] args) 
    { 
     Scanner sc=new Scanner(System.in); 
     String str; 
     String key; 
     int keyLength; 

     System.out.println("Enter message:"); 
     str=sc.nextLine(); 
     System.out.println("Enter encryption key:"); 
     key=sc.next(); 
     keyLength=key.length(); 
     //This for loop is repeated use of 'Enrypt' and 'Decrypt' options 
     for(;;) 
     { 
      System.out.println("1.Encrypt\n2.Decrypt\n3.Exit..."); 
      int choice=sc.nextInt(); 
      switch(choice) 
      { 
       case 1: 
       /*send input string keyLength to encrypt() method to encrypt it returns 'Encrypted' string*/ 
        System.out.println("Encrypted message..."+encrypt(str,keyLength)); 
        break; 
       case 2: 
        //send retrived string from encrypt() method and keyLength to decrypt() method it returns 'Decrypted' string 
        System.out.println("Decryptedmessage..."+decrypt(encrypt(str,keyLength),keyLength)); 
        break; 
       case 3: 
        //exit from the program 
        System.exit(0); 
        break; 
       default: 
       System.out.println("Invalid option.."); 
      } 
     } 
    } 
    public static String encrypt(String str,int keyLength) 
    { 
     String encrypted=""; 
     for(int i=0;i<str.length();i++) 
     { 
      //stores ascii value of character in the string at index 'i' 
      int c=str.charAt(i); 
      //encryption logic for uppercase letters 
      if(Character.isUpperCase(c)) 
      { 
       c=c+(keyLength%26); 
       //if c value exceeds the ascii value of 'Z' reduce it by subtracting 26(no.of alphabets) to keep in boundaries of ascii values of 'A' and 'Z' 
       if(c>'Z') 
        c=c-26; 
      } 
      //encryption logic for lowercase letters 
      else if(Character.isLowerCase(c)) 
      { 
       c=c+(keyLength%26); 
       //if c value exceeds the ascii value of 'z' reduce it by subtracting 26(no.of alphabets) to keep in boundaries of ascii values of 'a' and 'z' 
       if(c>'z') 
        c=c-26; 
      } 
      //concatinate the encrypted characters/strings 
      encrypted=encrypted+(char) c; 
     } 
     return encrypted; 
    } 
    public static String decrypt(String str,int keyLength) 
    { 
     String decrypted=""; 
     for(int i=0;i<str.length();i++) 
     { 
      //stores ascii value of character in the string at index 'i' 
      int c=str.charAt(i); 
      //decryption logic for uppercase letters 
      if(Character.isUpperCase(c)) 
      { 
       c=c-(keyLength%26); 
       //if c value deceed the ascii value of 'A' increase it by adding 26(no.of alphabets) to keep in boundaries of ascii values of 'A' and 'Z' 
       if(c<'A') 
        c=c+26; 
      } 
      //decryption logic for uppercase letters 
      else if(Character.isLowerCase(c)) 
      { 
       c=c-(keyLength%26); 
       //if c value deceed the ascii value of 'A' increase it by adding 26(no.of alphabets) to keep in boundaries of ascii values of 'A' and 'Z' 
       if(c<'a') 
        c=c+26; 
      } 
      //concatinate the decrypted characters/strings 
      decrypted=decrypted+(char) c; 
     } 
     return decrypted; 
    } 
+3

'сдвига значения 2' - где это приходит? Это то же самое, что и 'key', если длина' 1' и длина '2' одинаковы. –

+0

' key.length() 'возвращает длину' String' (поэтому '1' будет '1' и' 2' будут '1' и т. Д.); возможно, вы должны использовать 'Integer.parse (key)' или 'Scanner # nextInt'? – MadProgrammer

+0

Большое вам спасибо за помощь! – Jay

ответ

0

Как страшно Wombat и MadProgrammer сказал, на линии 12 у вас есть keyLength=key.length();. Это возвращает длину из String введенных. Так что, если вы входите в 2, keyLength 1. Если вы входите в 11, keyLength равно 2.

Я бы избавиться от keyLength полностью, сделать keyint вместо String, и установить key=sc.nextInt();

Это позволит 1 быть 1, 2 равным 2 и так далее.

Не забудьте изменить все экземпляры keyLength к key

+0

Большое вам спасибо за помощь! – Jay

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

  • Нет связанных вопросов^_^