Skip to content

4.3 Übungen: Ampel und Windpark

Ampel

Die nebenstehende Ampelkreuzung kann mit weniger Aufwand programmieren, wenn man für die Ampel eine eigene Klasse erstellt. Dabei wird das Programmierparadigma Programmiere eine Klasse, erstelle viele Objekte! umgesetzt.

Gleiche Klasse heißt nicht gleich!

Wenn man nun Objekte dieser Klasse erzeugt, beinhalten alle Objekte die gleichen Attribute, allerdings können die Attributswerte unterschiedlich sein! Im Bild oben besitzen alle Ampel-Objekte einen SGKreis, um das rote Licht darzustellen, aber bei zwei Ampeln ist die Farbe rot, bei den anderen beiden Ampeln schwarz: Die Attributswerte sind unterschiedlich.

Ampel

Aufgaben

Wir benötigen für das Projekt Ampelkreuzung zwei Klassen: Ampelkreuzung und Ampel.

1. Attribute der Klassen Ampelkreuzung und Ampel
Entscheide, in welche der Klassen die folgenden Objekte gehören:


meineLeinwand: SGLeinwand
gruenesLicht: SGKreis
ampelRechts: Ampel
strasseQuer: SGRechteck
ampelkasten: SGRechteck
ampelLinks: Ampel
ampelmast: SGRechteck


gelbesLicht: SGKreis
ampelOben: Ampel
ampelUnten: Ampel
ampelfuss: SGRechteck
strasseLaengs: SGRechteck
rotesLicht: SGKreis

uml_ampelkreuzung1

2. Methoden der Klassen Ampelkreuzung und Ampel
Entscheide, in welche der Klassen die folgenden Methoden gehören:
Ampel(pX: double, pY: double)
schalteAmpelRot()
schalteAmpelGelb()
schalteAmpelGruen()
schalteLaengsGruen()
schalteQuerGruen()

ampelkrezung-klassen

3. Der Konstruktor
Erkläre die Bedeutung der Parameter des Konstruktors Ampel(pX: double, pY: double).

4. Implementation der Ampelkreuzung
Öffne das Projekt Ampelkreuzung. Hier sind bereits die beiden Klassen Ampelkreuzung und Ampel angelegt, allerdings sind noch nicht alle Attribute und Methoden implementiert. Übertrage zuerst die Ergebnisse aus deinem UML-Implementationsdiagramm in die beiden Klassen. Programmiere dann zu aller erst die Methoden der Ampel, angefangen mit dem Konstruktor. Anschließend kannst du die verbliebenen Methoden programmieren.

Hinweis

Konstruktor: Der Konstruktor ist eine spezielle Methode, die bei der Erzeugung eines Objekts ausgeführt wird. Jeder Klasse hat mindestens einen Konstruktor. Er wird mit dem Schlüsselwort new aufgerufen:

mausi = new SGMaus();

Windpark

In einem Windpark stehen mehrere Windräder. Diese haben drei Rotorblätter und einen Mast. Die Rotorblätter können sich drehen. Dabei dreht sich jedes Windrad in seiner eigenen Geschwindigkeit.

Windrad

Aufgaben

1. UML-Diagramm
Erstelle ein UML-Implementationsdiagramm für den Windpark. Die Modellierung soll zwei Klassen umfassen: Die Klasse Windrad und die Klasse Windpark, wobei der Windpark die einzelnen Windräder verwaltet. Die folgenden Aufgaben können dir bei der Erstellung der Diagramme helfen:

  • Beschreibe, worin sich die einzelnen Windräder unterscheiden und überprüfe, ob der Konstruktor der Klasse Windrad dies berücksichtigt.
  • Überprüfe, ob die Klasse Windpark eine Methode zur Verfügung stellt, um das Drehen der Windräder zu ermöglichen.
  • Überprüfe dein UML-Diagramm, ob auch die unterschiedlichen Geschwindigkeiten, mit denen sich die Windräder drehen, berücksichtigt sind.

Hinweis: Wenn du noch einmal eine Erklärung zu UML-Diagrammen brauchst, schau hier nach.

2. Konstruktor-Probleme
Bei der Programmierung der Anwendung hat ein Schüler für die Klasse Windrad den folgenden Konstruktor gewählt:

public Windrad(double pX, double pY, double pGeschwindigkeit)

In der Klasse Windpark werden vier Windräder (w1 bis w4) erstellt. Beim Übersetzen des Quelltextes wird aber ein Fehler ausgeworfen. Erkläre den Fehler und korrigiere ihn.

fehler_windrad

3. „Da dreht sich nichts!“
Im gleichen Programm soll in der Methode fuehreAus das Drehen der Windräder implementiert werden. Erkläre den Fehler, der hier gemacht wurde.

fehler2_windrad

4. „Jetzt aber mal Tempo!“
Kommentiere den folgenden Quelltext. Gehe dabei besonders auf die Bedingung der if-Verzweigung und auf ihren Inhalt ein.

    public void fuehreAus()
{
	while(tasti.esc() == false)
	{
		if( tasti.tasteGedrueckt('+') == true)
		{
			double temp = w1.gibGeschwindigkeit();
			temp = temp + 1;
			w1.setzeGeschwindigkeit(temp);
		}
		
		w1.drehe();
		w2.drehe();
		w3.drehe();
		w4.drehe();
		
		SGSystem.warte();
	}
}   
            
                    
        

Zusatzaufgabe: Gib- und Setze-Methoden (Vorsicht: schwierig!)
Stelle Vermutungen auf, wie die Methoden gibGeschwindigkeit und setzeGeschwindigkeit der Klasse Windrad modelliert und implementiert werden müssen.