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

(Nachmittags: wikify)
K (Kategorisiert)
 
(29 dazwischenliegende Versionen von 7 Benutzern werden nicht angezeigt)
Zeile 2: Zeile 2:
  
 
= Vormittags =
 
= Vormittags =
* Aufgabenblatt kommt noch
+
* [[Robert_Lubkoll/Java_Kurs/Tag_2/Wiederholungsaufgabe | Wiederholungsaufgabe zu Schleifen und Arrays]]
* [[Martin_Häcker/Java_Kurs/Tag_2/Handout| Vorlesung 3 zum Nachschlagen]]
+
* [http://docs.freitagsrunde.org/Veranstaltungen/javakurs_2006/Aufgaben/blatt03.pdf Aufgabenblatt 3] - [http://docs.freitagsrunde.org/Veranstaltungen/javakurs_2006/Aufgaben/blatt03.tut.pdf Beispiellösung]
+
* [[Javakurs2006/Tag_2/Objekte_Kurz| Vorlesung 3 zum Nachschlagen (Kurzfassung)]]
 +
* [[Martin_Häcker/Java_Kurs/Tag_2/Handout| Vorlesung 3 zum Nachlesen (detailiert)]]
 +
* [http://docs.freitagsrunde.org/Veranstaltungen/javakurs_2006/Vortraege/Modularisierung_und_Objekte.pdf Folien zum Vortrag]
 +
 
 +
Bei Problemen mit dem compiler, die sich darauf beziehen, dass Eure eigenen Klassen nicht gefunden werden,
 +
schaut mal auf dieser Seite vorbei: [[Javakurs2006/Probleme]]
 +
 
 
= Nachmittags =
 
= Nachmittags =
 +
* [http://docs.freitagsrunde.org/javakurs/2006/vortrag%20le4_23.pdf Folien]
 +
* [[Javakurs2006/Tag 2/Vorlesung 2| Vorlesung zum Nachlesen]]
 
== Übungsaufgaben ==
 
== Übungsaufgaben ==
'''Ziel:''' Ein IOUtility-Objekt schreiben, das Eingabe und Ausgabe in Java einfach macht und die Studentendatenbank mit Hilfe der API um schöne neue Funktionen erweitern.
+
* [[Javakurs2006/Tag 2/Vorlesung 3/Aufgaben| Aufgaben zur API-Benutzung]]
  
'''Advanced:''' IOUtility erweitern, das es Input/Output quasi wie ein iterator durchführt.
+
[[Javakurs2006| <- Zurück zur Übersicht]]
  
'''Idee:''' Verwendung der Java-API lernen.
+
[[Kategorie:Java]]
 
 
'''Meta-Anweisung:''' Jede der Methoden in dieser Aufgabe ist so zu programmieren, das ihr zuerst in euere ''main()''-Methode einen Aufruf schreibt und das Ergebnis ausgebt um zu Zeigen, wie ihr die Methoden verwenden wollt. Auf jeden Fall muss am Ende der Aufgabe eine ''main()''-Methode existieren die von jeder Methode demonstriert das sie funktioniert. Wird eure ''main()''-Methode zu lang, könnt ihr teile davon in ''testXXX()''-Methoden auslagern damit ihr die Übersicht behaltet.
 
 
 
'''Aufgaben:'''
 
# Schlage die Methode [http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#random() Math.random()] nach und verwende sie, um in einer Methode ''void setRandomGrades()'', die Arbeit der zentralen Verwaltung zu erleichtern, indem jeder Student in einer Methode eine zufällige Hauptdiplom-Note zugewiesen bekommt.
 
# Implementiere die Methode [http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#toString() toString()] für die Studenten- und Studidatenbank-Klasse. Verändere printMe() in beiden Klassen so, das sie diese neue Methode verwenden. Hinweis: Ein Student soll dabei so ausgegeben werden, dass erst die Matrikelnummer und dann, nach einem Leerzeichen, der Name ausgegeben wird. Beispiel: "123456 Lieschen Müller".
 
# Implementiere eine Methode ''toString()'' für die Datenbank, die erst alle Studenten, pro Student eine Zeile, schreibt. Danach noch eine Zeile (die mit einem Leerzeichen oder Tab beginnt) in der die Anzahl der Studenten in der Datenbank ausgibt. (Wenn Du in der Übung am Vormittag schon eine Methode geschrieben hast, die eine Durchschnitts-Note der Studenten berechnet, dann gebt sie hier ebenfalls aus, andernfalls fällt diese Ausgabe weg).
 
# Lese den Javadoc zu [http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html ArrayList] und verwende die ArrayList als interne Datenstruktur für die Studentendatenbank anstatt des Arrays. Wie verändern sich die Methoden ''add()'', ''search()'' und ''delete()''? Gibt es Instanz-Variablen die jetzt nicht mehr gebraucht werden?
 
# 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, die zwei Studenten als gleich betrachtet, wenn sie die gleiche Matrikelnummer haben. Nutze equals() um eine Methode zu schreiben die  zeigt, dass ein neuer Student, der in der Datenbank eingefügt wird ''equals()'' zu dem Student ist, der unter dieser Matrikelnummer in der Datenbank nachgeschlagen werden kann.
 
# Lese die Javadocs für die notwendigen Java-Klassen die man für Ausgabe benötigt. [http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileOutputStream.html FileOutputStream] vor allem die Konstruktoren, [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)]. Verwende dieses Wissen um eine neue Klassse "IOUtility" zu schreiben, dass eine Methode ''void writeStringToFile(String content, String filename)'' implementiert, die diese Klassen verwendet um einen String in eine Datei zu schreiben. Benutze diese Methode um die Studiendatenbank in eine Datei auszugeben. Hinweis: Verwende auch hier die toString()-Methode. Bestimmte Exceptions müssen hier bearbeitet werden. Da es keine sinnvolle Behandlungsmöglichkeiten gibt, deklariert ihr die Input-/Output-Methoden so das sie die Exceptions mit ''throws'' in der Methodendeklaration weiterreichen.
 
# 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 einließt 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.
 
# Benutze diese Methoden um einen neuen Konstruktor für die Studentendatenbank zu schreiben, der sie aus einer Datei einließt. 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()]
 
# 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.
 
 
 
''Advanced Aufgabe für Leute denen das Vorher alles zu Langweilig war:''
 
# Erweitere das IOUtility-Objekt so, dass man es mit einem Dateinamen Instanziiert. Danach kann man mit den Methoden ''startReading()'' bzw. ''startWriting()'' die Klasse in einen Zustand bringen, der entweder Lesen oder Schreiben aus der Datei mit den Methoden ''readLine()'' bzw. ''writeLine()'' 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]]
 

Aktuelle Version vom 17. März 2009, 13:05 Uhr