Aufgaben zur Vorlesung
Aufgabe 1:
Schreiben Sie das obige Programm mit einen Texteditor ihrer
Wahl. Speichern Sie es als FirstProgram.java ab.
Übersetzen Sie es mit dem Java-Übersetzer javac.
Es entsteht eine Datei FirstProgram.class. Führen
Sie das Programm mit
dem Javainterpreter java aus. Führen Sie dieses sowohl einmal auf
Linux als auch einmal unter Windows durch.
Aufgabe 2:
Schreiben sie ein Programm, das ein Objekt der Klasse Minimal erzeugt und auf dem Bildschirm ausgibt. Hierzu ersetzen sie
einfach im Programm Answer die 42 durch den
Ausdruck new Minimal()
Aufgabe 3:
Schreiben Sie für die vier Karteikarten in der Modellierung eines
Bibliotheksystems entsprechende Klassen mit den entsprechenden Feldern.
Aufgabe 4:
Schreiben Sie Klassen, die die Objekte des Bibliotheksystems
repräsentieren können:
- Personen mit Namen, Vornamen, Straße, Ort und Postleitzahl.
- Bücher mit Titel und Autor.
- Datum mit Tag, Monat und Jahr.
- Buchausleihe mit Ausleiher, Buch und Datum.
Hinweis: der Typ, der ganze Zahlen in Java bezeichnet, heißt int.
- a) Schreiben Sie geeignete Konstruktoren für diese Klassen.
- b) Schreiben Sie für jede dieser Klassen eine Methode public String toString() mit dem Ergebnistyp.
Das Ergebnis soll eine gute textuelle Beschreibung
des Objektes sein.Sie brauchen noch nicht zu verstehen, warum vor
dem Rückgabetyp noch ein Attribut public steht.
- c) Schreiben Sie eine Hauptmethode in einer Klasse Main, in der Sie
Objekte für jede der obigen Klassen erzeugen und die Ergebnisse der toString-Methode auf den Bildschirm ausgeben.
Aufgabe 5:
Suchen Sie auf Ihrer lokalen Javainstallation oder im Netz
auf den Seiten von Sun nach
der Dokumentation der Standardklassen von Java. Suchen Sie die
Dokumentation der Klasse String. Testen Sie einige der für
die Klasse String definierten Methoden.
Aufgabe 6:
Ergänzen sie jetzt die Klasse Person aus der letzten Aufgabe um ein statisches Feld letzerVorname mit einer Zeichenkette,
die angeben soll, welchen Vornamen das zuletzt erzeugte Objekt vom Typ Person hatte. Hierzu müssen Sie im Konstruktor der Klasse Person
dafür sorgen, daß nach der Zuweisung der Objektfelder auch noch das
Feld letzerVorname verändert wird. Testen Sie in einer Testklasse, daß
sich tatsächlich nach jeder Erzeugung einer neuen Person dieses Feld verändert
hat.
Aufgabe 7:
Starten Sie folgendes Javaprogramm:class TestInteger {
public static void main(String [] _){
System.out.println(2147483647+1);
System.out.println(-2147483648-1);
}
}
Erklären Sie die Ausgabe.
Aufgabe 8:
Ergänzen Sie ihre Klasse Ausleihe um eine
Methode void verlaengereEinenMonat(), die den Rückgabetermin des
Buches um einen Monat erhöht.
Aufgabe 9:
Modellieren und schreiben Sie eine Klasse Counter,
die einen Zähler darstellt. Objekte dieser Klasse sollen folgende
Funktionalität bereitsstellen:
- Eine Methode click(), die den internen Zähler um eins
erhöht.
- Eine Methode reset(), die den Zähler wieder auf den
Wert 0 setzt.
- Eine Methode, die den aktuellen Wert des Zählers ausgibt.
Testen Sie Ihre Klasse.
Aufgabe 10:
Schreiben Sie mit den bisher vorgestellten Konzepten ein Programm,
das unendlich oft das Wort Hallo auf den Bildschirm ausgibt. Was
beobachten Sie, wenn sie das Programm lange laufen lassen?
Aufgabe 11:
Schreiben Sie eine Methode, die für eine ganze Zahl die
Fakultät dieser Zahl berechnet. Testen Sie die Methode zunächst mit
kleinen Zahlen, anschließend mit großen Zahlen. Was stellen Sie fest?
Aufgabe 12:
Modellieren und schreiben Sie eine Klasse, die ein Bankkonto
darstellt. Auf das Bankkonto sollen Einzahlungen und Auszahlungen
vorgenommen werden können. Es gibt einen maximalen Kreditrahmen. Das
Konto soll also nicht beliebig viel in die Miese gehen
können. Schließlich muß es eine Möglichkeit geben, Zinsen zu berechnen
und dem Konto gutzuschreiben.
Aufgabe 13:
Schreiben Sie jetzt die Methode zur Berechnung der Fakultät, indem
Sie eine Iteration und nicht eine Rekursion benutzen.
Aufgabe 14:
Schreiben Sie eine
Methode
static String darstellungZurBasis(int x,int b),
die als Parameter eine
Zahl x und eine zweite Zahl b erhält.
Sie dürfen annehmen, daß x>0 und 1<b<11.
Das Ergebnis soll
eine Zeichenkette vom Typ String sein, in der die
Zahl x zur Basis b dargestellt ist. Testen Sie ihre Methode mit
unterschiedlichen Basen.Hinweis: Der zweistellige Operator % berechnet den
ganzzahligen Rest einer Division. Bei einem geschickten Umgang mit den
Operatoren %, / und + und einer while-Schleife
kommen Sie mit sechs Zeilen im Rumpf der Methode aus.
Aufgabe 15:
Schreiben Sie eine Methode static int readIntBase10(String str). Diese
Methode soll einen String, der nur aus Ziffern besteht, in die von ihm repräsentierte Zahl umwandeln. Benutzen sie
hierzu die Methode charAt der String-Klasse,
die es erlaubt, einzelne
Buchstaben einer Zeichenkette zu selektieren.
Aufgabe 16:
Für die Lösung dieser Aufgabe gibt es 3 Punkte, die auf die
Klausur angerechnet werden. Voraussetzung hierzu ist, daß die Lösung
mir in der Übung gezeigt und erklärt werden
kann.
In dieser Aufgabe sollen Sie eine Klasse für römische Zahlen entwickeln.
- a) Schreiben Sie eine Klasse Roman. Diese Klasse soll
eine natürliche Zahl
darstellen.
- b) Schreiben Sie für Ihre Klasse Roman einen Konstruktor, der ein
Stringobjekt als Parameter hat. Dieser Stringparameter soll eine römische Zahl
darstellen. Der Konstruktor soll diese Zahl lesen und in einem Feld des
Typs int abspeichern.
- c) Implementieren Sie die Methode public String toString() für
Ihre Klasse Roman, die die intern gespeicherte Zahl als römische Zahl
dargestellt zurückibt.
- d) Fügen Sie ihrer Klasse Roman die folgenden Methoden für
arithmetische Rechnungen hinzu.
-
Roman add(Roman other)
-
Roman sub(Roman other)
-
Roman mul(Roman other)
-
Roman div(Roman other)
- e) Testen Sie Ihre Klasse Roman.
Aufgabe 17:
In dieser Aufgabe sollen Sie eine Gui-Klasse benutzen und ihr eine eigene
Anwendungslogik übergeben. Gegeben seien die folgenden Javaklassen, wobei Sie die
Klasse Dialogue nicht zu analysieren oder zu verstehen brauchen:
-
class ButtonLogic {
String getDescription(){
return "in Großbuchstaben umwandeln";
}
String eval(String x){return x.toUpperCase();}
}
-
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class Dialogue extends JFrame{
final ButtonLogic logic;
final JButton button;
final JTextField inputField = new JTextField(20) ;
final JTextField outputField = new JTextField(20) ;
final JPanel p = new JPanel();
Dialogue(ButtonLogic l){
logic = l;
button=new JButton(logic.getDescription());
button.addActionListener
(new ActionListener(){
public void actionPerformed(ActionEvent _){
outputField.setText
(logic.eval(inputField.getText().trim()));
}
});
p.setLayout(new BorderLayout());
p.add(inputField,BorderLayout.NORTH);
p.add(button,BorderLayout.CENTER);
p.add(outputField,BorderLayout.SOUTH);
getContentPane().add(p);
pack();
setVisible(true);
}
}
-
class TestDialogue {
public static void main(String [] _){
new Dialogue(new ButtonLogic());
}
}
- a) Übersetzen Sie die drei Klassen und starten Sie das Programm.
- b) Schreiben Sie eine Unterklasse der Klasse ButtonLogic. Sie
sollen dabei die Methoden getDescription und eval so
überschreiben, daß der Eingabestring in Kleinbuchstaben umgewandelt wird. Schreiben Sie eine Hauptmethode, in der Sie ein Objekt der
Klasse Dialogue mit einem Objekt Ihrer Unterklasse
von ButtonLogic erzeugen.
- c) Schreiben Sie jetzt eine Unterklasse der
Klasse ButtonLogic, so daß Sie im Zusammenspiel mit der
Guiklasse Dialogue ein Programm erhalten, in dem Sie römische Zahlen
in arabische Zahlen umwandeln können. Testen Sie Ihr Programm.
- d) Schreiben Sie jetzt eine Unterklasse der
Klasse ButtonLogic, so daß Sie im Zusammenspiel mit der
Guiklasse Dialogue ein Programm erhalten, in dem Sie arabische Zahlen
in römische Zahlen umwandeln können. Testen Sie Ihr Programm.
- e) Schreiben Sie jetzt ein Guiprogramm, daß eine Zahl aus ihrer Darstellung
zur Basis 10 in eine Darstellung zur Basis 2 umwandelt. Testen Sie.
Aufgabe 18:
Nehmen Sie beide der in diesem Kapitel entwickelten
Umsetzungen von Listen und fügen Sie ihrer Listenklassen folgende Methoden
hinzu. Führen Sie Tests für diese Methoden durch.
- a) Object last(): gibt das letzte Element der Liste aus.
- b) List concat(List other) bzw.: Li concat(Li other): erzeugt eine neue Liste, die
erst die Elemente der this-Liste und dann
der other-Liste hat, es sollen also zwei Listen aneinander
gehängt werden.
- c) Object elementAt(int i): gibt das Element an einer
bestimmten Indexstelle der Liste zurück. Spezifikation:
elementAt(Cons(x,xs),1)=x
elementAt(Cons(x,xs),n+1)=elementAt(xs,n)
Aufgabe 19:
Verfolgen Sie schrittweise mit Papier und Beistift, wie
der quicksort Algorithmus die folgenden zwei Listen sortiert:
-
("a","b","c","d","e")
-
("c","a","b","d","e")
Aufgabe 20:
Diese Aufgabe soll mir helfen, Listen für Ihre Leistungsbewertung zu
erzeugen.
- a) Implementieren Sie für Ihre Listenklasse eine
Methode String toHtmlTable(), die für Listen Html-Code für
eine Tabelle erzeugt, z.B:
<table>
<tr>erstes Listenelement</tr>
<tr>zweites Listenelement</tr>
<tr>drittes Listenelement</tr>
</table>
- b) Nehmen Sie die Klasse Student, die
Felder für Namen, Vornamen und Matrikelnummer hat. Implementieren
Sie für diese Klasse eine Methode String toTableRow(), die für Studenten eine Zeile einer Html-Tabelle erzeugt:
Student s1 = new Student("Müller","Hans",167857);
System.out.println(s1.toTableRow());
soll folgende Ausgabe ergeben:<td>Müller</td><td>Hans</td><td>167857</td>
Ändern Sie die Methode toString so, daß sie dasselbe Ergebnis wie die
neue Methode toTableRow hat.
- c) Legen Sie eine Liste von Studenten an, sortieren Sie diese
mit Hilfe der Methode sortBynach
Nachnamen und Vornamen und erzeugen Sie eine Html-Seite, die die
sortierte Liste anzeigt.
Sie können zum Testen die folgende Klasse benutzen:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
public class HtmlView extends JPanel {
//example invocation
public static void main(String s[]) {
HtmlView view = new HtmlView();
view.run();
view.setText("<h1>hallo</h1>");
}
JFrame frame;
JTextPane ausgabe = new JTextPane();
public HtmlView() {
ausgabe.setEditorKit(new HTMLEditorKit());
add(ausgabe);
}
void setText(String htmlString){
ausgabe.setText(htmlString);
frame.pack();
ausgabe.repaint();
}
void run(){
frame = new JFrame("HtmlView");
frame.getContentPane().add(this);
frame.pack();
frame.setVisible(true);
}
}
Aufgabe 21:
In dieser Aufgabe sollen Sie ein Programm schreiben, das nach und
nach die Primzahlen ausgibt.
- a) Schreiben sie eine Unterklasse From der
Klasse FromTo, die von einem Startwert an in Einerschritten
ganze Zahlen zurückgibt und für die hasNext immer wahr ist.
- b) Schreiben Sie eine Klasse Sieb, die die
Schnittstelle IntIterator implementiert. Die Klasse soll zwei Felder haben: eine ganze Zahl und ein weiteres Objekt, das die
Schnittstelle IntIterator implementiert. Der Konstruktor habe die
Signatur:
public Sieb(int i,IntIterator it)
Die Methode next soll das nächste Element des inneren
Iterators it zurückgeben, das nicht durch die
Zahl i teilbar ist.
Beispiel: PrintIntIteratorElements.print(new Sieb(3,new From(1))) gibt alle nicht
durch 3 teilbaren natürlichen Zahlen auf dem Bildschirm aus.
- c) Übersetzen Sie ihren Code mit folgender Klasse:
package de.tfhberlin.panitz.iterator;
class PrimIterator implements IntIterator{
private IntIterator sieb = new From(2);
public boolean hasNext(){return sieb.hasNext();}
public int next(){
int result = sieb.next();
sieb= new Sieb(result,sieb);
return result;
}
}
Lassen Sie sich alle Werte von PrimIterator mit der
Methode PrintIntIteratorElements.print ausgeben.
Aufgabe 22:
(4 Punkte)
In dieser Aufgabe wird ein kleines Programm, das einen
Psychoanalytiker simuliert, vervollständigt.
- a) Laden Sie sich hierzu das Archiv
Eliza.zip
vom Netz. Entpacken Sie es. Machen Sie sich mit den einzelnen Klassen
vertraut.
- b) In der Klasse MyList sind nicht alle abstrakten Methoden der
Klasse Li implementiert.
Ergänzen Sie MyList
um die
Methoden:
reverse, words, unwords, drop,
tails, isPrefixIgnoreCaseOf.
Implementieren Sie diese Methoden entsprechend ihrer Dokumentation in der
abstrakten Klasse Li und
schreiben Sie Tests für jede Methode.
Wenn Ihre Tests erfolgreich sind, übersetzen Sie alle Klassen und starten Sie
die main-Methode der Klasse Main.
- c) Erfinden Sie eigene Einträge für die Liste respMsgs in der
Klasse Data.
- d) Erklären Sie, was die Methode rotate von den anderen
Methoden der Klasse Li fundamental
unterscheidet. Demonstrieren Sie dieses anhand eines Tests.
Aufgabe 23:
Übersetzen und starten Sie die Klasse Finalize und
beobachten Sie, wie und wann Java Objekte aus dem Speicher löscht.
Aufgabe 24:
(3 Punkte) In dieser Aufgabe soll ein Spielbrett für das Spiel Vier gewinnt
implementiert werden. Laden Sie hierzu die
Datei
vier.zip
- a) Schreiben Sie eine Klasse VierImplementierung, die die
Schnittstelle VierLogik entsprechend der Dokumentation
implementiert.
- b) Schreiben Sie folgende Hauptmethode und starten Sie diese. Sie sollten jetzt in der Lage sein, über die Eingabekonsole Vier
gewinnt zu spielen.
public static void main(String[] args) {
new VierKonsole().spiel(new VierImplementierung());
}
Suchen Sie sich einen Spielpartner und versuchen Sie, gegen ihn zu gewinnen.
Aufgabe 25:
Schreiben Sie ein Programm FileConvert zum Konvertieren von Textdateien in eine andere Kodierung. Dem Programm sollen über die Kommandozeilenparameter der Name der Eingabedatei, der Name der Ausgabedatei und der Name der benutzten Codierung übergeben werden. Ein möglicher Aufruf wäre also:linux:~/>java FileConvert test.txt konvertiertTest.txt utf-8
Lassen Sie eine deutsche Textdatei mit Umlauten in eine Datei mit der Codierung utf-8 konvertieren. Betrachten Sie die Ergebnisdatei. Was stellen
Sie fest?
Aufgabe 26:
Erweitern Sie die Klasse Li, so daß Sie Ihre Listenobjekte
in Dateien schreiben und wieder aus Dateien lesen können. Testen Sie ihre
Implementierung.
Aufgabe 27:
Studieren Sie die Dokumentation von java.io.RandomAccessFile und schreiben Sie einige Testbeispiele zur Benutzung dieser Klasse.
Aufgabe 28:
Nehmen Sie eines Ihrer Javaprojekte des letzen Semesters
(z.B.Eliza oder VierGewinnt) und verpacken die .class-Dateien des Projektes in eine Jar-Datei. Berücksichtigen Sie dabei die Paketstruktur, die sich in
der Ordnerhierarchie der .class Dateien wiederspiegelt.
Aufgabe 29:
Starten Sie die Anwendung, die Sie in der letzten Aufgabe als Jar-Datei verpackt haben, mit Hilfe
der java-Option: -cp.
Aufgabe 30:
Laden Sie die Jar-Datei:
jugs.jar.
In diesem Archiv liegt eine Javaanwendung, die eine interaktive
Javaumgebung bereitstellt. Javaausdrücke und Befehle können
eingegeben und direkt ausgeführt werden. Das Archiv enthält zwei
Klassen mit einer Hauptmethode: - Jugs: ein Kommandozeilen-basierter
Javainterpreter.
- JugsGui: eine graphische interaktive Javaumgebung.
Um diese Anwendung laufen zu lassen, wird ein zweites Javaarchive
benötigt: die JAR-Datei tools.jar. Diese befindet sich in der
von Sun gelieferten Entwicklungsumgebung.
Setzen Sie den Klassenpfad (einmal per Javaoption, einmal durch neues
Setzen der Umgebungsvariablen CLASSPATH)
auf die beiden benötigten JAR-Dateien und
starten Sie eine der zwei Hauptklassen. Lassen Sie folgende
Ausdrücke in Jugs auswerten.
-
2*21
-
"hello world".toUpperCase().substring(2,5)
-
System.getProperties()
-
System.getProperty("user.name")
Beispielaufgaben zur Klausur:
Aufgabe 1:
Führen Sie die folgende Klasse von Hand aus und schreiben Sie auf, was
auf dem Bildschirm ausgegeben wird:class Aufgabe1{
public static void main(String [] args){
int i = 42;
for (int j = i; j>=i%15;j=j-5){
System.out.println(j);
}
}
}
Aufgabe 2:
Die folgenden Javaprogramme enthalten Fehler. Beschreiben Sie
die Fehler und korrigieren Sie sie:
-
a)
class Aufgabe2a {
static int dividiere(int z, int n){
if (n!=0) return z/n;
}
}
-
b)
class Aufgabe2b {
static int dividiere(int z, int n){
if (n!=0) return z/n;
throw new Exception("division durch 0");
}
}
-
c)
class Aufgabe2c {
String x;
String y;
Aufgabe2c(String x, StringBuffer y){
this.x = x;
this.y = y;
}
}
-
d)
class Aufgabe2d{
public void printTwiceAsUpperCase(String s){
Object doppelS = s+s;
System.out.println(doppelS.toUpperCase());
}
}
-
e)
class Aufgabe2e_1{
private String s = "hallo";
public String getS(){return s;}
}
class Aufgabe2e_2{
public static String getS(Aufgabe2e_1 e1){return e1.s;}
}
-
f)
class Aufgabe2f{
public void printString(String s){
System.out.println(s);
}
public static void main(String [] args){
printString("hallo");
}
}
Aufgabe 3:
Gegeben sei die folgende abstrakte Klasse für Listen, gemäß unserer
Spezifikation aus der Vorlesung:abstract class AbList{
abstract public AbList empty();
abstract public AbList cons(Object x, AbList xs);
abstract public boolean isEmpty();
abstract public Object head();
abstract public AbList tail();
}
Schreiben Sie für die Klasse folgende Methoden, die ihr hinzugefügt
werden können:
- a) public AbList take(int i);
take soll eine Teilliste der ersten i Elemente
zurückgeben.
- b) public AbList drop(int i);
drop soll eine Teilliste zurückgeben, in der die ersten i
Elemente fehlen.
- c) public AbList sublist(int beginIndex,int laenge);
sublist soll die Teilliste zurückgeben, vom Element an der
Stelle beginIndex anfängt und die
nachfolgenden laenge Elemente enthält. Sie dürfen die
Methoden take und drop benutzen.
- d) public AbList twiceElements();
twiceElements baut eine Liste, in der jedes Element doppelt
eingetragen wurde.
Beispiel: aus der
Liste ("a","b","c") erzeugt twiceElements die
Liste: ("a","a","b","b","c","c").
Aufgabe 4:
Schreiben Sie eine Methode
public static int wievielC(char c, String str)
die zählt, wie oft der Buchstabe c im
String str ist.
Aufgabe 5:
Betrachten Sie sich folgende Klassen:class Aufgabe5_1{
public String getInfo(){return "5_1";}
}
class Aufgabe5_2 extends Aufgabe5_1{
public String getInfo(){return "5_2";}
}
class Aufgabe5_3 extends Aufgabe5_2{
public String getInfo(){return "5_3";}
}
class Aufgabe5 {
static String getInfo(Aufgabe5_1 o){return o.getInfo();}
public static void main(String [] args){
Aufgabe5_1 a1 = new Aufgabe5_3();
Aufgabe5_1 a2 = new Aufgabe5_2();
Aufgabe5_1 a3 = new Aufgabe5_1();
System.out.println(a3.getInfo());
System.out.println(getInfo(a3));
System.out.println(getInfo(a1));
System.out.println(a2.getInfo());
}
}
Führen Sie die Methode main von Hand aus. Was wird auf dem
Bildschirm ausgegeben?
Aufgabe 6:
Betrachten Sie die folgende Klasse:class Aufgabe6{
String g1(){
new NullPointerException();
return "g1";
}
String g2()throws Exception{
try {
return g1();
}catch (NullPointerException _){
throw new Exception();
}
}
String g3(){
String result="";
try {
result=g2();
}catch (NullPointerException _){
return "null pointer";
}catch (Exception _){
return "exception";
}
return result;
}
public static void main(String [] args){
System.out.println(new Aufgabe6().g3());
}
}
Führen Sie das Programm von Hand aus. Was wird auf dem Bildschirm
ausgegeben?
Erklären Sie wie es zu dieser Ausgabe kommt.