# Verständnisproblem bei Aufgabe



## Taskiz (13. Jan 2021)

Hi Leute, wir sollten als Hausaufgabe einen Programmablaufplan interpretieren und den Code dazu erstellen. Ich weiß nicht, wie ich Screenshots hochladen kann, deshalb werde ich lediglich meine Interpretation schildern (vllt kann mir das zusätzlich jemand erklären)😖 


Also, gegeben ist das Alphabet in Großbuchstaben (A-Z), dies wurde bereits in einer anderen, von uns Schülern uneinsehbaren Klasse abgespeichert und greift bereits selbständig auf unseren Teil des Programms zu.

Wir sollen in einer neuen Klasse eine Methode schreiben, die zwei Parameter besitzt (String e , int n (die Parameter stammen aus dem Code meines Lehrers und werden immer automatisch zugewiesen ). In der Methode soll ein Variable k mit dem Wert 1 initialisiert werden. Entspricht k der Länge von e, so soll eine neue Variable a mit dem Buchstaben der k-ten stelle von e initialisiert werden (entspricht k nicht der länge von e wird nur der String e ausgegeben und die Methode endet).

Nun soll überprüft werden, ob a auch tatsächlich ein Buchstabe (Element des Alphabetes) ist. Ist das korrekt, wird eine neue Variable i initialisiert, welche den Wert der a-ten Stelle im Alphabet bekommt (z.b. A=1) + n. Diese stelle bekommt nun den Buchstabe z zugeschrieben. Z wird e angehängt, k wird um 1 erhöht und der Vorgang wiederholt sich . 

War a kein Buchstabe des Alphabets, so ist a = z. Z wird e angehängt, k wird um 1 erhöht und der Vorgang wiederholt sich . 

Mein Problem liegt nicht darin, nicht zu wissen wie der Code auszusehen hat, dafür hab ich ja eine genau Beschreibung durch meine Interpretation (falls diese überhaupt richtig ist), sondern ich habe noch ziemliche Probleme herauszufinden, welche Werkzeuge (Schleifen, kleinere Methoden) ich brauche und wie ich diese syntaktisch richtig verwende, um den Code tatsächlich so umzusetzen, wie ich ihn im Kopf habe, dafür fehlt mir noch mehr Übung. Dennoch habe ich schomal versucht selbst etwas zu erstellen


```
public class Algorithmus {
    public String encode(String e, int n) {                //Methodenkopf mit Parameter
        
        int k = 1;                                        //Variablen die ich verwendet habe
        int length = e.length();
        char a;
        int ascii;
        int i;
        char y;
        
    if(length != n){                                    //Länge wird überprüft,bei wrong = Ausgabe e

        return e;                 
                    }

    else                                                 //bei true, Buchstabe von e bei k-ter Stelle
        a = e.charAt(k-1);
        ascii = (int) a;                                // umschreiben in ascii, um zu überprüfen ob a = Buchstabe
    
if(65 <= a && a <= 90){

        i= a-a + k + n;                                    // Hier hab ich einen Fehler: ich wollte die Stelle der Buchstaben durch Ascii übermittel, was aber nicht funktioniert
                                                        // wenn die Buchstabenfolge randome ist (also nicht A-Z chronologisch)
             y = charAt(i);                               
             y = z;
             e = e+y;
             k++;
        return e
                             }

    else                                                //fals a != Buchstabe, wird a zu z und an e drangehängt
        a = z;
        e = e+a;
        
        k++;
        return e;

    }

}
```



Nochmal zur genaueren Erklärung meines Fehleres. Ich hatte mir das so vorgestellt: A entspricht ja beispielsweise nach der Ascii-tabelle 65, 65-65 = 0 +k( in diesem Fall 1) = 1 (A=1) und  dann noch + Parameter n (z.B. auch 1) = 65-65+1+1 = 2. Zweite Stelle des Alphabets ist B und B wird dann mit Z ersetzt. Aber nun funktioniert meine Ascci Rechnung nicht, wenn die Buchstaben nicht chronologisch in den Parameter gesetzt werden, außerdem kann keinen keinen Buchstaben mit z ersetzen der beispielsweise an 2.Stelle des Strings steht, wenn mein String gar nicht so lang ist.

Ich weiß absolut nicht wie ich vorgehen soll. 
Also um meine Frage zu konkretisieren, wie kann ich folgende Stelle "_Ist das korrekt, wird eine neue Variable __i initialisiert, welche den Wert der a-ten Stelle im Alphabet bekommt (z.b. A=1) + n__. Diese stelle bekommt nun den Buchstabe z zugeschrieben."_ als Code umsetzen.

MfG


----------



## mihe7 (13. Jan 2021)

Taskiz hat gesagt.:


> Ich weiß nicht, wie ich Screenshots hochladen kann,


Schon mal das Bildsymbol in der Toolbar des Editors versucht?

Mach das mal, ein Bild sagt mehr als tausend Worte.


----------



## Taskiz (14. Jan 2021)

Hab's vorhin eigentlich probiert, da hat es nicht funktioniert, naja jetzt klappt es😇🤔


----------



## mihe7 (14. Jan 2021)

Taskiz hat gesagt.:


> Ich hatte mir das so vorgestellt: A entspricht ja beispielsweise nach der Ascii-tabelle 65, 65-65 = 0 +k( in diesem Fall 1) = 1 (A=1) und dann noch + Parameter n (z.B. auch 1) = 65-65+1+1 = 2. Zweite Stelle des Alphabets ist B und B wird dann mit Z ersetzt. Aber nun funktioniert meine Ascci Rechnung nicht, wenn die Buchstaben nicht chronologisch in den Parameter gesetzt werden, außerdem kann keinen keinen Buchstaben mit z ersetzen der beispielsweise an 2.Stelle des Strings steht, wenn mein String gar nicht so lang ist.


Du brauchst hier gar nichts zu rechnen, das ist im Flussdiagramm nicht gefordert.

Die einzige Frage, die sich mir stellt ist folgende: Du schreibst oben, dass es eine Klasse für das Alphabet gibt. Irgendwie musst Du ja auf das Alphabet zugreifen können.

Ansonsten kannst Du das Flussdiagramm fast 1:1 umsetzen.



Taskiz hat gesagt.:


> Also um meine Frage zu konkretisieren, wie kann ich folgende Stelle "_Ist das korrekt, wird eine neue Variable __i initialisiert, welche den Wert der a-ten Stelle im Alphabet bekommt (z.b. A=1) + n__. Diese stelle bekommt nun den Buchstabe z zugeschrieben."_ als Code umsetzen.


Wenn das Alphabet als String gegeben ist, dann kannst Du einfach die indexOf-Methode verwenden:

```
int i = alphabet.indexOf(a);
if (i != -1) {
    // dann ist i eine natürliche Zahl, so dass a das (i+1)-te Zeichen im Alphabet ist
    // d. h. es gilt a == alphabet.charAt(i)
}
```


----------



## Taskiz (14. Jan 2021)

Ok vielen Dank, sobald wir eine Musterlösung bekommen haben, werde ich sie hier reinposten.


----------



## Onur (14. Jan 2021)

Guck so wie ich es Vertsanden habe Hast du einen String ( das Alphabet )
Du bekommts einen String oder Char element und sollst nun überprfüen in der wie vielten stelle das vorkommt...

1. würde ich dir empfelen mit String contains() zu checken ob das element überhaupt vorhaben ist => wäre ich der dozent wurde ich würde ich auch nach Elementen suchen lassen die Überhaupt nicht vorhanden sind
Sample Code

[CODE lang="java" title="Check Element"]String myStr = "Hello";

System.out.println(myStr.contains("Hel"));   // true

System.out.println(myStr.contains("e"));     // true

System.out.println(myStr.contains("Hi"));    // false[/CODE]



2. möchtest du ja den index ermitteln das schreit nach Java substring indexOf() Methode

[CODE lang="java" title="GetPositionOf"]String str_Sample = "This is Index of Example";

//Character at position

System.out.println("Index of character 'x': " + str_Sample.indexOf('x'));

//Character at position after given index value

System.out.println("Index of character 's' after 3 index: " + str_Sample.indexOf('s', 3));

//Give index position for the given substring

System.out.println("Index of substring 'is': " + str_Sample.indexOf("is"));

//Give index position for the given substring and start index

System.out.println("Index of substring 'is' form index:" + str_Sample.indexOf("is", 5));

 [/CODE]

*Output: *
Index of character 'x': 12 
Index of character 's' after 3 index: 3
Index of substring 'is': 2
Index of substring 'is' form index:5


indexOf() returned dir die erste Position wo es vorkommt

String str_Sample = "This is Index of Example"; // Index of character 'x': 12
Das aber dein String eine 1 zu 1 abbildung de Alphabet datstell sollte es bei deinem anewungsfall irrelevant sein.....

Ich hoffe es konnte dir helfen


----------



## Taskiz (14. Jan 2021)

Vielen Dank, für die umfangreiche Antwort. Ich werde auf jeden Fall versuchen, dies zu berücksichtigen.

Jedoch habe ich noch eine letzte Frage, wir sollen abschließend noch die Art/den Namen des Algorithmus, welcher im Prorammablaufplan abgebildet ist, benennen. Ich habe auch schon das Internet und meine Büchern durchforstest, jedoch bin ich auf keine klare Lösung gestoßen. Hat da jemand eine Idee?


----------



## Onur (14. Jan 2021)

Also mir die vorgehensweise die in deinem PAP (programmablaufplan) dargestellt wurde nicht bekannt im sinne eines Algorithmus a.k.a. (BubleSort oder Dijkstra-Algorithmus).

generell mein tip HALTE DICH AN DIE NAMENSKONVENTIONEN von Java => https://mein-javablog.de/java-namenskonventionen/

ich benutzte immer englische bezeichner die selbsterklärend sind
so was wie getPosOfAlphabet() oder sowas  in java

By the way bevor ich es vergesse ( achte auch Gros und Kleinschreibung  => wandle die charakter einheitlich um damit du keine probleme bekommst )

Ich bin selbst noch ein AZUBI ( also alle antworten mit vorsicht genießen  ^_^  )


----------



## mihe7 (14. Jan 2021)

Taskiz hat gesagt.:


> wir sollen abschließend noch die Art/den Namen des Algorithmus, welcher im Prorammablaufplan abgebildet ist, benennen.


Naja, was macht denn der Algorithmus? Er ersetzt jeden Buchstaben der Zeichenkette, der im Alphabet vorkommt, durch einen anderen Buchstaben, der im Alphabet vorkommt. Ausgangs- und Zielbuchstabe haben dabei einen bestimmten aber festen Abstand, nämlich n. Für n=2 wird aus einem A ein C, aus einem B ein D, aus einem C ein E usw.

Als was würdest Du das bezeichnen? Gibt es für speziell dieses Vorgehen sogar einen eigenen Namen?


----------



## Onur (14. Jan 2021)

mihe7 hat gesagt.:


> Naja, was macht denn der Algorithmus? Er ersetzt jeden Buchstaben der Zeichenkette, der im Alphabet vorkommt, durch einen anderen Buchstaben, der im Alphabet vorkommt. Ausgangs- und Zielbuchstabe haben dabei einen bestimmten aber festen Abstand, nämlich n. Für n=2 wird aus einem A ein C, aus einem B ein D, aus einem C ein E usw.
> 
> Als was würdest Du das bezeichnen? Gibt es für speziell dieses Vorgehen sogar einen eigenen Namen?


Oja dafür gibt einen Speziellen namen >> es ist  ein Verschlüsselungs Algoritmus  << So genau habe ich mir den pap nicht angesehen ( sollte man auch immer darauf achten )



Danke Dass du mich darauf hingewiesen hast


----------



## mihe7 (14. Jan 2021)

Nur solltest Du nicht seine Hausaufgabe machen


----------



## Onur (14. Jan 2021)

Ups danke habe jetzt einfach losgeantwortet ohne nachzudenken habe es korigiert


mihe7 hat gesagt.:


> Nur solltest Du nicht seine Hausaufgabe mache


----------

