# Cäsar-Chiffre + formale Parameter



## alexg1990 (12. Aug 2015)

Hey,
habe vor kurzem damit angefangen JAVA zu lernen und versuche dabei Übungsaufgaben zu bewältigen, komme jedoch nicht wirklich weiter und wollte fragen, ob mir vllt jemand kurz helfen kann.

Die Aufgabe lautet mit Hilfe von Arrays, Klassenmethoden und Schleifen die Cäsar-Chiffre zu implementieren. Bisher habe ich folgenden Code geschrieben:


```
import Prog1Tools.IOTools;

public class CesarCipher {
   public static void printMessage(char [] array){
     for (char i : array) {
       System.out.println(i + " ");
     }
   }
   public static char[] readChars(int k){
     int i = IOTools.readChar("Wie lang ist ihr Wort?");
     char[] wort = new char [I];
     for (int l = 0; l<i;l++){
       wort[l] = IOTools.readChar("Welcher Buchstabe für Position" + l + "?");
     }
     return wort;
   }
   public static void shift(char[]array,int m){
     int eingabe = IOTools.readInt("Text");
     
   }

}
```

Im nächsten Schritt soll in der Methode shift die Verschlüsselung durchgeführt werden. Dazu soll aus dem char-Array bei Eingabe eines int-Wertes das verschlüsselte char-Array werden. "Es soll das übergebene Array verändert und kein neues erzeugt werden".

Meine Frage/n:
- Ich gehe davon aus, das die Formulierung, welche ich in Anführungszeichen gesetzt habe, darauf abziehlt das Array aus der Methode readChar in die Methode shift zu übertragen. Wie funktioniert dies? Die Variable "wort" einfach zu verwenden würde nicht funktionieren, da diese Variablen ja nicht methodenübergreifend fungieren.
- Des Weiteren wollte ich fragen, ob jemand mir erklären könnte welchen nutzen der formale Parameter besitzt. Bei der Methode readChars bspw. handelt es sich um den formalen Parameter "int k", allerdings wird im folgenden kein Bezug mehr auf die Variable "k" genommen und es ist auch nicht so, als würden nurnoch int-variablen folgend - auch char-Variablen sind vorhanden.

Vielen Dank für jegliche Hilfe![/I]


----------



## JStein52 (12. Aug 2015)

Ich verstehe deine Fragen noch nicht ganz. Du kriegst von der Methode readChars ein Character Array zurück und dieses übergibst du beim Aufruf der Methode shift . In der Methode shift veränderst du das Array wie gewünscht
Was du mit dem Parameter k anfangen sollst ist aus deiner Beschreibung nicht ersichtlich.
In einer anderen Methode, bei mir unten "main" rufst du dann deine Methoden passend auf.



```
import Prog1Tools.IOTools;

public class CesarCipher {
public static void printMessage(char [] array){
for (char i : array) {
System.out.println(i + " ");
}
}
public static char[] readChars(int k){
int i = IOTools.readChar("Wie lang ist ihr Wort?");
char[] wort = new char[i] ; //  Achtung, in der passenden Länge anlegen !!!
for (int l = 0; l<i;l++){
wort[l] = IOTools.readChar("Welcher Buchstabe für Position" + l + "?");
}
return wort;
}

public static void shift(char[]array,int m){
int eingabe = IOTools.readInt("Text");
array[....] = <irgendwas>;

}

public static void main(String[] args) {

  char[] myArray = readChars(3);
  shift(myArray,3);
  printMessage(myArray);
  }




}
```


----------



## alexg1990 (12. Aug 2015)

Hey, erstmal danke für die Antwort!
Meine Frage bezieht sich darauf, wie rufe ich den Array in der Methode shift auf, sodass ich ihn dort verändern kann: ich gehe davon aus, dass "char [] wort = xxxx" einen neuen array anlegen würde und nicht die Werte aus der Methode readChars überträgt. 
Bzgl. des Parameters k frage ich mich, welchen Zweck "int k" erfüllt, wieso steht dort nicht "String [] arg" oder "char k" bspw.


----------



## JStein52 (12. Aug 2015)

Mal der Reihe nach:

1.) das array verwendest du in der Methode shift so wie ich es angedeutet hatte:  du kriegst es ja als Parameter mit dem Namen "array" übergeben, also greifst du auch über "array[<index>] darauf zu. Ganz einfach.
2.) zu den Parametern: wie kommst du denn auf die Signatur deiner Methoden ? hast du dir die ausgedacht oder sind die vorgegeben ? Steht vielleicht in der Aufgabenstellung etwas dazu drinnen ?


----------



## stg (12. Aug 2015)

alexg1990 hat gesagt.:


> Bzgl. des Parameters k frage ich mich, welchen Zweck "int k" erfüllt, wieso steht dort nicht "String [] arg" oder "char k" bspw.



Das hast DU doch geschrieben... 

Grundsätzlich sind das Übergabe-Parameter, falls deine Frage daraufabzielen sollte. Du übergibst der Methode einen Integer-Wert, innerhalb dieser Methode kannst du diesen dann für die weiteren Berechnungen verwenden.


----------



## alexg1990 (12. Aug 2015)

1.) Ist dies der Abschnitt, in welchem ich das array der Methode readChars an die Methode shift übergebe: "public static void shift(*char[]array*,int m)"? Werden arrays dann immer chronologisch von Methode zu methode übergeben, wenn ich diese als formalen Parameter angebe? Wieso sollte sich "char[]array" nicht auf eine andere Methode xxxx beziehen, welche vorher beschrieben wurde?
2.) Das hätte ich vermutlich dazu erwähnen sollen. In der Aufgabenstellung ist die Signatur jeweils vorgegeben, ich versuche zu verstehen weshalb ausgerechnet jene Signatur gewählt wurde - evtl. wird dies aber auch in späteren Einheiten oder am Ende der Aufgabe ersichtlich (es sind immer Teilschritte die erfüllt werden müssen für die gesamte Aufgabe, hier eben die verschlüsselung um jeweils "int x" Buchstaben (a --> c bspw. bei int 2)


----------



## JStein52 (12. Aug 2015)

Ich verstehe deinen Sprachgebrauch in dem Zusammenhang nicht, sorry. Aber ich versuche es dir nochmal zu erklären, mit einigen Kommentaren im Code, Ok ?


```
import Prog1Tools.IOTools;

public class CesarCipher {

// die folgende Methode druckt das characte3r-array das sie als Parameter übergeben kriegt auf der Konsole aus
public static void printMessage(char [] einArray){
       for (char i : einArray) {
              System.out.println(i + " ");
       }
}

// die folgende Methode fragt nach der Anzahl Zeichen und liest dann genau so viele
// von der Konsole ein und schreibt sie in ein Array (namens wort) das sie zurückliefert
public static char[] readChars(int k){
     int i = IOTools.readChar("Wie lang ist ihr Wort?");
     char[] wort = new char[i] ; //  Achtung, in der passenden Länge anlegen !!!
     for (int l = 0; l<i;l++){
            wort[l] = IOTools.readChar("Welcher Buchstabe für Position" + l + "?");
     }
     return wort;
}

// die folgende Methode verschlüsselt ein character-array das sie als Parameter namens
// array übergeben kriegt.
public static void shift(char[]array,int m){
     int eingabe = IOTools.readInt("Text");
     array[....] = <irgendwas>;

}

// die folgende Methode demosntriert den Aufruf der oben genannten Methoden !!
public static void main(String[] args) {

  char[] myArray = readChars(3);
  shift(myArray,3);
  printMessage(myArray);
  }




}
```

die Namen einArray, wort, array, myArray geben jeweils an wie die Variable in diesem Scope heisst und sind beliebeig austauschbar.


----------



## Flown (12. Aug 2015)

Kannst du bitte mal die ganze Aufgabe posten/hochladen?


----------



## alexg1990 (12. Aug 2015)

Soo.... vielen Dank erstmal für die riesige Unterstützung, ich beschäftige mich mit JAVA erst seit ein paar Tagen und habe noch keine weitere Programmiererfahrung, weshalb ich noch Probleme mit den Begrifflichkeiten habe. Die Aufgabe kann ich leider nicht hochladen, da sie vermutlich unter Copyright steht.

Die Frage mit den formalen Parametern hat sich beim Schreiben der Methode main beantwortet. Meinen Gedankengang zu erklären würde vermutlich wieder mehr Verwirrung stiften, als letzten Endes zu Antworten führen, deswegen lass ich es. 

Wie die Übergabe der arrays funktioniert leuchtet mir leider immernoch nicht ganz ein, evtl. kann ich meine Frage an einem Beispiel besser verdeutlichen:

```
public static void methode1(int a){
      char[]test1 = new  char [k];
      }
public static void methode2(int b){
     char[]test2 = new char [m];
     }
public static void shift(char[]array, int m){
     array[....] = <irgendwas>;
     }
```

Ziel war es den array test1 in die Methode shift zu übergeben. Ist dies gelungen? Wieso wurde nicht test2 übergeben?

(Wie lassen sich Forenbeiträge so formatieren, sodass der Code im blauen Kasten dargestellt wird?)

Und kann mir jemand beantworten, weshalb ich aus der Schleife nicht rauskomme und weshalb der Wert nicht zurückgegeben wird?:

```
public static int getCommand(){
     boolean wrong = false;
     while(wrong == false){
       String shift = IOTools.readString("shift or exit?");
       if(shift == "shift"){
         wrong = true;
         return 0;
       }else if(shift == "exit"){
         wrong = true;
         return 1;}
       }
}
```

Letzte Frage, dann steht der Code:
Ich möchte in der main Methode die Bedingung einführen, dass wenn in der Methode getCommand eine 1 zurückgegeben wird etwas ausgeführt wird und wenn eine 0 zurückgegeben wird etwas anderes ausgeführt wird. Wie lässt sich dies formulieren?

if getCommand() = 1{
xxxx} funktioniert vermutlich nicht.

Nochmal 1000 Dank für alle die mir geholfen haben weiterzukommen (insb. Jstein52). Ich merke, dass JAVA nicht von heute auf morgen zu lernen ist, aber das Gefühl, wenn man es endlich schafft etwas zum Laufen zu bekommen ist einfach nur klasse!


----------



## JStein52 (12. Aug 2015)

Fangen wir mal an:

1.) Um Code formatiert einzufügen klickst du auf diese Symbol bei dem als Tooltip "Einfügen" erscheint und wählst dann Code aus. Im folgenden Editor kannst du deinen Code einfügen.

2.) Du kannst schon schreiben:

```
if (getCommand() == 1) {
   // mache etwas
}
else {
   // mache etwas anderes
}
```

3.)  zu deinem Codebeispiel :
Strings vergleicht man mit equals, also zum Beispiel so:


```
String einString;

   //  dann irgendwelche Aktionen mit diesem String
   if (einString.equals("Hugo")) {
       //mache was
   }
```

4.) Zur Übergabe deiner Arrays:

bis jetzt sieht man ja nur wie die Methode aussehen, aufgerufen und übergeben wird da ja noch gar nix. So wie du es oben stehen hast sind test1, test2 und array erstmal völlig unabhängig voneinander !


----------



## alexg1990 (12. Aug 2015)

und wie würde nun etwas aufgerufen und übergeben werden?

Edit: und die Aufgabe ist gelöst - halleluja!


----------



## JStein52 (13. Aug 2015)

Schön. Wenn die Aufgabe gelöst ist hast du wohl alles herausgefunden ?!


----------



## Flown (13. Aug 2015)

Poste doch bitte die Lösung, damit andere von deiner Erfahrung profitieren können.


----------



## alexg1990 (13. Aug 2015)

weiß denn jemand wie das mit dem Copyright ist, wenn es sich im Aufgaben im Universitären Kontext handelt und ich meine selbst entworfene Lösung online stelle? Konnte auf anhieb auf google nichts finden. Wenn dies allgemein keine Problematik darstellt, stell ich sie gerne komplett hoch


----------



## Flown (13. Aug 2015)

Copyright auf Aufgaben wird keiner Ahnden und das Recht für die Lösung liegt auf deiner Seite.


----------



## stg (14. Aug 2015)

Und bei solch einfachen Anfängeraufgaben ist auch nicht mal die Lösung schützenswert im Sinne des Urheberrechts.


----------



## alexg1990 (14. Aug 2015)

Ok, dann hier der Code. Die einzigen Fragen die sich mir noch stellen sind:
1. ob in Zeile 35 der return wirklich notwendig ist, bzw. ob dies sich schöner lösen lässt, anstatt einen dummy-return Wert hinzuschreiben (Ohne die Angabe des return Wertes bekomme ich eine Fehlermeldung, obwohl dieser eigentlich nie erreicht werden kann aufgrund der while-schleife.).
2. bei der main Methode benutze ich eine while Schleife solange wie in der Methode getCommand eine 0 zurückgegeben wird. Wird etwas anderes zurückgegeben wird der weitere Code ausgeführt mit printMessage(array) usw.. Anfangs habe ich versucht anstelle von printMessage(array) in Zeile 46 }if (getCommand() == 1){ zu schreiben, was jedoch nicht funktioniert hat. Kann mir jemand sagen, wieso?


```
import Prog1Tools.IOTools;

public class CesarCipher {
    public static void printMessage(char [] array){
        for (char i : array) {
            System.out.print(i);
        }
        System.out.println("");
    }
    public static char[] readChars(int k){
        char[] wort = new char [k];
        for (int l = 0; l<wort.length;l++){
            wort[l] = IOTools.readChar("Welcher Buchstabe für Position" + l + "?");
        }
        return wort;
    }
    public static void shift(char[]wort,int m){
        for (int k = 0; k<wort.length;k++){
            int wechsel = wort[k];
            int gewechselt = wechsel + m;
            wort[k] = (char) gewechselt;
        }
    }
    public static int getCommand(){
        boolean wrong = false;
        while(wrong == false){
            String shift = IOTools.readString("shift or exit?");
            if(shift.equals("shift")){
                wrong = true;
                return 0;
            }else if(shift.equals("exit")){
                wrong = true;
                return 1;}
            }
        return 99;
    }
    public static void main(String [] args){
        int k = IOTools.readInt("Wie lang ist ihr Wort?");
        char[]array = readChars(k);
        while (getCommand() == 0){
        int m = IOTools.readInt("Um wie viele Zeichen soll das Wort verschoben werden?");
        System.out.println("Nachricht vor dem offset:");
        printMessage(array);
        shift(array,m);
        System.out.println("Nachricht nach dem offset:");
        printMessage(array);
        }
        System.out.println("byebye");}
    }
```


----------

