Home > Informatik > Einführung in die OOP > 3. Schleifen > 3.3 For-Schleifen

3.3 For-Schleifen, Teil 2

Das Datums-Projekt

Wir wollen unsere Fertigkeiten im Umgang mit for-Schleifen nun auf ein konkretes Programmierprojekt anwenden.

Vorbereitungs-Aufgabe

Lesen Sie sich die Informationen zu dem Datums-Projekt durch. Sie finden dort vier Klassen sowie eine Testklasse für das Projekt vor mit knappen Erläuterungen. Kopieren Sie sich die Quelltexte dieser fünf Klassen in Ihr BlueJ- oder IntelliJ-Projekt und bringen Sie das Projekt zum Laufen.

Wenn Sie wollen, können Sie auch den gesamten Workshop "Das Projekt Datum" durcharbeiten. Dann können Sie Schritt für Schritt nachvollziehen, wie es zur Entstehung dieses fünf Klassen umfassenden Projektes gekommen ist.

Kommen wir nun zur den eigentlichen Aufgaben. Diese Aufgaben stehen auch als vierseitiges PDF-Arbeitsblatt zum Download zur Verfügung. Dieses Arbeitsblatt enthält noch drei weitere Aufgaben.

Aufgaben

Aufgabe / Übung 3.3 #1

Informieren Sie sich zunächst über die switch-case-Anweisung.

Ersetzen Sie dann die große if-else-Anweisung in der Klasse DatumRegeln, Methode tageImMonat(), durch eine solche switch-case-Anweisung. Experten versuchen sogar, hier einen switch-case-Ausdruck einzusetzen.

Testen Sie das Projekt danach, ob weiterhin alles korrekt funktioniert.

Übung 3.3 #2

Erstellen Sie für das Projekt eine neue Klasse DatumTools. Schreiben Sie dann eine Methode

public int tageSeitJahresanfang(Datum d)

die Ihnen die Anzahl der Tage zurückliefert, die seit dem 1. Januar des Jahres d.getJahr() vergangen sind. Hierzu sollten Sie dann eine for-Schleife einsetzen.

Beispiel: Datum = 13.05.2025

Tage seit Jahresbeginn = 31 (für Januar) + 28 (Februar) + 31 (März) + 30 (April) + 13 (Mai) = 133.

Übung 3.3 #3

Ergänzen Sie die Klasse DatumTools durch eine Methode

public int tageBisJahresende(Datum d)

die Ihnen die Zahl der Tage liefert, die bis zum Ende des Jahres noch vergehen.

Beispiel: Datum = 13.05.2025

Entweder rechnen Sie mit einer for-Schleife die Tageszahlen der Monate 6 bis 12 zusammen und addieren dann die restlichen Tage des Mai, oder Sie gehen intelligenter vor: Das Jahr 2025 hat 365 Tage, am 13.05 sind 133 Tage vergangen, also verbleiben von den 365 Tagen noch 365 - 133 = 232 Tage.

Die Frage ist natürlich, ob diese einfache Rechnung wirklich korrekt ist. Aber das können Sie ja mit Ihrem Testprogramm leicht überprüfen. Geben Sie als Testdatum auf jeden Fall ein:

1.1.2025, dann sollten noch 364 Tage übrig bleiben,

31.12.2025, dann sollten genau 0 Tage übrig bleiben.

Übung 3.3 #4

Und nun die Krönung dieses Aufgabenteils. Ergänzen Sie die Klasse DatumTools durch eine Methode

public int getTagesdifferenz(Datum d1, Datum d2)

Diese Methode sollte Ihnen die Anzahl der Tage zurückliefern, die zwischen den beiden Daten liegen.

Überprüfen Sie zunächst, ob die Reihenfolge der Daten stimmt. Wenn d1 vor d2 liegt, ist alles OK. Andernfalls sollten Sie die beiden Parameter vertauschen.

Testen Sie die Methode ausführlich, und rechnen Sie dann aus, wie viele Tage Sie alt sind. Vielleicht gibt es ja bald einen Grund zum Feiern. Ich selbst bin vor zwei Wochen beispielsweise 25.000 Tage alt geworden.

Übung 3.3 #5

Jetzt noch ein kleiner Kür-Teil für die Experten unter Ihnen. Denken Sie sich selbst auch noch ein oder zwei schöne Aufgaben zum Umgang mit dem Datums-Projekt aus und lösen Sie diese in Partnerarbeit oder Gruppenarbeit. Anschließend präsentieren Sie Ihr Projekt und erklären genau, was Sie gemacht haben.

Vielleicht können Sie sich ja ausrechnen lassen, an welchem Datum Sie 10.000 oder 12.500 Tage alt werden. Oder sie schreiben eine Methode, die Ihnen den Wochentag Ihrer Geburt (oder eines anderen beliebigen Datums) zurückliefert. Und und und ...

Weitere Aufgaben zu for-Schleifen

Die folgenden Aufgaben aus der Fachliteratur können Sie ebenso gut mit Hilfe von while-Schleifen lösen. Als Klausurvorbereitung würde ich Ihnen sogar empfehlen, jede Aufgabe einmal mit while-Schleifen und einmal mit for-Schleifen zu lösen.

Übung 3.3 #6

Schreiben Sie eine Methode

public getHaeufigkeitBuchstabe(String zeichenkette, char buchstabe)

Diese Methode soll zählen, wie oft der angegebene Buchstabe in dem übergebenem String vorkommt. Wenn Sie sich noch nicht so gut mit der Klasse String auskennen, gehen Sie bitte auf die Seite "String" in der Abteilung "Java-Klassen" auf diese Homepage. Dort finden Sie die wichtigsten Methoden der Klasse String.

Übung 3.3 #7

Berechnen Sie die Summe der ersten n Quadratzahlen, die durch drei teilbar sind und der ersten n Kubikzahlen, die durch fünf teilbar sind.

Beispiel:

Mit n = 10 würden wir erhalten

3*3 + 5*5*5 + 6*6 + 9*9 + 10*10*10 = 1251

Aufgabe 3.3 #8

Was macht die folgende for-Schleife ?

for (int a = 1; a <= 10; a++)
{
   for (int b = 1; b <= 10; b++)
      System.out.printf("%6d", a*b);
   System.out.println();
}

Übung 3.3 #9

Die folgende Konsolenausgabe soll einen Tannenbaum darstellen:

                           *
                          ***
                         *****
                        *******
                       *********
                      ***********
                     *************
                           *
                           *
                           *
                           *
                           *

Schreiben Sie eine Java-Methode, die mit Hilfe der Befehle System.out.print() und System.out.println() und mit Hilfe von for-Schleifen einen solchen Tannenbaum in die Konsole zeichnet.

1. Ergänzung für Profis

Machen Sie Ihre Methode flexibler: man soll die maximale Breite des Tannenbaums als Parameter an die Methode übergeben können. Im obigen Beispiel hat der Baum eine maximale Breite von 13.

2. Ergänzung für Super-Profis

Die Methode soll noch flexibler werden: man soll auch die Höhe des Stammes als Parameter übergeben können. Im Beispiel ist der Stamm 5 Sterne hoch.

Übung 3.3 #10

Erzeugen Sie mithilfe von zwei geschachtelten for-Schleifen ein Schachbrettmuster in der Konsole, zum Beispiel so:

#.#.#.#.#.#.#.#
.#.#.#.#.#.#.#.
#.#.#.#.#.#.#.#
.#.#.#.#.#.#.#.
#.#.#.#.#.#.#.#
.#.#.#.#.#.#.#.
#.#.#.#.#.#.#.#
.#.#.#.#.#.#.#.

Die Wahl der Zeichen bleibt Ihnen überlassen.

Wenn Ihnen die Konsolen-Ausgabe zu langweilig ist, können Sie sich ja das alte Shapes-Projekt mit der Klasse Zeichnung noch einmal hervorholen und dann ein Schachbrett aus unterschiedlich farbigen Square-Objekten zeichnen lassen.

Übung 3.3 #11

Erstellen Sie eine Klasse Uhr mit den Instanzvariablen stunde und minute (beide vom Typ int).

Die Klasse soll folgende Methoden besitzen:

  • public void stellen(int h, int m) - stellt die Uhrzeit auf die Stunde und Minute neu ein
  • public String getZeit() - liefert einen String mit der Uhrzeit zurück, nach dem Muster hh:mm
  • public void anzeigen() - zeigt den Uhrzeit-String in der Konsole an
  • public void tick() - erhöht die Uhrzeit um genau eine Minute
  • public void run() - lässt die Uhr in einer for- oder while-Schleife über 1500 Minuten laufen (tick() aufrufen). Alle 10 Minuten soll die Uhrzeit in der Konsole ausgegeben werden.

Die Konsolenausgabe sollte dann so aussehen:

00:10:00
00:20:00
00:30:00
00:40:00
00:50:00
01:00:00
01:10:00
01:20:00
01:30:00
01:40:00
01:50:00
02:00:00
02:10:00

Und so weiter.

Tipp: In BlueJ können Sie im Konsolen-Menü einen "unbegrenzten Textspeicher" aktivieren, damit auch alle Zeilen angezeigt werden.

Erweiterung für Experten

Ergänzen Sie die Klasse Uhr um Sekunden. Die Methode tick() erhöht dann die Uhrzeit um genau eine Sekunde.

Die Aufgaben 12, 13 und 14 befinden sich auf dem vierseitigen Arbeitsblatt zu dieser Folge. Nach der Erstellung dieses Arbeitsblatts ist mir noch eine schöne Aufgabe #15 eingefallen:

Übung 3.3 #15

Informieren Sie sich auf der Seite "Zahlensysteme" über die Umwandlung von Dezimalzahl in Dualzahlen.

Schreiben Sie dann eine Methode

public String getDual(int dezimal)

Diese Methode nimmt eine int-Zahl entgegen und liefert einen String aus Nullen und Einsen zurück, beispielsweise "100101001", der die Dualdarstellung der Dezimalzahl repräsentiert.

Schreiben Sie anschließend auch eine Methode

public int getDezimal(String dual)

die einen solchen Dual-String wieder in eine Dezimalzahl umwandelt.

Seitenanfang
Weiter mit Schleifen und Graphik-Befehlen ...