Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Javakurs2006/Tag 2: Unterschied zwischen den Versionen

(''Weiterführende Aufgaben'': cleanup)
(Nachmittags: aufgaben ausgelagert)
Zeile 15: Zeile 15:
 
* [[Javakurs2006/Tag 2/Vorlesung 2| Vorlesung zum Nachlesen]]
 
* [[Javakurs2006/Tag 2/Vorlesung 2| Vorlesung zum Nachlesen]]
 
== Übungsaufgaben ==
 
== Übungsaufgaben ==
'''Ziel:''' Ein IOUtility-Objekt schreiben, das Eingabe und Ausgabe in Java einfach macht.
+
* [[Javakurs2006/Tag 2/Vorlesung 3/Aufgaben| Aufgaben zur API-Benutzung]]
 
 
'''Idee:''' Verwendung der Java-API lernen.
 
 
 
'''Empfehlung zum Vorgehen:'''
 
Ihr solltet für jede Methode, die ihr schrebt, zunächst einen Test in der Main-Methode anlegen.
 
Mit Test ist hier z.B. ein Aufruf der Methode und die Ausgabe ihres Rückgabewertes auf der Konsole gemeint.
 
 
 
 
 
 
 
 
 
=== Umwandeln in eine Zeichenkette ===
 
:*Implementiere die Methode [http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#toString() toString()] für die Student-Klasse.
 
:*Verändere printMe() so, dass sie diese neue Methode verwenden.
 
:Hinweis: Die Daten eines Studenten sollen dabei in folgendem Format ausgegeben werden: 
 
Matrikelnummer Name
 
:Beispiel:
 
123456 Lieschen Müller
 
:*Implementiere die Methode [http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#toString() toString()] für die StudentDatabase-Klasse, die sämtliche Studenten und anschließend die Anzahl der Studenten in der Datenbank zurückgibt. Jeder Student soll in einer eigenen Zeile stehen und die Zeile mit der Anzahl der Studenten soll mit einem Lehrzeichen oder Tab beginnen.
 
:Beispiel:
 
123456 Lieschen Müller
 
123457 Franz Schmidt
 
_2
 
:*(Wenn Du in der Übung am Vormittag schon eine Methode geschrieben hast, die eine Durchschnittsnote der Studenten berechnet, dann gib diese hier ebenfalls aus).
 
 
 
 
 
=== Arraylists ===
 
:*Lese den Javadoc zu [http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html ArrayList] und ersetze in der Studentendatenbank die Datenstruktur Array durch die ArrayList.
 
:*Wie verändern sich die Methoden ''addStudent()'', ''deleteStudent()'' und ''search()'' (sofern du sie implementiert hast)?
 
:* Gibt es Instanz-Variablen die jetzt nicht mehr gebraucht werden?
 
 
 
 
 
 
 
 
 
=== IOUtility ===
 
:*Es soll eine Klasse "IOUtility" geschrieben werden, welche eine Methode ''void writeStringToFile(String content, String filename)'' enthält.
 
:*Diese soll einen String in eine Datei schreiben. Schaue dir dafür die Java-Klassen [http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileOutputStream.html FileOutputStream] (vor allem die Konstruktoren) und [http://docjar.com/docs/api/java/io/OutputStreamWriter.html OutputStreamWriter] (für die geerbte Methode [http://java.sun.com/j2se/1.3/docs/api/java/io/Writer.html#write(java.lang.String) write(String)]) an.
 
:*Benutze deine eben geschriebende Methode, um die Studentendatenbank in eine Datei auszugeben.
 
 
 
Hinweis:
 
:*Verwende auch hier die toString()-Methode.
 
:*Von den von euch verwendeten API-Methoden können hier verschiedene Exceptions ausgelöst werden, um welche wir uns kümmern müssen.
 
:*Da wir in unserer Methode selbst keine Möglichkeit haben, diese sinvoll zu behandeln, sollen die Exeptions mit "throws" weitergereicht werden.
 
 
 
 
 
=== ''Weiterführende Aufgaben'' ===
 
Von diesen Aufgaben könnt ihr euch eine Aussuchen, die euch am besten gefällt - ihr müsst sie nicht der Reihe nach Lösen.
 
 
 
==== IOUtility Erweitern ====
 
:*Erweitere das IOUtility-Objekt so, dass ihm bereits im Konstruktoraufruf der Name einer Datei übergeben wird, auf welcher es arbeiten soll.
 
:*Mit dem Aufruf der Methode ''startWriting()'' soll das Objekt die Datei zum Schreiben öffnen, sodass mit der Methode ''writeLine()'' nacheinander Zeilenweise die Datei geschrieben werden kann. Wenn die Datei fertig geschrieben ist, soll die Datei '''stopWriting()''
 
 
 
==== Gleichheit ====
 
:*Implementiere eine [http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#equals(java.lang.Object) equals()]-Methode für Student. Diese soll zwei Studenten als gleich betrachten, wenn diese die gleiche Matrikelnummer haben.
 
 
 
===== Gleichheit verwenden =====
 
:Nutze equals(), um eine Methode ''containsStudent(Student aStudent)'' zu schreiben, die beim Einfügen eines neuen Studenten in die Datenbank nachprüft, ob dieser bereits in ihr enthalten ist.
 
 
 
==== Zufallszahlen ====
 
:*Schlage die Methode [http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#random() Math.random()] in der Java-API nach.
 
:*Verwende die Methode, um eine Methode ''void setRandomGrades()'' zu schreiben, die jedem Studenten eine zufällige Hauptdiplomsnote zuweist.
 
 
 
==== Eine Datei einlesen ====
 
Lese den Javadoc zu den Klassen, die man benötigt, um eine Datei einzulesen: [http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileInputStream.html FileInputStream] um mit den Konstruktoren eine Datei zu öffnen, [http://java.sun.com/j2se/1.4.2/docs/api/java/io/BufferedReader.html BufferedReader] um eine Datei zeilenweise [http://java.sun.com/j2se/1.4.2/docs/api/java/io/BufferedReader.html#readLine() readLine()] zu lesen und [http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStreamReader.html InputStreamReader] um den FileInputStream und den BufferedReader kombinieren zu können. Verwende diese Klassen, um das IOUtility-Objekt um eine Methode ''ArrayList readLinesInFile(String filename)'' zu erweitern, die eine Datei in einzelnen Zeilen in eine ArrayList einliest und diese zurückgibt. Danach implementiere eine Methode ''String readFile(String filename)',' die eine eine ganze Datei als ein String zurückgibt. Hinweis: Verwende dabei die vorher implementierte Methode.
 
 
 
===== Studentendatenbank Einlesen =====
 
Benutze diese Methoden, um einen neuen Konstruktor für die Studentendatenbank zu schreiben, der sie aus einer Datei einliest. Jede Zeile in der Datei sieht so aus: "234234 Heinz Kunz" Das bedeutet, erst die Matrikelnummer, dann ein Leerzeichen und dann der Name des Studenten bis zum Ende der Zeile. Vorsicht: beginnt eine Zeile nicht mit der Matrikelnummer sondern mit etwas anderem, ist sie zu verwerfen. Hilfreiche Methoden: [http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#substring(int,%20int)) substring()], [http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#split(java.lang.String) split()], [http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#startsWith(java.lang.String) startsWith()]
 
 
 
==== Eingabe von der Konsole ====
 
Benutze dein Wissen um die Eingabe um eine Methode ''String promptUserForString(String question)'' zu schreiben, die den übergebenen String dem Benutzer auf der Konsole anzeigt und seine Antwort als String zurückgibt. Schreibe danach noch eine Methode ''int promptUserForInt(String question)'', die diese Methode verwendet, aber einen ''int'' zurückgibt. Hinweis: Man benötigt dafür [http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#in System.in]. Schreibe mit dieser Methode ein Menü für die Studentendatenbank, die es erlaubt, die Datenbank aus einer Datei einzulesen, und in einer anderen Datei zu sichern. Hinweis: Am einfachsten ist es ein Menü auszugeben, in dem jede Wahl eine Nummer hat, die der Benutzer dann eingibt. Wählt er eine ungültige Zahl, kann man einfach eine Fehlermeldung und das Menü ausgeben und eine neue Eingabe verlangen.
 
 
 
===== Das IOUtility Erweitern Schreiben, Objektorientierter =====
 
Erweitere das IOUtility-Objekt so, dass man es mit einem Dateinamen Instanziiert. Danach kann man mit den Methoden ''startReading()''  die Klasse in einen Zustand bringen, der Lesen aus der Datei mit den Methoden ''readLine()'' erlaubt. Die Methode ''readLine()'' soll dabei ''null'' zurückgeben, wenn die Datei zuende gelesen wurde.
 
 
 
Erweitere das Menü der Studentendantenbank, so das es erlaubt:
 
* Eine Standarddatenbank zu erzeugen
 
* Einen Studenten zu suchen
 
* Einen neuen Studenten einzufügen
 
* Die Hauptdiplom-Note eines Studenten einzutragen.
 
* Erweitert euer Menü, so dasss es eine Fehlerbehandlung durchführt, wenn beim Einlesen einer Datei diese nicht vorhanden ist, oder beim Schreiben, die Datei nicht zum Schreiben geöffnet werden kann.
 
 
 
== An die Tutoren ==
 
:Eingabe und Ausgabe unter Java ist nicht besonders elegant - vor allem, wenn man bei einer Aufgabe die Vorteile des Stream-Konzepts überhaupt nicht nutzen kann. Die Studenten sollen daher ein Objekt schreiben, das ihnen diese Aufgaben erleichtert. Ein entferntes Vorbild ist uns dabei eine [http://www.cs.princeton.edu/introcs/22inout/In.java.html Input-Klasse, die wir an der Princeton-Universität gefunden haben].
 
  
 
[[Javakurs2006| <- Zurück zur Übersicht]]
 
[[Javakurs2006| <- Zurück zur Übersicht]]

Version vom 5. April 2006, 08:25 Uhr