# Programm liefert bei zweitem Durchlauf anderes Ergebnis



## helkom (14. Jun 2014)

Hallo,

heute wage ich mal mir bei meiner Hausaufgabe eine kleine Hilfestellung geben zu lassen. Mein Programm ist eigentlich schon fertig und läuft. Bei genauerem Testen ist mir aber noch ein Problem aufgefallen, was mich daran hindert die Aufgabe abzugeben. Bestimmt ist es nur eine Kleinigkeit. (hoffentlich...) 

*Was das Programm tun soll:*
Wahlweise entschlüsseln oder verschlüsseln für beliebige Schlüsselworte und Texte. (Verschlüsselungsverfahren durch Zweifachsubstitution nach Blaise de Vigenére und Tritemius)
Die Aufgabe wurde hier (etwas weiter unten) schonmal in voller länge gepostet.

*Mein Problem:*
Im ersten Durchlauf tut es was es soll. Im zweiten Durchlauf entschlüsselt das Programm trotz gleicher Angaben anders. Erst dachte ich es liegt daran, dass die Variable "index" nach jeden Durchlauf wieder auf 0 gesetzt werden muss, aber das hat auch nicht geklappt. 
Eingabe
   LMVSNIYZSJCCUFUPOJHJQZXVGTEEGJLBRPNVYVZGUQRENGKGZESQMGXPAFKQFSMPFSUOWK

Ausgabe 1. Durchlauf (richtig)
   DASHABENSIEABERSEHRSCHOENGEMACHTSIESINDJASCHONEINRICHTIGERINFORMATIKER

Ausgabe 2. Durchlauf(falsch)
   VSKZSTWFKAWSTWJKWZJKUZGWFYWESUZLKAWKAFVBSKUZGFWAFJAUZLAYWJAFXGJESLACWJ

*Zum Code:*
Habe nur den betreffenden Code mit seinen zwei Methoden zum Verschlüsseln gepostet und die Eingaben vorbelegt, damit der Freund und Helfer der sich hier hoffentlich finden wird, es übersichtlicher und einfacher hat.

Danke im Voraus für jeden Hinweis!


```
import inout.Console;
public class GeheimschriftenTest
{
    private static char abc = 65;      //Um ASCII-Zeichen beginnend mit "A" zu durchlaufen
    private static int index = 0;      //Codetext-Index getrennt durchlaufen
    private static final char A = 65;      //Beginn des Alphabets
    private static final char Z = 90;      //Ende   des Alphabets
    
    //Hauptprogramm*****************************************************************************************
    public static void main (String args[]) {
        for(;;){      // Auswahldialog mit Abbruchmöglichkeit
            System.out.println("\nWählen Sie bitte aus:");
            System.out.println("1: Ich will einen Text VERschlüsseln");
            System.out.println("2: Ich will einen Text ENTschlüsseln");
            char auswahl = Console.readChar();
            if(auswahl == '9') {break;}
            switch(auswahl){
                case '1': textEntschluesseln(); break;
                case '2': textEntschluesseln(); break;
                default: System.out.println("Keine gültige Eingabe. Wählen Sie Zwischen Möglichkeit 1, 2 oder brechen Sie mit '9' ab");
                continue;
                }  
        }
        System.out.print("Ende des Programms");
    }//Ende Hauptprogramm*****************************************************************************************
    
    public static void textEntschluesseln() {
        System.out.println("\nSchlüsselwort:");
        char []schluessel = Console.readCharArray();
        
        System.out.println("Text:");
        char []codetext = Console.readCharArray();
       
        System.out.println("Entschlüsselter Text:");         //Klartext ausgeben
        wandleInKlartext(schluessel, codetext);
        System.out.println();
    }        
    
    
    public static char[] wandleInKlartext(char []schluessel, char []codetext) {
        char klartext[] = new char[codetext.length]; 
        for(int i = 0; i < codetext.length; i++){                   //codetext durchlaufen
           klartext[index] = (char)(codetext[i] - schluessel[index] + abc);
           if(klartext[index] > Z){                                 //Abfrage auf Überschreitung des Alphabets 
                klartext[index] = (char)(klartext[index] - 26);     //Zurücksetzen um 26 Zeichen bei Überschreitung von "Z"
           } else if (klartext[index] < A) {
                klartext[index] = (char)(klartext[index] + 26);     //Vorsetzen um 26 Zeichen bei Unterschreitung von "A"
           }
           System.out.print(klartext[index]);
           if(abc < 90) abc++; else abc = 65;
           if(index != schluessel.length-1)index++; else index = 0; //Schlüsselwort von vorne durchlaufen wenn Ende erreicht
        }
        return klartext;
    }     
}
```


----------



## eMmiE (14. Jun 2014)

Das Problem liegt meiner Ansicht darin, dass du nach einmaligem Entschlüsseln die Variable abc nicht auf 65 setzt, sondern mit dem letzten Wert (65 + Wortlänge) wieder-ent/ver-schlüsselst

Gruß eMmiE


----------



## helkom (14. Jun 2014)

Grrr, wie blöd, dass ich das nicht probiert habe. Deshalb sollte man zu bestimmten Uhrzeiten doch lieber im Bett sein... :gaen: Danke für den Hinweis!

Es ändert sich was, löst das Problem aber leider noch nicht. 

Mit zurücksetzen auf abc=0 und index=0, ist die Ausgabe mit jedem Durchlauf:

```
,!8',"5+,8!+,6;B8':8&46;-F<8FVAQ=NFP;BAR<AEVPUGVTREVASBEZNGVXRE
```

Wenn ich nur auf abc = 0 zurücksetze, ist die Ausgabe ebenfalls mit jedem Durchlauf:

	
	
	
	





```
,!8',"5+,8!+,6;B8':8&46;-F<8FVAQ=NFP;BAR<AEVPUGVTREVASBEZNGVXRE
```

Wenn ich nur auf index= 0 zurücksetze, ist die Ausgabe mit jedem Durchlauf eine andere:

```
DASHABENSIEABERSEHRSCHOENGEMACHTSIESINDJASCHONEINRICHTIGERINFORMATIKER
VSKZSTWFKAWSTWJKWZJKUZGWFYWESUZLKAWKAFVBSKUZGFWAFJAUZLAYWJAFXGJESLACWJ
NKCRKLOXCSOKLOBCORBCMRYOXQOWKMRDCSOCSXNTKCMRYXOSXBSMRDSQOBSXPYBWKDSUOB
...
```


Ich probier mich mal noch ne Weile daran aus. 
Mir sind die Zusammenhänge jedoch nicht ganz klar, warum ich verschiedene Variablen als Index für meine Felder einsetzen musste, damit mein erster Durchlauf funktioniert, und auch nicht ob das der Königsweg ist. Ich habe es einfach so gelassen, als mir beim ausprobieren aufgefallen ist, dass so das richtige raus kommt.  Von daher kann es noch lange dauern bis ich drauf komme. Aber ich gebe Bescheid wenn ich auf etwas (mehr Klarheit) stoße!

Hier nochmal der Code im jetzigen Zustand, falls noch wer reingucken will: 

[Java]
import inout.Console;
public class GeheimschriftenTest
{
    private static char abc = 65;      //Um ASCII-Zeichen beginnend mit "A" zu durchlaufen
    private static int index = 0;      //Codetext-Index getrennt durchlaufen
    private static final char A = 65;      //Beginn des Alphabets
    private static final char Z = 90;      //Ende   des Alphabets

    //Hauptprogramm*****************************************************************************************
    public static void main (String args[]) {
        for(;{      // Auswahldialog mit Abbruchmöglichkeit
            System.out.println("\nWählen Sie bitte aus:");
            System.out.println("1: Ich will einen Text VERschlüsseln");
            System.out.println("2: Ich will einen Text ENTschlüsseln");
            char auswahl = Console.readChar();
            if(auswahl == '9') {break;}
            switch(auswahl){
                case '1': textEntschluesseln(); break;
                case '2': textEntschluesseln(); break;
                default: System.out.println("Keine gültige Eingabe. Wählen Sie Zwischen Möglichkeit 1, 2 oder brechen Sie mit '9' ab");
                continue;
                }  
        }
        System.out.print("Ende des Programms");
    }//Ende Hauptprogramm*****************************************************************************************

    public static void textEntschluesseln() {
        System.out.println("\nSchlüsselwort:");
        char []schluessel = "INFORMATIK".toCharArray();

        System.out.println("Text:");
        char []codetext = "LMVSNIYZSJCCUFUPOJHJQZXVGTEEGJLBRPNVYVZGUQRENGKGZESQMGXPAFKQFSMPFSUOWK".toCharArray();

        System.out.println("Entschlüsselter Text:");         //Klartext ausgeben
        wandleInKlartext(schluessel, codetext);
        System.out.println();
    }        


    public static char[] wandleInKlartext(char []schluessel, char []codetext) {
        char klartext[] = new char[codetext.length]; 
        for(int i = 0; i < codetext.length; i++){                   //codetext durchlaufen
           klartext[index] = (char)(codetext_ - schluessel[index] + abc);
           if(klartext[index] > Z){                                 //Abfrage auf Überschreitung des Alphabets 
                klartext[index] = (char)(klartext[index] - 26);     //Zurücksetzen um 26 Zeichen bei Überschreitung von "Z"
           } else if (klartext[index] < A) {
                klartext[index] = (char)(klartext[index] + 26);     //Vorsetzen um 26 Zeichen bei Unterschreitung von "A"
           }
           System.out.print(klartext[index]);
           if(abc < Z) abc++; else abc = A;
           if(index != schluessel.length-1)index++; else index = 0; //Schlüsselwort von vorne durchlaufen wenn Ende erreicht
        }
        index = 0;
        abc = 0;
        return klartext;
    }     
}
[/Java]_


----------



## helkom (14. Jun 2014)

Oh man ist das peinlich... 
abc gehört natürlich auf 65 für 'A' gesetzt und nicht auf 0. Sorry. Aber wenn ich Probleme habe, dann sind es immer solche vom Kaliber blöd... :bloed:


----------

