Musterlösung: Wortstatistik - FB3 - Uni Bremen

Werbung
Universität Bremen
Musterlösung: Wortstatistik
import
importjava.io.*;
java.io.*;
class
classWordsStat
WordsStat
{{
static
staticboolean
booleanisWhiteSpace(char
isWhiteSpace(charc)c)
{{
return
returncc==
==' '' '||||cc==
=='\t'
'\t'||||cc==
=='\n'
'\n'||||cc==
=='\r';
'\r';
}}
static
staticboolean
booleanisPunctuation(char
isPunctuation(charc)c)
{{
return
returncc==
=='.''.'||||cc==
=='!''!'||||cc==
=='?'
'?'||||cc==
==':'':'||||cc==
==','','||||
cc==
=='"''"'||||cc==
=='(''('||||cc==
==')'')'||||cc==
==';'';'||||cc==
=='-';
'-';
}}
static
staticboolean
booleanignore(char
ignore(charc)c)
{{
return
returnisWhiteSpace(c)
isWhiteSpace(c)||||isPunctuation(c);
isPunctuation(c);
}}
Einführung in die Programmierung mit Java
121
Universität Bremen
Musterlösung: Wortstatistik
static
staticString[]
String[]readWords(FileInputStream
readWords(FileInputStreamstream,int
stream,intc,int
c,intindex)
index)throws
throwsIOException
IOException
{{
while(c
while(c!=
!=-1
-1&&
&&ignore((char)
ignore((char)c))
c))
cc==stream.read();
stream.read();
if(c
if(c!=
!=-1)
-1)
{{
String
Stringword
word=="";
"";
while(c
!=
-1
&&
while(c != -1 &&!ignore((char)
!ignore((char)c))
c))
{{
word
word+=
+=(char)
(char)c;c;
cc==stream.read();
stream.read();
}}
String[]
String[]words
words==readWords(stream,c,index
readWords(stream,c,index++1);
1);
words[index]
=
word.toLowerCase();
words[index] = word.toLowerCase();
return
returnwords;
words;
}}
else
else
return
returnnew
newString[index];}
String[index];}
Einführung in die Programmierung mit Java
122
Universität Bremen
Musterlösung: Wortstatistik
static
staticvoid
voidcount(String[]
count(String[]s)s)
{{
int
inti i==0;0;
while(i
while(i<<s.length)
s.length)
{{
String
Stringword
word==s[i++];
s[i++];
int
num
=
1;
int num = 1;
while(i
while(i<<s.length
s.length&&
&&
word.equals(s[i++]))
word.equals(s[i++]))
++num;
++num;
System.out.println(num
System.out.println(num++"\t"
"\t"++word);
word);
}}
}}
static
staticvoid
voidswap(String[]
swap(String[]s,int
s,inti,i,int
intj)j)
{{
String
Stringt t==s[i];
s[i];s[i]
s[i]==s[j];
s[j];s[j]
s[j]==t;t;
}}
Einführung in die Programmierung mit Java
static
staticvoid
voidsort(String[]
sort(String[]s)s)
{{
for(int
for(inti i==0;0;i i<<s.length-1;
s.length-1;++i)
++i)
for(int
j
=
i+1;
j
<
s.length;
for(int j = i+1; j < s.length;++j)
++j)
if(s[j].compareTo(s[i])
<
0)
if(s[j].compareTo(s[i]) < 0)
swap(s,i,j);
swap(s,i,j);
}}
static
staticvoid
voidmain(String[]
main(String[]args)
args)throws
throws
FileNotFoundException,IOException
FileNotFoundException,IOException
{{
FileInputStream
FileInputStreamstream
stream==
new
newFileInputStream(args[0]);
FileInputStream(args[0]);
String[]
String[]words
words==
readWords(stream,stream.read(),0);
readWords(stream,stream.read(),0);
sort(words);
sort(words);
count(words);
count(words);
}}
}}
123
Universität Bremen
Beispiel: Wortstatistik
Einführung in die Programmierung mit Java
124
Universität Bremen
Ausnahmen (Exceptions)
Erzeugen (throw)
Fangen (catch)
Exceptions dienen zum Mitteilen von Fehlerzuständen
An der Stelle, an der die Exception ausgelöst wird, wird die Ausführung des
Programms unterbrochen und an anderer Stelle wieder aufgenommen
Das Behandeln einer Exception bezeichnet man als fangen
Wird eine Exception nicht gefangen, wird das Programm abgebrochen und
eine Fehlermeldung ausgegeben
Erzwingen der Behandlung
Durch die Angabe einer throws-Klausel hinter dem Funktionskopf werden
Aufrufer der Funktion gezwungen, die genannte Exception zu behandeln
Allerdings kann der Aufrufer ebenfalls eine throws-Klausel hinter seinem Funktionskopf verwenden, um die Behandlung an seinen Aufrufer weiterzuleiten
Einführung in die Programmierung mit Java
125
Universität Bremen
Ausnahmen: Syntax
funktionskopf
funktionskopf[ [throws
throwsexceptiontyp
exceptiontyp{ {, ,exceptiontyp
exceptiontyp} }] ]
throw
thrownew
newexceptiontyp
exceptiontyp( ([ [ausdruck
ausdruck{ {, ,ausdruck
ausdruck} }] ]) ); ;
try
try
{{
{ {anweisung
anweisung} }
}}
{ {catch
catch( (exceptiontyp
exceptiontypbezeichner
bezeichner) )
{{
{ {anweisung
anweisung} }
}}} }
[ [finally
finally
{{
{ {anweisung
anweisung} }
}}] ]
Einführung in die Programmierung mit Java
126
Universität Bremen
Der Weg einer Ausnahme
Parameter
Parametervon
vonmain(...)
main(...)
Rücksprungadresse
Rücksprungadresse
Lokale
LokaleVariablen
Variablenvon
vonmain
main
try{...} catch(E1 e){...} catch(E2 e){...} finally{...} ...
Parameter
Parametervon
vonfun1(...)
fun1(...)
Rücksprungadresse
Rücksprungadresse
Lokale
LokaleVariablen
Variablenvon
vonfun1
fun1
Parameter
Parametervon
vonfun2(...)
fun2(...)
try{...} catch(E3 e){...} catch(E4 e){...} finally{...} ...
Rücksprungadresse
Rücksprungadresse
Lokale
LokaleVariablen
Variablenvon
vonfun2
fun2
throw new E1();
Einführung in die Programmierung mit Java
127
Universität Bremen
Die Exception-Hierarchie
Throwable
Throwable
Exception
Exception
sonstige
sonstige
Error
Error
RuntimeException
RuntimeException
ArithmeticException
ArithmeticException
usw.
usw.
VirtualMachineError
VirtualMachineError
IndexOutOf
IndexOutOf
BoundsException
BoundsException
ArrayIndexOutOf
ArrayIndexOutOf
BoundsException
BoundsException
Einführung in die Programmierung mit Java
usw.
usw.
StringIndexOutOf
StringIndexOutOf
BoundsException
BoundsException
128
Universität Bremen
Wortstatistik mit Exception-Handling
static
staticvoid
voidmain(String[]
main(String[]args)
args)
{{
if(args.length
if(args.length!=
!=1)
1)
System.out.println(
System.out.println(
"usage:\tjava
"usage:\tjavaWordsStat
WordsStatfile");
file");
else
else
try
try
{{
FileInputStream
FileInputStreamstream
stream==
new
newFileInputStream(args[0]);
FileInputStream(args[0]);
String[]
String[]words
words==
readWords(stream,stream.read(),0);
readWords(stream,stream.read(),0);
sort(words);
sort(words);
count(words);
count(words);
}}
Einführung in die Programmierung mit Java
}}
catch(FileNotFoundException
catch(FileNotFoundExceptione)
e)
{{
System.out.println(args[0]
System.out.println(args[0]++
":":no
nosuch
suchfile
fileor
ordirectory");
directory");
}}
catch(IOException
catch(IOExceptione)
e)
{{
System.out.println(args[0]
System.out.println(args[0]++
":":file
fileisiscorrupted");
corrupted");
}}
}}
129
Universität Bremen
Beispiel: Exception-Handling
Einführung in die Programmierung mit Java
130
Universität Bremen
BinTree mit Exceptions
BinTree
BinTreeleft()
left()throws
throwsException
Exception
{{
if(empty())
if(empty())
throw
thrownew
newException("Zugriff
Exception("Zugriffauf
aufleeren
leerenBaum!");
Baum!");
else
else
return
returnleftBranch;
leftBranch;
}}
BinTree
BinTreeright()
right()throws
throwsException
Exception
{{
::
}}
int
intvalue()
value()throws
throwsException
Exception
{{
if(empty())
if(empty())
throw
thrownew
newException("Zugriff
Exception("Zugriffauf
aufleeren
leerenBaum!");
Baum!");
else
else
return
returnval;
val;
}}
Einführung in die Programmierung mit Java
131
Universität Bremen
BinTree mit Exceptions
static
staticpublic
publicvoid
voidmain(String[]
main(String[]args)
args)
{{
try
try
{{
BinTree
BinTreeb1
b1==new
newBinTree();
BinTree();
BinTree
b2
=
new
BinTree();
BinTree b2 = new BinTree();
System.out.println(new
System.out.println(newBinTree(b1,42,b2).left()
BinTree(b1,42,b2).left()==
==b1);
b1);
::
System.out.println(new
System.out.println(newBinTree().left());
BinTree().left());
}}
catch(Exception
catch(Exceptione)
e)
{{
System.out.println(e.getMessage());
System.out.println(e.getMessage());
}}
}}
Einführung in die Programmierung mit Java
132
Universität Bremen
Beispiel: BinTree mit Exceptions
Einführung in die Programmierung mit Java
133
Universität Bremen
Dokumentieren von Quelltexten
Klassen
Member-Variablen
Allgemeine Beschreibung, was die Aufgabe der Klasse ist
Was wird in der Variablen gespeichert?
Haben bestimmte Belegungen besondere Bedeutungen?
Member-Funktionen
Was tut die Funktion?
Welche Parameter hat sie und was bedeuten sie?
Welches Ergebnis liefert die Funktion?
Welche Seiteneffekte hat die Funktion?
Was sind die Vorbedingungen für die Anwendbarkeit der Funktion?
Welche Nachbedingungen sind erfüllt?
Einführung in die Programmierung mit Java
134
Universität Bremen
Dokumentieren von Quelltexten
In externen Dokumenten
Kommentare in Java
Wie ist die Gesamtarchitektur des Programms?
Wie arbeiten die Klassen zusammen?
Wie benutzt man das Programm?
Zeilen-Kommentar:
// Dies ist ein Kommentar bis zum Zeilenende
Block-Kommentar:
/* Dies ist ein Kommentar bis zur Endmarkierung */
JavaDoc-Kommentar: /** Dies ist ein JavaDoc-Kommentar */
Spezialitäten in JavaDoc-Kommentaren
@author Hier steht der Author
@version Hier wird die Versionsnummer angegeben
@param Hier wird ein Funktionsparameter beschrieben
@return Hier wird der Rückgabewert beschrieben
@throws Hier wird eine möglicherweise von einer Funktion erzeugte Exception
beschrieben
Einführung in die Programmierung mit Java
135
Universität Bremen
Stack mit JavaDoc-Kommentaren
/**
/**
**The
Theclass
classStack
Stackrealizes
realizesan
anunlimited
unlimited
**stack
for
integer
numbers.
The
stack for integer numbers. Thecurrent
current
**implementation
is
based
on
a
linked
implementation is based on a linkedlist.
list.
**@author
Thomas
Röfer
@author Thomas Röfer
*/*/
public
publicclass
classStack
Stack
{{
/**
/**
**The
Thelocal
localclass
classStackElement
StackElementrepresents
represents
**aasingle
element
on
the
stack.
It
single element on the stack. Itconsists
consists
**ofofthe
value
to
store
and
a
reference
the value to store and a referencetoto
**the
thenext
nextelement
elementon
onthe
thestack.
stack.
*/*/
private
privateclass
classStackElement
StackElement
{{
StackElement
StackElementnext;
next;
int
value;
int value;
}}
Einführung in die Programmierung mit Java
/**
/**
**The
Theprivate
privatemember
memberfirst
firstisisaareference
reference
**totothe
first
element
on
the
stack.
the first element on the stack.IfIfititisis
**null,
null,the
thestack
stackisisempty.
empty.
*/*/
private
privateStackElement
StackElementfirst;
first;
/**
/**
**The
Theonly
onlyconstructor
constructorofofthe
theclass.
class.
*/*/
public
publicStack()
Stack()
{{
first
first==null;
null;
}}
/**
/**
**The
Thefunction
functionputs
putsaanumber
numberon
ontop
topofof
**the
thestack.
stack.
**@param
@parami iThe
Thevalue
valuepushed
pushedonto
ontothe
the
**stack.
stack.
*/*/
136
Universität Bremen
Stack mit JavaDoc-Kommentaren
public
publicvoid
voidpush(int
push(inti)i)
{{
StackElement
StackElementss==new
newStackElement();
StackElement();
s.value
=
i;
s.value = i;
s.next
s.next==first;
first;
first
=
s;
first = s;
}}
/**
/**
**The
Thefunction
functionremoves
removesthe
thetopmost
topmostelement
elementfrom
fromthe
thestack
stack
**and
returns
it.
<b>Note:</b>
The
stack
must
not
be
empty!
and returns it. <b>Note:</b> The stack must not be empty!
**@return
@returnThe
Thevalue
valueremoved
removedfrom
fromthe
thestack.
stack.
*/*/
public
publicint
intpop()
pop()
{{
int
inti i==first.value;
first.value;
first
=
first.next;
first = first.next;
return
returni;i;
}}
}}
Einführung in die Programmierung mit Java
137
Universität Bremen
Beispiel: Dokumentieren mit JavaDoc
Einführung in die Programmierung mit Java
138
Universität Bremen
Beispiel: Dokumentieren mit JavaDoc
Einführung in die Programmierung mit Java
139
Universität Bremen
Datenströme
Allgemein
Datenströme leiten Daten seriell in ein
Programm hinein bzw. wieder heraus
Datenströme können umgeleitet werden,
so kann die Eingabe aus einer Datei
kommen bzw. die Ausgabe in eine Datei
geschrieben werden
Standard-Datenströme
Standardeingabe
Standardausgabe
System.in (Instanz von InputStream)
System.out (Instanz von PrintStream)
Standardfehlerausgabe
System.err (Instanz von PrintStream)
Einführung in die Programmierung mit Java
140
Universität Bremen
Datenströme in Java
Byte-orientierte Datenstöme
InputStream
OutputStream
FileInputStream, FilterInputStream, StringBufferInputStream ...
FileOutputStream, FilterOutputStream, PrintStream ...
Unicode-orientierte Datenströme
Reader
BufferedReader, FilterReader, InputStreamReader, StringReader ...
Writer
BufferedWriter, FilterWriter, OutputStreamWriter, PrintWriter, StringWriter ...
Einführung in die Programmierung mit Java
141
Universität Bremen
Datenströme in Java
import
importjava.io.*;
java.io.*;
class
classMore
More
{{
static
staticvoid
voidmain(String[]
main(String[]args)
args)throws
throwsIOException
IOException
{{
InputStreamReader
InputStreamReaderisReader
isReader==
new
newInputStreamReader(System.in);
InputStreamReader(System.in);
BufferedReader
BufferedReaderbufReader
bufReader==
new
newBufferedReader(isReader);
BufferedReader(isReader);
String
Stringline
line==bufReader.readLine();
bufReader.readLine();
while(line
while(line!=
!=null)
null)
{{
System.out.println(line);
System.out.println(line);
line
line==bufReader.readLine();
bufReader.readLine();
}}
}}
}}
Einführung in die Programmierung mit Java
System.in
System.in
InputStream
InputStream
isReader
isReader
InputStreamReader
InputStreamReader
bufReader
bufReader
BufferedReader
BufferedReader
line
line
String
String
142
Universität Bremen
Beispiel: More
Einführung in die Programmierung mit Java
143
Universität Bremen
Übungsaufgaben
Aufgabe 9
Aufgabe 10
Mindestens eines von den bisher erstellten Programmen JavaDoc-konform
dokumentieren und mit JavaDoc eine Online-Dokumentation erstellen
Aufgabe 11
Mindestens eines von den bisher erstellten Programmen „wasserdicht“
machen, d.h. alle zu erwartenden Exceptions auffangen und entsprechende
Fehlermeldungen ausgeben
Erstellen von zwei Programmen Zip und UnZip, die eine Datei komprimieren
bzw. eine komprimierte Datei wieder auspacken
Tipp
Es gibt zwei Klassen GZIPInputStream und GZIPOutputStream, die das Einund Auspacken übernehmen
Einführung in die Programmierung mit Java
144
Herunterladen