2017-12-28 5 views
-2

私は年齢の古いCaesar Cipherを使ってテキストの文字列を暗号化するアンドロイドアプリを開発しています。void文法でswitch文を含むメソッドの使い方

具体的には、ユーザーは任意の長さの文字列をEditText Viewに入力し、テキストの文字列を暗号化するボタンを押します。ボタンを押すと、文字列を暗号化してTextViewに印刷する必要があります。ここで

は私のMainActivityクラスは、(それが不完全です)です:

public class CeasarCipher { 

public char crypt (char alpha){ 

    switch (alpha){ 

     case 'A' : return 'D'; 
     case 'a' : return 'd'; 
     case 'B' : return 'E'; 
     case 'b' : return 'e'; 
     case 'C' : return 'F'; 
     case 'c' : return 'f'; 
     case 'D' : return 'G'; 
     case 'd' : return 'g'; 
     case 'E' : return 'H'; 
     case 'e' : return 'h'; 
     case 'F' : return 'I'; 
     case 'f' : return 'i'; 
     case 'G' : return 'J'; 
     case 'g' : return 'j'; 
     case 'H' : return 'K'; 
     case 'h' : return 'k'; 
     case 'I' : return 'L'; 
     case 'i' : return 'l'; 
     case 'J' : return 'M'; 
     case 'j' : return 'm'; 
     case 'K' : return 'N'; 
     case 'k' : return 'n'; 
     case 'L' : return 'O'; 
     case 'l' : return 'o'; 
     case 'M' : return 'P'; 
     case 'm' : return 'p'; 
     case 'N' : return 'Q'; 
     case 'n' : return 'q'; 
     case 'O' : return 'R'; 
     case 'o' : return 'r'; 
     case 'P' : return 'S'; 
     case 'p' : return 's'; 
     case 'Q' : return 'T'; 
     case 'q' : return 't'; 
     case 'R' : return 'U'; 
     case 'r' : return 'u'; 
     case 'S' : return 'V'; 
     case 's' : return 'v'; 
     case 'T' : return 'W'; 
     case 't' : return 'w'; 
     case 'U' : return 'X'; 
     case 'u' : return 'x'; 
     case 'V' : return 'Y'; 
     case 'v' : return 'y'; 
     case 'W' : return 'Z'; 
     case 'w' : return 'z'; 
     case 'X' : return 'A'; 
     case 'x' : return 'a'; 
     case 'Y' : return 'B'; 
     case 'y' : return 'b'; 
     case 'Z' : return 'C'; 
     case 'z' : return 'c'; 
     default: return alpha; 

    } 

} 
} 

オクラホマので、シーザー暗号クラスの仕事は、文字列をスキャンすることである。

public class MainActivity extends AppCompatActivity { 

     EditText TextToMirror; 
     TextView TextOut; 
     Button Mirrorbtn; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    TextToMirror = (EditText) findViewById(R.id.TextToMirror); 

    TextOut = (TextView) findViewById(R.id.TextOut); 

    Mirrorbtn = (Button) findViewById(R.id.Mirrorbtn); 

    Mirrorbtn.setOnClickListener(new View.OnClickListener() { 

     /**The onClick method should get text from the edittext view, 
     * crypt that text using the crypt method from the ceasar chiper method and then 
     * print on the textview**/ 

     @Override 
     public void onClick(View v) { 

      TextOut.setText(TextToMirror.getText()); 

     } 
    }); 
} 

//Trying to access the crypt method from the ceasar chiper class 

public void cryptxt(){ 
    CeasarCipher lock = new CeasarCipher(); 
    lock.crypt(); 
} 
} 
ここ

はシーザー暗号クラスですアプリケーションのEditTextビューにテキストを入力し、その文字列を暗号化します。 crypt (char alpha)メソッドは、ボタンによってEditText Viewに入力された文字列を暗号化するために使用されるメソッドです。したがってMainActivityクラスのメソッドは、MainActivity内にCaesarCipherオブジェクトを作成することによって(上記の主なアクティビティコードを参照してください)使用されます。このオブジェクトにより、cryptメソッドにアクセスできます。

このように、ここ数週間私を悩ませていた問題は、このcryptメソッドです。 switch()ステートメントを使用しているので、MainActivity内のcrypttextメソッド内のメソッドを呼び出すことはできません。これは、crypttextメソッドがvoidメソッドであり、cryptメソッドに値を返すswitch文が含まれているためです。私は非常によく知っています。voidは返り値を意味しません!

あなたに私の質問はすべてです:どのように私は妥当な方法の中で値を返す必要がありますか? voidpublic void cryptxt()から削除しようとしましたが、アンドロイドスタジオは「メソッド名が無効です」と「戻り値の型が必要です」と伝え続けました。

助けてください!

+1

どこからでもメソッドを呼び出すことができます。そこから呼び出すメソッドの戻り値の型は違いはありません。 – SLaks

+0

の代わりに 'public cryptxt(){}'のようにメソッドシグネチャから 'void'を削除する代わりに、' public char cryptxt(){} ' – Lino

+0

@Lino Okに置き換えてください。私はそれを試してみる。 – AugieJavax98

答えて

0

あなたの質問

HOW DO I CALL A METHOD THAT HAS TO RETURN A VALUE WITHIN A VOID METHOD? 

への答えはノー、あなたがこのような呼び出しを行うことができないです。 Javaのメソッドは戻り値の型を持つ必要があります。空の場合という意味です。何も意味しませんが、コンパイラに何も返さないようにする必要があります。

また、以下の方法は、あなたのケースで返ってくる場合に便利です。 voidを返すと不可能な暗号化された値を印刷したいので、暗号化された値を取得するように変更します。

public char cryptxt (char temp){ 
    CeasarCipher lock = new CeasarCipher(); 
    return lock.crypt(temp); 
} 

今のところ、このように印刷するだけです。

@Override 
     public void onClick(View v) { 

      //use encrypted value 
      String str = TextToMirror.getText().toString; 
      for(int i=0; i<str.length();i++){ 
       char ch = str.charAt(i); 
       char temp = cryptxt(ch) 
       TextOut.setText(temp); 
      } 

     } 
0

あなたは何か(void以外の方法)を返すメソッドを呼び出したい場合は、例えば、このメソッドが返す値で何かをする必要があります。

public int something() { 
    return 128; 
} 

public void nothing() { 
    int assignedReturnValue = something(); 
} 

ご覧のとおり、something()intを返し、そのメソッドの結果をint変数に代入しました。ご覧のとおり、voidメソッド自体は何も返しませんが、何も返さないメソッドの中に何かを返すメソッドを呼び出す方法の簡単な例です。

ところで、私はあなたがint秒にchar秒をキャストし、むしろ非常に長いswitch文を作成するよりも3のこの鋳造値結果に加えることを示唆しています。 if-elseステートメントで正しく処理する必要があります。

1

あなたはちょうどそのよう実行する必要があります。

public class MainActivity extends AppCompatActivity { 

    EditText TextToMirror; 
    TextView TextOut; 
    Button Mirrorbtn; 
    CeasarCipher lock; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     TextToMirror = (EditText) findViewById(R.id.TextToMirror); 

     TextOut = (TextView) findViewById(R.id.TextOut); 

     Mirrorbtn = (Button) findViewById(R.id.Mirrorbtn); 
     lock = new CeasarCipher(); 
     Mirrorbtn.setOnClickListener(new View.OnClickListener() { 

      /**The onClick method should get text from the edittext view, 
      * crypt that text using the crypt method from the ceasar chiper method and then 
      * print on the textview**/ 

      @Override 
      public void onClick(View v) { 

       String str = TextToMirror.getText().toString; 
       StringBuilder temp=new StringBuilder(""); 
       for (int i = 0; i < str.length(); i++) { 

        temp.append(lock.crypt(str.charAt(i))); 

       } 

       TextOut.setText(temp); 

      } 
     }); 
    } 
0

これは私が唯一のアルファベットのための暗号を行うには、私のカスタム関数を作成したものです。 私は暗号化したい文字列を渡し、変換された暗号文を返します。 ASCIIの詳細についてはAlphabetical ASCIIMore details about ASCII

私はこれが役に立ちます。

public class USCipher { 

    public static String encyptCipherAlpha(String text) { 
    char[] cArray = text.toCharArray(); 

    String encyptedString = ""; 
    for (int i = 0; i < cArray.length; i++) { 
     int chara = CharToASCII(cArray[i]); 
     if (chara == 120) {//x 
      chara = 97;//a 
     } else if (chara == 121) {//y 
      chara = 98;//b 
     } else if (chara == 122) {//z 
      chara = 99;//c 
     } else if (chara == 88) {//x 
      chara = 65;//a 
     } else if (chara == 89) {//y 
      chara = 66;//b 
     } else if (chara == 90) {//z 
      chara = 67;//c 
     } else { 
      chara = chara + 3; 
     } 
     encyptedString = encyptedString + ASCIIToChar(chara); 
    } 
    return encyptedString; 
} 

public static String decryptCipherAlpha(String text) { 
    char[] cArray = text.toCharArray(); 

    String decryptedString = ""; 
    for (int i = 0; i < cArray.length; i++) { 
     int chara = CharToASCII(cArray[i]); 
     if (chara == 97) {//a 
      chara = 120;//x 
     } else if (chara == 98) {//b 
      chara = 121;//y 
     } else if (chara == 99) {//c 
      chara = 122;//z 
     } else if (chara == 65) {//A 
      chara = 88;//X 
     } else if (chara == 66) {//B 
      chara = 89;//Y 
     } else if (chara == 67) {//C 
      chara = 90;//Z 
     } else { 
      chara = chara - 3; 
     } 
     decryptedString = decryptedString + ASCIIToChar(chara); 
    } 
    return decryptedString; 
} 

public static String encyptCipher(String text) { 
    char[] cArray = text.toCharArray(); 
    String encyptedString = ""; 

    for (int i = 0; i < cArray.length; i++) { 
     encyptedString = encyptedString + ASCIIToChar(CharToASCII(cArray[i]) + 3); 
    } 
    return encyptedString; 
} 

public static String decryptCipher(String text) { 
    char[] cArray = text.toCharArray(); 
    String decryptedString = ""; 

    for (int i = 0; i < cArray.length; i++) { 
     decryptedString = decryptedString + ASCIIToChar(CharToASCII(cArray[i]) + 3); 
    } 
    return decryptedString; 
} 

/** 
* Convert the characters to ASCII value 
* 
* @param character character 
* @return ASCII value 
*/ 
public static int CharToASCII(final char character) { 
    return (int) character; 
} 

/** 
* Convert the ASCII value to character 
* 
* @param ascii ascii value 
* @return character value 
*/ 
public static char ASCIIToChar(final int ascii) { 
    return (char) ascii; 
    } 
} 
関連する問題