2016-04-12 5 views
0

Ich versuche, ein Caesar-Shift-Programm zu ändern, um nicht jedes Zeichen in einem Array zu verschieben, sondern jedes fünfte Zeichen zu sagen. Gegenwärtig können Zeichen in ein Textfeld eingegeben werden, das dann in ein Array konvertiert wird und jedes Zeichen um was auch immer verschoben wird, was auch immer der shiftAmount (Key) ist (wie zu erwarten ist). "abc" --by2 -> "cde".Wie verschiebt man jedes 'n-te' Zeichen in einem Array?

Ich probierte (int i=0; i<ptArray.length; i+=5), was dazu führt, dass jedes fünfte Zeichen (einschließlich des ersten) verschoben wird. Es scheint aber auch, dass nur diese Zeichen gezählt werden und somit keine anderen Zeichen im Array angezeigt werden. Kann ich eine Änderung an der Schleife vornehmen, um dies zu erreichen? Im Idealfall „abcdefghij“ mit jedem fünften Buchstaben verschoben von 2 würde als „ABCD g fghi l“ mit einem Multi

Ich versuche, um einen anderen Betrag gleichzeitig durch Verschieben jedes Zeichens eine sicherere Chiffre machen anzuzeigen -integer Schlüssel. Jede Hilfe würde sehr geschätzt werden.

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; 

Antwort

2

So machen Sie einen Vigenère chiper für nur einige Buchstaben in der Nachricht. Besser, alle Buchstaben zu verschlüsseln und einen längeren Schlüssel zu verwenden.

for(int i=0; i<ptArray.length; i+=5) Schritt durch jeden fünften Buchstaben im Array. (Vergessen Sie nicht die Zuweisung an die Variable i).

Verwenden Sie nur ein Array, es sei denn, Sie möchten ein Array mit nur den neuen Buchstaben. Überschreibe die alten Buchstaben im ersten Array.

aktualisiert

Es gibt zwei Möglichkeiten, wie Sie diesen

Erstes tun können: Loop durch jeden 5. Index im Array (0,4,9,14 ... und so weiter), und Ändern Sie diesen Buchstaben im ursprünglichen Array.

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

Zweitens: Kopieren alle die Werte in ein neues Array, und jedes fünfte Element ändern.

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

Ah, das habe ich ausprobiert (vergaß das "=" in meinem Post, behoben), aber es zeigte nicht die unveränderten Zeichen. Danke, das Überschreiben des Arrays funktioniert - obwohl es immer noch vom ersten Zeichen ausgeht. – TabulaRasa

+0

Ein Update mit den zwei Möglichkeiten hinzugefügt, die man machen kann. – heniv181

+1

@ heniv181 Ich habe Ihre Code-Formatierung korrigiert, aber bitte verwenden Sie in Zukunft keine Schimpfwörter auf dieser Seite. Von Ihnen wird erwartet, dass Sie sich hier professionell verhalten. – Magisch

1

Wenn Sie möchten, dass nach wie vor auf jedes Zeichen bedienen, sondern nur das fünfte Zeichen verschieben Sie Ihre for-Schleife ändern könnte mit einem Modul zu verwenden:

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

Ist das, was Sie versuchen, kommen?

+0

Dies ist immer noch mir das gleiche Ergebnis wie geben '(int i = 0; i TabulaRasa

+0

Haben Sie die unveränderten Zeichen in das neue Array kopiert? – heniv181

+0

Ich tat es jetzt, es ist das gleiche wie 'i + = 5', aber das Überschreiben des Arrays behält die unveränderten Zeichen. Der erste Charakter bleibt sein Ausgangspunkt, so dass er stattdessen jeder 6. Buchstabe wird. – TabulaRasa