Variablen, Referenzen, Listen Aufgabe Ref 1: Gegeben ist die

Werbung
Variablen, Referenzen, Listen
Aufgabe Ref 1:
Gegeben ist die Klasse Schueler
public class Schueler {
private String name, vorname, kurs;
// Konstruktor
public Schueler(String n, String vn, String k) {
name=n; vorname=vn; kurs=k;
}
public String getName(){ return name; }
public void setName(String n){ name =n; }
public String getKurs(){ return kurs; }
public void setKurs(String x) { kurs =x; }
} // Schueler
und verwenden die Klasse im Programm SchuelerTest:
public class SchuelerTest ...
....
Schueler p,q,r;
.....
p= new Schueler("Wurst","Hans","Informatik");
jTextArea1.append("(1): "+p.getName()+" "+p.getKurs()+"\n");
p.setKurs("Mathematik");
jTextArea1.append("(2): "+p.getName()+" "+p.getKurs()+"\n");
q = p;
jTextArea1.append("Variable q/1: "+q.getName()+" "+q.getKurs()+"\n");
p.setKurs("Sport");
jTextArea1.append("Variable q/2: "+q.getName()+" "+q.getKurs()+"\n");
q=new Schueler("Kuh","Milka","Biologie");
jTextArea1.append("Variable q/3: "+q.getName()+" "+q.getKurs()+"\n");
jTextArea1.append("p/1: "+p.getName()+" "+p.getKurs()+"\n");
p = null;
jTextArea1.append("p/2: "+p.getName()+" "+p.getKurs()+"\n");
p = q; jTextArea1.append("p/3: "+p.getName()+" "+p.getKurs()+"\n");
// Ende der Klasse Schueler
Aufgaben NF 11; Seite 1
Variablen, Referenzen, Listen
Fragen
1. Warum ist die Anweisung p.name="Maier"; nicht möglich?
2. Welche Wirkung hat Anweisung p.setKurs("Mathematik"); ?
3. Was wird nach q = p; ausgegeben?
4. Welche Ausgaben erfolgen nach p.setKurs("Sport"); ?
5. Was bewirkt q = new Schueler("Kuh","Milka","Biologie"); ?
6. Warum erzeugt p = null; eine NullPointerException in der nachfolgenden Ausgabe?
7. Welche Wirkung hat p = q; ?
Objekt-Orientierung
Die ersten objektorientierten Sprachen wurden ab 1967 entwickelt (Simula, Smalltalk). Die
Grundidee besteht darin, Objekte der realen Welt abzubilden.
Objekte besitzen Attribute; Methoden implementieren das Verhalten des Objekts.
Eine Klasse beschreibt die Struktur und das Verhalten aller Objekte, die mit Hilfe der Klasse
erzeugt werden können (Klasse = Bauplan).
Als Klasse (class) bezeichnet man die Definition einer Idee, eines Konzepts, eines Bauplans, einer
Schablone.
Die Deklaration und Objekterzeugung
Deklaration: Schueler p;
Objekterzeugung durch den
Konstruktor Schueler(String n, String vn, String k):
Der Konstruktor dient zur Erzeugung des Objekts und der Initialisierung der Attributvariablen.
Der Konstruktor muss denselben Namen wie die Klasse tragen.
Zur Erzeugung des OBJEKTS (INSTANZ) vom Typ Ballon wird der Konstruktor mit new
aufgerufen: p= new Schueler("Wurst","Hans","Informatik");
Die Initialisierung wird durch den Konstruktor gesetzt; das neue Objekt weist einen sinnvollen
Anfangszustand auf. Die Laufzeitumgebung von Java reserviert so viel Speicher, dass ein Objekt
vom Typ Schueler mit allen Attributen und Methoden darin Platz hat.
Kann das System nicht genügend Speicher bereitstellen, so generiert die Laufzeitumgebung einen
OutOfMemoryError.
Ein Beispiel aus dem Alltagsleben: Das blaue Auto mit dem Namen golfi ist eine Instanz des
Autotyps Golf. Der Bauplan des Typs Golf wird bei der Produktion (=Instanziierung) dieses
blauen Autos ausgeführt: golfi = new Golf( ...) .
Aufgaben NF 11; Seite 2
Variablen, Referenzen, Listen
Aufgabe
Was ist in folgenden Anweisungen falsch?
Knoten k = new Knoten;
Knoten p; p= null;
k.nachfolger=p;
Gib die Datenstruktur grafisch an
Knoten k1 = new Knoten("b", null);
Knoten k2 = new Knoten("a", k1);
k1.setzeNachfolger(k1);
Der ADT Liste
Konstruktor
Liste0()
kopf = null, d.h. kein Nachfolger
Beschreibung der Operationen/Methoden
public boolean listeLeer(Knoten k); //TRUE, wenn Liste leer
public void einfuegen(Object element); // Fügt Knoten am Listenkopf an
public boolean einfuegen(Object element, int index);
// Fügt Knoten hinter Stelle index ein; index >=0; index =0 Einfügen am
Listenkopf
public int suchen(Object element);
//gibt Index des Vorkommens an; -1, wenn element nicht in Liste vorhanden
public boolean loeschen(Object element);
//True, wenn element gelöscht wurde
public String toString(Knoten k)
// Gibt die Listenelemente aus
Gib schrittweise die (ADT-)Operationen zu folgenden Aufgaben an
List 1: Aufbau obiger Liste
List 2: Suchen der Position des Knotens mit dem String-Element 4
List 3: Einfügen eines Knotens mit dem Inhalt 9 hinter dem zweiten Knoten.
List 4: Löschen des Knotens mit dem Inhalt 2.
Aufgaben NF 11; Seite 3
Variablen, Referenzen, Listen
Zeichne die Liste, die durch folgende Anweisungen entsteht:
(1) Liste0 li = new Liste0( );
(2) if ( li.listeLeer(kopf) ) { li.einfuegen(”zehn”); }
(3) li.einfuegen(”acht”);
li.einfuegen(”vier”, 2);
(4) li.einfuegen(”sechs”, 2);
Stelle die Auswirkung der Anweisungen grafisch dar. Welche Ausgaben erfolgen?
Knoten k = new Knoten("eins", null);
Knoten p = new Knoten("zwei",k);
System.out.println(p.liefereElement() ); // (1)
Knoten r = p.liefereNachfolger();
// (2)
System.out.println(r.liefereElement() );
r.speichereElement("drei");
// (2a)
System.out.println(r.liefereElement() ); // (3)
r.setzeNachfolger(p);
// (4)
System.out.println(r.liefereNachfolger().liefereElement()); // (5)
Aufgabe Formuliere eine rekursive eine Methode
public void durchlaufen(Knoten k) {
// durchläuft die Liste ab der Referenz k
Stapel (Stack)
Konstruktor
Stack( )
Bedeutung: Neuer Stapel (Stapel ist leer)
Attribut-Methoden
boolean isEmpty()
Object peek()
(= inspizieren der Stapelspitze)
true, wenn Stapel leer
liefert das oberste Element, ohne den Stapel zu verändern
Modifizierende Methoden
Object push (Object element) legt ein Element oben auf den Stapel;
Object pop( )
Die Operation entfernt das oberste Element;
Fehler, wenn Stapel leer
Aufgaben NF 11; Seite 4
Variablen, Referenzen, Listen
Aufgabe Stack: Was liefern folgende Operationen?
Stack s;
s.isEmpty();
s = new Stack();
s.isEmpty();
s.push ("x"); s.peek();
s.push("z"); s.pop();
s.push("y"); s.isEmpty();
s= new Stack(); s.pop();
Schlange (Queue): Methoden/Interface
public interface QueueIF {
public boolean isEmpty(); //TRUE, wenn Schlange leer
public Object add(Object e); // Einfügen am Ende
public Object remove(); // Entfernt Element am Anfang
public Object element(); // Element am Anfang erfragen
public String toString(); // Gibt Schlange aus
} // Interface
Doppelt verkettete Liste
Zum Ergänzen!
public class DKnoten {
//
//
//
private Object element; //(fast) beliebiges Datenelement
private DKnoten nachfolger;
private DKnoten vorgaenger;
Die Konstruktoren:
DKnoten() {
Leerer Knoten , kein Nachfolger, KEIN DUMMY-Knoten
..
..
}
Knoten mit Nachfolger und Vorgänger
DKnoten(Object element, DKnoten nachfolger, DKnoten vorgaenger) {
}
Aufgaben NF 11; Seite 5
Variablen, Referenzen, Listen
DKnoten(Object element) {
}
public void speichereElement(Object element) {
}
public void setzeNachfolger(DKnoten nachfolger) {
}
public void setzeVorgaenger(DKnoten vorgaenger) {
}
DKnoten liefereNachfolger() {
}
DKnoten liefereVorgaenger() {
}
Object liefereElement() {
}
} // DKnoten
Aufgaben
1.
Fertige ein Klassendiagramm zu DKnoten an.
2.
Schreibe eine Methode
public String toStringReverse(DKnoten k) {… },
welche die Liste rückwärts ausgibt.
Aufgaben NF 11; Seite 6
Herunterladen