Programmiertechnik: Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
Zeile 233: Zeile 233:
[[File:Kara-wintervorrat-nachher.png|thumb|nachher|409px]]
[[File:Kara-wintervorrat-nachher.png|thumb|nachher|409px]]


Kara soll über das Gebirge klettern, bis sie in einem Tal ein Kleeblatt findet.
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===
===Zerlegung===
Man sieht, dass Kara immer abwechselnd bergauf und bergab gehen muss!
Das Problem besteht aus mehreren Teilproblemen die nacheinander abgearbeitet werden:
Daher bietet es sich an, das Gesamtproblem mithilfe der folgenden zwei Methoden zu programmieren:
 
* <code>aufDenGipfel()</code>
* <code>blaetterSammeln()</code>: <br>''Diese Methode gibt die Zahl der gesammelten Blätter zurück!''<br>''Danach dreht sich Kara nach rechts.''
* <code>insTal()</code>
* <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===
===Programmbeschreibung der Hauptmethode===
Zeile 249: Zeile 253:
|
|


   '''Methode sucheKleeblatt()'''
   '''Methode wintervorratAnlegen()'''
   &lceil;&macr;&macr;&macr;&macr;&macr;&macr;  
   &lceil;&macr;&macr;&macr;&macr;&macr;&macr;  
   &#124;  Solange Kara '''nicht''' auf einem Blatt steht
   &#124;  ''Es wird die Variable blaetterZahl gebraucht!''
   &#124;  &lceil;&macr;&macr;&macr;&macr;&macr;&macr;
   &#124;  blaetterZahl = blaetterSammeln()
   &#124;  &#124;  zumGipfel()
   &#124;  nach rechts drehen
   &#124;  &#124;  insTal()
  &#124;  bisZumBaumGehen()
  &#124;  &lfloor; &#822; &#822; &#822; &#822; &#822; &#822;
   &#124;  zweimal nach rechts drehen
  &#124;  blaetterLegen(blaetterZahl)
   &lfloor; &#822; &#822; &#822; &#822; &#822; &#822;
   &lfloor; &#822; &#822; &#822; &#822; &#822; &#822;
|}
|}
Zeile 263: Zeile 268:


<code>
<code>
   '''public void zumGipfel()'''
   '''public int blaetterSammeln()'''
   {
   {
     while(kara.treeFront())
    int ergebnis = 0;
     while(kara.treeRight())
     {
     {
         // eine Stufe hochsteigen!
         if(kara.onLeaf())
        kara.turnRight();
         {
         kara.move();
            kara.removeLeaf();
         kara.turnLeft();
            ergebnis = ergebnis + 1;
         }
         kara.move();
         kara.move();
     }
     }
    return ergebnis;
   }
   }
</code>
</code>
Zeile 278: Zeile 286:


<code>
<code>
   '''public void insTal()'''
   '''public void bisZumBaumGehen()'''
   {
   {
     while(!kara.treeFront())
     while(!kara.treeFront())
     {
     {
        // eine Stufe runtersteigen!
         kara.move();
         kara.move();
         kara.turnRight();
    }
  }
</code>
 
<code>
  '''public void blaetterLegen(int anzahl)'''
  {
    for(int i=0; i<anzahl; i++
    {
         kara.putLeaf();
         kara.move();
         kara.move();
        kara.turnLeft();
     }
     }
   }
   }
</code>
</code>


===Programmierung der Hauptmethode===
===Programmierung der Hauptmethode===
Jetzt kann man die Hauptmethode programmieren, indem man die Methoden <code>zumGipfel()</code> und <code>insTal()</code> verwendet!
Jetzt kann man die Hauptmethode programmieren:


Dafür wird die Programmbeschreibung in ein Java-Programm übersetzt.
Dafür wird die Programmbeschreibung in ein Java-Programm übersetzt.
Zeile 302: Zeile 316:
|-
|-
|
|
 
   '''Methode wintervorratAnlegen()'''
   '''Methode sucheKleeblatt()'''
   &lceil;&macr;&macr;&macr;&macr;&macr;&macr;  
   &lceil;&macr;&macr;&macr;&macr;&macr;&macr;  
   &#124;  Solange Kara '''nicht''' auf einem Blatt steht
   &#124;  ''Es wird die Variable blaetterZahl gebraucht!''
   &#124;  &lceil;&macr;&macr;&macr;&macr;&macr;&macr;
   &#124;  blaetterZahl = blaetterSammeln()
   &#124;  &#124;  zumGipfel()
   &#124;  nach rechts drehen
   &#124;  &#124;  insTal()
  &#124;  bisZumBaumGehen()
  &#124;  &lfloor; &#822; &#822; &#822; &#822; &#822; &#822;
   &#124;  zweimal nach rechts drehen
  &#124;  blaetterLegen(blaetterZahl)
   &lfloor; &#822; &#822; &#822; &#822; &#822; &#822;
   &lfloor; &#822; &#822; &#822; &#822; &#822; &#822;
|
|
   '''public void sucheKleeblatt()'''
   '''public void wintervorratAnlegen()'''
   {
   {
     while(!kara.onLeaf())
     int blaetterZahl = blaetterSammeln();
     {
    kara.turnRight();
        zumGipfel();
    bisZumBaumGehen();
        insTal();
     kara.turnRight();
     }
    kara.turnRight();
     blaetterLegen(blaetterZahl);
   }
   }
|}
|}

Version vom 2. Januar 2016, 21:35 Uhr


Auf dieser Seite werden anhand von Kara grundlegende Programmiertechniken vorgestellt.

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", was als nächster Schritt zu tun ist. (Das kann kompliziert sein...)
    • Nach dem Nachdenken: Der Schritt 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

Graph für die Distanzen zwischen Städten

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
 Methode rundUmDenWald()
 ⌈¯¯¯¯¯¯ 
 |  Solange Kara nicht auf einem Blatt steht
 |  ⌈¯¯¯¯¯¯
 |  | (Nachdenken!)
 |  |  wenn kein Baum rechts ist
 |  |  ⌈¯¯¯¯¯¯ 
 |  |  |  drehe dich nach rechts
 |  |  ⌊ ̶ ̶ ̶ ̶ ̶ ̶
 |  |  sonst
 |  |  |¯¯¯¯¯¯
 |  |  |  wenn ein Baum vorne ist
 |  |  |  ⌈¯¯¯¯¯¯ 
 |  |  |  |  drehe dich nach links
 |  |  |  |  wenn ein Baum vorne ist
 |  |  |  |  ⌈¯¯¯¯¯¯ 
 |  |  |  |  |  drehe dich nach links
 |  |  |  |  ⌊ ̶ ̶ ̶ ̶ ̶ ̶
 |  |  |  ⌊ ̶ ̶ ̶ ̶ ̶ ̶
 |  |  ⌊ ̶ ̶ ̶ ̶ ̶ ̶
 |  | 
 |  | (Schritt ausführen!)
 |  |  gehe einen Schritt
 |  ⌊ ̶ ̶ ̶ ̶ ̶ ̶
 ⌊ ̶ ̶ ̶ ̶ ̶ ̶
 public void rundUmDenWald()
 {
    while(!kara.onLeaf())
    {
       // (Nachdenken!)
       if(!kara.treeRight())
       {
          kara.turnRight();
       }
       else
       {
          if(kara.treeFront())
          {
             kara.turnLeft();
             if(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 ergebnis zurückgegeben.

Beispiel

Kara zählt Blätter; das Ergebnis ist hier 6.

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
 Methode zaehleBlaetter(): gibt eine Zahl zurück
 ⌈¯¯¯¯¯¯ 
 |  Setze ergebnis auf 0
 |  Solange Kara auf einem Blatt steht
 |  ⌈¯¯¯¯¯¯
 |  | erhöhe ergebnis um 1
 |  | gehe einen Schritt
 |  ⌊ ̶ ̶ ̶ ̶ ̶ ̶
 |  gib ergebnis zurück;
 ⌊ ̶ ̶ ̶ ̶ ̶ ̶
 public int zaehleBlaetter()
 {
    int ergebnis = 0;
    while(kara.onLeaf())
    {
       ergebnis = ergebnis + 1;
       kara.move();
    }
    return ergebnis;
  }

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

  1. Man überlegt sich, in welche Teilprobleme man das Gesamtproblem zerlegen kann.
  2. Für jedes Teilproblem:
    1. Programmieren
    2. Testen
  3. Jetzt das Gesamtproblem programmieren!

Beispiel 1: Gebirge

Kara soll in einem Tal das Kleeblatt finden

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:

  • aufDenGipfel()
  • insTal()

Programmbeschreibung der Hauptmethode

Programmbeschreibung
 Methode sucheKleeblatt()
 ⌈¯¯¯¯¯¯ 
 |  Solange Kara nicht auf einem Blatt steht
 |  ⌈¯¯¯¯¯¯
 |  |  zumGipfel()
 |  |  insTal()
 |  ⌊ ̶ ̶ ̶ ̶ ̶ ̶
 ⌊ ̶ ̶ ̶ ̶ ̶ ̶

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
 Methode sucheKleeblatt()
 ⌈¯¯¯¯¯¯ 
 |  Solange Kara nicht auf einem Blatt steht
 |  ⌈¯¯¯¯¯¯
 |  |  zumGipfel()
 |  |  insTal()
 |  ⌊ ̶ ̶ ̶ ̶ ̶ ̶
 ⌊ ̶ ̶ ̶ ̶ ̶ ̶
 public void sucheKleeblatt()
 {
    while(!kara.onLeaf())
    {
        zumGipfel();
        insTal();
    }
 }


Beispiel 2: Wintervorrat

vorher
nachher

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
 Methode wintervorratAnlegen()
 ⌈¯¯¯¯¯¯ 
 |  Es wird die Variable blaetterZahl gebraucht!
 |  blaetterZahl = blaetterSammeln()
 |  nach rechts drehen
 |  bisZumBaumGehen()
 |  zweimal nach rechts drehen
 |  blaetterLegen(blaetterZahl)
 ⌊ ̶ ̶ ̶ ̶ ̶ ̶

Programmierung der Teilprobleme

Für die Teilprobleme wird hier nur die Programmierung angegeben.

 public int blaetterSammeln()
 {
    int ergebnis = 0;
    while(kara.treeRight())
    {
        if(kara.onLeaf())
        {
            kara.removeLeaf();
            ergebnis = ergebnis + 1;
        }
        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
 Methode wintervorratAnlegen()
 ⌈¯¯¯¯¯¯ 
 |  Es wird die Variable blaetterZahl gebraucht!
 |  blaetterZahl = blaetterSammeln()
 |  nach rechts drehen
 |  bisZumBaumGehen()
 |  zweimal nach rechts drehen
 |  blaetterLegen(blaetterZahl)
 ⌊ ̶ ̶ ̶ ̶ ̶ ̶
 public void wintervorratAnlegen()
 {
    int blaetterZahl = blaetterSammeln();
    kara.turnRight();
    bisZumBaumGehen();
    kara.turnRight();
    kara.turnRight();
    blaetterLegen(blaetterZahl);
 }