Erste Schritte Caesar - Code Verbesserung

JavaUndC-Prog

Bekanntes Mitglied
Hi Leute,

ich habe gerade die Caesar Verschlüsselung selbst programmiert. Eigentlich dürfte alles funktionieren. Ich würde dennoch gerne Kritik von Euch bekommen, was kann man besser machen...

Danke!

Code:
Java:
public class Caesar {
    public static void main(String[] args){
        int schlüssel_länge = 4;
        String[] alpha = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"
                , "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v"
                , "w", "x", "y", "z"};
        //String[] eingangsText = {"v", "w", "x"};   
        String[] eingangsText = "hallo peter mueller".split("");
       
        String[] ausgangsText = new String[100];
       
        for(int i = 0; i < eingangsText.length; i++){
            for(int j = 0; j <= 25; j++){
                if(eingangsText[i].equals(alpha[j])){
                    if(j+schlüssel_länge>25){
                        int p = j+schlüssel_länge;
                        int pp = p-25;
                        ausgangsText[i] = alpha[pp-1];
                    }else{
                        ausgangsText[i] = alpha[j+schlüssel_länge];
                    }
                }
               
            }
        }
        for(int index = 0; index < eingangsText.length; index++){
            if(ausgangsText[index] == null){
                System.out.print(" ");
            }else{
                System.out.print(ausgangsText[index]);
            }
           
        }
    }
}
 
Wie ist dein Ausgangstext auf 100 beschränkt?
Was passiert mit spaces?
Ein Char kann durch eine Nummer repräsentiert werden. Diese kann addiert werden, dadurch würdest du dein Array mit dem Alphabet sparen
Auch mit den Schleifen machst du es dir dann viel leichter.

Wenn du dich für die neuen Java 8 Features interessierst könntest du dir bei dem Thema auch mal Streams anschauen.

Grossbuchstaben und Sonderzeichen wären natürlich auch noch interessant. Wenn die auch verarbeitet werden.

Zum Spass mal deine Funktionalität mit Java 8 hingehackt.

Java:
public class Caesar {


    public static void main(String[] args) {

        int cipher = 4;
        "hallo peter mueller".chars().map(n -> n >= 'a' && n <= 'z' ? ((n-'a'+cipher)%26)+'a' : n).forEach(n -> System.out.print((char)n));
    }
}
 
Hi JavaUndC-Prog,
dein Ansatz ist ja schon richtig, aber da du ja nach Verbesserungsvorschlägen gefragt hast, hier mal der ein oder andere 😉
Java:
public class Caesar {

    public static void main(String[] args) {
        int schlüssel_länge = 4;
        char[] eingangsText = "hallo peter mueller".toUpperCase().toCharArray();
        System.out.println("Ausgabe Array: " + Arrays.toString(caesar(eingangsText, schlüssel_länge)));
    }
  
    public static char[] caesar(char[] array, int verschiebung){
        System.out.println("Eingabe Array: " + Arrays.toString(array));
        for (int i = 0; i < array.length; i++) {
          
            if (array[i] >= 'A' && array[i] <= 'z') {
                array[i] =  (char) ((array[i] - 'A' + verschiebung) % 26 + 'A');
            }
            //Testausgabe der Verschlüsselung
            //System.out.print(array[i]);
        }
        return array;
    }
}
Ich würde das zu verschlüsselnde Array nicht mit Hilfe eines Arrays, bestehend aus den Buchstaben des Alphabets verschlüsseln, sondern die verschlüsselten Werte berechnen lassen.
Diese ist in dem Fall nicht nur speicher-effizienter, sondern auch laufzeitmäßig, da eine komplette Schleife wegfällt.
Solltest du den Inhalt des alten Arrays nicht mehr benötige, so kannst du, wie ich es getan habe, direkt das Array ändern, ohne ein zusätzliches Array zu benötigen. Du kannst natürlich auch in der Methode
Code:
caesar(char[] array, int verschiebung)
ein lokales Array dazu anlegen und dieses danach zurückgeben, solltest du die Werte des alten Arrays weiterhin benötigen.
Wichtig ist meiner Meinung nach vor allem, dass du die Werte des Arrays als (char) carstest, damit der Compiler diese als "Zahlen" ansieht und damit rechnen kann. Ein 'A' wäre bspw. 65 und ein 'z' wäre 122 => ...,A,.....,Z,a.....z,...
Du kannst ja einfach mal ein bisschen mit der Zeile
Java:
array[i] =  (char) ((array[i] - 'A' + verschiebung) % 26 + 'A');
herumspielen und schauen was passiert 😉
Bei Fragen, fragen!!

Gruß
Jakob
 

Zurück
Oben