Frage zu meinem Code

te-knohi

Grünschnabel
Hallo,

ich bin blutiger Anfänger und finde meinen Fehler nicht. Wäre nett, wenn mir jemand meinen Fehler mitteilen könnte, wenn er ihn findet. Vielen Dank schon mal im Voraus

Java:
import java.util.*;



public class caesar {



public static void main(String args[]) {

Scanner input = new Scanner(System.in);

       

       

        char[] alphabet = { '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' };

       

        //Text erfassen

        System.out.println("Bitte den Text zum verschlüsseln eingeben: ");

        String text = input.nextLine();

       

        //Den Text in ein char Array umwandeln

        char[] textArray= text.toCharArray();



        //Schlüssel erfassen

        System.out.println("Bitte einen Schlüssel zum verschlüsseln eingeben: ");

        int key = input.nextInt();

       

        //mod27 von dem eingegebenen Schlüssel berechnen, damit Zahlen größer 26 kein Problem darstellen

        key = key % 27;

       

        //neues leeres Array zu speicher des verschlüsselten Text

        char[] cryptArray = new char[textArray.length];

       

        //for Schleife, welche das cryptArray mit dem verschlüsselten Text füllen soll

        for(int i = 0; i < textArray.length; i++){
              cryptArray[i] = verschluesseln( textArray, key, i, alphabet);
        }

       

        //Ausgabe des verschlüsselten Text

        System.out.println(cryptArray);

       

        //Schlüssel zum entschlüsseln erfassen

        System.out.println("Bitte einen Schlüssel zum entschlüsseln eingeben: ");

        int key2 = input.nextInt();

       

        //mod27 von dem eingegebenen Schlüssel berechnen, damit Zahlen größer 26 kein Problem darstellen

        key2 = key2 % 27;

       

        //neues leeres Array zu speicher des ggf. entschlüsselten Textes

        char[] clearArray = new char[cryptArray.length];

       

        //for Schleife, welche das clearArray mit dem ggf. entschlüsselten Text füllen soll

        for(int i = 0; i < cryptArray.length; i++){
                  clearArray[i] = entschluesseln( cryptArray, key2, i, alphabet);
        }

       

        //Ausgabe des ggf. entschlüsselten Text

        System.out.println(clearArray);

       

       

        input.close();

}




//Methode zum verschlüssen des Textes

private static char verschluesseln(char[] textArray, int key, int i, char[] alphabet) {
      char letter;
      int positionAlphabet = findePostionVerschluesseln(textArray, alphabet, i);
      int position = key + positionAlphabet;
      if (position > 26){
            int a = position - 26;
            letter = alphabet[a];
      }else{
            letter = alphabet[position];
      }
      return letter;
}


//Methode zur Bestimmung der Position des Buchstaben im Alphabet

private static int findePostionVerschluesseln(char[] textArray, char[] alphabet, int i) {
      int testPos = 0;
      while(testPos < alphabet.length){
            if(alphabet[testPos] == textArray[i]){
                  return testPos;
            }
            testPos = testPos + 1;
      }
      return -1;
}


private static char entschluesseln(char[] cryptArray, int key2, int i, char[] alphabet) {
      char letter;
      int positionAlphabet = findePostionEntschluesseln(cryptArray, alphabet, i);
      int position = positionAlphabet - key2;
      if (0 > position){
            int a = 26 + position;
            letter = alphabet[a];
      }else{
            letter = alphabet[position];
      }
            return letter;
      }

private static int findePostionEntschluesseln(char[] cryptArray, char[] alphabet, int i) {
      int testPos = 0;
      while(testPos < alphabet.length){
            if(alphabet[testPos] == cryptArray[i]){
                  return testPos;
            }
           testPos = testPos + 1;
      }
      return -1;
}
}
 

sheel

I love Asm
Hi

es wäre hilfreich zu sagen, warum du denkst dass du einen Fehler hast.
Gibt es eine Fehlermeldung? Welche?
Macht das Programm etwas falsches? Was? Was soll es anders machen?
...
 

te-knohi

Grünschnabel
eclipse gibt diese folgende Meldung aus:
"Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 26

at caesar.verschluesseln(caesar.java:72)

at caesar.main(caesar.java:33)"
 

vfl_freak

Premium-User
Moin,

zumindest stimmen die geposteten Zeilennummern NICHT mit der Fehlermeldung überein !!
Zeile 72 ist in der Main und zudem leer :(
An der Methode "verschluesseln" ist mir so aus dem Stand nichts aufgefallen.

Welchen konkreten Text udn Schlüssel hast Du eingegeben ??

Gruß Klaus
 

te-knohi

Grünschnabel
Sorry darauf hab ich nicht geachtet. Hier handelt es sich um Zeile 126 anstatt 72 und 69 anstatt 33.

Die Meldung erscheint bei egal welchem Text nach der Eingabe eines beliebigen Schlüssels
 

vfl_freak

Premium-User
In dem Zusammenhang ist mir aufgefallen:
- erster Schlüssel "%26", zweiter Schlüssel "%27"
- bei Ver- und Entschlüssel dann jedesmal '26'

Ist das wirklich so gewollt ??
 

HonniCilest

Erfahrenes Mitglied
Grundsätzlich denke ich, dass die 0- bzw. 1-Basierung hier dein Problem ist, du bist nicht konsistent.

Ansonsten finde ich deinen Code an einigen Stellen recht unübersichtlich, daher folgende Fragen:
1) Warum hast du bei den findePosition-Methoden dieses while-Konstrukt anstatt einer for-Schleife?
2) Warum übergibst du textArray bzw. cryptArray incl. Index anstatt direkt textArray[index][I] bzw. cryptArray[index][I]?
3) Wieso hast du diese "Aufwendigen" Methoden zur Bestimmung der Position im Alphabet anstatt der Verwendung von char-Eigenschaften? Du könntest dir damit das gesamte charArray sparen.
Java:
int pos = textArray[i] - 'a' // +1 je nach 0 oder 1 basiert
4) sowas schreib doch besser in einer Zeile
Java:
int a = 26 + Position;
letter = alphabet[a];
//letter = alphabet[26 + Position];