g9:uebungen:eigene_klassen:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
g9:uebungen:eigene_klassen:start [2021/01/20 12:55] – Martin Pabst | g9:uebungen:eigene_klassen:start [2022/06/30 07:23] (aktuell) – [Zweite Erweiterung: Rückgabe des Würfelergebnisses] Martin Pabst | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Eigene Klassen mit Methoden und Attributen ====== | ====== Eigene Klassen mit Methoden und Attributen ====== | ||
+ | |||
+ | ===== Beispiel 1: Würfel-Klasse (Methoden mit Parametern und Rückgabewerten) ===== | ||
+ | Wir wollen in den folgenden Abschnitten eine Klasse '' | ||
+ | <code myjava> | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Würfel w = new Würfel(); | ||
+ | w.würfle(); | ||
+ | |||
+ | class Würfel { | ||
+ | |||
+ | void würfle(){ | ||
+ | int zahl = Math.floor(Math.random() * 6) + 1; | ||
+ | println(zahl); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round info 60%> | ||
+ | ** Definition einer Klasse** \\ | ||
+ | Eine Klasse wird mit dem Schlüsselwort '' | ||
+ | <code myjava> | ||
+ | class Würfel { | ||
+ | // Deklaration der Attribute | ||
+ | // Deklaration der Methoden | ||
+ | } | ||
+ | </ | ||
+ | Zwischen den '' | ||
+ | **Deklaration einer Methode** \\ | ||
+ | Eine Methode ohne Parameter und Rückgabewert (dazu weiter unten mehr) wird folgendermaßen deklariert: | ||
+ | <code myjava> | ||
+ | void würfle(){ | ||
+ | // Anweisungen | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | Zuerst wird der **Datentyp des Rückgabewertes** angegeben, in diesem Fall '' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Erste Erweiterung: | ||
+ | Es gibt nicht nur 6-seitige Würfel, sondern auch 8-seitige, 20-seitige usw. Wir erweitern die Methode würfle so, dass beim Aufruf die Anzahl der Seiten des Würfels mit angegeben werden kann: | ||
+ | <code myjava> | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | <WRAP center round help 80%> | ||
+ | Wie bringen wir die Information darüber, wie viele Seiten der Würfel hat (oben: 6 bzw. 20) in die Methode und wie erreichen wir, dass diese Information dort berücksichtigt wird? \\ \\ | ||
+ | Wir deklarieren einen **Parameter**! | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Würfel w = new Würfel(); | ||
+ | w.würfle(20); | ||
+ | w.würfle(6); | ||
+ | |||
+ | class Würfel { | ||
+ | |||
+ | void würfle(int seitenzahl){ | ||
+ | int zahl = Math.floor(Math.random() * seitenzahl) + 1; | ||
+ | println(zahl); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
<WRAP center round info 80%> | <WRAP center round info 80%> | ||
- | **Aus dem G9-Lehrplan | + | Die **Parameter einer Methode** legen fest, welche Werte beim Aufruf der Methode an den Methodenrumpf übergeben werden, welche Datentypen sie besitzen und mit welchem Bezeichner sie innerhalb der Methode verwendet werden können. \\ \\ |
- | Die Schülerinnen | + | '' |
- | * analysieren Objekte | + | <code myjava> |
- | * deklarieren | + | w.würfle(20); |
- | * verwenden bei der Implementierung Wertzuweisungen, um Attributwerte zu ändern, und interpretieren diese als Zustandsänderung des zugehörigen | + | </ |
+ | auf, so wird beim Aufruf eine Kopie des übergebenen Wertes in den Parameter '' | ||
+ | <code myjava> | ||
+ | | ||
+ | </ | ||
+ | hat '' | ||
+ | **Tipp:** \\ | ||
+ | Führe das obige Programm in Einzelschritten aus und beobachte bei jedem Schritt, ob der Parameter '' | ||
+ | </ | ||
+ | |||
+ | ==== Zweite Erweiterung: | ||
+ | |||
+ | Im Hauptprogramm soll 3-mal gewürfelt werden. Anschließend soll die Summe der Augenzahlen ausgegeben werden. | ||
+ | |||
+ | <WRAP center round tip 80%> | ||
+ | Wir brauchen also eine Möglichkeit, | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Würfel w = new Würfel(); | ||
+ | int summe = w.würfle(6) + w.würfle(6) + w.würfle(6); | ||
+ | println(" | ||
+ | |||
+ | class Würfel { | ||
+ | |||
+ | int würfle(int seitenzahl){ | ||
+ | int zahl = Math.floor(Math.random() * seitenzahl) + 1; | ||
+ | return zahl; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | Mit Hilfe der '' | ||
+ | <code myjava> | ||
+ | int würfle(int seitenzahl){ ... } | ||
+ | </ | ||
+ | |||
+ | Methoden, die einen Wert zurückgeben, | ||
+ | </ | ||
+ | |||
+ | ===== Beispiel 2: Rechner-Klasse | ||
+ | Wir schreiben eine Klasse Rechner mit Methoden '' | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Rechner r = new Rechner(); | ||
+ | println(r.summe(r.potenz(2, | ||
+ | |||
+ | class Rechner { | ||
+ | | ||
+ | return summand1 + summand2; | ||
+ | } | ||
+ | |||
+ | | ||
+ | return minuend - subtrahend; | ||
+ | } | ||
+ | |||
+ | | ||
+ | double ergebnis = 1; | ||
+ | for(int i = 0; i < exponent; i++) { | ||
+ | | ||
+ | } | ||
+ | return ergebnis; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | **Methoden mit mehreren Parametern** \\ \\ | ||
+ | Methoden können auch mehrere Parameter haben. Sie werden einfach mit Komma getrennt hintereinander deklariert, z.B. | ||
+ | <code myjava> | ||
+ | | ||
+ | </ | ||
+ | Beim Aufruf werden auch die Parameterwerte durch Kommas voneinander getrennt, z.B. | ||
+ | <code myjava> | ||
+ | | ||
+ | </ | ||
+ | * Die Parameter | ||
+ | * Unterscheide im obigen Beispiel das **Komma** als Trennzeichen zwischen Parameterwerten vom **Dezimalpunkt**. | ||
+ | * **Gute Methodenbezeichner: | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | ===== Beispiel 3: Weihnachtsbaum (Methoden rufen sich gegenseitig auf) ===== | ||
+ | Schreibe | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Baum b = new Baum(); | ||
+ | b.zeichneBaum(21); | ||
+ | |||
+ | class Baum { | ||
+ | |||
+ | void zeichneBaum(int baumbreite) { | ||
+ | zeichneKrone(baumbreite); | ||
+ | zeichneStamm(baumbreite); | ||
+ | } | ||
+ | |||
+ | void zeichneKrone(int breite) { | ||
+ | for(int i = 1; i <= breite; i = i + 2) { | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | zeichneKronenPunkt(); | ||
+ | } | ||
+ | |||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void zeichneKronenPunkt() { | ||
+ | if(Math.random() < 0.7) { | ||
+ | | ||
+ | } else if(Math.random() < 0.4) { | ||
+ | | ||
+ | } else { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void zeichneStamm(int baumbreite) { | ||
+ | int stammbreite = baumbreite / 5; | ||
+ | if(stammbreite % 2 == 0) { | ||
+ | | ||
+ | } | ||
+ | if(stammbreite < 1) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | int stammhöhe = stammbreite * 3 / 2; | ||
+ | for(int zeile = 1; zeile <= stammhöhe; zeile++) { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void gibZeichenAus(String zeichen, int anzahl, String farbe) { | ||
+ | for(int i = 1; i <= anzahl; i++) { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round info 60%> | ||
+ | Methoden eines Objekts | ||
+ | Aus einer Methode eines Objekts heraus ruft man eine andere Methode desselben Objekts auf, in dem man einfach ihren Bezeichner verwendet (ohne " | ||
+ | <code myjava> | ||
+ | void zeichneBaum(int baumbreite) { | ||
+ | zeichneKrone(baumbreite); | ||
+ | zeichneStamm(baumbreite); | ||
+ | } | ||
+ | </ | ||
</ | </ | ||
+ |
g9/uebungen/eigene_klassen/start.1611143708.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)