Übungen zu Einführung in die Informatik II

Werbung
Technische Universität München
Fakultät für Informatik
T. Hain, Dr. M. Pizka,
Dr. B. Schätz, Dr. M. Schneider
SS 2002
Lösungsvorschläge zu Blatt 4
16. Mai 2002
Übungen zu Einführung in die Informatik II
Aufgabe 12 Vererbung, Polymorphie, Kapselung (Lösungsvorschlag)
Das gesuchte Java-Programm könnte folgende Form haben:
class Person {
private String nachname, vorname;
public Person(String n, String v){
this.nachname = n;
this.vorname = v;
}
public String toString (){
return
"\nNachname: " + nachname +
"\nVorname: " + vorname;
}
public String getVorname(){return vorname;}
public String getNachname(){return nachname;}
}
class Student extends Person {
private String fach;
private int matrikel;
public Student(String n, String v, int m, String f){
super(n, v);
this.matrikel = m;
this.fach = f;
}
public String toString (){
return
"\nNachname: \t" +
"\nVorname: \t" +
"\nMatrikel: \t" +
"\nFach:
\t" +
}
getNachname() +
getVorname() +
matrikel +
fach ;
Lösung 4/ Seite 2
public int getMatrikelnummer(){return matrikel;}
public String getFach(){return fach;}
public void setFach(String f){fach = f;}
}
class Mitarbeiter extends Person {
private int personalnummer;
private double gehalt;
public Mitarbeiter(String n, String v, int p, double g) {
super(n, v);
this.personalnummer = p;
this.gehalt = g;
}
public String toString (){
return
"\nNachname: \t" +
"\nVorname:
\t" +
"\nPers.-nr.: \t" +
"\nGehalt:
\t" +
}
getNachname() +
getVorname() +
personalnummer +
gehalt + " Euro";
public int getPersonalnummer(){return personalnummer;}
public double getGehalt(){return gehalt;}
public void setGehalt(double g){gehalt = g;}
}
class Test{
public static void main (String[] args){
Person p1 = new Person("Meier", "Theoderich");
Student s1 = new Student("Schmidt", "Walburga", 8151234, "Semiotik");
Mitarbeiter m1 = new Mitarbeiter("Mueller", "Krimhild", 9876543, 2500.34);
System.out.println(p1.toString());
System.out.println(s1.toString());
System.out.println(m1.toString());
}
}
Aufgabe 13 Referenzen und Listen in Java (Lösungsvorschlag)
a) Die Analyse der angegebenen Programmausschnitte ergibt folgendes:
Eine Variable vom Typ int ist in Java ein Grundtyp. Variablen dieser Art, zu denen
auch die Typen boolean, char, double zählen, müßen nicht instanziiert werden und
sind somit keine Referenzen. Alle durch new instanziierten Größën sind Referenzen,
also etwa Variablen vom Typ String, Integer sowie alle Objekte, die aus selbstdefinierten Klassen erzeugt werden.
Lösung 4/ Seite 3
String ist eine in Java vordefinierte Klasse. Instanzen dieser Klasse sind somit Referenzvariablen
Die Funktion equals ist eine für alle Instanzen vom Typ Object, sowie deren Unterklassen vordefinierte Funktion. Für Instanzen der Klasse Object vergleicht diese Fuktion die Referenzen der Operanden; für zahlreiche Unterklassen, wie z.B. für Strings,
führt equals jedoch einen Wertevergleich durch; in dem angegebenen Beispiel überprüft equals etwa, ob die Zeichenketten s1 und s2 gleich sind. Demgegenüber vergleicht der Operator ==, angewandt auf Referenzvariablen, die Referenzen dieser Objekte; angewandt auf Grundtypen vergleicht dieser Operator die Werte der Operanden.
b) Die gesuchte Implementierung könnte folgende Form haben:
public class List {
private Link listHead;
// Listenkopf (erstes Element der Liste)
public List( ) { // Erzeugendenfunktion
// Erzeugen der leeren Liste
listHead = null;
}
public boolean istLeer() { // Ueberprueft, ob Liste leer
// Ausnutzung der Invariante: Es reicht listHead == null
return (listHead == null);
}
public void fuegeEin(Object o) { // Haengt o in die Liste ein
// Einfache Variante: Vorne einhaengen
listHead = new Link(o,listHead);
}
public boolean istEnthalten(Object o) { // Pruefe, ob o in der Liste enthalten
Link refLink; // Refernz zum Durchlaufen der Liste
for(refLink = listHead; refLink != null; refLink = refLink.getLink())
if(refLink.getObject().equals(o))
//
if(refLink.getObject() == o)
return true;
return false;
}
public String toString(){ // Gibt den Inhalt der Liste String zurueck
String result = "";
// Ergebnisvariable
Link refLink;
// Referenz zum Durchlaufen der Liste
for(refLink = listHead; refLink != null; refLink = refLink.getLink())
result = result + refLink.getObject().toString() + " ";
return result;
}
}
c) Eine Testklasse besitzt etwa folgende Form:
Lösung 4/ Seite 4
public class Test {
public static void main(String argv[]) {
String s1 = new String("Hallo");
String s2 = new String("Hallo");
List l = new List();
l.fuegeEin(s1);
if(l.istEnthalten(s2))
System.out.println("Drin.");
else System.out.println("Nicht drin.");
l.fuegeEin("Hali");
System.out.println(l.toString());
}
}
Aufgabe 14 Binäre Suchbäume in Java; Kapselung (Lösungsvorschlag)
a) /**
* Knoten für einen binären Suchbaum in dem Objekte der Klasse Person und dessen
* Unterklassen abgelegt werden können.
*/
public class Personenknoten {
private Personenknoten lKnoten = null, rKnoten = null;
private Person markierung = null;
/**
* Ein Default-Konstruktor wird von Java automatisch generiert. Die Methode
* "erzeuge" der Spezifikation entspricht dem Default-Konstruktor:
*
* public Personenknoten() {}
*/
/**
* fügt eine Person in dem Teilbaum ein, der diesen Knoten als Wurzel hat
*/
public Personenknoten einfuegen(Person p) {}
/**
* String-Darstellung des Teilbaums als geklammerten Ausdruck in der Form
* "(linkerSohn Markierung rechterSohn)"
*/
public String toString() {}
}
b) /**
* Knoten für einen binären Suchbaum in dem Objekte der Klasse Person und dessen
* Unterklassen abgelegt werden können.
*/
Lösung 4/ Seite 5
public class Personenknoten {
private Personenknoten lKnoten = null, rKnoten = null;
private Person markierung = null;
/**
* Ein Default-Konstruktor wird von Java automatisch generiert. Die Methode
* "erzeuge" der Spezifikation entspricht dem Default-Konstruktor:
*
* public Personenknoten() {}
*/
/**
* fügt eine Person in dem Teilbaum ein, der diesen Knoten als Wurzel hat
*/
public Personenknoten einfuegen(Person p) {
if (markierung == null)
// Knoten leer => hier einfügen
markierung = p;
else
if (isLessThan(p,markierung)) { // lexikalischer Names-Vergleich
if (lKnoten == null)
// linker Teilbaum leer => Instanziieren
lKnoten = new Personenknoten();
lKnoten.einfuegen(p);
// Einfügen im linken Teilbaum
}
else {
if (rKnoten == null)
// rechter Teilbaum leer => Instanziieren
rKnoten = new Personenknoten();
rKnoten.einfuegen(p);
// Einfügen im rechten Teilbaum
}
return this;
}
/**
* String-Darstellung des Teilbaums als geklammerten Ausdruck in der Form
* "(linkerSohn Markierung rechterSohn)"
*/
public String toString() {
String l = "",r ="";
if (lKnoten != null)
l = lKnoten.toString() + " ";
if (rKnoten != null)
r = " " + rKnoten.toString();
return "("+ l +
markierung.getNachname() + " " + markierung.getVorname() +
r + ")";
}
/**
* Hilfsmethode, die die Namen zweier Personen p1 und p2 vergleicht.
* Ergebnis true : wenn Name von p1 < Name von p2
*
false : sonst
Lösung 4/ Seite 6
*/
public boolean isLessThan(Person p1, Person p2) {
return (p1.getNachname() + p1.getVorname())
.compareTo
(p2.getNachname() + p2.getVorname())
< 0;
}
}
c) class Test{
public static
Person p1 =
Person p2 =
Person p3 =
Person p4 =
Person p5 =
void main (String[] args){
new Person("Schaetz","");
new Person("Ehler", "");
new Person("Schneider", "");
new Person("Broy", "");
new Person("Pizka", "");
Personenknoten wurzel = new Personenknoten();
wurzel = wurzel.einfuegen(p1);
wurzel = wurzel.einfuegen(p2);
wurzel = wurzel.einfuegen(p3);
wurzel = wurzel.einfuegen(p4);
wurzel = wurzel.einfuegen(p5);
System.out.println(wurzel.toString());
}
}
Herunterladen