Programmieren leicht gemacht - adäquate Modelle für den Einsatz im Unterricht/ Elementare Aufgaben

Aus Wikibooks

Elementare Programmier-Aufgaben[Bearbeiten]

Die nachfolgenden Aufgaben sollen dazu dienen, um die bereits kennen gelernten theoretischen Programmierkonzepte in die Praxis umsetzen zu können.

Aufgabe 1[Bearbeiten]

Ausgangssituation: Auf jedem Feld liegen ein oder zwei Körner. Der Hamster soll dafür sorgen, dass auf jedem Feld genau ein Korn liegt:



Zuerst fügen wir unserem neuen Programm eine Methode evtlFressen() hinzu, die auf ein Feld genau ein Korn platziert:

void evtlFressen() 
{
   //erstmal ein Korn fressen
   nimm();
   /*
    * falls dies das einzige Korn auf dem Feld war, muss es wieder 
    * abgelegt werden
    */
    if (!kornDa()) 
   {
      gib();
    }
}


Des Weiteren benötigen wir noch eine Methode, die wir bereits kennen gelernt haben und die die Rechtsdrehung des Hamster um 90 Grad realisiert:

void rechtsUm()
{
  linksUm();
  linksUm();
  linksUm();
}

Da unser zu überprüfendes Feld aus mehreren Reihen besteht, können wir die Überprüfung einer Reihe in eine eigene Methode verpacken:

void ueberpruefeEineReihe()
{
  evtlFressen();
  vor();
  evtlFressen();
  vor();
  evtlFressen();
  vor();
  evtlFressen();
  vor();
  evtlFressen();
}

Diese Methode ist jedoch noch auffallend lang. Außerdem fällt uns hierbei auch sofort auf, dass sich die Befehle in der gleichen Reihenfolge wiederholen. Um den Code kompakter zu gestalten, fügen wir eine for-Schleife ein, die viermal durchlaufen wird:

void ueberpruefeEineReihe()
{
  for(int i=0; i <= 3 ; i++)
 {
   evtlFressen();
   vor();
  }
  evtlFressen();
}


Nun müssen wir die benötigten Anweisungen in der richtigen Reihenfolge in die main-Methode einfügen:

void main() 
{	
  //untere Reihe
  ueberpruefeEineReihe();
  linksUm();
  vor();
  linksUm();
  //zweite Reihe von unten
  ueberpruefeEineReihe();
  rechtsUm();
  vor();
  rechtsUm();
  //dritte Reihe von unten
  ueberpruefeEineReihe();
  linksUm();
  vor();
  linksUm();
  //vierte Reihe von unten
  ueberpruefeEineReihe();
  rechtsUm();
  vor();
  rechtsUm();
  //obere Reihe
  ueberpruefeEineReihe();
}

Dabei wollen wir nun wiederum eine for-Schleife einführen, die zweimal durchlaufen wird, um den Code ein wenig zu verkürzen:

void main() 
{
for (int i=0; i < 2; i++)
{
  ueberpruefeEineReihe();
  linksUm();
  vor();
  linksUm();
  ueberpruefeEineReihe();
  rechtsUm();
  vor();
  rechtsUm();
}
 //obere Reihe
 ueberpruefeEineReihe();
}


Detaillierte Informationen zur Dekodierung des angeführten ASCII-Textes finden Sie unter Wichtige Information zum Herunterladen der Beispielsdateien

Den zugehörigen ASCII-Text finden Sie hier.


Aufgabe 1.1[Bearbeiten]

Passen Sie die Lösung von Aufgabe 1 an folgende Ausgangssituation an: Auf jedem Feld liegen anfangs ein, zwei oder drei Körner.

Aufgabe 1.2[Bearbeiten]

Gegeben sei folgendes Hamster-Territorium:

Der Hamster weiß nicht, wie viele Körner in seinem Maul sind. Solange noch Körner in seinem Maul vorhanden sind, soll er folgendes ausführen: Er soll in der aktuellen Ecke ein Korn ablegen und dann in die zweite Ecke laufen. Dort soll er zwei Körner ablegen und in die dritte Ecke laufen. Dort soll er drei Körner ablegen und in die vierte Ecke laufen. Dort angekommen soll er vier Körner ablegen.

Aufgabe 1.3[Bearbeiten]

Bei dieser Aufgabe befindet sich der Hamster in einem Kreuz:

Neun Körner befinden sich in seinem Maul. Er soll nun auf allen neun freien Feldern genau ein Korn ablegen und dann auf seine Ausgangsposition zurückkehren. Es ist jedoch nicht festgelegt, in welche Richtung der Hamster anfangs blickt. Schreibe ein Hamster-Programm, dass die gegebene Aufgabe unabhängig von der anfänglichen Blickrichtung des Hamsters löst!

Aufgabe 2[Bearbeiten]

Die bis jetzt kennen gelernten Aufgaben waren immer nur auf eine bestimmte vorgegebene Landschaft zugeschnitten. Bei der folgenden Aufgabe soll nun die fehlende Anpassbarkeit beseitigt werden. Diese Aufgabe dient weiters zur Illustration der while-Schleife. Das Hamster-Territorium für diese Aufgabe soll von folgender Form sein (dabei soll das Programm auch für Abweichungen von diesem Territorium funktionieren):


Der Hamster steht vor einem regelmäßigen Berg unbekannter Höhe. Der Hamster soll nun den Gipfel erklimmen und dann stehen bleiben.


Folgende zwei Methoden sind in diesem Beispiel sicherlich hilfreich:

void rechtsUm()  
{ 
   kehrt(); 
   linksUm(); 
}
void kehrt() 
{ 
   linksUm(); 
   linksUm(); 
}


Zuerst soll der Hamster bis zum Fuße des Berges laufen, der durch eine Mauer symbolisiert wird, d.h. solange dem Hamster keine Mauer den Weg versperrt, soll dieser nach vorne laufen:

void laufeZumBerg() 
{
   while (vornFrei()) 
  {
      vor();
   }
}


Das Erklimmen einer einzelnen Stufe realisiert folgende Methode:

void erklimmeEineStufe() 
{
   linksUm(); 
   vor(); 
   rechtsUm(); 
   vor();
}

Nun muss diese Methode noch geeignet oft ausgeführt werden, um dem Hamster das Erklimmen des Gipfels zu ermöglichen. Dazu soll solange die Methode erklimmeEineStufe() ausgeführt werden, bis im Feld vor dem Hamster keine Mauer mehr positioniert ist. Dies bedeutet, dass er am Gipfel des Berges angekommen ist:

void erklimmeGipfel() 
{
  while (!vornFrei())
  {
     erklimmeEineStufe();
   }
}


Nun müssen die vorgestellten Methoden nur mehr in die main-Methode eingefügt werden:

void main() 
{
   laufeZumBerg();
   erklimmeGipfel();
}


Detaillierte Informationen zur Dekodierung des angeführten ASCII-Textes finden Sie unter Wichtige Information zum Herunterladen der Beispielsdateien

Den zugehörigen ASCII-Text finden Sie hier.

Aufgabe 2.1[Bearbeiten]

Diese Aufgabe stellt eine Modifikation der Aufgabe 2 dar: Der Hamster steht hier nicht vor einem Berg, sondern vor einer regelmäßigen Mulde unbekannter Tiefe:


Es sind keine Körner im Territorium positioniert. Der Hamster, der anfangs ein Korn im Maul trägt, soll bis zur tiefsten Stelle der Mulde hinabsteigen, sich umdrehen, wieder emporsteigen und an seiner Ausgangsposition stehen bleiben.

Aufgabe 2.2[Bearbeiten]

Der Hamster befindet sich in der unteren Ecke eines gleichmäßigen rautenförmigen Territoriums beliebiger Größe:

Er blickt in Richtung Norden. Das Territorium ist ringsum durch Mauern abgeschlossen, im Inneren existieren jedoch keine weiteren Mauern. Im Territorium befindet sich genau ein Korn. Der Hamster soll sich auf die Suche nach dem Korn begeben und dieses schlussendlich fressen.

Aufgabe 3[Bearbeiten]

In dieser Aufgabe soll unser Hamster das Zeichnen von Zahlen mit Hilfe von Körnern lernen. Der Hamster befindet sich in einem leeren Territorium und soll die Ziffern 0,1 und 2 mit jeweils einem Korn pro entsprechendem Feld zeichnen:


Detaillierte Informationen zur Dekodierung des angeführten ASCII-Textes finden Sie unter Wichtige Information zum Herunterladen der Beispielsdateien.

Den zugehörigen ASCII-Text finden Sie hier.

Aufgabe 3.1[Bearbeiten]

Die Aufgabe 3 soll dahingehend modifiziert werden, dass die Anzahl der Körner pro Feld nicht auf ein Korn beschränkt ist, sondern variabel als Parameter übergeben werden kann. Im folgenden Beispiel wurde der Parameter auf 9 gesetzt, d.h. die Ziffern werden jeweils mit 9 Körnern pro entsprechendem Feld gezeichnet:


Detaillierte Informationen zur Dekodierung des angeführten ASCII-Textes finden Sie unter Wichtige Information zum Herunterladen der Beispielsdateien

Den zugehörigen ASCII-Text finden Sie hier.

Aufgabe 4[Bearbeiten]

In dieser Aufgabe soll der Hamster eine beliebige Anzahl an Schritten vorwärts laufen, maximal jedoch bis zur nächsten Mauer.

Wir schreiben nun eine Methode, welche den Hamster eine bestimmte Anzahl von Schritten vorwärts laufen lässt, sofern ihm keine Mauer im Weg steht. Dabei wird die while-Schleife nur dann durchlaufen, wenn direkt vor dem Hamster keine Mauer steht und wenn die Anzahl der noch zu machenden Schritte größer als 0 ist. Diese Anzahl wird in jedem Schleifendurchlauf um 1 erniedrigt, da sich der Hamster ja in jedem Durchlauf um ein Feld nach vorne bewegt:

void laufeNachVor (int schritte)
{
   while (vornFrei() && schritte > 0)
  {
     vor();
     schritte--;
  }
}

Diese Methode muss nun nur noch der main-Methode hinzugefügt werden. In angegebenen Code soll sich der Hamster 10 Schritte vorwärts bewegen:

void main() 
{
   int anzahl = 10;	
   laufeNachVor(anzahl);
}



Detaillierte Informationen zur Dekodierung des angeführten ASCII-Textes finden Sie unter Wichtige Information zum Herunterladen der Beispielsdateien

Den zugehörigen ASCII-Text finden Sie hier.

Aufgabe 4.1[Bearbeiten]

Bei dieser Aufgabe soll sich der Hamster den Weg durch ein Labyrinth bahnen, welches wie folgendes Territorium aussehen kann, und das darin enthaltene Korn suchen und fressen:

Dabei ist es wichtig, dass alle Wege genau 1 Feld breit sind. Dein Programm soll aber nicht nur für das obige Labyrinth funktionieren, sondern für alle denkbaren Labyrinthe, die die entsprechenden Konventionen erfüllen.


Detaillierte Informationen zur Dekodierung des angeführten ASCII-Textes finden Sie unter Wichtige Information zum Herunterladen der Beispielsdateien.

Den zugehörigen ASCII-Text finden Sie hier.

Eigene Testanweisungen[Bearbeiten]

Aufgabe 5.1[Bearbeiten]

Schreiben Sie eine boolean-Funktion rechtsOderLinksFrei() als reine Test-Funktion! Die Funktion soll den Wert true zurückliefern, wenn das Feld rechts oder links vom Hamster nicht durch eine Mauer belegt ist. Damit diese Aufgabe ein wenig schwieriger ist, soll die Funktion das exklusive Oder realisieren, d.h. wenn das Feld links und rechts frei ist, liefert sie false zurück, wenn aber das Feld nur rechts oder nur links frei ist, gibt sie den Wert true zurück.


Detaillierte Informationen zur Dekodierung des angeführten ASCII-Textes finden Sie unter Wichtige Information zum Herunterladen der Beispielsdateien.

Den zugehörigen ASCII-Text finden Sie hier.

Aufgabe 5.2[Bearbeiten]

Schreiben Sie eine boolean-Funktion sackgasse() als reine Test-Funktion! Die Funktion soll dann den Wert true liefern, wenn der Hamster am Ende einer Sackgasse steht, wenn er also vorne, rechts und links von Mauern umgeben ist und nur das Feld hinter ihm frei ist.

Detaillierte Informationen zur Dekodierung des angeführten ASCII-Textes finden Sie unter Wichtige Information zum Herunterladen der Beispielsdateien

Den zugehörigen ASCII-Text finden Sie hier.