programmierkurs java vorlesung 4 dietrich boles seite 1 programmierkurs java vorlesung am fb...
TRANSCRIPT
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 1
Programmierkurs Java
Vorlesung
am FB Informatik
der Universität Oldenburg
Vorlesung 4
Dietrich Boles
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 2
Gliederung von Vorlesung 4
• Java-Grundlagen
– Java-Programme
– Zeichensätze
– Kommentare
– Token
– Schlüsselwörter
– Bezeichner
• Variablen
– Motivation
– Datentypen
– Initialisierung
• Ausdrücke
– Motivation
– Definition
– Operatoren
• Erweiterung des Hamster-Modells
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 3
Grundlagen / Java-Programme
Erstellen und Ausführen:(1)Eingeben eines Programms
(2)Compilieren (javac) evtl. Syntaxfehler beseitigen!
(3)Ausführen (java)
Beispiel:(1)Datei „World.java“ :
(2)javac World.java
(3)java World
import java.io.*;
public class World { public static void main(String[] args) { try { System.out.println(„Hello world!“); } catch (Exception e) { System.out.println(„Fehler!“);} } }
„to-do“-Code
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 4
Grundlagen / Zeichensätze
• Java zugrundeliegender Zeichensatz: Unicode
• 16-Bit-Zeichensatz (216 Zeichen)
• ersten 256 Zeichen: Latin-1
• ersten 128 Zeichen: ASCII (7-Bit-Zeichensatz)
• Escape-Sequenz \udddd als (Ersatz-)Darstellung von Unicode-Zeichen;
d ist hexadezimale Ziffer (0-9 und a-f)
• gültiger Bezeichner: ab\u4711\u8a9fcd
Bitte nur ASCII-Zeichen verwenden !!!!!!!!!!!!!
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 5
Grundlagen / Kommentare
Zeilenkommentar:
// Kommentar
Bereichskommentar:
/* Kommentar */
import java.io.*;
// gibt „Hello world!“ auspublic class World { public static void main(String[] args) { try { /* Ausgabe- befehl */ System.out.println(„Hello world!“); } catch (Exception e) { System.out.println(„Fehler!“);} } }
Dokumentationskommentar:
/** Kommentar */
Keine Schachtelung möglich!
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 6
Grundlagen / Token
• Token: lexikalische Einheiten– Symbole: <, =, <=, ...– Schlüsselwörter: while, if, ...– Bezeichner: Prozedurnamen, Klassennamen, ...– Literale: true, 23, 24.5f, „hello
world“, ...
• Trennung von Token:– Leerzeichen (Blank)
– Tabulator
– Zeilenende
– Zeilenvorschub
– Seitenvorschub
• „gefräßiger“ Tokenizer: Zusammenfassung möglichst vieler Zeichen
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 7
Grundlagen / Schlüsselwörter
abstractbooleanbreakbytecasecatchcharclassconstcontinuedefaultdo
doubleelseextendsfinalfinallyfloatforgotoifimplementsimportinstanceof
intinterfacelongnativenewnullpackageprivateprotectedpublicreturnshort
staticsuperswitchsynchronizedthisthrowthrowstransienttryvoidvolatilewhile
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 8
Grundlagen / Bezeichner
• Benennung von deklarierten Einheiten und Labeln:– Klassennamen
– Variablennamen
– Prozedurnamen
– ...
• Beginn mit Buchstabe, Unterstrich oder Dollar
• anschließend: Buchstaben, Ziffern, Unterstrich, Dollar, Unicode-Zeichen
• Grundlage: Unicode-Zeichensatz– Katze– Kätzchen– a asasas
Bitte nur ASCII-Zeichen verwenden!
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 9
Variablen und Ausdrücke / Motivation• Motivation:
Der Hamster soll bis zur nächsten Wand laufen, dabei alle Körner einsammeln, die er findet, und an der Wand genauso viele Körner ablegen, wie er eingesammelt hat.
• Notwendige Voraussetzungen:– Gedächtnis ( Speicher)
– Zählen/Rechnen/Vergleichen ( Operationen)
• Programm:*1:„gefundene Anzahl ist 0“;while (vornFrei()) { vor(); while (kornDa()) { nimm(); *2:„erhöhe gefundene Anzahl um 1“; }}while ( *3:„gefundene Anzahl größer als 0 ist“ ) { gib(); *4:„erniedrige gefundene Anzahl um 1“;}
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 10
Variablen / Definition
• Notwendig für *1:– Reservierung von Speicherplatz ( Variablendefinition)– Festlegung eines Namens ( Variablendeklaration)– Festlegung des Typs ( Datentypen)– Initialisierung– hier: int anzahl = 0;
• Variablendeklaration/-definition:– Deklaration: Bekanntgabe eines Namens für den Speicherbereich an den Compiler– Definition: Reservierung von Platz im Hauptspeicher
Programm
Daten
Hauptspeicher
„Gedächtnis“
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 11
Variablen / Definition
<Variablendefinition> ::= <Datentyp> <Bezeichner> [„=“ <Ausdruck>] {„,“ <Bezeichner> [„=“ <Ausdruck>]} „;“
int anzahl = 0;long grosse_zahl = 1234567891234567L;
float pi = 3.1415F;float noch_eine;
char eins = `1`, zwei = `2`, drei = `3`;char neue_zeile = `\n`;
String hello = „hello world!“;
boolean wahr = true;
int = 4711;
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 12
Variablen / Datentypen
• Daten haben unterschiedliche Eigenschaften:– Ganze Zahlen: 2, 4711, -45, ...
– Reelle Zahlen: -3.4, -56.789678, -3.4e-10, 45.567e123, ...
– Buchstaben: `a`, `b`, ...
– Zeichenketten: „hello world!“, ...
– ...
– Unsinn: 3 + „hello“
• Unterschiedliche Daten benötigen unterschiedlich viel Platz– boolesche Werte: 1 Bit
– ASCII-Zeichen: 7 Bit
– ...
• Motivation für Datentypen:– Überprüfung „sinnvoller“ Operationen
– Reservierung von „passendem“ Speicherplatz
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 13
Variablen / Datentypen
Einfache Datentypen in Java:
boolean entweder true oder false
char 16-Bit-Unicode
byte 8-Bit-Integer, vorzeichenbehaftetes 2er-Komplement
short 16-Bit-Integer, vorzeichenbehaftetes 2er-Komplement
int 32-Bit-Integer, vorzeichenbehaftetes 2er-Komplement
long 64-Bit-Integer, vorzeichenbehaftetes 2er-Komplement
float 32-Bit-Gleitkommazahl (IEEE 754-1985)
double 64-Bit-Gleitkommazahl (IEEE 754-1985)
Wertebereiche beschränkt: int: [-231 ... 231-1]
int i = 2147483647;
i = i + 1;
i: -2147483648
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 14
Variablen / Datentypen
boolean false N.A. N.A.
char `\u0000` \u0000 \uFFFF
byte 0 -128 127
short 0 -32768 32767
int 0 -2147483648 2147483647
long 0L -9223372036854775808
9223372036854775807
float 0.0F +-3.40282347E+38
+-1.40239846E-45
double 0.0 +-1.79769313486231570E+308
+-4.94065645841246544E-324
Default KleinsterWert
GrößterWert
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 15
Variablen / Initialisierung
• Initialisierung von Variablen– implizit durch Default-Werte
– explizit mit Hilfe von Literalen bzw. Ausdrücken
– Empfehlung: Variablen immer explizit initialisieren!
• Literale: Typspezifische Konstanten
• boolean:true, false
• int:
Zeichenketten aus – oktalen (führende 0): 035– dezimalen 29– hexadezimalen Ziffern (führendes 0x): 0x1D
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 16
Variablen / Initialisierung
• long:
int-Literal mit nachgestelltem l oder L: 29L 4321l• double:
Dezimalzahlen mit Dezimalpunkt und optionalem Exponent:
18. 1.8e1 .18E-2• float:
double-Literal mit nachgestelltem f oder F:
18.0f 1.8e1F• char:
Zeichen zwischen zwei Apostrophen: `a` `A` `2`
oder Sonderzeichen mit Escape-Sequenz: `\n` `\“` `\\`• Strings:
Zeichen zwischen zwei Anführungszeichen: „hello\n world“
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 17
Ausdrücke / Motivation
• Notwendig für *2 , *3 und *4:– Operationen ( Mathematik)– Operatoren– Operanden
• Sinn und Zweck: Berechnung neuer Werte aus alten Werten
• Beispiel:
int anzahl = 0;
anzahl = anzahl + 1;
Operator
OperandOperand
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 18
Ausdrücke / Definition
<Ausdruck> ::= <Literal> | <Variablenname> | <Funktionsaufruf> | „(“ <Ausdruck> „)“ | <unär-Op> <Ausdruck> | <Ausdruck> <binär-Op> <Ausdruck> | <Ausdruck> <ternär-Op1> <Ausdruck> <ternär-Op2> <Ausdruck>
Ausdruck: – Verarbeitungsvorschrift, deren Ausführung einen Wert eines bestimmten
Typs liefert
– entsteht, indem Operanden mit Operatoren verknüpft werden
– Operanden müssen typkonform sein!
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 19
Ausdrücke / Operatoren / Übersicht
• Integer-Arithmetik (int, short, long): +, -, *, /, %
• Gleitkomma-Arithmetik (float, double): +, -, *, /
• Boolesche Arithmetik (boolean): &&, ||, !
• Vergleichsoperatoren: ==, !=, <, >, <=, >=
• Zuweisungsoperatoren: =, +=, -=, *=, /=, %=
• Inkrement-Operator: ++
• Dekrement-Operator: --
• Bit-Operatoren: <<, >>>, &, |, ~, ^, ...
• Spezielle Operatoren: ?:, (type)
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 20
Ausdrücke / Operatoren / integer-Arithmetik
+: positives Vorzeichen +9876
-: negatives Vorzeichen -2345
+: Addition 12 + 98 (= 110)
-: Subtraktion 12 - 98 (= -86)
*: Multiplikation 6 * 5 (= 30)
/: Ganzzahl-Division 7 / 3 (= 2)
%: Restbildung (modulo) 7 % 3 (= 1)
• Operanden vom Typ int, short oder long• gelieferter Wert vom Typ int, short bzw. long
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 21
Ausdrücke / Operatoren / Gleitkomma-Arithmetik
+: positives Vorzeichen +45.67e3
-: negatives Vorzeichen -3.4e-5
+: Addition 1.2 + 9.8 (= 11.0)
-: Subtraktion 1.2 - 9.8 (= -8.6)
*: Multiplikation 6.1 * 5.0 (= 30.5)
/: Ganzzahl-Division 9.0 / 2.0 (= 4.5)
• Operanden vom Typ float oder double• gelieferter Wert vom Typ float oder double
Rundungsfehler möglich!
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 22
Ausdrücke / Operatoren / boolesche Arithmetik
&&: Konjunktion true && false (= false)
||: Disjunktion true || false (= true)
!: Negation !true (= false)
• Operanden vom Typ boolean• gelieferter Wert vom Typ boolean
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 23
Ausdrücke / Operatoren / Vergleiche
==: Gleichheit 4 == 5 (= false)
!=: Ungleichheit 6 != 7 (= true)
<: Kleiner -2. < 0.1 (= true)
<=: Kleiner-Gleich 3 <= 3 (= true)
>: Größer `a` > `b` (= false)
>=: Größer-Gleich 1 >= -1 (= true)
• Operanden vom Typ int, short , long,float, double oder char• gelieferter Wert vom Typ boolean
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 24
Ausdrücke / Operatoren / Zuweisung
• Operanden von beliebigem Typ• gelieferter Wert vom Typ der Operanden
<Zuweisung> ::= <Variablenname> „=“ <Ausdruck> „;“
int i = 0, j = -34; // Initialisierungi = 45; // Zuweisungi = i + 3;j = i = j + i*3;
• Abkürzungen:
i++ i = i+1;i-- i = i-1;i += <expr> i = i + (<expr>)i -= <expr> i = i - (<expr>)i *= <expr> i = i * (<expr>)i /= <expr> i = i / (<expr>)i %= <expr> i = i % (<expr>)
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 25
Ausdrücke / Operatoren / Bedingungsoperator
• ternärer Operator• erster Operand vom Typ boolean• Operanden zwei und drei typkonform
int i = 45, j = 46;
int k = i<j ? i-1 : j+2;
int k = 0; if (i<j) k = i-1; else k = j+2;
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 26
Ausdrücke / Operatoren / Typumwandlungen
• einige Typumwandlungen implizit:– short int long– float double– arithmetisch Gleitkomma– char int
short s = 3;int i = s;long l = i = s;
float f = 3.4F;double d = f * 2.3;
float g = 3 + i;
int b = `a`;´z` - `a`
ASCII-Repräsentation
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 27
Ausdrücke / Operatoren / Typumwandlungen
• Explizite Typumwandlung (Typcast):
<Cast> ::= „(“ <Typ> „)“
double d = 7.99;
int i = (int) d; // i == 7
int zahl = 33000;
short s = (short)zahl; // Abschneiden der oberen Bits
// s == -32536
• Nicht alle Typumwandlungen sind erlaubt:
int wahr = (int)true; // Fehler!!!
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 28
Ausdrücke / Operatoren / Präzedenz
• Postfix-Operatoren [], ., ++, --
• unäre Operatoren +, -, ~, !
• Erzeugung / Typumwandlung new, (type)
• Multiplikationsoperatoren *, /, %
• Additionsoperatoren +, -
• Gleichheitsoperatoren ==, !=
• logische Und &&
• logisches Oder ||
• Bedingungsoperator ?:
• Zuweisungsoperatoren =, +=, *=, ...
Abänderung der Präzedenz durch Klammernsetzung möglich!
Liste mit absteigender Präzedenz:
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 29
Ausdrücke / Operatoren / Assoziativität
• wichtig bei Operatoren gleicher Präzedenz
• alle unären Operatoren sind rechts-assoziativ
• alle binären Operatoren außer den Zuweisungsoperatoren sind links-assoziativ
• Zuweisungsoperatoren sind rechts-assoziativ
• der ternäre Bedingungsoperator (?:) ist rechts-assoziativ
• Assoziativität ist von Bedeutung bei Funktionen mit Seiteneffekten!
i = j *= k + 78; i = (j *= (k + 78));
i = j * k / 5; i = (j * k) / 5;
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 30
Ausdrücke / Operatoren / Auswertungsreihenfolge
• Operanden werden immer von links nach rechts ausgewertet werden
• wichtig bei Seiteneffekten!
• jeder Operand wird vor der Ausführung des Operators ausgewertet;
Ausnahmen: &&, || und ?:
p && q p ? q : false
p || q p ? true : q
o1 ? o2 : o3 werte o1 aus; falls true, werte o2 ansonsten o3 aus
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 31
Variablen und Ausdrücke / Zusammenfassung
• Motivation:Der Hamster soll bis zur nächsten Wand laufen, dabei alle Körner einsammeln, die er findet, und an der Wand genauso viele Körner ablegen, wie er eingesammelt hat.
• Programm:
int anzahl = 0;while (vornFrei()) { vor(); while (kornDa()) { nimm(); anzahl = anzahl + 1; }}while ( anzahl > 0 ) { gib(); anzahl = anzahl -1;}
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 32
Beispiele / Fakultät
import java.io.*;
public class Fakultaet {
public static void main (String[] args) { int fak = 1; int n = 7; int zaehler = 1; while (zaehler <= n) { fak = fak * zaehler; zaehler = zaehler + 1; } System.out.println(fak); }}
fak:n:
zaehler:
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 33
Variablen und Ausdrücke / Beispiel
import java.io.*;
public class Fibonacci {
public static void main (String[] args) { int lo = 1; int hi = 1; System.out.println(lo); while (hi < 20) { System.out.println(hi); hi = lo + hi; // neues hi lo = hi - lo; // neues lo (= altes hi) } }}
lo:hi:
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 34
Erweiterung des Hamster-Modells
• Variablendefinition (int anzahl = 0;)– neue Anweisung (lokale Variable)
– neue Definition (globale Variable)
• Zuweisung(en) (anzahl = 3;)• arithmetische Ausdrücke (anzahl = anzahl + 1;)• Erweiterung der booleschen Ausdrücke (anzahl > 0)
• Achtung:– Der Gültigkeitsbereich einer Variablen beschränkt sich auf den Block, in dem die
Variable definiert wurde!
– Im Falle einer Variablendefinition als Anweisung beginnt der Gültigkeitsbereich ab der Stelle der Definition!
– In dem Gültigkeitsbereich einer Variablen darf keine Variable gleichen Namens definiert werden!
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 35
Erweiterung des Hamster-Modells
• Aufgabe:Der Hamster soll bis zur nächsten Wand laufen, dabei alle Körner einsammeln, die er findet, und an der Wand genauso viele Körner ablegen, wie er eingesammelt hat.
• Korrektes Programm mit globaler Variable anzahl:
int anzahl = 0;
void main() { sammle(); while (vornFrei()) { vor(); sammle(); } legeAb();}
void sammle() { while (kornDa()) { nimm(); anzahl = anzahl + 1; }}
void legeAb() { while (anzahl > 0) { gib(); anzahl = anzahl - 1; }}
Programmierkurs Java Vorlesung 4 Dietrich Boles Seite 36
Erweiterung des Hamster-Modells
• Aufgabe:Der Hamster soll bis zur nächsten Wand laufen, dabei alle Körner einsammeln, die er findet, und an der Wand genauso viele Körner ablegen, wie er eingesammelt hat.
• Fehlerhaftes Programm mit zwei lokalen Variablen anzahl:
void main() { sammle(); while (vornFrei()) { vor(); sammle(); } legeAb();}
void sammle() { int anzahl = 0; while (kornDa()) { nimm(); anzahl = anzahl + 1;} }
void legeAb() { int anzahl; while (anzahl > 0) { gib(); anzahl = anzahl - 1;} }