Hallo zusammen,
Ich kniffel seit gestern abend an meinem (De)Chiffrieralgorithmus herum den ich als Übungsaufgabe 14 aus dem Erlenkötterbuch java - programmieren von Anfang an mache. Der Lösungsvorschlag des Buches allerdings benutzt keinen Algorithmus, von daher komme ich mit dem Buch nicht weiter. Prinzip der Dechiffrierung ist relativ einfach: es ist ein Zeichenschlüssel aus X zeichen vorhanden und die zu entschlüsselnde Botschaft wird im Muster: "2,17,13,7,8,...." angegeben, bei der Jede Zahl für das Zeichen an der angegeben Stelle steht, wobei abwechselnd von vorne nach hinten gezählt wird. Sprich in dem Beispiel 2. zeichen von vorne, 17. von hinten, 13. von vorne...
Nun hab ich die Dechiffriermaschine als Klasse umgesetzt die wie folgt vorgeht: erst wird der Zeichenschlüssel (Codesatz) übergeben, dann wird die Zu entschlüsselnde Zeichenkette (ZEZ) gesetzt und dann kann man die Methode decode() aufrufen um die ZEZ zu decodieren.
Dabei werden zuerst die Kommas gezählt und deren Postion gespeichert, dann wird versucht die Zahlen zwischen den Kommas in Integerarrays zu speichern und dann werden die gespeicherten Zahlen, welche ja die Postion der Zeichen im Codesatz angeben, decodiert und zum Lösungsstring hinzugefügt welcher dann letzten Endes als entschlüsselte Zeichenkette von decode() zurückgeliefert wird.
Das meiste funktioniert soweit, das Problem liegt in der zahl die das letzte, zu Entschlüsselnde Zeichen angibt, da es irgendwie die grenzen des Arrays sprengt, obwohl es vorher mit einer Testausgabe das richtige ergebnis liefert...
Naja hier mal der code:
Ein Testlauf liefert folgendes Ergebnis:
ZEZ.length: 25
numbers.length: 10
Komma[10]: 23
Bla 7
Durchlauf: 0
Durchlauf: 1
Durchlauf: 2
Durchlauf: 3
Durchlauf: 4
Durchlauf: 5
Durchlauf: 6
Durchlauf: 7
Durchlauf: 8
Durchlauf: 9
Durchlauf: 10
Komma[10] = 23 + 1 = 24
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at Codesystem.decode(Codesystem.java:74)
at Aufgabe14.main(Aufgabe14.java:7)
Irgendwas muss an dem Algorithmus der die Zahlen zwischen den Kommas speichert falsch sein, aber ich komm einfach nicht drauf, was... wäre für die Hilfe sehr dankbar.
Ich kniffel seit gestern abend an meinem (De)Chiffrieralgorithmus herum den ich als Übungsaufgabe 14 aus dem Erlenkötterbuch java - programmieren von Anfang an mache. Der Lösungsvorschlag des Buches allerdings benutzt keinen Algorithmus, von daher komme ich mit dem Buch nicht weiter. Prinzip der Dechiffrierung ist relativ einfach: es ist ein Zeichenschlüssel aus X zeichen vorhanden und die zu entschlüsselnde Botschaft wird im Muster: "2,17,13,7,8,...." angegeben, bei der Jede Zahl für das Zeichen an der angegeben Stelle steht, wobei abwechselnd von vorne nach hinten gezählt wird. Sprich in dem Beispiel 2. zeichen von vorne, 17. von hinten, 13. von vorne...
Nun hab ich die Dechiffriermaschine als Klasse umgesetzt die wie folgt vorgeht: erst wird der Zeichenschlüssel (Codesatz) übergeben, dann wird die Zu entschlüsselnde Zeichenkette (ZEZ) gesetzt und dann kann man die Methode decode() aufrufen um die ZEZ zu decodieren.
Dabei werden zuerst die Kommas gezählt und deren Postion gespeichert, dann wird versucht die Zahlen zwischen den Kommas in Integerarrays zu speichern und dann werden die gespeicherten Zahlen, welche ja die Postion der Zeichen im Codesatz angeben, decodiert und zum Lösungsstring hinzugefügt welcher dann letzten Endes als entschlüsselte Zeichenkette von decode() zurückgeliefert wird.
Das meiste funktioniert soweit, das Problem liegt in der zahl die das letzte, zu Entschlüsselnde Zeichen angibt, da es irgendwie die grenzen des Arrays sprengt, obwohl es vorher mit einer Testausgabe das richtige ergebnis liefert...
Naja hier mal der code:
Code:
Codesystem Aufgabe = new Codesystem("Die Zuspätgekommenen bestraft schon das Leben");
Aufgabe.setZEZ("2,14,33,6,13,8,18,1,4,2,7");
System.out.println(Aufgabe.decode());
Code:
public class Codesystem extends Aufgabe14 {
String Codesatz;
String ZEZ = "";
String ZVZ = "";
// Konstruktor
public Codesystem(String codesatzargkonstruktor){
setCodesatz(codesatzargkonstruktor);
}
// Get & Set
public void setCodesatz(String codesatzarg){
Codesatz = codesatzarg;
Codesatz.toUpperCase();
}
public String getCodesatz(){
return Codesatz;
}
public void setZEZ(String ZEZarg){
ZEZ = ZEZarg;
}
public String getZEZ(){
return ZEZ;
}
public void setZVZ(String ZVZarg){
ZVZ = ZVZarg;
}
public String getZVZ(){
return ZVZ;
}
// Decode with Codesatz
public String decode(){
String Decodedstring = "";
int[] Komma = new int[ZEZ.length()];
int KIndex = 1;
Komma[0] = 0;
int i = 1;
// count kommas
while (i < ZEZ.length()){
if(ZEZ.charAt(i - 1) == ','){
Komma[KIndex] = i - 1;
KIndex += 1;
}
if (i < ZEZ.length())
i +=1;
}
int[] numbers = new int[KIndex - 1 ];
System.out.println("ZEZ.length: " + ZEZ.length()); //Testausgabe
System.out.println("numbers.length: " + numbers.length); //Testausgabe
System.out.println("Komma[10]: " + Komma[10]); //Testausgabe
System.out.println("Bla " + ZEZ.substring(24 ,ZEZ.length())); //Testausgabe
Schleifeii:
for (int ii = 0; ii <= numbers.length; ii++){
switch(ii){
case 0:
numbers[ii] = Integer.parseInt(ZEZ.substring(Komma[0],Komma[ii+1]));
numbers[ii] -= 1;
System.out.println("Durchlauf: " + ii); //Testausgabe
}
if(ii <= numbers.length && ii != 0){
try {
System.out.println("Durchlauf: " + ii);
if (ii == numbers.length){
System.out.println("Komma[" + ii + "] = " + Komma[ii] + " + 1 = " + (Komma[ii]+1) ); //Testausgabe
numbers[ii] = Integer.parseInt(ZEZ.substring(Komma[ii] + 1,ZEZ.length()));
numbers[ii] -= 1;
break Schleifeii;
}
numbers[ii] = Integer.parseInt(ZEZ.substring(Komma[ii] + 1,Komma[ii+1]));
numbers[ii] -= 1;
}
catch(java.lang.NumberFormatException e) {
System.out.println("Die zu entschluesselnden Zahlen wurden nicht korrekt eingegeben!");
}
}
}
for(int iii = 0; iii < numbers.length; iii++){
if (iii%2 == 0)
Decodedstring = Decodedstring.concat(Codesatz.charAt(numbers[iii]) + " ");
else
Decodedstring = Decodedstring.concat(Codesatz.charAt((Codesatz.length()-1) - numbers[iii]) + " ");
}
return Decodedstring;
}
}
Ein Testlauf liefert folgendes Ergebnis:
ZEZ.length: 25
numbers.length: 10
Komma[10]: 23
Bla 7
Durchlauf: 0
Durchlauf: 1
Durchlauf: 2
Durchlauf: 3
Durchlauf: 4
Durchlauf: 5
Durchlauf: 6
Durchlauf: 7
Durchlauf: 8
Durchlauf: 9
Durchlauf: 10
Komma[10] = 23 + 1 = 24
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at Codesystem.decode(Codesystem.java:74)
at Aufgabe14.main(Aufgabe14.java:7)
Irgendwas muss an dem Algorithmus der die Zahlen zwischen den Kommas speichert falsch sein, aber ich komm einfach nicht drauf, was... wäre für die Hilfe sehr dankbar.