====== AB05 - Methoden mit Rückgabe ====== Die Schafe können schon eine ganze Menge. Viel mehr lernt so ein Schaf auch nicht. Daher wenden wir uns nun dem Bauern zu und bringen ihm einiges bei... ===== Neue Sensoren ===== **Ziel:** Methoden mit boolschen Rückgabewerten erstellen können. Parameter verwenden können, um Methoden Zusatzinformationen mitzugeben. Unsere Figuren haben nur eine beschränkte Anzahl von Methoden, die die Umwelt der Figur wahrnehmen (z.B. ''istVorneFrei()'', ''istVorne("Wasser")''). In diesem Arbeitsblatt lernst, du neue (komplexere) Sensoren selbst zu erstellen. Schaue dir dazu die Methode ''istAufLeeremAcker()'' des AB5_Bauer an. Im Gegensatz zu den Methoden, die du bisher implementiert hast, gibt diese eine Antwort zurück (wie z.B. auch ''istVorneFrei()''). {{:aufgabe.png?nolink |}} === (A1) === Teste die Methode ''istAufLeeremAcker()'' an den verschiedenen Bauern. Wie beantwortet der Bauer diese Anfrage? Welche Antwortmöglichkeiten gibt es? {{:aufgabe.png?nolink |}} === (A2) === {{ :faecher:informatik:mittelstufe:bauernhof:ab5:ab5_a2.jpg?400|}} Analysiere nun den Quelltext zur Methode ''istAufLeeremAcker()'' in der Figur ''AB5_Bauer'': Wo tauchen die Antwortmöglichkeiten (''true'' und ''false'') im Quelltext auf? Welcher Befehl sorgt dafür, dass eine Antwort zurückgegeben wird? Wie unterscheidet sich der Methodenkopf, d.h. die mit ''public ...'' beginnende Zeile, von den bisherigen Methodenköpfen?\\ \\ \\ \\ Alle bisherigen Methoden wurden mit ''public void methodenName() {...}'' programmiert. ''Void'' steht dabei für leer/nichts. ''Void'' steht an der Stelle, an der der sogenannte Rückgabetyp steht. Es wird also nichts zurückgegeben. Möchte man nun mit ''true/false'' antworten, muss man den Rückgabewert als ''boolean'' ((''boolean'' ist ein Variablentyp, der nur die beiden Wahrheitswerte ''true'' oder ''false'' speichern kann. Der Name ist an George Boole angelehnt, der sich mit dem mathematischen Teilbereich Logik beschäftigt hat und viele mathematische Grundlagen für die Informatik gelegt hat.)) deklarieren. Mit ''return true/false;'' kann man dann den gewünschten Wert zurückgeben. ''Return'' beendet außerdem das Unterprogramm. Es werden also keine Befehle mehr nach dem Ausführen eines ''Return'' ausgeführt. {{:aufgabe.png?nolink |}} === (A3) Erntebereit === Reife Tomaten kann man mit ''ernte("Tomate");'' abernten. Damit dabei kein Fehler passiert, muss man testen, ob man überhaupt auf einer Tomate steht und ob diese reif ist. Den Reifegrad kann man mit ''pruefe("Tomate")'' bestimmen. Hat er den Wert 100, kann die Tomate geerntet werden. **Implementiere die Methode ''boolean istAufReiferTomate()'', die diesen Test vornimmt.** Hinweis 1: Dieser Test soll die Tomate nicht ernten. Tests sollten eigentlich nie Änderungen vornehmen, da der Benutzer das nicht erwartet.\\ Hinweis 2: In AB4 Aufg. 3 wird erklärt, wie man zwei Bedingungen verknüpfen kann. {{:aufgabe.png?nolink |}} === (A4) Gießen === Die Tomaten wachsen leider nicht so leicht wie Gras. Tomaten haben einen sehr hohen Wasserbedarf. Daher muss man sie mit ''benutze("Giesskanne")'' gießen. Vorher sollte man aber prüfen, ob man auf einer Tomate steht und sie Wasser benötigt (''pruefe("Tomate")'' liefert dann den Wert -1). \\ **Implementiere die Methode ''boolean istAufDurstigerTomate()'', die diesen Test vornimmt.** {{:aufgabe.png?nolink |}} === (A5) Out of Power === Implementiere eine Methode ''istEnergieSchwach()''. Diese soll ''true'' zurückgeben, wenn mindestens einer der Energiewerte (Hunger und Durst) des Bauer auf weniger als 40 Energiepunkte gesunken ist. Ansonsten gibt sie ''false'' zurück. Teste deine Methode an den unterschiedlichen Bauern. ===== Parameter ===== Viele Methoden benötige zusätzliche Informationen, um korrekt arbeiten zu können. Du hast z.B. schon die Methoden pruefe oder istAuf kennen gelernt. Beide erwarten einen Text als Parameter. Ihr Methodenkopf sieht folgendermaßen aus: ''public boolean istAuf(String name) {...}'' ''public int pruefe(String name) {...}'' Man gibt also in der runden Klammer hinter dem Methodennamen die Parameter an. Dabei wird zuerst der Typ genannt (hier ''String'') und dann der Name des Parameters (hier ''name''). Diesen Parameter kann man dann überall innerhalb der Methode nutzen. Dabei wird nur noch der Name angegeben und nicht mehr der Typ. **Variablentypen:** Du hast nun bereits mit verschiedenen Typen zu tun gehabt. Während wir Menschen Zahlen, Texte und Wahrheitswerte mit einem Blick unterscheiden können, sind Computer "dumme Maschinen", die das tatsächlich nicht so einfach können. Daher müssen wir dem Computerprogramm immer mitteilen, welche Art von Daten er vor sich sieht. Die wichtigsten Typen sind die folgenden: * ''boolean'': Wahrheitswerte - nur ''true'' oder ''false'' möglich. * ''String'': Beliebiger Text - muss zwischen **doppelten Anführungszeichen** stehen, z. B.: ''"Informatik ist cool!"'' * ''int'': Ganzzahl zwischen ''-2.147.483.648'' und ''2.147.483.647'' {{:aufgabe.png?nolink |}} === (A6) Besitztümer === Der Bauer kann Gegenstände mit sich herumtragen. Mit ''getAnzahl(String name)'' kann man testen, wie viele Gegenstände eines bestimmten Typs er bei sich hat. Untersuche die Methode ''hatGegenstand'' des AB5_Bauer. Welchen Parameter erwartet diese Methode? Teste die Methode an den Bauern. Wie wirkt es sich aus, dass die Methode einen Parameter hat? Wo wird dieser Parameter innerhalb der Methode genutzt? Tipp: Untersuche, ob die Bauern Tomaten mit sich herumtragen. {{:aufgabe.png?nolink |}} === (A7) Gießbereit === Implementiere eine Methode ''boolean kannGiessen()'', die testet, ob der Bauer eine Gießkanne (''"Giesskanne"'') hat und sie gefüllt ist, d.h. das Prüfen der Gießkanne einen Wert größer als 0 ergibt. Hinweis: Hier musst du noch keinen eigenen Parameter definieren, sondern siehst wie man eine Methode mit Parameter nutzt. {{:aufgabe.png?nolink |}} === (A8) Blick nach links === Implementiere eine Methode ''boolean istLinks(String name)'', die testet, ob links vom Bauern ein bestimmter Gegenstand ist. Der Name dieses Gegenstandes ist der Parameter der Methode. Da der Bauer nur die Methode ''istVorne(String name)'' kennt, musst du den Bauern zunächst nach links drehen. Am Ende soll der Bauer wieder so stehen wie am Anfang. Hinweis: Befehle nach der return Anweisung werden nicht mehr ausgeführt. An welcher Stelle muss man den Bauern wieder zurückdrehen? {{:aufgabe.png?nolink |}} === (A9) Positionslauf === Implementiere eine Methode ''laufeBisY(int y)'', die den Bauern so lange vorwärts gehen lässt, wie die durch den Parameter angegebene y-Koordinate (''getY()'') noch nicht erreicht ist. Du kannst davon ausgehen, dass die angegebene y-Koordinate vor dem Bauern liegt und er sich dafür nicht drehen muss. Teste deine Methode. Welche Art von Parameter erwartet sie? Für Experten: Drehe den Bauer zusätzlich zunächst in die richtige Richtung. ===== Leveltest 5: Gemüsebauernprüfung ===== **Aufgabe:** Dein Bauer ist bereit: Er hat sich für die Gemüsebauerprüfung angemeldet. Seine Aufgabe ist es, Tomaten anzubauen und mindestens 20 Tomaten zu ernten. Je schneller er diese Aufgabe erledigt, desto besser. Er hat am Anfang vier Tomaten. Diese kann er pflanzen, indem er sie auf einem leeren Ackerfeld ablegt. Danach muss er fleißig gießen, bis die Tomaten herangereift sind. Sind sie schön rot, kann er sie ernten. Tomatenpflanzen produzieren bei ausreichender Wasserversorgung immer wieder neue Tomaten, es müssen keine neuen gepflanzt werden. So viel Arbeit ist natürlich anstrengend. Daher muss der Bauer immer mal wieder eine Vesperpause in seinem Haus machen, um seine Energiereserven aufzufüllen. {{ :faecher:informatik:mittelstufe:bauernhof:ab5:ab5_leveltest.jpg?600 |}} === Hilfreiche Methoden === * ''void ablegen(String name)'' - Der Bauer legt einen Gegenstand aus seinem Inventar ab. Tomaten werden dabei gepflanzt. * ''void aufnehmen()'' - Der Bauer hebt einen Gegenstand vom Boden auf. * ''void ernte(String name)'' - Der Bauer kann "Tomate" und "Korn" ernten, wenn es reif ist. * ''void benutze(String name)'' - Der angegebene Gegenstand wird benutzt. Benutzt man eine Gießkanne (''benutze("Giesskanne"'') vor einem Wasserfeld, wird sie gefüllt. Benutzt man sie auf einem Acker, dann gießt man den Boden damit. Hinweis: Eine volle Gießkanne reicht **nicht** für vier Pflanzen hintereinander. * ''void vesperpause()'' - Der Bauer macht eine Pause im Haus. Er muss dazu direkt vor der Tür zum Haus stehen. * ''int getAnzahl(String name)'' - Gibt die Anzahl der Gegenstände vom Typ name zurück, die der Bauer mit sich herumträgt. {{:tipp.png?nolink |}} === Tipps === ++++ Vorschlag, wie der Algorithmus ablaufen könnte | - Schnapp dir gleich zu Beginn die Gießkanne neben dir. - Laufe direkt bis runter zum Feld. - Laufe nach links und pflanze dabei auf allen 4 Feldern die Tomaten (Tipp: Schleife). - Wenn du nun links unter dem Brunnen stehst, bietet sich eine **große Schleife** an (bis du 20 Tomaten hast), da jetzt immer nur noch folgende Dinge wiederholt werden müssen: - Fülle die Gießkanne und laufe anschließend nach rechts über die 4 Felder zurück. Gieße dabei (wenn möglich) und ernte dabei (wenn möglich). - Gehe zurück zum Stall und mache eine Vesperpause. - Gehe runter zum rechten Brunnen und fülle die Gießkanne. - Gehe noch eins runter zum Feld und laufe anschließend nach links über die 4 Felder. Gieße dabei (wenn möglich) und ernte dabei (wenn möglich). - Nun bist du wieder am Anfang der großen Schleife unter dem linken Brunnen und alles wiederholt sich ++++ [[..:ab4:start|<<< Zurück zu Level 4]] **AB05** [[..:ab6:start|Weiter zu Level 6 >>> ]]