klassen2:attribute:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | klassen2:attribute:start [2024/08/31 10: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 Person ===== | ||
+ | Wir beginnen mit einem künstlichen - dafür aber sehr einfachen - Beispiel: Einer Klasse '' | ||
+ | <WRAP center round tip 60%> | ||
+ | Unter Programmierern ist es '' | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Person fritzi = new Person(); | ||
+ | fritzi.name = " | ||
+ | fritzi.geschlecht = " | ||
+ | fritzi.größe = 1.67; | ||
+ | |||
+ | Person max = new Person(); | ||
+ | max.name = "Max Munter"; | ||
+ | max.geschlecht = " | ||
+ | max.größe = 1.66; | ||
+ | |||
+ | println(" | ||
+ | println(" | ||
+ | |||
+ | class Person { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <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, z.B. | ||
+ | <code myJava> | ||
+ | class Person { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | 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 in den Zeilen 2 - 12. | ||
+ | </ | ||
+ | |||
+ | ===== 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. \\ \\ | ||
+ | |||
+ | <code myJava> | ||
+ | class Person { | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | // Jetzt kommt eine Methodendeklaration: | ||
+ | void schreibeName(){ | ||
+ | println(name); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | 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=" | ||
+ | Person fritzi = new Person(); | ||
+ | fritzi.name = " | ||
+ | fritzi.geschlecht = " | ||
+ | fritzi.größe = 1.67; | ||
+ | |||
+ | Person max = new Person(); | ||
+ | max.name = "Max Munter"; | ||
+ | max.geschlecht = " | ||
+ | max.größe = 1.66; | ||
+ | |||
+ | fritzi.schreibeName(); | ||
+ | fritzi.begrüßen(); | ||
+ | println(); | ||
+ | max.begrüßen(); | ||
+ | |||
+ | class Person { | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | void schreibeName(){ | ||
+ | print(name); | ||
+ | } | ||
+ | |||
+ | void begrüßen(){ | ||
+ | println(" | ||
+ | if(geschlecht == " | ||
+ | | ||
+ | } else { | ||
+ | | ||
+ | } | ||
+ | println(name + " | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <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 '' | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | {{ : | ||
+ | ===== Beispiel 4: Ampel ===== | ||
+ | Wir programmieren eine Klasse '' | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | Ich habe Dir noch etwas Arbeit im Programm hinterlassen (siehe die Kommentare). Vielleicht möchtest Du die Ampel auch noch etwas umfangreicher gestalten: | ||
+ | * Umgib das Gehäuse mit einem dunkelgrauen Rahmen (Methode '' | ||
+ | * Füge ein gelbes Licht hinzu! | ||
+ | * Füge eine " | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Ampel a = new Ampel(); | ||
+ | a.init(); | ||
+ | a.schalteRot(); | ||
+ | Input.readString(" | ||
+ | a.schalteGrün(); | ||
+ | Input.readString(" | ||
+ | a.schalteAus(); | ||
+ | |||
+ | class Ampel { | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | void init() { | ||
+ | |||
+ | // Instanzieren und Initialisieren des Gehäuses: | ||
+ | gehäuse = new Rectangle(340, | ||
+ | gehäuse.setFillColor(Color.gray); | ||
+ | |||
+ | // Ergänze den Code zum Instanzieren und initialisieren der beiden Lichter! | ||
+ | // Die Lichter sollen initial beide mit der Farbe Color.darkgray gefüllt sein. | ||
+ | |||
+ | } | ||
+ | |||
+ | void schalteRot() { | ||
+ | lichtOben.setFillColor(Color.red); | ||
+ | lichtUnten.setFillColor(Color.darkgray); | ||
+ | } | ||
+ | |||
+ | // Ergänze Methoden schalteGrün() und schalteAus()! | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | [[.ampelloesung: | ||
+ | ===== Aufgabe 1: Tiere ===== | ||
+ | Erstelle eine Klasse '' | ||
+ | < | ||
+ | Ich heiße Snoopy und bin ein/e Katze mit 4 Beinen. | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Tier s = new Tier(); | ||
+ | s.name = " | ||
+ | s.art = " | ||
+ | s.beinzahl = 4; | ||
+ | |||
+ | Tier c = new Tier(); | ||
+ | c.name = " | ||
+ | c.art = " | ||
+ | c.beinzahl = 2; | ||
+ | |||
+ | s.vorstellen(); | ||
+ | c.vorstellen(); | ||
+ | |||
+ | // Jetzt bist Du dran: Definiere hier die Klasse Tier, so dass das Programm oben | ||
+ | // fehlerfrei läuft. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | [[.Aufgabe1Loesung: | ||
+ | |||
+ | |||
+ | ===== Aufgabe 2: Längeneinheiten ===== | ||
+ | <WRAP center round tip 80%> | ||
+ | Sind Dir schon mal Längenangaben wie //12 in// oder //17 zoll// oder // | ||
+ | **Umrechnung: | ||
+ | </ | ||
+ | |||
+ | Schreibe eine Klasse '' | ||
+ | == Programm: == | ||
+ | <code myJava> | ||
+ | Länge a = new Länge(); | ||
+ | a.speichere(3.0, | ||
+ | a.schreibeCm(); | ||
+ | a.speichere(25.4, | ||
+ | a.schreibeInch(); | ||
+ | </ | ||
+ | == Ausgabe == | ||
+ | < | ||
+ | 7.62 cm | ||
+ | 10 inch | ||
+ | </ | ||
+ | |||
+ | **Tipp: ** Natürlich benötigt die Klasse auch ein Attribut, um die Länge zu speichern. Es bietet sich an, nur ein einziges Attribut zu deklarieren, | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Länge a = new Länge(); | ||
+ | a.speichere(3.0, | ||
+ | a.schreibeCm(); | ||
+ | a.speichere(25.4, | ||
+ | a.schreibeInch(); | ||
+ | |||
+ | // Jetzt bist Du dran: schreibe die Definition der Klasse Länge! | ||
+ | |||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | [[.Aufgabe2Loesung: | ||
+ | |||
+ | |||
+ | ===== Aufgabe 3: 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! | ||
+ | |||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | [[.Aufgabe3Loesung: | ||
+ | |||
+ | |||
+ | ===== Aufgabe 4: 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(); | ||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | [[.Aufgabe4Loesung: | ||
+ | |||
+ | |||
+ | <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: | ||
+ | </ | ||
+ | |||
+ | ===== Aufgabe 5: Bild mit verschiedenen Tageszeiten ===== | ||
+ | {{ : | ||
+ | {{: | ||
+ | {{ : | ||
+ | | ||
+ | Die Klasse Bild zeichnet das Bild einer Wüste mit Sonne und Himmel (s.u.) zu drei verschiedenen Tageszeiten. Sie besitzt die Methoden '' | ||
+ | **Tipp:** Orientiere Dich beim Programmieren am [[# | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Bild b = new Bild(); | ||
+ | b.init(); | ||
+ | b.schalteMorgen(); | ||
+ | b.schalteMittag(); | ||
+ | b.schalteAbend(); | ||
+ | |||
+ | class Bild { | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | [[.aufgabe5loesung: |
klassen2/attribute/start.txt · Zuletzt geändert: 2024/08/31 10:03 von 127.0.0.1