Blatt 3, Aufgabe 3.2

CäsarChiffre

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Blatt 3, Aufgabe 3.2
Bin gerade an der Aufgabe, dachte im ersten Moment die ist ganz einfach, aber vermutlich denke ich nur viel zu kompliziert.
Und zwar das mit dem Rechnen und nach LInks und Rechts rutschen ist ja quasi im Hinweis gegeben, wie man das machen sollte…
DIe Schwierigkeiten liegen ja darin, wenn die SHIFT Zahl so groß bzw. klein ist, dass man vom Anfang zum Ende oder umgekehrt rennen muss, weil man ja nur zwischen A und Z oder eben a und z rutschen darf…
Ich hab mir dann die ASCII Tabelle angeschaut und alle Zeichen haben ja eine Reihenfolge: Zeichen1, Zeichen2, usw…
und habe mir dann mit Zahlenstrahlen farbig markiert (ähnlich wie damals in der Schule als man INTERVALLE erklärt bekommen hat) und mit Termen versucht, durch die Zahlen SHIFT den IN-Wert auf den OUT-Wert zu kommen…
Wenn ich Beispiels Buchstaben wähle und mein Programm mit den sehr vielen if/else Anweisungen gehe kommt auch rein logisch die richtige Stelle raus, und wenn man in der Tabelle nachsieht, das richtige Zeichen…
Einige Werte stimmen sogar, EST sagt richtig (auch das Negative ist korrekt), aber manchmal heißt es: Output falsch…

Vermutlich denke ich viel viel viel zu kompliziert bei der Aufgabe :frowning:

achja: und eine weitere Schwierigkeit ist ja eben, falls SHIFT größer/kleiner als (+26) oder eben (-26) ist und man quasi periodisch MEHRFACH die Intervalle durchlaufen muss…


http://de.wikipedia.org/wiki/Division_mit_Rest
Außerdem kann man mit Buchstaben rechnen.

Test1
ich habe ne Frage zum ersten Testfall. Unzwar wird ja ein zweites mal mit den Eingaben (shift,output, tmp) getestet und dabei kommt wieder der input “Hallo Welt” heraus. Soll das immer so sein oder ist das nur eine Ausnahme?

@Test(timeout = 100)
	public void testRoundTripWithShift13() throws Exception {
		char input[] = "Hallo Welt".toCharArray();
		char input_ref[] = "Hallo Welt".toCharArray();
		char output[] = "Unyyb Jryg".toCharArray();
		char output_ref[] = "Unyyb Jryg".toCharArray();
		char tmp[] = new char[input.length];
		int shift = 13;
		Caesar.encrypt(shift, input, tmp);
		assertArrayEquals("Do not change input!", input_ref, input);
		assertArrayEquals("Output incorrect!", output_ref, tmp);
		Caesar.encrypt(shift, output, tmp);
		assertArrayEquals("Do not change input!", output_ref, output);
		assertArrayEquals("Output incorrect!", input_ref, tmp);
	}

Wenn um zweimal um 13 geshiftet wird, kommt der Input wieder heraus - unser Alphabet hat 26 Buchstaben, zweimal 13 heisst also wir sind wieder am Anfang! (Siehe auch: http://de.wikipedia.org/wiki/ROT13 )
Wenn shift % 13 != 0 ist, kommt nach zweimaligem encrypt wahrscheinlich was anderes raus.