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: 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: 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.
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:

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:

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: 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.


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.