Initialisierung von Variablen - FB3 - Uni Bremen

Werbung
Universität Bremen
Initialisierung von Variablen
Automatische Initialisierung
Für Klassen-Variablen (die sich auf kein Objekt beziehen, static)
Für Member-Variablen (Teile von Objekten)
Erzwungene Initialisierung
Für lokale Variablen, d.h. Variablen in Funktionen
Es muss für den Compiler erkennbar sein, dass eine Variable initialisiert
wurde, bevor sie das erste Mal ausgelesen wird.
int i = 0;
int i;
:
i = 17;
Einführung in die Programmierung mit Java
int i;
:
i = i+1 (Nicht erlaubt)
67
Universität Bremen
Funktionen
Motivation
Eigenschaften
Funktionen erlauben, das Programm zu strukturieren
Sie kapseln eine bestimmte Funktionalität
Man kann sie mehrfach verwenden
Sie eröffnen die Möglichkeit zur Rekursion (Selbstaufruf)
ergebnistyp bezeichner ( [ typ bezeichner ] { , typ bezeichner } ] ) rumpf
Vor Klassen-Funktionen (die sich auf kein Objekt beziehen) steht static
Funktionen ohne Rückgabe haben den Ergebnistyp void
Überladen
Mehrere Funktionen können den gleichen Namen haben, wenn sie unterschiedliche
Parameterlisten haben
oder zu unterschiedlichen Klassen gehören
Einführung in die Programmierung mit Java
68
Universität Bremen
Beispiele für Funktionen
Parameterlos
Mit Parametern
static void printHello() {System.out.println("Hello");}
static double getPi() {return Math.PI;}
void println() in class PrintStream
static int plus(int a,int b) {return a + b;}
static double factorial(int n) {return n == 0 ? 1 : n * factorial(n-1);}
void println(String s) in class PrintStream
Überladung
static int add(int a,int b) {return a+b;}
static double add(double a,double b) {return a+b;}
static int add(double a,double b) {return (int) (a+b);} Falsch!
static String add(String a,String b)
{return Integer.toString(Integer.parseInt(a) + Integer.parseInt(b));}
Diverse Varianten von println und print in PrintStream
Einführung in die Programmierung mit Java
69
Universität Bremen
Count mit Funktionen
import
importjava.io.*;
java.io.*;
class
classCount
Count
{{
static
staticboolean
booleanisWhiteSpace(char
isWhiteSpace(charc)c)
{{
return
returncc==
==' '' '||||cc==
=='\t'
'\t'||||
cc==
=='\n'
'\n'||||cc==
=='\r';
'\r';
}}
static
staticboolean
booleanisEndOfSentence(char
isEndOfSentence(charc)c)
{{
return
returncc==
=='.''.'||||cc==
=='!''!'||||
cc==
=='?'
'?'||||cc==
==':';
':';
}}
Einführung in die Programmierung mit Java
static
staticvoid
voidmain(String[]
main(String[]args)
args)
throws
throwsFileNotFoundException,
FileNotFoundException,
IOException
IOException
{{
int
intchars
chars==0,0,
whitespace
whitespace==0,0,
words
words==0,0,
sentences
sentences==0;0;
FileInputStream
FileInputStreamstream
stream==
new
newFileInputStream(args[0]);
FileInputStream(args[0]);
int
intcc==stream.read();
stream.read();
70
Universität Bremen
Count mit Funktionen
while(c
while(c!=
!=-1)
-1)
{{
while(c
while(c!=
!=-1
-1&&
&&isWhiteSpace((char)
isWhiteSpace((char)c))
c))
{{
++whitespace;
++whitespace;
cc==stream.read();
stream.read();
}}
if(c
if(c!=
!=-1)
-1)
{{
while(c
while(c!=
!=-1
-1&&
&&!isWhiteSpace((char)
!isWhiteSpace((char)c))
c))
{{
++chars;
++chars;
if(isEndOfSentence((char)
if(isEndOfSentence((char)c))
c))
++sentences;
++sentences;
cc==stream.read();
stream.read();
}}
++words;
++words;
}}
Einführung in die Programmierung mit Java
}}
System.out.println(
System.out.println(
args[0]
args[0]++""besteht
bestehtaus:");
aus:");
System.out.println(
System.out.println(
chars
chars++whitespace
whitespace
++""Zeichen
Zeichen(inkl.
(inkl.Leerzeichen)");
Leerzeichen)");
System.out.println(chars
System.out.println(chars
++""Zeichen
Zeichen(ohne
(ohneLeerzeichen)");
Leerzeichen)");
System.out.println(words
System.out.println(words
++""Wörtern");
Wörtern");
System.out.println(sentences
System.out.println(sentences
++""Sätzen");
Sätzen");
}}
}}
71
Universität Bremen
Beispiel: Count mit Funktionen
Einführung in die Programmierung mit Java
72
Universität Bremen
Eval mit Funktionen
class
classEval
Eval
{{
static
staticdouble[]
double[]stack;
stack;
static
int
top;
static int top;
static
staticvoid
voidinit(int
init(intsize)
size)
{{
stack
stack==new
newdouble[size];
double[size];
top
=
0;
top = 0;
}}
static
staticvoid
voidpush(double
push(doublei)i)
{{
stack[top++]
stack[top++]==i;i;
}}
static
staticdouble
doublepop()
pop()
{{
return
returnstack[--top];
stack[--top];
}}
Einführung in die Programmierung mit Java
static
staticvoid
voidmain(String[]
main(String[]args)
args)
{{
init(10);
init(10);
for(int
for(inti i==0;0;i i<<args.length;
args.length;++i)
++i)
if(args[i].equals("+"))
if(args[i].equals("+"))
push(pop()
push(pop()++pop());
pop());
else
elseif(args[i].equals("-"))
if(args[i].equals("-"))
push(-pop()
push(-pop()++pop());
pop());
else
elseif(args[i].equals("x"))
if(args[i].equals("x"))
push(pop()
push(pop()**pop());
pop());
else
elseif(args[i].equals("/"))
if(args[i].equals("/"))
push(1.0
push(1.0/ /pop()
pop()**pop());
pop());
else
else
push(Double.parseDouble(args[i]));
push(Double.parseDouble(args[i]));
System.out.println(pop());
System.out.println(pop());
}}
}}
73
Universität Bremen
Verbundvariablen
Arrays
Arrays verbinden mehrere Variablen gleichen
Typs zu einem Verbund
Auf die einzelnen Elemente kann mit einem
Index zugegriffen werden
Verbundvariablen
Verbundvariablen verbinden mehrere Variablen
möglicherweise unterschiedlichen Typs zu
einem Verbund
Der Zugriff auf die Elemente des Verbunds
geschieht über ihren Namen
In Java heißt der Typ eines Verbundes Klasse,
einzelne Instanzen heißen Objekte
Instanzen von Verbundvariablen werden mit
new erzeugt
Einführung in die Programmierung mit Java
vorname
vorname
Herbert
Herbert
nachname
nachname Pappelbusch
Pappelbusch
alter
alter
35
35
adresse
adresse
Nirgendwo
Nirgendwo
74
Universität Bremen
Eval mit Stack-Objekt
class
classStack
Stack
{{
double[]
double[]stack;
stack;
int
top;
int top;
}}
class
classEval
Eval
{{
static
staticStack
Stackinit(int
init(intsize)
size)
{{
Stack
Stackss==new
newStack();
Stack();
s.stack
=
new
double[size];
s.stack = new double[size];
s.top
s.top==0;0;
return
returns;s;
}}
static
staticvoid
voidpush(Stack
push(Stacks,double
s,doublei)i)
{{
s.stack[s.top++]
s.stack[s.top++]==i;i;
}}
Einführung in die Programmierung mit Java
static
staticdouble
doublepop(Stack
pop(Stacks)s)
{{
return
returns.stack[--s.top];
s.stack[--s.top];
}}
static
staticvoid
voidmain(String[]
main(String[]args)
args)
{{
Stack
Stackstack
stack==init(10);
init(10);
for(int
i
=
0;
i
<
for(int i = 0; i <args.length;
args.length;++i)
++i)
if(args[i].equals("+"))
if(args[i].equals("+"))
push(stack,pop(stack)
push(stack,pop(stack)++pop(stack));
pop(stack));
else
if(args[i].equals("-"))
else if(args[i].equals("-"))
push(stack,-pop(stack)
push(stack,-pop(stack)++pop(stack));
pop(stack));
...... else
else
push(stack,Double.parseDouble(args[i]));
push(stack,Double.parseDouble(args[i]));
System.out.println(pop(stack));
System.out.println(pop(stack));
}}
}}
75
Universität Bremen
Klassen
Klassen fassen sowohl die Daten als
auch die Funktionen, die auf den
Daten arbeiten, in Verbund-variablen
zusammen
Die Instanzen einer Klasse heißen
Objekte
Funktionen, die Teil einer Klasse sind
(also alle in Java), heißen auch
Member-Funktionen oder Methoden
der Klasse
Variablen, die Teil einer Klasse sind,
heißen Member-Variablen
Auf Objekte kann in Java nur über
Referenzen zugegriffen werden
Referenzen zeigen immer entweder
auf ein Objekt oder sie sind null
Einführung in die Programmierung mit Java
76
Universität Bremen
Klassenvariablen und -funktionen
Klassen können auch Variablen
enthalten, die nur einmal existieren
und nicht für jedes Objekt getrennt
Diese bezeichnet man als
Klassenvariablen und erkennt sie am
vorangestellten static
Auf sie kann auch aus MemberFunktionen zugegriffen werden
Ebenfalls können Klassen Funktionen
enthalten, die nicht auf Objekten
arbeiten, sondern wiederum nur auf
Klassenvariablen zugreifen können.
Sie beginnen ebenfalls mit static
Einführung in die Programmierung mit Java
Ausgelieferte Fahrzeuge
77
Universität Bremen
Eval mit Stack-Klasse
class
classStack
Stack
{{
double[]
double[]stack;
stack;
int
top;
int top;
Stack(int
Stack(intsize)
size)
{{
stack
stack==new
newdouble[size];
double[size];
top
=
0;
top = 0;
}}
void
voidpush(double
push(doublei)i)
{{
stack[top++]
stack[top++]==i;i;
}}
double
doublepop()
pop()
{{
return
returnstack[--top];
stack[--top];
}}
}}
Einführung in die Programmierung mit Java
class
classEval
Eval
{{
static
staticvoid
voidmain(String[]
main(String[]args)
args)
{{
Stack
Stackstack
stack==new
newStack(10);
Stack(10);
for(int
for(inti i==0;0;i i<<args.length;
args.length;++i)
++i)
if(args[i].equals("+"))
if(args[i].equals("+"))
stack.push(stack.pop()
stack.push(stack.pop()++stack.pop());
stack.pop());
else
elseif(args[i].equals("-"))
if(args[i].equals("-"))
stack.push(-stack.pop()
stack.push(-stack.pop()++stack.pop());
stack.pop());
else
elseif(args[i].equals("x"))
if(args[i].equals("x"))
stack.push(stack.pop()
stack.push(stack.pop()**stack.pop());
stack.pop());
...... else
else
stack.push(Double.parseDouble(args[i]));
stack.push(Double.parseDouble(args[i]));
System.out.println(stack.pop());
System.out.println(stack.pop());
}}
}}
78
Universität Bremen
Zugriff auf Klassenelemente
Allgemein
Der Zugriff ist nur aus demselben Paket erlaubt
Jeder Zugriff ist erlaubt
private
public
Ohne Angabe
Der Zugriff auf die Member-Variablen und MemberFunktionen einer Klasse kann eingeschränkt werden
Hierdurch lässt sich gewährleisten, dass nur die
offizielle Schnittstelle der Klasse (die Signatur) von
außen benutzt werden kann, so dass die eigentliche
Implementierung nachträglich geändert werden
kann.
Zugriff nur aus derselben Klasse
protected
Zugriff aus demselben Paket und auch aus
abgeleiteten Klassen
Einführung in die Programmierung mit Java
class
classStack
Stack
{{
private
privatedouble[]
double[]stack;
stack;
private
int
top;
private int top;
public
publicStack(int
Stack(intsize)
size)
{{
stack
stack==new
newdouble[size];
double[size];
top
=
0;
top = 0;
}}
public
publicvoid
voidpush(double
push(doublei)i)
{{
stack[top++]
stack[top++]==i;i;
}}
public
publicdouble
doublepop()
pop()
{{
return
returnstack[--top];
stack[--top];
}}
}}
79
Universität Bremen
Abstrakte Datentypen und Klassen
Einführung in die Programmierung mit Java
80
Universität Bremen
Beispiel: Implementierung
public
publicclass
classBinTree
BinTree
{{
BinTree
BinTreeleftBranch,rightBranch;
leftBranch,rightBranch;
private
int
private intval;
val;
boolean
isEmpty;
boolean isEmpty;
public
publicBinTree()
BinTree(){isEmpty
{isEmpty==true;}
true;}
public
publicBinTree(BinTree
BinTree(BinTreel,int
l,intv,BinTree
v,BinTreer)r)
{{
leftBranch
leftBranch==l;l;
val
val==v;v;
rightBranch
rightBranch==r;r;
isEmpty
isEmpty==false;
false;
}}
public
publicboolean
booleanempty()
empty(){return
{returnisEmpty;}
isEmpty;}
Einführung in die Programmierung mit Java
public
publicBinTree
BinTreeleft()
left()
{{
if(empty())
if(empty())
error();
error();
return
returnleftBranch;
leftBranch;
}}
public
publicBinTree
BinTreeright()
right()
{{
if(empty())
if(empty())
error();
error();
return
returnrightBranch;
rightBranch;
}}
public
publicint
intvalue()
value()
{{
if(empty())
if(empty())
error();
error();
return
returnval;}
val;}
81
Universität Bremen
Beispiel: Implementierung
private
privatevoid
voiderror()
error()
{{
System.out.println("Zugriff
System.out.println("Zugriffauf
aufleeren
leerenBaum!");
Baum!");
}}
static
staticpublic
publicvoid
voidmain(String[]
main(String[]args)
args)
{{
BinTree
BinTreeb1
b1==new
newBinTree(),
BinTree(),b2
b2==new
newBinTree();
BinTree();
System.out.println(new
System.out.println(newBinTree(b1,42,b2).left()
BinTree(b1,42,b2).left()==
==b1);
b1);
BinTree(b1,42,b2).right()
==
System.out.println(new
System.out.println(new BinTree(b1,42,b2).right() ==b2);
b2);
BinTree(b1,42,b2).value()
==
System.out.println(new
System.out.println(new BinTree(b1,42,b2).value() ==42);
42);
BinTree().empty()
==
true);
System.out.println(new
System.out.println(new BinTree().empty() == true);
System.out.println(new
System.out.println(newBinTree(b1,42,b2).empty()
BinTree(b1,42,b2).empty()==
==false);
false);
System.out.println(new
System.out.println(newBinTree().left());
BinTree().left());
}}
}}
Einführung in die Programmierung mit Java
82
Universität Bremen
Der Java-Stack
class
classfoo
foo
{{
static
staticpublic
publicvoid
voidmain(String[]
main(String[]args)
args)
{{
int
inti i==1,j
1,j==2;2;
int
intkk==fun1(i,j);
fun1(i,j);
}}
static
staticpublic
publicint
intfun1(int
fun1(inta,int
a,intb)
b)
{{
bool
boolx;x;
return
returnaa**b;b;
}}
}}
Parameter
Parametervon
vonmain(...)
main(...)
MM
Rücksprungadresse
Rücksprungadresse
zum
zumStartup-Code
Startup-Code
Lokale
LokaleVariablen
Variablenvon
vonmain
main
MM
Parameter
Parametervon
vonfun1(...)
fun1(...)
MM
Rücksprungadresse
Rücksprungadresse
zum
zumAufruf
Aufrufaus
ausmain()
main()
Lokale
LokaleVariablen
Variablenvon
vonfun1
fun1
MM
Einführung in die Programmierung mit Java
83
Universität Bremen
Der Java-Heap
Stack
Heap
M
boolean
b
true
"Hallo"
BinTree
int
i
42
int
val
0
String
s
BinTree
right
null
BinTree
t
M
boolean isEmpty
boolean b = true;
int i = 42;
String s = "Hallo";
left
null
true
BinTree
left
int
val
17
BinTree
right
null
boolean isEmpty
false
M
BinTree t = new BinTree(new BinTree(),17,null);
Einführung in die Programmierung mit Java
84
Universität Bremen
Arrays
Stack
Heap
M
int
length
3
int[]
a
17
42
15
int[][]
b
M
int
length
3
int[.] a = {17,42,15};
int[.][.] b = new int[3][.];
b[0] = new int[6];
b[1] = new int[.] {1,24};
b[0][0] = 29; ...
Einführung in die Programmierung mit Java
null
int
length
6
29
-42
0
38
34
7
int
length
2
1
24
M
85
Universität Bremen
Zuweisungen
Stack
Heap
M
int
i
42
int
j
17
Value
v
Value
w
M
class Value {int value;}
int i = 42, j = 17;
Value v = new Value();
Value w = new Value();
v.value = 42; w.value = 17;
i = j; v = w; w.value = 19;
System.out.println(v.value);
Einführung in die Programmierung mit Java
int
value
42
int
value
M
17
Stack
M
int
i
17
int
j
17
Value
v
Value
w
M
86
19
Universität Bremen
Funktionsaufrufe
Stack
Heap
M
int
i
Value
v
M
int
value
17
42
42
M
Stack
static public void fun(int j, Value w)
{w.value = j; j = 63;}
...
int i = 42;
Value v = new Value();
v.value = 17;
fun(i,v);
System.out.println(i + " " + v.value);
Einführung in die Programmierung mit Java
M
int
i
Value
v
int
j
42
42
Value
w
M
Rücksprungadresse
87
63
Universität Bremen
Beispiel: Zahlen austauschen
class
classValue
Value
{{
int
intvalue;
value;
}}
class
classSwap
Swap
{{
static
staticvoid
voidmain(String[]
main(String[]args)
args)
{{
Value
Valueaa==new
newValue(),
Value(),bb==new
newValue();
Value();
a.value
=
17;
b.value
=
42;
a.value = 17; b.value = 42;
swap1(a.value,b.value);
swap1(a.value,b.value);
System.out.println(a.value
System.out.println(a.value++",",""++b.value);
b.value);
swap2(a,b);
swap2(a,b);
System.out.println(a.value
System.out.println(a.value++",",""++b.value);
b.value);
swap3(a,b);
swap3(a,b);
System.out.println(a.value
System.out.println(a.value++",",""++b.value);
b.value);
}}
Einführung in die Programmierung mit Java
static
staticvoid
voidswap3(Value
swap3(Valuea,Value
a,Valueb)
b)
{{
int
intt t==a.value;
a.value;
a.value
a.value==b.value;
b.value;
b.value
=
t;
b.value = t;
}}
static
staticvoid
voidswap1(int
swap1(inta,int
a,intb)
b)
{{
int
intt t==a;a;
aa==b;b;
bb==t;t;
}}
static
staticvoid
voidswap2(Value
swap2(Valuea,Value
a,Valueb)
b)
{{
Value
Valuet t==a;a;
aa==b;b;
bb==t;t;
}}
}}
88
Universität Bremen
Beispiel: Zahlen austauschen
Stack
M
int
a
17
int
b
M
42
swap1
Heap
Stack
int
value
17
int
value
M
42
M
Value
a
Value
b
M
swap2
Einführung in die Programmierung mit Java
89
swap3
Universität Bremen
Strings: Suchen und Ersetzen
import
importjava.io.*;
java.io.*;
class
classReplace
Replace
{{
static
staticString
Stringread(String
read(Stringfile)
file)throws
throws
FileNotFoundException,
IOException
FileNotFoundException, IOException
{{
String
Stringtext
text=="";
"";
FileInputStream
FileInputStreamstream
stream==
new
newFileInputStream(file);
FileInputStream(file);
int
c
=
stream.read();
int c = stream.read();
while(c
while(c!=
!=-1)
-1)
{{
text
text+=
+=(char)
(char)c;c;
cc==stream.read();
stream.read();
}}
return
returntext;
text;
}}
Einführung in die Programmierung mit Java
static
staticString
Stringreplace(String
replace(Stringtext,
text,
String
searchText,String
replaceText)
String searchText,String replaceText)
{{
int
intpos
pos==text.indexOf(searchText);
text.indexOf(searchText);
while(pos
while(pos!=
!=-1)
-1)
{{
text
text==text.substring(0,pos)
text.substring(0,pos)++
replaceText
replaceText++
text.substring(pos
text.substring(pos++searchText.length());
searchText.length());
pos
=
text.indexOf(searchText,pos+
pos = text.indexOf(searchText,pos+
replaceText.length());
replaceText.length());
}}
return
returntext;}
text;}
substring
substringliefert
lieferteinen
einenTeilbereich
Teilbereichdes
desStrings
Strings
indexOf
indexOfsucht
suchtnach
nachdem
demersten
erstenVorkommen
Vorkommen
des
desSuch-Strings
Such-Stringsab
abder
derStartposition
Startposition
90
Universität Bremen
Strings: Suchen und Ersetzen
static
staticvoid
voidmain(String[]
main(String[]args)
args)throws
throwsFileNotFoundException,
FileNotFoundException,
IOException
IOException
{{
String
Stringtext
text==read(args[0]);
read(args[0]);
for(int
for(inti i==1;1;i i<<args.length;
args.length;i i+=
+=2)
2)
text
text==replace(text,args[i],args[i+1]);
replace(text,args[i],args[i+1]);
System.out.print(text);
System.out.print(text);
}}
}}
Einführung in die Programmierung mit Java
91
Universität Bremen
Beispiel: Suchen und Ersetzen
Einführung in die Programmierung mit Java
92
Universität Bremen
Übungsaufgabe
Aufgabe
Beispiel
Umwandlung von ganzen Zahlen in die deutsche Sprache
>java IntToGerman 30123511
dreißigmillioneneinhundertdreiundzwanzigtausendfünfhundertelf
>
Tipps
Zahlen kann man mit Ganzzahldivision und Modulo zerlegen
Viele Texte kann man in String-Arrays ablegen ("zwei", "zwölf", "sechzig")
Manche Teile kann man mehrmals nutzen, daher sollte man Funktionen
verwenden
Einführung in die Programmierung mit Java
93
Herunterladen