Programmiertechnik: Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
 
(11 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 4: Zeile 4:
Auf dieser Seite werden anhand von Kara '''grundlegende Programmiertechniken''' vorgestellt.
Auf dieser Seite werden anhand von Kara '''grundlegende Programmiertechniken''' vorgestellt.


Die Grundlagen der '''Java-Syntax''' werden auf folgender Seite vorgestellt:<br/>'''[[Java_Basis-Sprachelemente]]'''
Die Grundlagen der '''Java-Syntax''' werden auf folgender Seite vorgestellt: '''[[Java_Basis-Sprachelemente]]'''
 
 
''Hinweis:''<br>
''Dass bei den Programmbeschreibungen manchmal die senkrechten Linien gestrichelt sind, ist keine Absicht. <br/>Das liegt einfach daran, dass sich das in HTML nicht anders darstellen lässt...<br/>Bei Programmbeschreibungen "von Hand" kann man einfach Linien durchziehen!''


=Methoden, die n-mal etwas tun=
=Methoden, die n-mal etwas tun=
Zeile 76: Zeile 72:
         |} sonst
         |} sonst
         {| style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px"
         {| style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px"
             | wenn ein Baum vorne ist
             | solange ein Baum vorne ist
             {| style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px"
             {| style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px"
               | drehe dich nach links<br/>wenn ein Baum vorne ist
               | drehe dich nach links
              {| style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px"
                  | drehe dich nach links
              |}
             |}
             |}
         |} <br/>'''''(Schritt ausführen!)'''''<br/>gehe einen Schritt
         |} <br/>'''''(Schritt ausführen!)'''''<br/>gehe einen Schritt
Zeile 99: Zeile 92:
         else
         else
         {
         {
           if(kara.treeFront())
           while(kara.treeFront())
           {
           {
               kara.turnLeft();
               kara.turnLeft();
              if(kara.treeFront())
              {
                kara.turnLeft();
              }
           }
           }
         }
         }
Zeile 121: Zeile 110:
** Die Berechnung wird aktualisiert
** Die Berechnung wird aktualisiert
** Es wird zum nächsten Schritt weitergegangen.
** Es wird zum nächsten Schritt weitergegangen.
* Wenn die Schleife fertig ist, dann wird <code>ergebnis</code> zurückgegeben.
* Wenn die Schleife fertig ist, dann wird mit dem Schlüsselwort <code>return</code> das <code>ergebnis</code> zurückgegeben.


==Beispiel==
==Beispiel==
Zeile 155: Zeile 144:
   }
   }
|}
|}
==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=
=Zerlegung in mehrere Methoden=
Zeile 177: Zeile 185:
Man sieht, dass Kara immer abwechselnd bergauf und bergab gehen muss!
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:
Daher bietet es sich an, das Gesamtproblem mithilfe der folgenden zwei Methoden zu programmieren:
* <code>aufDenGipfel()</code>
* <code>zumGipfel()</code>
* <code>insTal()</code>
* <code>insTal()</code>


Zeile 187: Zeile 195:
|-
|-
|
|
 
  {|style="border-style: solid; border-width: 0px;"
  '''Methode sucheKleeblatt()'''
    | '''Methode sucheKleeblatt()'''
  &lceil;&macr;&macr;&macr;&macr;&macr;&macr;  
    {|style="border-style: solid; border-width: 2px 0px 2px 2px; margin: 5px"
  &#124;  Solange Kara '''nicht''' auf einem Blatt steht
      | Solange Kara '''nicht''' auf einem Blatt steht
  &#124;  &lceil;&macr;&macr;&macr;&macr;&macr;&macr;
      {|style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px"
  &#124;  &#124;  zumGipfel()
        | zumGipfel()<br/>insTal()
  &#124;  &#124;  insTal()
      |}
  &#124;  &lfloor; &#822; &#822; &#822; &#822; &#822; &#822;
    |}
   &lfloor; &#822; &#822; &#822; &#822; &#822; &#822;
   |}
|}
|}


Zeile 201: Zeile 209:
''Für die Teilprobleme wird hier nur die Programmierung angegeben.''
''Für die Teilprobleme wird hier nur die Programmierung angegeben.''


<code>
<code>
   '''public void zumGipfel()'''
   '''public void zumGipfel()'''
   {
   {
Zeile 213: Zeile 221:
     }
     }
   }
   }
</code>
 
 
 
<code>
   '''public void insTal()'''
   '''public void insTal()'''
   {
   {
Zeile 228: Zeile 233:
     }
     }
   }
   }
</code>
</code>
 


===Programmierung der Hauptmethode===
===Programmierung der Hauptmethode===
Zeile 241: Zeile 245:
|-
|-
|
|
 
  {|style="border-style: solid; border-width: 0px;"
  '''Methode sucheKleeblatt()'''
    | '''Methode sucheKleeblatt()'''
  &lceil;&macr;&macr;&macr;&macr;&macr;&macr;  
    {|style="border-style: solid; border-width: 2px 0px 2px 2px; margin: 5px"
  &#124;  Solange Kara '''nicht''' auf einem Blatt steht
      | Solange Kara '''nicht''' auf einem Blatt steht
  &#124;  &lceil;&macr;&macr;&macr;&macr;&macr;&macr;
      {|style="border-style: solid; border-width: 1px 0px 1px 1px; margin: 5px"
  &#124;  &#124;  zumGipfel()
        | zumGipfel()<br/>insTal()
  &#124;  &#124;  insTal()
      |}
  &#124;  &lfloor; &#822; &#822; &#822; &#822; &#822; &#822;
    |}
   &lfloor; &#822; &#822; &#822; &#822; &#822; &#822;
   |}
|
|
   '''public void sucheKleeblatt()'''
   '''public void sucheKleeblatt()'''
Zeile 260: Zeile 264:
   }
   }
|}
|}


==Beispiel 2: Wintervorrat==
==Beispiel 2: Wintervorrat==
Zeile 285: Zeile 288:
|-
|-
|
|
 
  {|style="border-style: solid; border-width: 0px;"
  '''Methode wintervorratAnlegen()'''
    | '''Methode wintervorratAnlegen()'''
  &lceil;&macr;&macr;&macr;&macr;&macr;&macr;  
    {|style="border-style: solid; border-width: 2px 0px 2px 2px; margin: 5px"
  &#124;  ''Es wird die Variable blaetterZahl gebraucht!''
        | ''Es wird die Variable blaetterZahl gebraucht!''<br/>blaetterZahl = blaetterSammeln()<br/>nach rechts drehen<br/>bisZumBaumGehen()<br/>zweimal nach rechts drehen<br/>blaetterLegen(blaetterZahl)
  &#124;  blaetterZahl = blaetterSammeln()
    |}
  &#124;  nach rechts drehen
  |}
  &#124;  bisZumBaumGehen()
  &#124;  zweimal nach rechts drehen
  &#124;  blaetterLegen(blaetterZahl)
  &lfloor; &#822; &#822; &#822; &#822; &#822; &#822;
|}
|}


Zeile 300: Zeile 299:
''Für die Teilprobleme wird hier nur die Programmierung angegeben.''
''Für die Teilprobleme wird hier nur die Programmierung angegeben.''


<code>
<code>
   '''public int blaetterSammeln()'''
   '''public int blaetterSammeln()'''
   {
   {
Zeile 318: Zeile 317:
     return ergebnis;
     return ergebnis;
   }
   }
</code>
</code>


<code>
<code>
   '''public void bisZumBaumGehen()'''
   '''public void bisZumBaumGehen()'''
   {
   {
Zeile 328: Zeile 327:
     }
     }
   }
   }
</code>
</code>


<code>
<code>
   '''public void blaetterLegen(int anzahl)'''
   '''public void blaetterLegen(int anzahl)'''
   {
   {
Zeile 339: Zeile 338:
     }
     }
   }
   }
</code>
</code>


===Programmierung der Hauptmethode===
===Programmierung der Hauptmethode===
Zeile 351: Zeile 350:
|-
|-
|
|
  '''Methode wintervorratAnlegen()'''
  {|style="border-style: solid; border-width: 0px;"
  &lceil;&macr;&macr;&macr;&macr;&macr;&macr;  
    | '''Methode wintervorratAnlegen()'''
  &#124;  ''Es wird die Variable blaetterZahl gebraucht!''
    {|style="border-style: solid; border-width: 2px 0px 2px 2px; margin: 5px"
  &#124;  blaetterZahl = blaetterSammeln()
        | ''Es wird die Variable blaetterZahl gebraucht!''<br/>blaetterZahl = blaetterSammeln()<br/>nach rechts drehen<br/>bisZumBaumGehen()<br/>zweimal nach rechts drehen<br/>blaetterLegen(blaetterZahl)
  &#124;  nach rechts drehen
    |}
  &#124;  bisZumBaumGehen()
  |}
  &#124;  zweimal nach rechts drehen
  &#124;  blaetterLegen(blaetterZahl)
  &lfloor; &#822; &#822; &#822; &#822; &#822; &#822;
|
|
   '''public void wintervorratAnlegen()'''
   '''public void wintervorratAnlegen()'''

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
Methode zwanzigerLinieLegen()
Wiederhole 20-mal
lege ein Blatt
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 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

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
solange 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
       {
          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 das 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;
  }

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

  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:

  • zumGipfel()
  • 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())
    {
        // "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
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);
 }