2016-04-12 7 views
0

私は配列内のすべての文字をシフトするのではなく、5文字ごとにシフトするようにシーザーシフトプログラムを修正しようとしています。現在、文字はテキストエリアに入力され、次に配列に変換され、すべての文字はshiftAmount(Key)が何であっても(あなたが期待したように)シフトされます。 "abc" --by2 - > "cde"配列内の「n番目」の文字をシフトする方法はありますか?

(int i=0; i<ptArray.length; i+=5)私はを試しましたが、それは見える5番目の文字(1番目を含む)ごとにシフトするだけでなく、シフトされた文字を数えて配列の他の文字を表示しません。これを達成するために私がループに加える変更はありますか?理想的には2だけシフトし、すべての第五の文字と「ABCDEFGHIJは、」私はマルチで異なる量で同時に各文字をシフトすることによって、より安全な暗号を作るしようとしている「ABCD グラム FGHI リットル

として表示していました - 整数キー。どんな助けでも大歓迎です。

public String shiftCipher (String p, int s) { //plaintext, shiftAmount 
     //convert the input/plain string to an array of characters 
     char[] ptArray = p.toCharArray(); 
     //create array of characters to hold output/cipher string 
     char[] ctArray = new char[ptArray.length]; 

     //shift and put result in the ciphertext array 
     for (int i=0; i<ptArray.length; i++) { 
     int ascii = (int)ptArray[i]; 
     ascii = (ascii - 32 + s)%95 + 32; 
     ctArray[i] = (char)ascii; 
     } 

      //convert ciphertext array to string 
      String c = new String(ctArray); 

      return c; 

答えて

2

これで、メッセージ内の一部の文字に対してのみ、Vigenèreチップを作成しています。すべての文字を暗号化し、より長いキーを使用する方がよい。

for(int i=0; i<ptArray.length; i+=5)は、配列内の5番目の文字をすべて検索します。 (変数iへの代入を忘れないでください)。

新しい文字だけの配列を必要としない限り、1つの配列のみを使用します。最初の配列である古いレターセットを上書きします。

更新

あなたはこの

まず行うことができる2つの方法があります(そうで0,4,9,14 ...と)アレイ内のすべての第五のインデックスを通じてループし、 オリジナルのの配列を変更してください。

for(int i=0; i < myArray.length; i+=5){ 
    myArray[i] = ...what to change to here.. 
} 

第二には:新しい配列にすべての値をコピーし、すべての5番目の要素を変更します。

char[] newArray = new char[oldArray.length]; 
    for(int i = 0; i < oldArray.length; i++) { 
     if(i % 5 == 0) { //Every 5th element 
      newArray[i] = ...what to change to here...; 
     } else { 
      newArray[i] = oldArray[i]; 
       } 
} 
+0

ああ、これは私が試みたものです(私のポストで '='を忘れてしまった、今修正されました)が、変更されていない文字は表示されませんでした。おかげで、配列の上書きはうまくいきますが、それはまだ最初の文字から厄介なものです。 – TabulaRasa

+0

2つの方法でアップデートを追加しました。 – heniv181

+1

@ heniv181あなたのコードの書式を修正しましたが、将来このサイトで呪いの言葉を使用しないようにしてください。あなたはここで専門的に行動することが期待されます。 – Magisch

1

あなたがモジュラスを使用し、まだすべての文字を処理しますが、あなただけはループのためにあなたを変えることができる5番目の文字をシフトしたい場合:

for(int i=0; i < ptArray.length; i++){ 
    if(i%5 == 0){ 
     // Shifting the array code. 
    } 
    // Other character counting code. 
} 

をあなたがしようとしているものですに得るには?

+0

これはまだ私に '(I = 0をint型I + 5;;私はptArray.lengthを<)' と同じ結果を与えている2ずれたときに "CH" になり、それはシフトの "、 "ABCDEFGHIJ" a 'と' f '。その例では、変更されていない文字も表示しながら、 'e'と 'j'をシフトしようとしています。 – TabulaRasa

+0

変更されていない文字を新しい配列にコピーしましたか? – heniv181

+0

私は今、 'i + = 5'と同じですが、配列を上書きすると変更されない文字が保持されます。最初の文字は開始点のままですので、代わりに6番目の文字になります。 – TabulaRasa

関連する問題