Frage von lebene, 23

Wie komm ich beim ASCII Code direkt von Z zu A?

Guten Tag,

ich habe folgende Aufgabe:

"Eine einfache und alte Verschlüsselungmethode für Texte ist die Caesar-Verschlüsselung. Ausgangspunkt ist ein Buchstabe b und ein Schlüssel k ∈ N. Das Verfahren arbeitet so, dass der Buchstabe durch den Buchstaben ersetzt wird, der k Buchstaben weiter im Alphabet erscheint. Dabei ist zu beachten, dass beim “Hinauslaufen“ über Z mit A weiter gezählt wird. Der nächste Buchstabe nach Z ist also A. Beispiel: b = H und k = 1 ergibt als Ergebnis I. Schreiben Sie ein Java-Programm Caesar, das für einen Schlüssel k mit k ∈ N (also z.B. k = 100) und einen Großbuchstaben b den verschlüsselten Großbuchstaben auf dem Bildschirm ausgibt. Die beiden Argumente werden über die Tastatur dem Programm übergeben, zuerst der Schlüssel k in einer Zeile und anschließend der Buchstabe b in einer Zeile. Die Ausgabe besteht nur aus dem kodierten Resultatbuchstaben zu Beginn der Ausgabezeile gefolgt von einem Zeilenumbruch. Beispiel: Für die Eingabe 5 X ist die Ausgabe C Überlegen Sie sich, wie Sie mit den Hilfmitteln, die bis jetzt bekannt sind, das “Hinauslaufen“ geeignet behandeln können. Nutzen Sie Eigenschaften der Zeichencodierung aus sowie geeignete arithmetische Operationen. Wie könnte die Dekodierung funktionieren? Hinweise: Modulo-Operation, Zeichen - ’A’, Typumwandlung zwischen int und char."

Ich bin schon so weit, dass der Buchstabe sich ändert je nachdem wie die Zahl ist. Aber ich habe noch das Problem, dass ich nicht weiß wie ich das "Hinauslaufen" programmieren kann. Kann mir da jemand helfen?

Vielen Dank im Voraus und freundliche Grüße, Lebenne.

Expertenantwort
von martin7812, Community-Experte für programmieren, 23

Ich würde es so machen:

char buchstabe = ...
int n = (int)buchstabe - (int)'A';
n = (n + k) % 26;
char ergebnis = (char)((int)'A' + n);

Grüße

Martin

Kommentar von TeeTier ,

Noch einfacher: Ich würde k auf 26 als Anforderung festlegen, und mir weitere Mühen sparen. :)

Das hat dann die typischen KISS Vorteile: Es ist leicht wartbar, die Dokumentation wird knapp gehalten, die Unit-Tests bleiben überschaubar, und neue Entwickler müssen nicht erst lange eingearbeitet werden:

char ceasar26(const char c) {
return c;
}

Ganz zu schweigen von der Laufzeit-Effizienz im Bezug auf Geschwindigkeit und Speicherverbrauch.

Tja, SO entwickelt man Software heutzutage! :)

Keine passende Antwort gefunden?

Fragen Sie die Community