g9:uebungen:attribute:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | g9:uebungen:attribute:start [2024/08/31 12:03] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Klassen/ | ||
+ | <WRAP center round info 80%> | ||
+ | {{ : | ||
+ | Ein **Attribut** eine Objektes ist eine **Eigenschaft**, | ||
+ | Siehe dazu auch das [[klassen1: | ||
+ | </ | ||
+ | |||
+ | ===== Beispiel 1: Die Klasse Tier ===== | ||
+ | Wir beginnen mit einem künstlichen - dafür aber sehr einfachen - Beispiel: Einer Klasse '' | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Tier s = new Tier(); | ||
+ | s.name = " | ||
+ | s.art = " | ||
+ | s.anzahlBeine = 4; | ||
+ | |||
+ | Tier g = new Tier(); | ||
+ | g.name = " | ||
+ | g.art = " | ||
+ | g.anzahlBeine = 2; | ||
+ | |||
+ | println(s.name); | ||
+ | println(g.anzahlBeine); | ||
+ | |||
+ | class Tier { | ||
+ | | ||
+ | | ||
+ | int anzahlBeine; | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | **Deklaration von Attributen: | ||
+ | Attribute werden deklariert, indem man auf oberster Ebene innerhalb der Klassendeklaration (also **nicht** innerhalb einer Methode!) den Datentyp des Attributs gefolgt von seinem Bezeichner schreibt. | ||
+ | Es ist auch möglich, bei der Attributdeklaration einen Anfangswert anzugeben, z.B. | ||
+ | <code myJava> | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Auf die Attribute von Objekten kann man außerhalb der Klassendeklaration mithilfe der Punktschreibweise zugreifen. Wie das geht, siehst Du im obigen Beispiel. | ||
+ | </ | ||
+ | |||
+ | ===== Beispiel 2: Klassen mit Attributen und Methoden ===== | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | Attributdeklarationen und Methodendeklarationen dürfen innerhalb einer Klassendeklaration beliebig hintereinander stehen. Es ist aber üblich, **gleich zu Beginn** einer Klassendeklaration **alle Attribute** der Klasse zu deklarieren und danach erst die Methoden. \\ \\ | ||
+ | |||
+ | Innerhalb von Methodendeklarationen kann man auf Attribute wie auf gewöhnliche Variablen durch Angabe ihres Bezeichners zugreifen. Du siehst das im obigen Beispiel in der Anweisung '' | ||
+ | |||
+ | //Du fragst Dich vielleicht, wie der Compiler Attributdeklarationen und Methodendeklarationen unterscheiden kann?// \\ Den Unterschied macht die runde Klammer hinter dem Bezeichner einer Methode. Jetzt ist Dir sicher auch klar, weshalb bei Methoden ohne Parameter trotzdem die runden Klammern '' | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Tier s = new Tier(); | ||
+ | s.name = " | ||
+ | s.art = " | ||
+ | s.anzahlBeine = 4; | ||
+ | |||
+ | Tier g = new Tier(); | ||
+ | g.name = " | ||
+ | g.art = " | ||
+ | g.anzahlBeine = 2; | ||
+ | |||
+ | s.stellDichVor(); | ||
+ | g.stellDichVor(); | ||
+ | |||
+ | class Tier { | ||
+ | | ||
+ | | ||
+ | int anzahlBeine; | ||
+ | |||
+ | void stellDichVor() { | ||
+ | println(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <WRAP center round tip 60%> | ||
+ | Führe das Programm schrittweise mit "step into ({{: | ||
+ | Wenn sich der Aktuelle Ausführungspunkt des Programms (grün hinterlegte Programmzeile) gerade innerhalb einer Methode befindet, wird das Objekt, für das die Methode aufgerufen wurde, immer mit '' | ||
+ | </ | ||
+ | |||
+ | ===== Aufgabe 1: RechteckHelfer ===== | ||
+ | Schreibe eine Klasse '' | ||
+ | == Programm: == | ||
+ | <code myJava> | ||
+ | RechteckHelfer rh = new RechteckHelfer(); | ||
+ | rh.setzeLängeBreite(3, | ||
+ | println(rh.gibUmfang()); | ||
+ | println(rh.gibFlächeninhalt()); | ||
+ | println(rh.gibDiagonalenlänge()); | ||
+ | </ | ||
+ | == Ausgabe == | ||
+ | < | ||
+ | 14 | ||
+ | 12 | ||
+ | 5 | ||
+ | </ | ||
+ | |||
+ | **Tipp: ** Natürlich benötigt die Klasse auch zwei Attribute, um die Länge und Breite des Rechtecks zu speichern! | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | RechteckHelfer rh = new RechteckHelfer(); | ||
+ | rh.setzeLängeBreite(3, | ||
+ | println(rh.gibUmfang()); | ||
+ | println(rh.gibFlächeninhalt()); | ||
+ | println(rh.gibDiagonalenlänge()); | ||
+ | |||
+ | // Jetzt bist Du dran: schreibe die Definition der Klasse RechteckHelfer! | ||
+ | |||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | [[: | ||
+ | |||
+ | |||
+ | ===== Aufgabe 2: Eine Klasse zum Bruchrechnen ===== | ||
+ | Studiere die Klasse Bruch im Programm unten genau und ergänze folgende Methoden: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | |||
+ | Bruch b1 = new Bruch(); | ||
+ | b1.setzeWert(7, | ||
+ | |||
+ | Bruch b2 = new Bruch(); | ||
+ | b2.setzeWert(2, | ||
+ | |||
+ | b1.addiere(b2); | ||
+ | b1.gibAusUnecht(); | ||
+ | |||
+ | class Bruch { | ||
+ | int zähler; | ||
+ | int nenner; | ||
+ | |||
+ | |||
+ | void setzeWert(int z, int n) { | ||
+ | zähler = z; | ||
+ | nenner = n; | ||
+ | } | ||
+ | |||
+ | void gibAusUnecht() { | ||
+ | println(zähler + "/" | ||
+ | } | ||
+ | |||
+ | void kürze() { | ||
+ | | ||
+ | // Ermittle den größten gemeinsamen Teiler von Zähler und Nenner | ||
+ | int z1 = zähler; | ||
+ | int z2 = nenner; | ||
+ | while(z1 != z2) { | ||
+ | int z3 = Math.abs(z2 - z1); | ||
+ | if(z1 > z2) { | ||
+ | z1 = z3; | ||
+ | } else { | ||
+ | z2 = z3; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Der ggT von zähler und Nenner befindet sich jetzt in z1 und z2. | ||
+ | // Wir kürzen jetzt den Bruch, indem wir Zähler und Nenner durch deren | ||
+ | // größten gemeinsamen Teiler teilen: | ||
+ | zähler = zähler / z1; | ||
+ | nenner = nenner / z1; | ||
+ | |||
+ | } | ||
+ | |||
+ | void addiere(Bruch b) { | ||
+ | zähler = zähler * b.nenner + b.zähler * nenner; | ||
+ | nenner = nenner * b.nenner; | ||
+ | kürze(); | ||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | [[: | ||
+ | |||
+ | |||
+ | <WRAP center round tip 60%> | ||
+ | **Für die Mathematik-Interessierten unter Euch: \\ Algorithmus zur Berechnung des größten gemeinsamen Teilers zweier Zahlen** \\ \\ | ||
+ | In der Methode '' | ||
+ | Wenn eine Zahl $x$ ein Teiler der Zahlen $a$ und $b$ ist, dann ist $x$ auch ein Teiler von $|a - b|$ und von $a + b$. \\ \\ | ||
+ | **In Folgenden ein Beispiel zur Durchführung des Algorithmus, | ||
+ | Wir bestimmen den ggT von $24$ und $80$ (und nennen ihn im Folgenden kurz $x$). | ||
+ | * $x$ ist Teiler beider Zahlen und teilt daher auch $80 - 24 = 56$. Wir nehmen jetzt die kleineren beiden dieser drei Zahlen (also $24$ und $56$) und setzen das Spiel damit fort. | ||
+ | * $x$ ist Teiler von $24$ und $56$ und teilt daher auch $56 - 24 = 32$. Wir nehmen jetzt die kleineren beiden dieser drei Zahlen (also $32$ und $24$) und setzen das Spiel damit fort. | ||
+ | * $x$ ist Teiler von $32$ und $24$ und teilt daher auch $32 - 24 = 8$. Wir nehmen jetzt die kleineren beiden dieser drei Zahlen (also $24$ und $8$) und setzen das Spiel damit fort. | ||
+ | * $x$ ist Teiler von $24$ und $8$ und teilt daher auch $24 - 8 = 16$. Wir nehmen jetzt die kleineren beiden dieser drei Zahlen (also $16$ und $8$) und setzen das Spiel damit fort. | ||
+ | * $x$ ist Teiler von $16$ und $8$ und teilt daher auch $16 - 8 = 8$. Wir nehmen jetzt die kleineren beiden dieser drei Zahlen (also $8$ und $8$) und sind fertig, denn wir wissen jetzt, dass der ggT von $24$ und $80$ ein Teiler von $8$ ist. Gleichzeitig ist aber $8$ auch ein Teiler von $24$ und $80$, teilt also auch deren ggT. Daher ist $8$ der gesuchte ggT. | ||
+ | |||
+ | |||
+ | * **Halt, halt, nicht so schnell!!** \\ Warum ist $6$ auch ein Teiler von $24$ und $80$? \\ \\ Denk' Dir einfach alle Schritte wieder rückwärts: | ||
+ | </ | ||