Regel 1 Kurze If-Anweisung

Werbung
University of Paderborn
Software Engineering Group
E. Kindler
University of Paderborn
Software Engineering Group
E. Kindler
Technische Informatik für Ingenieure (TIfI)
WS 2005/2006, Vorlesung 4
II. Grundlagen der Programmierung
…
Zuweisungen, Anweisungen, Blöcke
Kontrollstrukturen, Erweiterungen
Datentypen & Typisierung
Konventionen & Kommentare
…
Ekkart Kindler
3.3.3 Ergänzungen
Kurz If-Anweisungen
University of Paderborn
Software Engineering Group
E. Kindler
University of Paderborn
Software Engineering Group
E. Kindler
if (x == 0) if (y == 0) z = 0; else z = 1;
Kurze If-Anweisungen & Mehrdeutigkeiten
if (x == 0)
if (y == 0) {
z = 0;
}
else z = 1;
Problem Mehrdeutigkeit:
Weitere Schleifenkonstrukte
if (x == 0){ if (y == 0) z = 0; else z = 1; }
Abbruch von Schleifen
if (x == 0){ if (y == 0) z = 0; } else z = 1;
if
u welchem
Frage: Z
?
as else
d
rt
hö
ge
do while / for
oder
break
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Kurze If-Anweisung: Regel 1
VL 4
3
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Kurze If-Anweisung: Regel 2
University of Paderborn
Software Engineering Group
E. Kindler
VL 4
4
University of Paderborn
Software Engineering Group
E. Kindler
Lassen Sie in Ihren Programmen keine Mehrdeutigkeiten zu!
Schreiben Sie
if (x == 0) {
if (y == 0) {
z = 0;
} else {
z = 1;
}
}
oder
ung ist
e Einrück
Die richtig htig wie die
wic
ebenso
ung!
Klammer
explizite
In einer langen If-Anweisung kommt als erste
Anweisung (im dann-Fall) niemals unmittelbar
eine kurze If-Anweisung (short-if) vor!
if (x == 0) {
if (y == 0) {
z = 0;
}
} else {
z = 1;
}
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
5
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
6
1
Regel 2: graphisch
Zählschleifen
University of Paderborn
Software Engineering Group
E. Kindler
University of Paderborn
Software Engineering Group
E. Kindler
Schleifen haben oft die Form, daß eine Variable alle
Werte von einer vorgegeben Untergrenze bis zu
einer Obergrenze durchläuft. Z.B.:
int erg = 1;
if (bed1) if (bed2) Anw1 else Anw2
int i
while
erg
i =
}
sich
e bezieht
Das els te if.
letz
s
da
f
au
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Zählschleifen
VL 4
7
Für solche Schleifen gibt es eigenes
Schleifenkonstrukt: die for-Schleife
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
for (int i = 1; i <= n; i++) {
erg = erg * i;
}
Obergrenze für die ZählErhöhung der Zähl-
Bemerkung
<Loop>::=
variablen i um eins
(nach jedem Schleifendurchlauf)!
VL 4
9
Man kann jede for-Schleife in eine
äquivalente while-Schleife umformen
( Übung)
Deshalb ist das Konstrukt der for-Schleife
nicht unbedingt nötig
Aber Programme werden lesbarer und besser
verständlich, wenn man for-Schleifen
(richtig) einsetzt.
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
11
8
University of Paderborn
Software Engineering Group
E. Kindler
ifener Schle
, die in d
werden,
rt
rie
Variablen
a
kl
rung de
leife
initialisie
b der Sch
innerhal
Block)!
sind nur
m
ne
ei
ie in
gültig (w
…|
"for" "("
<BasicCommand> ";"
<BoolExpression> ";"
<BasicCommand> ")"
<Command>
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Durchlaufschleife
University of Paderborn
Software Engineering Group
E. Kindler
VL 4
<BasicCommand> ";" |
<Block> |
Das ist auch neu!
<Alternative> |
Ausdrücke sind
<Loop> |
auch Anweisungen!
…
<BasicCommand>::=
<Assignment> |
<VarDecl> |
<Expression> |
…
Initialisierung der
“Zählvariablen”
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
“Inkrement”
Zählschleife: BNF
University of Paderborn
Software Engineering Group
E. Kindler
variable i! Diese Bedingung
wird vor jedem Schleifendurchlauf überprüft.
Obergrenze
= 1;
(i <= n) {
= erg * i;
i + 1;
<Command>::=
int erg = 1;
Untergrenze
VL 4
10
University of Paderborn
Software Engineering Group
E. Kindler
Manchmal möchte man eine Schleife
mindestens einmal durchlaufen, bevor die
Bedingung überprüft wird.
Diese Schleifen nennen wir Durchlaufschleife
(im Gegensatz zur bisherigen abweisenden
Schleife).
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
12
2
Durchlaufschleife: Beispiel
Durchlaufschleife
University of Paderborn
Software Engineering Group
E. Kindler
<Command>::=
Wir wollen für eine Zahl n der Reihe nach die
Ziffern dieser Zahl ausgeben (angefangen bei
der niedrigsten Ziffer bis zur höchsten Ziffer):
do {
Out.print( n % 10 );
n = n / 10;
} while ( n > 0 );
führe die
Anweisung
aus
…|
"do"
werte die
Bedingung
aus
wenn falsch
<Command>
"while" "(" <BoolExpression> ")" ";"
VL 4
13
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Abbruch einer Schleife: Beispiel
University of Paderborn
Software Engineering Group
E. Kindler
Manchmal möchte man eine Schleife in der
Mitte ihres Rumpfes verlassen;
z.B. wenn ein Fehler eingetreten ist
Dies kann man mit der Anweisung break;
erreichen
Wenn break-Anweisung irgendwann
ausgeführt wird, wird das Programm
unmittelbar nach der unmittelbar umgebenden
Schleife fortgesetzt
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
4. Typisierung und Datentypen
<BasicCommand> ";" |
<Block> |
<Alternative> |
<Loop>
…
wenn wahr
<Loop>::=
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Abbruch einer Schleife
University of Paderborn
Software Engineering Group
E. Kindler
VL 4
15
14
University of Paderborn
Software Engineering Group
E. Kindler
int erg = 1;
int i = 1;
while (i <= n) {
erg = erg * i;
if (erg <= 0) break;
i = i + 1;
}
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
4.1 Primitive Datentypen
University of Paderborn
Software Engineering Group
E. Kindler
VL 4
VL 4
16
University of Paderborn
Software Engineering Group
E. Kindler
Bisher:
nur Programme über den ganzen Zahlen
Die ganzen Zahlen sind nicht für jede
Information eine zweckmäßige
Repräsentation:
Primitive Datentypen
Typisierung
Variablendeklarationen (Forts.)
Zuweisungen (Forts.)
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
Funktionen über den reellen Zahlen
Textverarbeitung
17
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
18
3
Primitive Datentypen
„Ganze Zahlen“
University of Paderborn
Software Engineering Group
E. Kindler
University of Paderborn
Software Engineering Group
E. Kindler
byte –128 bis 127
short –32768 bis 32767 (2 Byte)
int
-2147483648 bis 2147483647 (4 Byte)
long -9223372036854775808 bis 9223372036854775807
(8 Byte)
ganze Zahlen:
..., -3, -2, -1, 0, 1, 2, ..., 4711, …
reelle Zahlen:
0.321, π, e, 0.777..., 3.1*10-11
Zeichen:
‘a‘, ‘b‘, ‘c‘, ... , ‘A‘, ‘B‘, ... ‚‘0‘, ... ‘9‘, ‘&‘, ‘*‘, ...
Echte ganze Zahlen gibt es nicht (als primitive
Datentypen) !!!
Zeichenreihen:
n
ner ganze ist
an bei ei
usagt,
az
Wenn m
d
r
te
ts wei
Zahl nich .
nt
sie ein i
“Hallo Echo!“, “Eine Zeichenfolge: %$§.“
Wahrheitswerte:
false, true
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
„Reelle Zahlen“/ Gleitkommazahlen
VL 4
19
Zeichen (Character)
University of Paderborn
Software Engineering Group
E. Kindler
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Zeichenreihen (Strings)
VL 4
'a', ... , 'z, 'ä', 'ö', 'ü', 'ß',
'A', ... 'Z', ... , '0', ... , '9',
'+', '-',
'\t', '\n', '\r', '\\', '\'', ...
'\u2200'
21
"Dies ist ein Beispiel für eine\n
Zeichenreihe mit einem Zeilenumbruch!"
23
∀, '\u00A9'
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Achtung!
String Zeichenreihen (-folgen)
in Unicode!
Zeichenfolgen werden im Gegensatz zu
(einzelnen) Zeichen in Gänsefüßchen
dargestellt:
VL 4
University of Paderborn
Software Engineering Group
E. Kindler
„Alle Zeichen der Welt“ sind in Unicode
darstellbar (2 Byte):
University of Paderborn
Software Engineering Group
E. Kindler
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
20
http://www.unicode.org/charts/
„D“ wie
double!
n
ner reelle
an bei ei
Wenn m
dazusagt
r
te
ei
w
ts
Zahl nich er „D“), ist sie ein
od
(d.h. „F“
.
double
VL 4
char Zeichen in sogenanntem Unicode
float ca. –3*1038 bis 3*1038 (4 Byte)
ca. 6 bis 7 Stellen Genauigkeit
„F“ wie float!
Darstellung: 3.578671E+22F
0.0145456E-15F
double ca. –2*10308 bis 2*10308 (8 Byte)
ca. 15 Stellen Genauigkeit
Darstellung: 1.234567897897E+220D
-3.956745656e-12
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
22
University of Paderborn
Software Engineering Group
E. Kindler
'c' ist ein Zeichen!
"c" ist eine Zeichenreihe, die aus genau
einem Zeichen besteht
"\u2200" ist auch eine Zeichenreihe, die aus
genau einem Zeichen besteht ( ∀ )
"\\u2200" besteht dagegen aus 6 (!) Zeichen
(\\ repräsentiert den Backslash)
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
24
4
Achtung!
Wahrheitswerte
University of Paderborn
Software Engineering Group
E. Kindler
University of Paderborn
Software Engineering Group
E. Kindler
boolean
Zeichenreihen sind streng genommen in Java
kein primitiver Datentyp!
Werte: false
und
true
ter
m e n spä
Wir kom
k!
c
rü
u
z
f
darau
Für den Augenblick sehen wir String jedoch
als primitiven Datentyp an
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Wir benutzen
int
double
char
boolean und
String
VL 4
25
4.2 Typisierung
University of Paderborn
Software Engineering Group
E. Kindler
, real
$#nat
#
"
int n;
int sum;
double x;
String name;
boolean ende;
Für die anderen Datentypen gelten die meisten der
folgenden Aussagen analog (mit ein paar für uns
nicht relevanten Abweichungen)
Variablendeklaration
<VarDecl>::=
VL 4
27
26
University of Paderborn
Software Engineering Group
E. Kindler
Strenge
ng !
Typisieru
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Typisierung von Konstanten
University of Paderborn
Software Engineering Group
E. Kindler
<Type> <Identifier> [ "=" <Expression> ]
{ "," <Identifier> [ "=" <Expression> ] }
VL 4
28
University of Paderborn
Software Engineering Group
E. Kindler
Jede Konstante hat einen eindeutigen Typ:
<Identifier>::=
<Letter> { <Letter> | <Digit> }
<Letter>::=
"a" | "b" | "c" | … | "z" |
"A" | "B" | "C" | … | "Z" | "_"
<Digit>::=
"0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<Type>::=
"int" | " long" | "byte" | "short" |
"double" | "float" |
"char" |
"boolean" |
"String" |
…
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
Jede Variable hat einen eindeutig definierten
Typ
Der Typ der Variablen wird bei der
Deklaration der Variablen festgelegt:
!
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
0, -1, 4711, 32768, -1000000
sind vom Typ int (zumindest für uns)
0.1, -1.7359e-34, 0.0
sind vom Typ double
'a', '©'
sind vom Typ char
Strenge
ng !
Typisieru
"Bla bla", "Test\n Test\n"
sind vom Typ String
VL 4
29
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
30
5
Typisierung von Ausdrücken
Signatur von Operatoren
University of Paderborn
Software Engineering Group
E. Kindler
Jeder Ausdruck hat einen eindeutigen Typ:
int n, m;
double x, y;
1 * 2
n + m
x
x / y
x < y
//
//
//
//
//
vom
vom
vom
vom
vom
Type int
Typ int
Typ double
Typ double
Typ boolean
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Typ eines Ausdrucks
VL 4
Math.min: int, int → int
Math.abs: int → int
. + . : int int → int
. < . : int int → boolean
31
<
int h1
int h6
2
int h4
+
n
int h2
+
Geht das?
int h3
n
1
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
r
e weitere
Eine List
n folgt.
re
to
ra
Ope
VL 4
32
University of Paderborn
Software Engineering Group
E. Kindler
Der Operator + ist bereits für die Addition
zweier Zahlen des Datentyps int vergeben!
Wir würden + jedoch auch gerne für die
Addition zweier Zahlen des Datentyps double
benutzen!
<
*
Strenge
ng !
Typisieru
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
4.3 Polymorphimus
boolean h7
*
Polymorphismus
Beispiele:
University of Paderborn
Software Engineering Group
E. Kindler
ergibt sich (induktiv) aus dem Typ
der Konstanten,
der Variablen, und
der Operatoren
int h5
und Funktionen
int n; ...
n * (n + 1) < 2
Für jeden Operator (und jede Funktion) ist
eindeutig festgelegt, welchen Typ die
Operanden und das Ergebnis besitzen!
Strenge
ng !
Typisieru
ist
ist
ist
ist
ist
University of Paderborn
Software Engineering Group
E. Kindler
33
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
. + . : int int → int
University of Paderborn
Software Engineering Group
E. Kindler
h=
polymorp ltig“,
„vielgesta
ig“.
„vielförm
VL 4
34
University of Paderborn
Software Engineering Group
E. Kindler
Es geht:
Da die Typen der Teilausdrücke, auf die +
angewendet wird, bekannt sind, können wir
diese Typen benutzen, um den gemeinten
Operator eindeutig zu identifizieren
Addiert zwei Zahlen vom Typ int und liefert
eine Zahl vom Typ int
Der Operator + kommt in verschiedenen
Formen („Gestalten“) vor:
. + . : int int → int
. + . : double double → double
. + . : String String → String
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
35
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
36
6
. + . : double double → double
. + . : String String → String
University of Paderborn
Software Engineering Group
E. Kindler
University of Paderborn
Software Engineering Group
E. Kindler
Schreibt die beiden Zeichenreihen
hintereinander (Konkatenation)
Addiert zwei Zahlen vom Typ double und
liefert eine Zahl vom Typ double
"abc" + "def" ergibt "abcdef"
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Weitere (implizite) Formen
.
.
.
.
.
.
.
.
+
+
+
+
+
+
+
+
.
.
.
.
.
.
.
.
:
:
:
:
:
:
:
:
VL 4
37
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Weitere Operatoren
University of Paderborn
Software Engineering Group
E. Kindler
int double → double
double int → double
int String → String
String int → String
double String → String
String double → String
String boolean → String
boolean String → String
VL 4
38
University of Paderborn
Software Engineering Group
E. Kindler
Dasselbe gilt für die anderen arithmetischen
Operatoren -, *, /
% (Rest) kommt auf den Gleitpunktzahlen
nicht vor
Auf Zeichenreihen kommen %, -, *
und / nicht vor
"
'
"#
l
do ub e
String
%
&
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Weitere Operatoren
VL 4
39
Beispiele
University of Paderborn
Software Engineering Group
E. Kindler
Über Math stehen eine Reihe weiterer
Operationen zur Verfügung:
"abc" + 1
1 / 2
1 / 2.0
Math.abs(.)
Absolutbetrag der Zahl (im jeweiligen Datentyp)
VL 4
40
University of Paderborn
Software Engineering Group
E. Kindler
ergibt "abc1"
ergibt 0 (ganzzahlige Division)
ergibt 0.5 (Gleitkomma-Division)
"abc" + false
ergibt "abcfalse"
"abc" + (1 + 2) ergibt "abc3"
Math.max(.,.)
Math.min(.,.)
Maximum und Minimum der beiden Zahlen
(im jeweiligen Datentyp)
Math.sqrt(.)
Quadratwurzel der Zahl (double)
bt
Was ergi 3
Fragen:
+ 10 +
"bla"
b
+ " la"
10 + 3
Math.sin(.) Math.cos(.) Math.tan(.)
Math.asin(.) Math.acos(.) Math.atan(.)
Ergebnis der jew. trigonometrischen Operation (double)
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
41
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
42
7
Weitere Operatoren
Weitere Operatoren
University of Paderborn
Software Engineering Group
E. Kindler
Vergleiche (auf Zahlen):
Boolesche Operationen:
== Test auf Gleichheit (binär)
<, <=, >, >= Größenvergleiche (binär)
!= Test auf Ungleichheit (binär)
Das Ergebnis einer solchen Operation ist vom Typ
boolean.
Einen Ausdruck vom Typ boolean nennen wir
einen booleschen Ausdruck.
;
= mit ==
:
niemals
Achtung
t zum
hseln sie
ch
ec
ni
w
e
er
llt
V
•
so
rator ==
n
• Der Ope
henreihe
von Zeic
Vergleich nutzt werden;
be
ls)
)
ua
gs
in
eq
(
(Str
er mehr
dazu spät
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Operatorvorrang
unäre Operatoren
* / %
+ < <= > >=
== !=
&&
||
int n;
n = 0.0;
|
!
n & und
Achtung ch die Operatore
res und
as ande
w
Es gibt au
et
er
also
uten ab
die bede t mit && und ||
ch
sollten ni t werden!!!
el
verwechs
43
VL 4
44
University of Paderborn
Software Engineering Group
E. Kindler
Der Wert der Auswertung eines Ausdrucks
kann nur an eine Variable zugewiesen
werden, die den gleichen Typ hat wie der
Ausdruck:
int n, m;
boolean b;
...
m = n * (n + 1);
b = m < n;
niedrigste Priorität
VL 4
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
Zuweisung
höchste Priorität
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
double x;
x = 0.0;
VL 4
! Negation (unär)
&& Konjunktion „logisches und“ (binär)
|| Disjunktion „logisches oder“ (binär)
University of Paderborn
Software Engineering Group
E. Kindler
Typen müssen passen!!
University of Paderborn
Software Engineering Group
E. Kindler
45
besitzt
perator =
r
eisungso
tärke alle
ss
g
Der Zuw
un
d
gste Bin
die gerin n.
re
Operato
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
46
University of Paderborn
Software Engineering Group
E. Kindler
(#
(
(#
(
läßt sich
rderung
Diese Fo rn!
c ke
etwas lo
lung:
Umwand
e
it
liz
p
Im
;
0
z.B. x =
E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn
VL 4
47
8
Herunterladen