# dringende Hilfe gesucht



## Wirtschaftsinformatiker (18. Nov 2021)

Debugging von Schleifen
Öffne das Projekt und schau Dir die Klasse Schleifendreher an. Dort findest Du Beispiele für die verschiedenen Schleifentypen in Java. Führe die Beispiele aus, um Dich mit den Schleifen vertraut zu machen. Beachte dabei die Ausgaben auf der Konsole. Lies Dir die Methodenrümpfe gründlich durch. Führe sie anschließend im DebugModus von BlueJ aus: Ö΍ne dazu die Klasse im BlueJ-Editor und klicke links in die weiße Leiste neben eine Anweisung in der Methode; es erscheint ein kleines rotes Stoppschild. Dies ist ein Haltepunkt. Wenn Du nun wie gewohnt die Methoden aufrufst, ö΍net sich der Debugger automatisch und Du kannst den Programmablauf Schritt für Schritt steuern, indem Du auf den Knopf „Schritt über“ (engl. step) klickst. Erkläre Deinen Betreuern, warum die Beispiele zu diesen Ausgaben führen. Konsultiere im Zweifel den zweiten Teil des Skripts.
*Ich verstehe die Aufgabe nicht!*

Class Schleifendreher {
    // Beispiele fuer for-Schleifen

    /**
     * Gibt die Ziffern 0 bis 9 mit dem Hinweis, dass es sich um Ziffern handelt,
     * auf der Konsole aus.
     */
    public void druckeAlleZiffern() {
        for (int i = 0; i < 10; ++i) {
            System.out.println(i + " ist eine Ziffer.");
        }
    }

    /**
     * Gibt die druckbaren Zeichen des ASCII-Zeichensatzes auf der Konsole aus.
     */
    public void druckeDruckbareASCIIZeichen() {
        for (char c = 32; c < 127; ++c) {
            int i = c;
            System.out.println(i + ". ASCII-Zeichen: " + c);
        }
    }

    /**
     * Gibt alle Ziffern, die durch drei teilbar sind, mit entsprechendem Hinweis
     * auf der Konsole aus.
     */
    public void druckeDreierZiffernRueckwaerts() {
        // Man kann bei beliebigen Werten anfangen
        // und beliebig grosse Schritte in beide Richtungen gehen.
        for (int i = 9; i >= 0; i -= 3) {
            System.out.println(i + " ist durch 3 teilbar.");
        }
    }

    /**
     * Gibt alle Paare nicht-negativer Zahlen, deren Summe 9 ergibt, auf der Konsole
     * aus. Die die Addition kommutativ ist, werden redundante Paare bewusst
     * vermieden.
     */
    public void druckeNeunerSummen() {
        // Es koennen beliebig viele Schleifenzaehler verwendet werden,
        // zum Beispiel zwei "gegeneinander laufende" Zaehler,
        // die sich in der Mitte treffen (man beachte die Schleifenbedingung).
        for (int a = 0, b = 9; a < b; ++a, --b) {
            System.out.println(a + " + " + b + " = " + (a + b));
        }
    }

    /**
     * Gibt die Buchstaben einer Zeichenkette durch Kommata getrennt auf der Konsole
     * aus.
     * 
     * @param text Enthealt den Text, der ausgegeben werden soll.
     */
    public void druckeEinzelneBuchstaben(String text) {
        for (int i = 0; i < text.length(); ++i) {
            System.out.print(text.charAt(i));
            System.out.print(", ");
        }
        System.out.println();
    }

    // Beispiel fuer while-Schleife

    /**
     * Liefert die kleinste Primzahl, welche groesser oder gleich x ist.
     * 
     * @param x Eine Zahl, von der aus mit der Suche begonnen werden soll.
     * 
     * @Return die naechste gefundene Primzahl.
     */
    public int findeNaechstePrimzahl(int x) {
        while (!istPrimzahl(x)) {
            ++x;
        }
        return x;
    }

    // Beispiel fuer do-while-Schleife

    /**
     * Fordert den Benutzer wiederholt zur Eingabe eines Passwortes auf, bis er das
     * korrekte Passwort eingegeben hat.
     */
    public void verlangePasswort() {
        String zeile;
        do {
            System.out.print("Passwort? ");
            zeile = liesZeileVomBenutzer();
        } while (!zeile.equals("\116\151\143\141\162\141\147\165\141"));

        // C-Hack: Zeichen hier kodiert ueber "octal escapes", siehe JLS 3.10.6
        // Wenn ihr die Zeichen sehen wollt: Zeichenkette in die Direkteingabe
        // von BlueJ kopieren und Enter druecken.

        System.out.println("Du darfst eintreten!");


----------



## kneitzel (18. Nov 2021)

Kannst Du evtl. noch sagen, was an der Aufgabe Du nicht verstehst?

Generell ist ein fertiger Code gegeben. An dem ist erst einmal nichts anzupassen!

Du sollst diesen Code ansehen und verstehen um dann zu erklären, was dieser Code macht und wieso es zu der Ausgabe kommt, die da kommt.

Ich würde da aber zu einem anderen Vorgehen raten: Statt einfach nur auszuführen und den Debugger zu nutzen solltest Du alles mit Stift und Papier durchspielen und schauen, was Du an Funktionalität / Ausgabe da so siehst. Das kannst Du dann Vergleichen. Und natürlich kannst Du auch mit dem Debugger Schritt für Schritt durch die Methode gehen und es mit Deinen Aufzeichnungen vergleichen.

Beispiel:

```
public void druckeAlleZiffern() {
    for (int i = 0; i < 10; ++i) {
        System.out.println(i + " ist eine Ziffer.");
    }
}
```

Unterteile den Zettel in drei Bereiche - einmal nur für Variablen, einen für den Ablauf und einen für die Ausgabe:
for-Zeile:
- Neue Variable i = 0 (i := 0 bei Variablen hinschreiben!)
- i < 10 : (Hier schaust Du auf den Variablen Teil. i := 0, daher) Ja
println (Bei der Ausgabe schreibst Du nun die Ausgabe  "0 ist eine Ziffer."
for: ++i (Bei Variablen wird bei i die 0 gestrichen und eine 1 hingeschrieben)
println Ausgabebereich bekommt ein "1 ist eine Ziffer."
u.s.w.

Dabei ist natürlich wichtig, dass man verstanden hat, was jeder einzelne Befehl wann genau macht. bei der for Schleife hat man halt:
for (Start; Prüfung; Ende)
Start wird einmalig am Start gemacht
Prüfung ist die Prüfung vor jedem Durchlauf
Ende ist etwas, das nach jedem Durchlauf des Schleifenblocks gemacht wird.

Aber vermutlich wird sowas im zweiten Teil des Scripts stehen.


----------



## Wirtschaftsinformatiker (18. Nov 2021)

kneitzel hat gesagt.:


> Kannst Du evtl. noch sagen, was an der Aufgabe Du nicht verstehst?
> 
> Generell ist ein fertiger Code gegeben. An dem ist erst einmal nichts anzupassen!
> 
> ...


----------



## Wirtschaftsinformatiker (18. Nov 2021)

Ich war bei den Vorlesungen nicht da, deswegen verstehe ich die Aufgabe nicht.


----------



## kneitzel (18. Nov 2021)

Wenn Du da Inhalte verpasst hast, dann erkundige Dich, was da durchgenommen wurde und arbeite es nach.

Wir haben so keinen Ansatz, wie wir dir helfen können. Ich habe Dir die Aufgabe erläutert und auch beschrieben, wie Du da heran gehen kannst.... Darüber hinaus sehe ich jetzt keine weiteren Ansätze.


----------

