2.3 Weitere Beispiele (von Variablen)
Zwei Arten von Variablen
§ Primitive Variables
§ Speichern Wert eines Basistyps
§ Basistyp: fixe Grösse, Ober- und Unter-Grenze
§ verwenden Operatoren +, /, *, - (und ein paar mehr …)
§ Reference Variables
§ Speichern Verweis auf Objekt
§ Objekt: (oft) variable Grösse
§ Operationen mit Methoden (z.B. s.toUpperCase() // s ein String)
Zwei Arten von Variablen
§ Bisher kennen wir nur
§ Primitive Variables für ganze Zahlen: int int k;
int m = 1234;
int n = m + 1;
§ Reference Variables für String Objekte:
String s = "hello";
String t = s.repeat(3);
§ Es gibt noch einige mehr … aber auch mit diesen zwei gibt es
viele interessante Beispiele 3
Opertoren für int
§ Die bekannten Operatoren
§ + : Addition
§ - : Subtraktion
§ * : Multiplication
§ / : Division
§ % : Rest
§ Die üblichen Regeln (Punkt vor Strich etc)
§ int Division a/b (a,b: int) ergibt int Quotient, nach 0 gerundet
int Division mit /
§ Wenn wir ganze Zahlen dividieren ist der Quotient auch wieder eine ganze Zahl.
§ 14 / 4 ergibt 3, nicht 3.5
3 4 52
4 ) 14 10 ) 45 27 ) 1425
12 40 135
2 5 75 54 21
int Division mit /
§ Weitere Beispiele:
§ 32 / 5 ergibt 6
§ 84 / 10 ergibt 8
§ 156 / 100 ergibt 1
§ -4 / 3 ergibt -1
§ -101 / 9 ergibt -11
§ Division durch 0 führt zu einem Fehler während der Ausführung des Programmes
int Rest mit %
§ Der % Operator liefert den Rest der Division ganzer Zahlen
§ 14 % 4 ergibt 2
§ 218 % 5 ergibt 3
3 43
4 ) 14 5 ) 218
12 20
2 18 15 3
int Rest mit %
§ Einsatz des % Operators:
§ Finde letzte Ziffer einer ganzen Zahl : 230857 % 10 ist 7
§ Finde letzte 4 Ziffern: 658236489 % 10000 ist 6489
§ Entscheide ob Zahl gerade ist: 7 % 2 ergibt 1 42 % 2 ergibt 0
Was ist das Ergebnis von
1. 10 / 4
2. 45 % 6
3. -23 / 11
4. 11 % 0
5. 2 % 2
6. 43 / 3
7. 8 % 20
Was ist das Ergebnis von
1. 10 / 4 2
2. 45 % 6 3
3. -23 / 11 -2
4. 11 % 0
5. 2 % 2 0
6. 43 / 3 14
7. 8 % 20 8
String Beispiel
§ Schreiben Sie ein Programm das das Zeichen in der Mitte eines Strings findet (und einen String mit diesem erstellt)
§ Annahme: String hat ungerade Länge > 2 (Länge + 1)
m = 2
"Eisenbahn"
Länge: 90 1 2 3 4 5 6 7 8
Position fängt mit «0» an
Gesucht:
substring(m-1,m)
Noch ein Beispiel
§ Schreiben Sie ein Programm das die 3 Zeichen in der Mitte eines Strings findet (und einen String mit diesen erstellt)
§ Annahme: String hat ungerade Länge > 2
§ Für "Eisenbahn" wollen wir "enb"
"Eisenbahn"
Länge: 90 1 2 3 4 5 6 7 8
Variation des Beispiels
§ Schreiben Sie ein Programm das die 3 Zeichen in der Mitte eines Strings findet (und einen String mit diesen erstellt)
§ Annahme: String hat ungerade Länge > 2
§ Für "Autobahn" wollen wir "tob"
§ "oba" wäre auch eine vernüftige Lösung …
"Autobahn"
Länge: 80 1 2 3 4 5 6 7
Arbeiten mit Werten
§ Primitive Variable (speichert Wert eines Basistyps):
Operatoren +, /, *, - (und ein paar mehr …)
§ Reference Variables (Verweis auf Objekt):
Operationen mit Methoden
mit einer Ausnahme: + Operator für String Objekte
String Operationen
§ String Konkatenierung («concatenation»):
§ concat(String) Operation
§ Aber Strings sind häufig … wer will das schreiben:
§ Java erlaubt eine Kurzform: + Operator
"hello " + ”world" ergibt "hello world"
"a" + "b" + "c" ergibt "abc"
?
String Operationen
§ Java Regel: Jeder Wert eines Basistyps kann ausgegeben werden (auch jedes Objekt)
§ Ausgeben: es gibt eine Standard Darstellung als String (kann dann z.B.
gedruckt oder auf dem Display gezeigt werden)
§ Ob diese default Darstellung (Deutsch: voreingestellte D. ,
standardmässig eingestellte D.) sinnvoll/verständlich ist – andere Frage
§ Trotzdem sehr praktisch
§ Der Operator + mit einem String verwendet default Darstellung
Darstellung als String
§ Für Basistypen ist die default Darstellung die erwartete Darstellung
§ Für int Variable und Konstanten
§ int Konstante 42 Default Ausgabe: "42"
§ int j = 99 Default Ausgabe für j : "99"
§ Für Strings ist die default Darstellung der String (wie von der JShell gezeigt)
String Operationen
§ Der Operator + mit einem String und einem anderen Wert als Operanden ergibt einen längeren String
§ Der Operator + mit einem String verwendet die default Darstellung beider Operanden um den neuen String zu konstruieren
§ "abc" + 2
§ Default Darstellung für "abc": "abc"
§ Default Darstellung für 2: "2"
Darstellung als String
§ String + anderer Wert als Operand: verknüpfe String mit default Ausgabe zu neuem String
"hello" + 42 ergibt "hello42"
"hello" + j ergibt "hello99" // j ist 99
§ Für Ausdrücke («Expressions») mit Strings gelten die üblichen Regeln
Die üblichen Regeln …
§ Von links nach rechts abarbeiten
§ 12 – 3 + 5 ergibt 1124 (nicht 4)
§ Punkt vor Strich
§ 12 + 2 * 3 ergibt 18
§ Genauso mit Strings …
§ 2 + 3 + " Hello" ergibt "5 Hello"
§ "Hello " + 2 + 3 ergibt "Hello 23"
§ "Hello " + 2 * 3 ergibt "Hello 6"
Die üblichen Regeln …
§ Von links nach rechts abarbeiten
§ 12 – 3 + 5 ergibt 14 (nicht 4)
§ Punkt vor Strich
§ 12 + 2 * 3 ergibt 18
§ Genauso mit Strings …
§ 2 + 3 + " Hello" ergibt "5 Hello"
§ "Hello " + 2 + 3 ergibt "Hello 23"
§ "Hello " + 2 * 3 ergibt "Hello 6"
Die üblichen Regeln …
§ Von links nach rechts abarbeiten
§ 12 – 3 + 5 ergibt 14 (nicht 4)
§ Punkt vor Strich
§ 12 + 2 * 3 ergibt 18
§ Genauso mit Strings …
§ 2 + 3 + " Hello" ergibt "5 Hello"
§ "Hello " + 2 + 3 ergibt "Hello 23"
§ "Hello " + 2 * 3 ergibt "Hello 6"
String Operationen Quiz
1 + 2 + "abc"
"abc" + 9 * 3
"1" + 1
4 - 1 + "abc"
Review
Zuweisung (Programm) und Algebra (Mathematik)
§ Zuweisung verwendet = , aber eine Zuweisung ist keine algebraische Gleichung!
= ist ein Operator: Zuweisungsoperator
= bedeutet: ”speichere Wert in der Variable"
Die rechte Seite des Ausdrucks wird zuerst ausgewertet,
dann wird das Ergebnis in der Variable auf der linken Seite gespeichert
§ Was passiert hier?
int x = 3;
x = x + 2; // ???
x 3
x 5
Was passiert hier ?
Sehen Sie sich diese Anweisungen an. Welchen Wert hat x am Ende?
int x;
int y;
x = 1; // (S1) y = 2; // (S2) x = y; // (S3) y = 3; // (S4)
x hat den Wert ???
Poll
Vorkurs zur
Einführung in die Programmierung
3.0 Schritte und ihre Reihenfolge(n)
Thomas R. Gross
Department Informatik ETH Zürich
Übersicht
3.1 Einleitung
3.2 Bedingte Ausführung 3.3 Boolsche Ausdrücke 3.4 Boolsche Variable 3.5 Sichtbarkeit
3.6 Bemerkungen
3.1 Einleitung
Zurück zum String Beispiel
§ Schreiben Sie ein Programm das das Zeichen in der Mitte eines Strings findet (und einen String mit diesem erstellt)
§ Lösung korrekt nur unter Annahme dass String > 2 Zeichen enthält
§ Also 3, 4, 5, …
§ Zwei Fragen
§ Wer prüft die Annahme?
§ Gibt es eine (vernünftige) Lösung wenn die Annahme nicht erfüllt ist?
Variation String Beispiel
§ Schreiben Sie ein Programm das das Zeichen in der Mitte eines Strings findet (und einen String mit diesem erstellt)
§ Annahme: String hat ungerade Länge > 2 (Länge + 1)
m = 2
"Eisenbahn"
Länge: 90 1 2 3 4 5 6 7 8
Strings fangen mit «0» an
Gesucht:
Variation String Beispiel
§ Gegeben ein String str.
§ Schreiben Sie ein Programm das das Zeichen in der Mitte des Strings str findet und einen String res erstellt, der aus
diesem Zeichen besteht.
§ Wir geben Ausgangs- und Ergebnis-String einen Namen
§ Weiterhin Annahme str.length() > 2
Programm
String str;
String res;
int sl = (str.length() + 1) / 2 res = str.substring(sl-1, sl)
Programm
String str;
String res;
int sl = (str.length() + 1) / 2 res = str.substring(sl-1, sl)
JShell Ausführung
JShell Komfort
§ /list liefert Liste der Eingabe (Anweisungen, Ausdrücke, Deklarationen)
§ Können diese wiederverwenden: /<number>
Welche Annahmen sind nötig?
§ sl = (str.length() + 1) / 2
§ Länge für jeden String definiert, auch für leeren String ""
§ str.substring(sl-1, sl)
§ Nur wenn der String str Zeichen enthält gibt es Teilstring
Länge (Länge+1)/2 Teilstring Beispiel
3 2 1 .. 2 "abc"
Welche Annahmen sind nötig?
§ sl = (str.length() + 1) / 2
§ Länge für jeden String definiert, auch für leeren String ""
§ str.substring(sl-1, sl)
§ Nur wenn der String str Zeichen enthält gibt es Teilstring
Länge (Länge+1)/2 Teilstring Beispiel
3 2 1 .. 2 "abc"
2 1 0 .. 1 "ab"
Welche Annahmen sind nötig?
§ sl = (str.length() + 1) / 2
§ Länge für jeden String definiert, auch für leeren String ""
§ str.substring(sl-1, sl)
§ Nur wenn der String str Zeichen enthält gibt es Teilstring
Länge (Länge+1)/2 Teilstring Beispiel
3 2 1 .. 2 "abc"
2 1 0 .. 1 "ab"
1 1 0 .. 1 "a"
Unser Beispiel
§ Und für den leeren String ""?
Welche Annahmen sind nötig?
§ sl = (str.length() + 1) / 2
§ Länge für jeden String definiert, auch für leeren String ""
§ str.substring(sl-1, sl)
§ Nur wenn der String str Zeichen enthält gibt es Teilstring
Länge (Länge+1)/2 Teilstring Beispiel
3 2 1 .. 2 "abc"
2 1 0 .. 1 "ab"
1 1 0 .. 1 "a"
0 0 -1 .. 0 ""
Unser Beispiel
§ Und für den leeren String ""?
§ Was ist eine vernünftige Lösung für den leeren String?
§ Hängt von den Umständen ab
§ Fehlermeldung
§ z.B., String res soll als Filename verwendet werden
§ Noch einmal fragen …
§ Programmabbruch wenn Fehler nicht behoben
§ Leerer String
§ Andere Lösungen auch sinnvoll
§ Was ist eine vernünftige Lösung für den leeren String?
§ Hängt von den Umständen ab
§ Fehlermeldung
§ z.B., String res soll als Filename verwendet werden
§ Noch einmal fragen …
§ Programmabbruch wenn Fehler nicht behoben
§ Leerer String
§ Andere Lösungen auch sinnvoll
§ Fragen Sie nach, lesen Sie Aufgabenbeschreibung
Variation String Beispiel
§ Gegeben ein String str.
§ Schreiben Sie ein Programm das das Zeichen in der Mitte des Strings str findet und einen String res erstellt, der aus
diesem Zeichen besteht.
§ Wenn str der leere String ist so soll auch res der leere String sein.
§ Erfreulicherweise ist unser Programm fast fertig
Entscheidungen à Bedingte Ausführung
§ Wollen unterschiedliche Anweisungen ausführen, abhängig vom Zustand unseres Programmes oder vom Input
§ if – then – else Konstrukt in Java erlaubt selektive Ausführung von Anweisungen
§ Verschiedene Varianten
§ Auch in vielen anderen Programmiersprachen
3.2 Bedingte Ausführung
Java: bedingte Ausführung
§ Die if—Anweisung (if—statement) führt eine Folge von
Anweisungen nur dann aus, wenn eine Bedingung erfüllt ist if (test) {
Folge-von-Anweisungen }
// folgende Anweisung
§ test: bestimmt die Bedingung
§ Folge-von-Anweisungen: kann leer oder eine Anweisung sein
§ Heisst auch «then-Block»
Anweisungen
§ Anweisungen («Statements») können sich über mehrere Zeilen erstrecken
§ Der Compiler1 muss wissen, wo ein Statement aufhört
§ 1 und auch die JShell
§ In Java endet jede Anweisung mit ;
JShell Komfort
§ In Java endet jede Anweisung mit ;
§ Die JShell ist tolerant
§ ; nur notwendig wenn zwingend erforderlich
§ Manchmal ist die JShell nicht konsequent
§ Siehe letztes Beispiel
§ Vorschlag: ab jetzt ; verwenden um Ende einer
Java: bedingte Ausführung
§ Die if—Anweisung (if—statement) führt eine Folge von
Anweisungen nur dann aus, wenn eine Bedingung erfüllt ist if (test) {
Folge-von-Anweisungen }
// naechste Anweisung
§ Beispiel
§ int j = 5;
§ if (j > 4) {
§ j = 0;
§ } 58
Anweisung(en) ausführen Ist test wahr?
Nächste Anweisung ausführen
ja nein
Programm für String Beispiel
§ Wollen sicher sein dass res der leere String ist, falls str der leere String ist (dann hat str.length() den Wert 0 ergeben)
§ Je nach Setup erscheinen multi-Zeilen Eingaben so:
Diskussion
§ Wenn wir dieses Programm für einen anderen String
ausführen wollen, dann müssen wir auch /32 ausführen (denn str könnte der leere String sein)
§ Ist das gut oder schlecht??
Diskussion
§ In beiden Fällen liefert das Programm das gewünschte Ergebnis!
§ // heisst: der Rest der Zeile ist ein Kommentar
Diskussion
§ Wenn wir dieses Programm für einen anderen String
ausführen wollen, dann müssen wir auch /32 ausführen (denn str könnte der leere String sein)
§ Ist das gut oder schlecht??
§ Gut: sollten eh jede Variable initialisieren
§ Schlecht: Unnötige Arbeit falls str nicht der leere String ist
Java: bedingte Ausführung
§ Andere Idee: entweder-oder
§ Entweder res wird auf das Zeichen in der Mitte gesetzt
§ "Autobahn" à "o"
§ Oder res wird auf den leeren String gesetzt (falls str der leere String ist)
§ "" à ""
§ Häufiges Muster: if-else—Anweisung (if-else—statement)
Java: bedingte Ausführung
§ Die if-else—Anweisung führt eine Folge A von Anweisungen aus wenn eine Bedingung erfüllt ist, sonst eine Folge B
if (test) {
Folge-A-von-Anweisungen } else {
Folge-B-von-Anweisungen }
// naechste Anweisung
"if" Anweisung(en) ausführen: Folge A Ist test wahr?
Nächste Anweisung ausführen nein ja
"else" Anweisung(en) ausführen: Folge B
Java: bedingte Ausführung
§ Die if-else—Anweisung führt eine Folge A von Anweisungen aus wenn eine Bedingung erfüllt ist, sonst eine Folge B
if (test) {
Folge-A-von-Anweisungen } else {
Folge-B-von-Anweisungen }
// naechste Anweisung
§ test: bestimmt die Bedingung
§ Folge-A/Folge-B: kann leer oder eine Anweisung sein
§ Leer ist schlechter Stil, später dazu mehr
§ { und } begrenzen den then-Block (if-Block) und else-Block 66
3.3 Boolesche Ausdrücke
§ Was für Tests können wir in einem if-Statement (oder if-else—
Statement) verwenden?
§ Fall 1: Variable und Werte eines Basistyps
§ Bisher kennen wir nur int
§ Was wir vorstellen gilt für alle Basistypen
§ Fall 2: Referenzvariable
Boolesche Ausdrücke
§ if—Anweisungen und if-else—Anweisungen verwenden beide boolesche Ausdrücke
if (i > 0) { ... }
if (i > 10) { ... } else { ... }
§ Oft Vergleiche oder Kombinationen von Vergleichen
§ Diese Ausdrücke werden ausgewertet --- Ergebnis entweder «true»
oder «false»
§ true und false sind Konstanten (für Wahrheitswerte)
Ausdrücke verwenden Vergleichsoperatoren
Vergleichsoperatoren
§ Der boolesche Ausdruck steht (für if-Statement) in Klammern
Operator Bedeutung Beispiel Wert
== gleich 1 + 1 == 2 true
!= ungleich 3 != 2 true
< weniger als 10 < 5 false
> grösser als 10 > 5 true
<= weniger als oder gleich 126 <= 100 false
>= grösser als oder gleich 5 >= 5 true
Boolesche Ausdrücke
§ Aussagen: boolescher Ausdruck
§ Aussagen können mit && (UND) oder || (ODER) kombiniert werden
2 <= x && x <= 10 (Annahme: x ist 15) True && False
False
§ Verwenden Sie Klammern um Klarheit zu schaffen (2 <= x) && (x <= 10)
Boolesche Operatoren
§ Ausdrücke mit Vergleichsoperatoren können durch boolesche Operatoren verknüpft werden
§ ”Wahrheitstabelle" für diese Operatoren, für Aussagen p und q:
Operator Bedeutung Beispiel Wert
&& and (2 == 3) && (-1 < 5) false
|| or (2 == 3) || (-1 < 5) true
! not !(2 == 3) true
p q p && q p || q
true true true true
true false false true
false true false true
p !p
true false false true
Beispiel
§ Welcher boolesche Ausdruck ergibt true 0)
Boolesche Ausdrücke
§ Was ist das Ergebnis für die folgenden Ausdrücke?
int x = 42;
int y = 17;
int z = 25;
1. y < x && y <= z
2. x % 2 == y % 2 || x % 2 == z % 2 3. x <= y + z && x >= y + z
4. !(x < y && x < z)
5. (x + y) % 2 == 0 || !((z - y) % 2 == 0)
Poll
§ Was ist das Ergebnis für die folgenden Ausdrücke?
int x = 42;
int y = 17;
int z = 25;
1. y < x && y <= z
2. x % 2 == y % 2 || x % 2 == z % 2 3. x <= y + z && x >= y + z
4. !(x < y && x < z)
5. (x + y) % 2 == 0 || !((z - y) % 2 == 0)
Boolesche Ausdrücke
= und == in Java
§ = ist der Zuweisungsoperator (assignment operator)
int k = 4; // k hat nach diesem Statement den Wert 4
§ Ergebnis ist der Wert 4 -- kein Wahrheitswert
§ Fehlermeldung eventuell verwirrend
= und == in Java
§ = ist der Zuweisungsoperator (assignment operator)
int k = 4; // k hat nach diesem Statement den Wert 4
§ Ergebnis ist der Wert 4 -- kein Wahrheitswert
§ == ist der Vergleichsoperator (auf Gleichheit)
§ Kann in if-Statement verwendet werden
3.4 Boolesche Variable
§ Das Ergebnis eines booleschen Ausdrucks kann gespeichert werden
§ Basistyp boolean
§ Nur die Werte true und false
§ Nur == und != als Vergleichsoperatoren
§ Vergleich (>, <, >=, <=) nicht sinnvoll
Operator Bedeutung Beispiel Wert
== gleich true == false false
!= ungleich true != false true
Typ boolean
§ Deklaration wie gehabt
§ boolean quadrant1;
§ boolean quadrant1 = true;
deklarieren boolesche Variable
§ Boolesche Variable und Ausdrücke können mit den booleschen Operatoren kombiniert werden
Typ boolean Beispiele
boolean isJugendlicher = (alter < 18);
boolean wohntInZuerich = (plz >= 8000) && (plz < 8100);
boolean studiertETH = true;
// Zutritt nur fuer volljaehrige/n ETH Student/in // aus Zuerich – dann:
if (isJugendlicher || !wohntInZuerich || !studiertETH) { System.out.println("Kein Zutritt!");
}
Gebrauch von boolean
§ Kann Ergebnis eines komplizierten Ausdrucks speichern und später wiederverwenden
§ Vorausgesetzt die Komponenten des Ausdrucks ändern sich nicht …
§ Macht Programm lesbarer
3.5 Sichtbarkeit
§ if—Statement hat 1 oder 2 Blöcke
§ if-Block (auch then-Block genannt)
§ else-Block (manchmal)
§ Welche Variablen können wir in den Blöcken verwenden?
§ Frage der Sichtbarkeit
§ Folgefrage: wo können wir Variablennamen neu verwenden
3.5.1 Welche Variable ist sichtbar?
§ Was gilt für den then—Block?
§ else—Block genauso
if (test) {
// then-Block }
// naechste Anweisung
§ Sichtbar: kann gelesen oder modifiziert werden
✓
✘
✘
§ Deklariert im Top Level: überall sichtbar
✓
✘
§ … aber Variable muss deklariert sein
§ Ob Statement je ausgeführt wird spielt keine Rolle
§ "Statischer Check" – ohne Berücksichtigung möglicher Ausführungen
JShell Komfort
§ Eine Variable, die im Top Level der JShell deklariert wurde, ist sichtbar bis zum Exit aus der JShell
§ Top Level: JShell Prompt
§ (Oder bis wir ein Reset machen: mit /reset )
§ Im Top Level der JShell dürfen wir Variable beliebig neu deklarieren
JShell Komfort
§ Im Top Level der JShell dürfen wir Variable beliebig neu deklarieren
88
Nicht empfohlen!
Aber bequem wenn wir ein Beispiel ausprobieren
Variable in einem Block
§ Können in einem Block Variable deklarieren
§ Variation des «Finde-mittleres-Zeichen» Programms
Variable in einem Block
§ Können in einem Block Variable deklarieren
§ Variation des «Finde-mittleres-Zeichen» Programms:
Variable in einem Block
§ Können in einem Block Variable deklarieren
§ Variation des «Finde-mittleres-Zeichen» Programms:
if (str.length() > 0) {
int sl = (str.length()+1)/2;
res = str.substring(sl-1, sl);
} else { // str muss leerer String sein res = str;
} § sl existiert nur wenn if-Block ausgeführt wird
Variable in einem Block
§ Können in einem Block Variable deklarieren
§ Sichtbar in diesem Block bis zum Ende des Blocks
§ Beispiel: sl im letzten Programm
§ Nur im Block sichtbar, nach der Deklaration
§ Sichtbarkeit und Existenz sind zwei verschiedene Aspekte:
§ sl existiert nur wenn if-Block ausgeführt wird (dynamische Eigenschaft der Variable)
§ sl ist sichtbar im Programm (egal ob später ausgeführt)
Variable in einem Block
§ Können in einem Block Variable deklarieren
§ Ausserhalb des Blocks ist die Variable nicht sichtbar
§ Es gibt eine Fehlermeldung wenn wir es dennoch versuchen
§ … und die Variable existiert auch nicht