0

ユーザーが入力した量だけ ROT13 文字列をシフトしたいと考えています。これはサンプル出力です:

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;
}

}

更新:このコードは私がどのように進んだかです。実際のシフトはまだ動作しません http://pastebin.com/v2T1fxEj

ROT13暗号化とすべてを印刷していますが、それをシフトする方法がわかりません。

また、メイン メソッドの String input = getText(sc) の下に「Enter amount to shift by」を追加しようとすると、次のようになります。

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

私はそれを得ることになっていない

4

1 に答える 1

0

shiftMessage()のように、代わりにrot13()入れるだけです:n13

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;
}

fromshiftMessage()の代わりに呼び出すと、次のことができます。rot13()main()

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()すると、改行が読み取られ、空の文字列が返されます。解決策は、改行を取り除くためにnextLine()afterを呼び出すことだと思います。nextInt()

最後に、ユーザーが誤ったシフト量を入力するのは 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: ^_` |
+----------------+
于 2016-10-21T00:18:25.740 に答える