0

以下では、文字列を配列に送信するために toCharArray を使用しています。次に、for ステートメントを使用して文字の値を MOVE します...

for(i = 0; i < letter.length; i++){
               letter[i] += (shiftCode);
               System.out.print(letter[i]);
            }

ただし、shiftCodeを使用して値を移動すると...

-1 シフトされます。記号 @ を取得します。文字列をshiftCodeに送信する方法、またはshiftCodeに文字のみを使用するように指示する方法はありますか? 「aaron」などのテキストを表示する必要があり、for ステートメントを使用すると、az のみを反復処理し、すべての記号と数字を無視します。私はそれが同じくらい簡単だと思います...

letter=codeWord.toCharArray(a,z);

しかし、それをさまざまな形式で試してグーグルで検索しても、結果は得られませんでした。おそらくそれは正規表現か何かと関係がありますか?以下に、私のプログラムの完全なコピーがあります。それは私がやりたいように正確に機能します。ただし、文字と記号を反復処理します。また、 toCharArray のオンラインで指示を見つけようとしましたが、引数が存在する場合、それらを見つけることができません。

私のプログラム...

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/*
 * Aaron L. Jones
 * CS219
 * AaronJonesProg3
 * 
 * This program is designed to -
 * Work as a Ceasar Cipher
 */

/**
 *
 * Aaron Jones
 */
public class AaronJonesProg3 {
    static String codeWord;
    static int shiftCode;
    static int i;
    static char[] letter;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // Instantiating that Buffer Class
        // We are going to use this to read data from the user; in buffer
        // For performance related reasons
        BufferedReader reader;

        // Building the reader variable here
        // Just a basic input buffer (Holds things for us)
        reader = new BufferedReader(new InputStreamReader(System.in));

        // Java speaks to us here / We get it to query our user
        System.out.print("Please enter text to encrypt: ");

        // Try to get their input here
        try {    
            // Get their codeword using the reader
            codeWord = reader.readLine();

            // Make that input upper case
            codeWord = codeWord.toUpperCase();
            // Cut the white space out
            codeWord = codeWord.replaceAll("\\s","");
            // Make it all a character array
            letter = codeWord.toCharArray();
        }
        // If they messed up the input we let them know here and end the prog.
        catch(Throwable t) {
            System.out.println(t.toString());
            System.out.println("You broke it. But you impressed me because"
                    + "I don't know how you did it!");
        }

        // Java Speaks / Lets get their desired shift value
        System.out.print("Please enter the shift value: ");

        // Try for their input
        try {
               // We get their number here
               shiftCode = Integer.parseInt(reader.readLine());
        }
        // Again; if the user broke it. We let them know.
        catch(java.lang.NumberFormatException ioe) {
            System.out.println(ioe.toString());
            System.out.println("How did you break this? Use a number next time!");
        }

        for(i = 0; i < letter.length; i++){
           letter[i] += (shiftCode);
           System.out.print(letter[i]);
        }

        System.out.println();

        /****************************************************************
         ****************************************************************
         ***************************************************************/
        // Java speaks to us here / We get it to query our user
        System.out.print("Please enter text to decrypt: ");

        // Try to get their input here
        try {    
            // Get their codeword using the reader
            codeWord = reader.readLine();

            // Make that input upper case
            codeWord = codeWord.toUpperCase();
            // Cut the white space out
            codeWord = codeWord.replaceAll("\\s","");
            // Make it all a character array
            letter = codeWord.toCharArray();
        }
        // If they messed up the input we let them know here and end the prog.
        catch(Throwable t) {
            System.out.println(t.toString());
            System.out.println("You broke it. But you impressed me because"
                    + "I don't know how you did it!");
        }

        // Java Speaks / Lets get their desired shift value
        System.out.print("Please enter the shift value: ");

        // Try for their input
        try {
               // We get their number here
               shiftCode = Integer.parseInt(reader.readLine());
        }
        // Again; if the user broke it. We let them know.
        catch(java.lang.NumberFormatException ioe) {
            System.out.println(ioe.toString());
            System.out.println("How did you break this? Use a number next time!");
        }

        for(i = 0; i < letter.length; i++){
           letter[i] += (shiftCode);
           System.out.print(letter[i]);
        }

        System.out.println();
    }
}
4

3 に答える 3

2

文字を区切るために使用Character.isLetter().......

このリンクを参照してください.....

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Character.html

例えば:

public class Test{
   public static void main(String args[]){
      System.out.println( Character.isLetter('c'));
      System.out.println( Character.isLetter('5'));
   }
}

出力:

真/偽

于 2012-09-08T17:48:40.270 に答える
1

まず、配列の各文字を。でチェックしif(Character.isLetter(letter[i]))ます。次に、シフトコードを使用して、文字[i]の文字と、対応する最後のアルファベット文字、つまり大文字または小文字の「z」との違いを確認します。詳細な説明については、このフォーラムのこのリンクにあるシーザー暗号に関する私の回答を参照してください。

于 2012-09-08T17:54:40.257 に答える
0
        // iterating
    for(i = 0; i < letter.length; i++){
        letter[i] += (shiftCode); // Start adding shiftcode to letter
        if(!(letter[i] <= 'Z')) {
            // if its bigger than Z subtract 26
            letter[i] -= (26);
        }
        // less than A?
        if(!(letter[i] >= 'A')) {
            // add 26
            letter[i] += (26);
        }
        System.out.print(letter[i]); // print it all out
    }

上記のコードは、私の問題に対する正しい答えです。UNICODE には番号が付けられており、26 という番号を使用することで、大きな番号を選択して独り占めしなければ、PRETTY をうまく処理できることがわかりました。ユーザーが最大-26から26まで反復するように強制するキャッチでプログラムするのが賢明だと思います。

于 2012-09-09T05:34:15.837 に答える