Home > Informatik > Stufe EF > Thema

2.3 Fallunterscheidungen

Bild programmieren - Sondierende Methoden - Fallunterscheidungen

Das ist ja mal eine interessante Überschrift - Fallunterscheidungen, was soll denn das?

Schritt 1 - Wo ist denn die Sonne?

Öffnen Sie das Projekt "Zeichnung02" und speichern Sie eine Kopie des Projektes unter dem Namen "Zeichnung03" ab.

Verändern Sie den Quelltext der Klasse Zeichnung wie folgt:

public class Zeichnung
{
	Circle sonne;

	public Zeichnung()
	{
		sonne = new Circle();
	}

	public void makeVisible()
	{
		sonne.makeVisible();
	}

	public void draw()
	{
		sonne.changeColor("yellow");
		sonne.changeSize(100);
		sonne.moveHorizontal(950);
	}
}

Kompilieren Sie nun das Projekt, erzeugen Sie ein Objekt der Klasse Zeichnung, öffnen Sie das Kontextmenü des Zeichnungs-Objektes und rufen Sie zunächst die Methode makeVisible() auf, danach die Methode draw().

Nach dem Ausführen von makeVisible() sehen Sie einen kleinen blauen Kreis in der linken oberen Ecke der Zeichenfläche. Das ist auch in Ordnung so, denn im Konstruktor der Klasse Circle werden die Attribute der Circle-Objekte entsprechend gesetzt.

Nach dem Ausführen von draw() sehen Sie aber nur eine leere Zeichenfläche. Vielleicht, wenn Sie einen langsamen Computer haben, konnten Sie kurz vorher noch ein gelbes Aufblitzen sehen, weil der Kreis ja seine Farbe geändert hat und größer geworden ist. Danach aber "verschwindet" der Kreis von der Zeichenfläche.

Sie haben den Kreis durch den Aufruf von

sonne.moveHorizontal(950)

um sage und schreibe 950 Pixel nach rechts bewegt. Die Zeichenfläche hat aber gar nicht so viele Pixel, sie ist nur 300 Pixel breit.

Wie können wir nun verhindern, dass der Kreis nach rechts aus der Zeichenfläche verschwindet, wenn man moveHorizontal() etwas unvorsichtig aufruft?

Schritt 2 - Die Methode moveHorizontal() verbessern

Doppelklicken Sie auf die Klasse Circle und suchen Sie im Quelltext die Methode moveHorizontal().

Diesen Quelltext hatten wir bereits in der letzten Teilfolge besprochen:

public void moveHorizontal(int distance)
{
	erase();
	xPosition += distance;
	draw();
}

Wir wollen den Quelltext jetzt so verändern, dass der Kreis die Zeichenfläche nicht mehr nach rechts verlassen kann.

Verändern Sie den Quelltext der Methode folgendermaßen:

public void moveHorizontal(int distance)
{
	erase();
	if (xPosition + distance < 300)
		xPosition += distance;
	draw();
}

Erzeugen Sie wieder ein Objekt der Klasse Zeichnung und testen Sie die veränderte Methode, indem Sie wieder die makeVisible()- und dann die draw()-Methode des Zeichnungs-Objektes aufrufen.

Sie sehen jetzt einen großen gelben Kreis in der linken oberen Ecke der Zeichenfläche. Die Methode moveHorizontal() wurde zwar aufgerufen und ausgeführt, aber die Methode hat die Position des Kreis-Objektes nicht verändert.

Die logische Bedingung (xPosition + distance < 300) war nämlich nicht erfüllt.

Die ursprüngliche xPosition hatte den Wert 20, dazu wurde dann eine Distanz von 950 addiert, also hatte die Summe xPosition + distance den Wert 970. Der Wert 970 ist mit Sicherheit nicht kleiner als der Wert 300.

Verändern Sie den Quelltext der Methode draw() jetzt folgendermaßen:

public void draw()
{
	sonne.changeColor("yellow");
	sonne.changeSize(100);
	sonne.moveHorizontal(270);
}

Man sieht jetzt nur noch einen ganz kleinen Zipfel der großen gelben Sonne am rechten Rand der Zeichenfläche, der größte Teil der Sonne ist verschwunden.

Wenn Sie mehr über logische Bedingungen wissen möchten, schauen Sie sich bitte den entsprechenden Lernbaustein "logische Bedingungen" an.

Aufgabe 2.3-1

Begründen Sie, welche der folgenden if-Anweisungen falsch sind. Die Variable x ist dabei immer vom Typ int, also eine ganze Zahl.

if (x + 3) x++;
if (x >= 12) x--;
if (x+y*3 = 20) y=12;
if (x == true) x=12;
if (true) x = 12;

Übung 2.3-2

Verändern Sie die Methode moveHorizontal() so, dass beim Überprüfen, ob der rechte Rand erreicht wird, auch der Durchmesser des Kreises berücksichtigt wird. Ein großer Kreis erreicht den rechten Rand nämlich eher als ein kleiner Kreis.

Achtung:
Das Attribut xPosition definiert nicht die X-Koordinate des Kreis-Mittelpunktes, sondern die X-Koordinate des linken Randes des Kreises. Ein Kreis mit xPosition = 20 und diameter = 100 erstreckt sich also horizontal von x = 20 bis x = 120.

Übung 2.3-3

Ergänzen Sie die Klasse Circle um eine sondierende Methode

public boolean atRightBorder()

welche den Wert true zurückliefert, wenn der Kreis den rechten Rand berührt. Wenn sich zum Beispiel ein Kreis mit dem Durchmesser 50 an der X-Position 250 befindet, müsste die Methode true zurückliefern. Hat der Kreis nur einen Durchmesser von 49, dann müsste die Methode dagegen false liefern.

Wenn Sie mehr über Fallunterscheidungen wissen möchten - es gibt einen neuen Lernbaustein "Fallunterscheidungen", der sich speziell an Anfänger(innen) richtet.

Seitenanfang -
Weiter mit der Folge 3...