2016-10-20 36 views
0

ROT13文字列をユーザ入力量だけシフトしたい。ROT13文字列をJavaシフトする

Enter your text to encrypt (!!! to quit): abcdefghijklmnopqrstuvwxyz 

Enter amount to shift text by: 3 

ORIGINAL: abcdefghijklmnopqrstuvwxyz 

ENCRYPTED: defghijklmnopqrstuvwxyzabc 

ユーザがこの範囲外になった場合、ユーザは0と26との間のシフト値を提供しなければならない、プログラムが有効な値を入力するようユーザーに強制する必要があります:これはサンプル出力です

Enter your text to encrypt (!!! to quit): the quick brown fox jumped over the lazy dog 
Enter amount to shift text by: -3 
ERROR! Shift must be non-negative! 
Enter amount to shift text by: 33 
ERROR! Shift must be no more than 26! 
Enter amount to shift text by: 2 

暗号化するテキストを入力してください(!!!終了してください):!!! さようなら!

import java.util.Scanner; 

public class Lab08b 
{ 

public static void main(String[] args) 
{ 
    Scanner sc = new Scanner (System.in); 
    String input = getText(sc); 
    int shift = getShift(sc); 
    if (input.equals("!!!")) 
    { 
     System.out.println("Goodbye!"); 
    } 

    while (!input.equals("!!!")) 
    { 
     String encoded = rot13(input); 
     shiftMessage(input, shift); 
     displayResults(input, encoded); 
     input = getText(sc); 
     if (input.equals("!!!")) 
     { 
      System.out.println("Goodbye!"); 
     } 
    } 


} 
private static int getShift (Scanner inScanner) 
{ 
    System.out.print("Enter amount to shift text by: "); 
    int shift = inScanner.nextInt(); 

    if (shift < 0) 
    { 
     System.out.println("ERROR! Shift must be non-negative!"); 
     System.out.print("Enter amount to shift text by: "); 
     shift = inScanner.nextInt(); 
    } 
    else if (shift > 26) 
    { 
     System.out.println("ERROR! Shift must be non-negative!"); 
     System.out.print("Enter amount to shift text by: "); 
     shift = inScanner.nextInt(); 
    } 
    return shift; 
} 

private static String getText(Scanner inScanner) 
{ 
    System.out.print("Enter your text to encrypt (!!! to quit): "); 
    String original = inScanner.nextLine(); 

    while (original.equals("")) 
    { 
     System.out.println("ERROR! String must not be empty!"); 
     System.out.print("Enter your text to encrypt (!!! to quit): "); 
     original = inScanner.nextLine(); 
    } 
    return original; 
} 


private static String rot13(String input) 
{ 
    String str = ""; 

    for (int i = 0; i < input.length(); i++) 
    { 
     char ch = input.charAt(i); 
     if (ch >= 'A' && ch <= 'Z') 
     { 
      ch = (char) (ch + 13); 
      if (ch > 'Z') 
      { 
       ch = (char)(ch - 26); 
      } 
     } 
     else if (ch >= 'a' && ch <= 'z') 
     { 
      ch = (char)(ch + 13); 
      if (ch > 'z') 
      { 
       ch = (char)(ch - 26); 
      } 
     } 
     str = str + ch; 
    } 
    return str; 
} 

private static void displayResults(String inText, String encText) 
{ 
    System.out.print("+"); 
    for (int i = 13 + encText.length(); i > 0; i--) 
    { 
     System.out.print("-"); 
    } 
    System.out.println("+"); 

    System.out.println("| ORIGINAL: " + inText + " |"); 
    System.out.println("| ENCRYPTED: " + encText + " |"); 

    System.out.print("+"); 
    for(int i = 13 + encText.length(); i > 0; i--){ 
     System.out.print("-"); 
    } 
    System.out.println("+"); 
} 

private static String shiftMessage(String input, int n) 
{ 
    for (int i = 0; i < input.length(); i++) 
    { 
     input = input.charAt(input.length()- n) + input.substring(0,input.length()); 
    } 
    return input; 
} 

}

UPDATE

この

は私が書いた私のコードです。このコードは、私が進展している方法です。 私はそれがROT13暗号化とすべてのものをプリントアウトしている http://pastebin.com/v2T1fxEj

実際のシフトがまだ動作しません、私はちょうどそれをシフトする方法がわかりません。

、私は文字列の入力下のmainメソッドで=のgetText(SC)「によってシフトする量を入力して」追加しようとすると、私はこの取得し終わる:

Enter your text to encrypt (!!! to quit): ERROR! String must not be empty! 
Enter your text to encrypt (!!! to quit): 

を私はなっていないのです

+0

ペーストビンを使用しないでください。質問にあなたのコードを表示してください。この質問は、後に来てリンクが壊れている場合、他の人には役に立たないでしょう。 – nhouser9

+0

よろしいですか?私はそれがより簡単だろうと思った。 – ConfusedCoder

+0

[ROT-13関数in java?]の可能な複製?(http://stackoverflow.com/questions/8981296/rot-13-function-in-java) – Charles

答えて

0

shiftMessage()だけnの代わり13に入れ、rot13()のようなものであることを取得する:

private static String shiftMessage(String input, int n) { 
    String str = ""; 

    for (int i = 0; i < input.length(); i++) 
    { 
     char ch = input.charAt(i); 
     if (ch >= 'A' && ch <= 'Z') 
     { 
      ch = (char) (ch + n); 
      if (ch > 'Z') 
      { 
       ch = (char)(ch - 26); 
      } 
     } 
     else if (ch >= 'a' && ch <= 'z') 
     { 
      ch = (char)(ch + n); 
      if (ch > 'z') 
      { 
       ch = (char)(ch - 26); 
      } 
     } 
     str = str + ch; 
    } 
    return str; 
} 

今とき、私main()からshiftMessage()代わりのrot13()を呼んで、私はでき:

Enter your text to encrypt (!!! to quit): abcdefghijklmnopqrstuvwxyz 
Enter amount to shift text by: 1 
+---------------------------------------+ 
| ORIGINAL: abcdefghijklmnopqrstuvwxyz | 
| ENCRYPTED: bcdefghijklmnopqrstuvwxyza | 
+---------------------------------------+ 

その他の問題:

ERROR! String must not be empty!、あなたが言及、Scanner.nextInt()と古典的です。 nextInt()はそれに続く改行ではなく数字だけを読み込みます。したがって、後でinScanner.nextLine()を実行すると、改行を読み取り、空の文字列を返します。解決策は、nextInt()の後にnextLine()と呼んで、改行を取り除くことだと私は信じています。

最後に、誤ったシフト量を1回だけ入力することは事前にわかりません。私はできる:

Enter your text to encrypt (!!! to quit): abc 
Enter amount to shift text by: -3 
ERROR! Shift must be non-negative! 
Enter amount to shift text by: -3 
+----------------+ 
| ORIGINAL: abc | 
| ENCRYPTED: ^_` | 
+----------------+ 
+0

ねえ、助けてくれてありがとう!しかし、nextLine()を追加しようとするたびに、eclipseはプリミティブ型intに対してnextLine()を呼び出すことができないと訴えていました。それに対して別の修正がありますか?あなたが最後に言ったように、私はwhileループを使用するだけで、if文を使用していたので、それを修正できることに気がついたので、1回以上範囲外だった場合は暗号化を駄目にするでしょう。 – ConfusedCoder

+0

私はスキャナの専門家。あなたは 'inScanner.nextInt()。nextLine()'などを試していたようです。むしろ 'inScanner.nextLine();'を別の行に入れてみてください。 –

+0

ああ、決して気にしないでください。わかった。私は[getText]の[nextLine()]をちょうど[next()]に変更しました – ConfusedCoder

関連する問題