Programmiertechnik: Unterschied zwischen den Versionen
(31 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Kategorie:Informatik]] | |||
[[Kategorie:Informatik-EF]] | |||
Auf dieser Seite werden anhand von Kara '''grundlegende Programmiertechniken''' vorgestellt. | |||
Die Grundlagen der '''Java-Syntax''' werden auf folgender Seite vorgestellt: '''[[Java_Basis-Sprachelemente]]''' | |||
=Methoden, die n-mal etwas tun= | |||
''Mit '''n-mal''' ist gemeint, dass '''bekannt''' ist, wie oft die Wiederholung ausgeführt werden soll. | |||
Dafür braucht man eine '''Wiederhole n-mal'''-Schleife. In Java kann man das mit <code>for</code> realisieren. | |||
==Beispiel== | |||
Kara soll eine Linie von 20 Kleeblättern legen. | |||
{| class="wikitable" | {| class="wikitable" | ||
! Programmbeschreibung !! Java Quelltext | ! Programmbeschreibung !! Java Quelltext | ||
|- | |- | ||
| | | | ||
''' | {|style="border-style: solid; border-width: 0px;" | ||
| Methode zwanzigerLinieLegen() | |||
{|style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px" | |||
| Wiederhole 20-mal | |||
{|style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px" | |||
| lege ein Blatt<br/>gehe einen Schritt | |||
|} | |||
|} | |||
|} | |||
|| | |||
public void zwanzigerLinieLegen() | |||
{ | |||
'''for(int i=0; i<20; i++) | |||
{ | |||
kara.putLeaf(); | |||
kara.move(); | |||
} | |||
} | |||
|} | |||
=Methoden, die etwas tun, bis ein Ziel erreicht wird= | |||
Solche Methoden brauchen eine '''Solange'''-Schleife. In Java kann man das mit <code>while</code> realisieren. | |||
In der Regel haben diese Methoden folgenden Aufbau: | |||
* Eine Schleife, die so lange läuft, bis das "Ziel" erreicht ist<br>In der Schleife passiert folgendes: | |||
** Es wird "nachgedacht". (Das kann kompliziert sein...) | |||
** '''Nach''' dem Nachdenken: Ein Schritt in Richtung Ziel wird ausgeführt | |||
'''Wichtig''' ist dabei, dass '''in jedem Schleifendurchlauf genau ein Schritt''' ausgeführt wird, und das erst '''nach''' dem "Nachdenken"! | |||
Dadurch wird die Programmierung viel einfacher! | |||
==Beispiel== | |||
[[File:Kara-rund-um-den-wald-mit-weg.png|thumb|Graph für die Distanzen zwischen Städten |263px]] | |||
Die folgende Methode lässt Kara rund um einen Wald gehen, bis sie auf einem Blatt steht. | |||
''Das "Nachdenken" ist hier relativ kompliziert:<br>'' | |||
''Die größte Schwierigkeit ist für Kara, wenn sie in die "Sackgasse" auf der rechten Seite geht.<br>'' | |||
''Dort muss sie 2x prüfen, ob sie vor einem Baum steht!'' | |||
{| class="wikitable" | |||
! Programmbeschreibung !! Java Quelltext | |||
|- | |||
| | |||
{| style="border-style: solid; border-width: 0px;" | |||
| '''Methode rundUmDenWald()''' | |||
{| style="border-style: solid; border-width: 3px 0px 3px 3px; margin: 5px" | |||
| Solange Kara nicht auf einem Blatt steht | |||
{| style="border-style: solid; border-width: 2px 0px 2px 2px; margin: 5px" | |||
| '''''(Nachdenken!)'''''<br>wenn kein Baum rechts ist | |||
{| style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px" | |||
| drehe dich nach rechts | |||
|} sonst | |||
{| style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px" | |||
| solange ein Baum vorne ist | |||
{| style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px" | |||
| drehe dich nach links | |||
|} | |||
|} <br/>'''''(Schritt ausführen!)'''''<br/>gehe einen Schritt | |||
|} | |||
|} | |||
|} | |||
|| | |||
public void rundUmDenWald() | |||
{ | |||
while(!kara.onLeaf()) | |||
{ | |||
// '''''(Nachdenken!)''''' | |||
if(!kara.treeRight()) | |||
{ | |||
kara.turnRight(); | |||
} | |||
else | |||
{ | |||
while(kara.treeFront()) | |||
{ | |||
kara.turnLeft(); | |||
} | |||
} | |||
// '''''(Schritt ausführen!)''''' | |||
kara.move(); | |||
} | |||
} | |||
|} | |||
=Methoden, die etwas berechnen= | |||
Methoden, die etwas berechnen, haben in der Regel folgenden Aufbau: | |||
* Zuerst wird eine Variable <code>ergebnis</code> deklariert. | |||
* Dann wird mit einer Schleife das zu berechnende Feld (oder Blätterspur o.ä.) durchlaufen.<br>In der Schleife passiert folgendes: | |||
** Die Berechnung wird aktualisiert | |||
** Es wird zum nächsten Schritt weitergegangen. | |||
* Wenn die Schleife fertig ist, dann wird mit dem Schlüsselwort <code>return</code> das <code>ergebnis</code> zurückgegeben. | |||
==Beispiel== | |||
[[File:Kara-blaetter-zaehlen.png|thumb|Kara zählt Blätter; das Ergebnis ist hier 6. |227px]] | |||
Die folgende Methode lässt Kara so lange geradeaus laufen, wie Kara auf einem Blatt steht. | |||
Dabei werden die Blätter gezählt und am Ende der Methode zurückgegeben. | |||
{| class="wikitable" | |||
! Programmbeschreibung !! Java Quelltext | |||
|- | |||
| | |||
{|style="border-style: solid; border-width: 0px;" | |||
| '''Methode zaehleBlaetter()''': ''gibt eine Zahl zurück'' | |||
{|style="border-style: solid; border-width: 2px 0px 2px 2px; margin: 5px" | |||
| Setze ergebnis auf 0<br/>Solange Kara auf einem Blatt steht | |||
{|style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px" | |||
| erhöhe ergebnis um 1<br/>gehe einen Schritt | |||
|} gib ergebnis zurück; | |||
|} | |||
|} | |||
|| | || | ||
public int zaehleBlaetter() | public int zaehleBlaetter() | ||
Zeile 27: | Zeile 143: | ||
return ergebnis; | return ergebnis; | ||
} | } | ||
|} | |||
==Aufruf der Methode== | |||
Die Methode <code>zaehleBlaetter()</code> kann z.B. so verwendet werden: | |||
<code> | |||
'''int anzahl = zaehleBlaetter();''' | |||
kara.turnLeft(); | |||
kara.move(); | |||
kara.turnLeft(); | |||
kara.move(); | |||
linieLegen(anzahl); | |||
</code> | |||
'''Erklärung:''' | |||
Die Methode <code>zaehleBlaetter()</code> gibt eine Zahl zurück. <br/> | |||
Diese Zahl wird in der lokalen Variable <code>anzahl</code> gespeichert.<br/> | |||
Dann kann <code>anzahl</code> verwendet werden. | |||
Im Beispiel zählt Kara die Blätter. <br/>Dann wendet sie und legt eine Zeile darunter genau so viele Blätter ab, wie sie gezählt hat. | |||
=Zerlegung in mehrere Methoden= | |||
Programmieren wird viel einfacher - und vor allem übersichtlicher! - wenn man ein großes Problem in beherrschbare Teilprobleme zerlegt. | |||
Im Idealfall genügt jedes Teilproblem folgenden Anforderungen: | |||
* Es lässt sich ganz einfach programmieren | |||
* Es lässt sich einzeln testen | |||
==Vorgehensweise== | |||
# Man überlegt sich, in welche Teilprobleme man das Gesamtproblem zerlegen kann. | |||
# Für jedes Teilproblem: | |||
## Programmieren | |||
## Testen | |||
# Jetzt das Gesamtproblem programmieren! | |||
==Beispiel 1: Gebirge== | |||
[[File:Kara-himalaya.png|thumb|Kara soll in einem Tal das Kleeblatt finden|773px]] | |||
Kara soll über das Gebirge klettern, bis sie in einem Tal ein Kleeblatt findet. | |||
===Zerlegung=== | |||
Man sieht, dass Kara immer abwechselnd bergauf und bergab gehen muss! | |||
Daher bietet es sich an, das Gesamtproblem mithilfe der folgenden zwei Methoden zu programmieren: | |||
* <code>zumGipfel()</code> | |||
* <code>insTal()</code> | |||
===Programmbeschreibung der Hauptmethode=== | |||
{| class="wikitable" | |||
! Programmbeschreibung | |||
|- | |||
| | |||
{|style="border-style: solid; border-width: 0px;" | |||
| '''Methode sucheKleeblatt()''' | |||
{|style="border-style: solid; border-width: 2px 0px 2px 2px; margin: 5px" | |||
| Solange Kara '''nicht''' auf einem Blatt steht | |||
{|style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px" | |||
| zumGipfel()<br/>insTal() | |||
|} | |||
|} | |||
|} | |||
|} | |||
===Programmierung der Teilprobleme=== | |||
''Für die Teilprobleme wird hier nur die Programmierung angegeben.'' | |||
<code> | |||
'''public void zumGipfel()''' | |||
{ | |||
while(kara.treeFront()) | |||
{ | |||
// eine Stufe hochsteigen! | |||
kara.turnRight(); | |||
kara.move(); | |||
kara.turnLeft(); | |||
kara.move(); | |||
} | |||
} | |||
'''public void insTal()''' | |||
{ | |||
while(!kara.treeFront()) | |||
{ | |||
// eine Stufe runtersteigen! | |||
kara.move(); | |||
kara.turnRight(); | |||
kara.move(); | |||
kara.turnLeft(); | |||
} | |||
} | |||
</code> | |||
===Programmierung der Hauptmethode=== | |||
Jetzt kann man die Hauptmethode programmieren, indem man die Methoden <code>zumGipfel()</code> und <code>insTal()</code> verwendet! | |||
Dafür wird die Programmbeschreibung in ein Java-Programm übersetzt. | |||
{| class="wikitable" | |||
! Programmbeschreibung !! Java-Quelltext | |||
|- | |||
| | |||
{|style="border-style: solid; border-width: 0px;" | |||
| '''Methode sucheKleeblatt()''' | |||
{|style="border-style: solid; border-width: 2px 0px 2px 2px; margin: 5px" | |||
| Solange Kara '''nicht''' auf einem Blatt steht | |||
{|style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px" | |||
| zumGipfel()<br/>insTal() | |||
|} | |||
|} | |||
|} | |||
| | |||
'''public void sucheKleeblatt()''' | |||
{ | |||
while(!kara.onLeaf()) | |||
{ | |||
zumGipfel(); | |||
insTal(); | |||
} | |||
} | |||
|} | |||
==Beispiel 2: Wintervorrat== | |||
[[File:Kara-wintervorrat-vorher.png|thumb|vorher|413px]] | |||
[[File:Kara-wintervorrat-nachher.png|thumb|nachher|409px]] | |||
Kara soll bis zur Höhle gehen und alle Kleeblätter aufsammeln. | |||
Dann soll Kara die gesammelten Kleeblätter in der Höhle ablegen und sich darüber setzen. | |||
===Zerlegung=== | |||
Das Problem besteht aus mehreren Teilproblemen die nacheinander abgearbeitet werden: | |||
* <code>blaetterSammeln()</code>: <br>''Diese Methode gibt die Zahl der gesammelten Blätter zurück!''<br>''Danach dreht sich Kara nach rechts.'' | |||
* <code>bisZumBaumGehen()</code><br>''Danach dreht sich Kara zweimal nach rechts.'' | |||
* <code>blaetterLegen(int anzahl)</code><br>''Dieser Methode wird die Anzahl der gesammelten Blätter übergeben.'' | |||
===Programmbeschreibung der Hauptmethode=== | |||
{| class="wikitable" | |||
! Programmbeschreibung | |||
|- | |||
| | |||
{|style="border-style: solid; border-width: 0px;" | |||
| '''Methode wintervorratAnlegen()''' | |||
{|style="border-style: solid; border-width: 2px 0px 2px 2px; margin: 5px" | |||
| ''Es wird die Variable blaetterZahl gebraucht!''<br/>blaetterZahl = blaetterSammeln()<br/>nach rechts drehen<br/>bisZumBaumGehen()<br/>zweimal nach rechts drehen<br/>blaetterLegen(blaetterZahl) | |||
|} | |||
|} | |||
|} | |||
===Programmierung der Teilprobleme=== | |||
''Für die Teilprobleme wird hier nur die Programmierung angegeben.'' | |||
<code> | |||
'''public int blaetterSammeln()''' | |||
{ | |||
int ergebnis = 0; | |||
while(kara.treeRight()) | |||
{ | |||
// "Nachdenken" | |||
if(kara.onLeaf()) | |||
{ | |||
kara.removeLeaf(); | |||
ergebnis = ergebnis + 1; | |||
} | |||
// "Einen Schritt weiter gehen" | |||
kara.move(); | |||
} | |||
return ergebnis; | |||
} | |||
</code> | |||
<code> | |||
'''public void bisZumBaumGehen()''' | |||
{ | |||
while(!kara.treeFront()) | |||
{ | |||
kara.move(); | |||
} | |||
} | |||
</code> | |||
<code> | |||
'''public void blaetterLegen(int anzahl)''' | |||
{ | |||
for(int i=0; i<anzahl; i++) | |||
{ | |||
kara.putLeaf(); | |||
kara.move(); | |||
} | |||
} | |||
</code> | |||
===Programmierung der Hauptmethode=== | |||
Jetzt kann man die Hauptmethode programmieren: | |||
Dafür wird die Programmbeschreibung in ein Java-Programm übersetzt. | |||
{| class="wikitable" | |||
! Programmbeschreibung !! Java-Quelltext | |||
|- | |||
| | |||
{|style="border-style: solid; border-width: 0px;" | |||
| '''Methode wintervorratAnlegen()''' | |||
{|style="border-style: solid; border-width: 2px 0px 2px 2px; margin: 5px" | |||
| ''Es wird die Variable blaetterZahl gebraucht!''<br/>blaetterZahl = blaetterSammeln()<br/>nach rechts drehen<br/>bisZumBaumGehen()<br/>zweimal nach rechts drehen<br/>blaetterLegen(blaetterZahl) | |||
|} | |||
|} | |||
| | |||
'''public void wintervorratAnlegen()''' | |||
{ | |||
int blaetterZahl = blaetterSammeln(); | |||
kara.turnRight(); | |||
bisZumBaumGehen(); | |||
kara.turnRight(); | |||
kara.turnRight(); | |||
blaetterLegen(blaetterZahl); | |||
} | |||
|} | |} |
Aktuelle Version vom 27. Oktober 2024, 14:00 Uhr
Auf dieser Seite werden anhand von Kara grundlegende Programmiertechniken vorgestellt.
Die Grundlagen der Java-Syntax werden auf folgender Seite vorgestellt: Java_Basis-Sprachelemente
Methoden, die n-mal etwas tun
Mit n-mal ist gemeint, dass bekannt ist, wie oft die Wiederholung ausgeführt werden soll.
Dafür braucht man eine Wiederhole n-mal-Schleife. In Java kann man das mit for
realisieren.
Beispiel
Kara soll eine Linie von 20 Kleeblättern legen.
Programmbeschreibung | Java Quelltext | |||
---|---|---|---|---|
|
public void zwanzigerLinieLegen() { for(int i=0; i<20; i++) { kara.putLeaf(); kara.move(); } } |
Methoden, die etwas tun, bis ein Ziel erreicht wird
Solche Methoden brauchen eine Solange-Schleife. In Java kann man das mit while
realisieren.
In der Regel haben diese Methoden folgenden Aufbau:
- Eine Schleife, die so lange läuft, bis das "Ziel" erreicht ist
In der Schleife passiert folgendes:- Es wird "nachgedacht". (Das kann kompliziert sein...)
- Nach dem Nachdenken: Ein Schritt in Richtung Ziel wird ausgeführt
Wichtig ist dabei, dass in jedem Schleifendurchlauf genau ein Schritt ausgeführt wird, und das erst nach dem "Nachdenken"!
Dadurch wird die Programmierung viel einfacher!
Beispiel
Die folgende Methode lässt Kara rund um einen Wald gehen, bis sie auf einem Blatt steht.
Das "Nachdenken" ist hier relativ kompliziert:
Die größte Schwierigkeit ist für Kara, wenn sie in die "Sackgasse" auf der rechten Seite geht.
Dort muss sie 2x prüfen, ob sie vor einem Baum steht!
Programmbeschreibung | Java Quelltext | ||||||
---|---|---|---|---|---|---|---|
|
public void rundUmDenWald() { while(!kara.onLeaf()) { // (Nachdenken!) if(!kara.treeRight()) { kara.turnRight(); } else { while(kara.treeFront()) { kara.turnLeft(); } } // (Schritt ausführen!) kara.move(); } } |
Methoden, die etwas berechnen
Methoden, die etwas berechnen, haben in der Regel folgenden Aufbau:
- Zuerst wird eine Variable
ergebnis
deklariert. - Dann wird mit einer Schleife das zu berechnende Feld (oder Blätterspur o.ä.) durchlaufen.
In der Schleife passiert folgendes:- Die Berechnung wird aktualisiert
- Es wird zum nächsten Schritt weitergegangen.
- Wenn die Schleife fertig ist, dann wird mit dem Schlüsselwort
return
dasergebnis
zurückgegeben.
Beispiel
Die folgende Methode lässt Kara so lange geradeaus laufen, wie Kara auf einem Blatt steht.
Dabei werden die Blätter gezählt und am Ende der Methode zurückgegeben.
Programmbeschreibung | Java Quelltext | |||
---|---|---|---|---|
|
public int zaehleBlaetter() { int ergebnis = 0; while(kara.onLeaf()) { ergebnis = ergebnis + 1; kara.move(); } return ergebnis; } |
Aufruf der Methode
Die Methode zaehleBlaetter()
kann z.B. so verwendet werden:
int anzahl = zaehleBlaetter();
kara.turnLeft();
kara.move();
kara.turnLeft();
kara.move();
linieLegen(anzahl);
Erklärung:
Die Methode zaehleBlaetter()
gibt eine Zahl zurück.
Diese Zahl wird in der lokalen Variable anzahl
gespeichert.
Dann kann anzahl
verwendet werden.
Im Beispiel zählt Kara die Blätter.
Dann wendet sie und legt eine Zeile darunter genau so viele Blätter ab, wie sie gezählt hat.
Zerlegung in mehrere Methoden
Programmieren wird viel einfacher - und vor allem übersichtlicher! - wenn man ein großes Problem in beherrschbare Teilprobleme zerlegt.
Im Idealfall genügt jedes Teilproblem folgenden Anforderungen:
- Es lässt sich ganz einfach programmieren
- Es lässt sich einzeln testen
Vorgehensweise
- Man überlegt sich, in welche Teilprobleme man das Gesamtproblem zerlegen kann.
- Für jedes Teilproblem:
- Programmieren
- Testen
- Jetzt das Gesamtproblem programmieren!
Beispiel 1: Gebirge
Kara soll über das Gebirge klettern, bis sie in einem Tal ein Kleeblatt findet.
Zerlegung
Man sieht, dass Kara immer abwechselnd bergauf und bergab gehen muss! Daher bietet es sich an, das Gesamtproblem mithilfe der folgenden zwei Methoden zu programmieren:
zumGipfel()
insTal()
Programmbeschreibung der Hauptmethode
Programmbeschreibung | |||
---|---|---|---|
|
Programmierung der Teilprobleme
Für die Teilprobleme wird hier nur die Programmierung angegeben.
public void zumGipfel()
{
while(kara.treeFront())
{
// eine Stufe hochsteigen!
kara.turnRight();
kara.move();
kara.turnLeft();
kara.move();
}
}
public void insTal()
{
while(!kara.treeFront())
{
// eine Stufe runtersteigen!
kara.move();
kara.turnRight();
kara.move();
kara.turnLeft();
}
}
Programmierung der Hauptmethode
Jetzt kann man die Hauptmethode programmieren, indem man die Methoden zumGipfel()
und insTal()
verwendet!
Dafür wird die Programmbeschreibung in ein Java-Programm übersetzt.
Programmbeschreibung | Java-Quelltext | |||
---|---|---|---|---|
|
public void sucheKleeblatt() { while(!kara.onLeaf()) { zumGipfel(); insTal(); } } |
Beispiel 2: Wintervorrat
Kara soll bis zur Höhle gehen und alle Kleeblätter aufsammeln.
Dann soll Kara die gesammelten Kleeblätter in der Höhle ablegen und sich darüber setzen.
Zerlegung
Das Problem besteht aus mehreren Teilproblemen die nacheinander abgearbeitet werden:
blaetterSammeln()
:
Diese Methode gibt die Zahl der gesammelten Blätter zurück!
Danach dreht sich Kara nach rechts.bisZumBaumGehen()
Danach dreht sich Kara zweimal nach rechts.blaetterLegen(int anzahl)
Dieser Methode wird die Anzahl der gesammelten Blätter übergeben.
Programmbeschreibung der Hauptmethode
Programmbeschreibung | ||
---|---|---|
|
Programmierung der Teilprobleme
Für die Teilprobleme wird hier nur die Programmierung angegeben.
public int blaetterSammeln()
{
int ergebnis = 0;
while(kara.treeRight())
{
// "Nachdenken"
if(kara.onLeaf())
{
kara.removeLeaf();
ergebnis = ergebnis + 1;
}
// "Einen Schritt weiter gehen"
kara.move();
}
return ergebnis;
}
public void bisZumBaumGehen()
{
while(!kara.treeFront())
{
kara.move();
}
}
public void blaetterLegen(int anzahl)
{
for(int i=0; i<anzahl; i++)
{
kara.putLeaf();
kara.move();
}
}
Programmierung der Hauptmethode
Jetzt kann man die Hauptmethode programmieren:
Dafür wird die Programmbeschreibung in ein Java-Programm übersetzt.
Programmbeschreibung | Java-Quelltext | ||
---|---|---|---|
|
public void wintervorratAnlegen() { int blaetterZahl = blaetterSammeln(); kara.turnRight(); bisZumBaumGehen(); kara.turnRight(); kara.turnRight(); blaetterLegen(blaetterZahl); } |