252-0027
Einführung in die Programmierung 2.2 Typen und Variable
Thomas R. Gross
Department Informatik ETH Zürich
Uebersicht
§ 2.2 Typen und Variable
§ Deklaration von Variablen
§ 2.3 Schleifen (Loops)
§ 2.3.1 “for” Loops
§ 2.3.2 Verschachtelte Schleifen
§ 2.4 “if”-Anweisungen
§ 2.5 Nochmals Schleifen
§ “while” Loops
§ 2.6 Input
2
Variable
public class Lohn{
public static void main(String[] args) {
// Calculate net wages based on weekly hours worke; deduct AHV 4.2%, IV 0.7%, ALV 1.0%
System.out.println("Hours worked:");
System.out.println(38 + 40 + 30 + 10);
System.out.println("AHV:");
System.out.println(30*(38 + 40 + 30 + 10) * .042);
System.out.println("IV:");
System.out.println(30*(38 + 40 + 30 + 10) * .007);
System.out.println("ALV:");
System.out.println(30*(38 + 40 + 30 + 10) * .01);
System.out.println("Lohn:");
System.out.println(30*(38 + 40 + 30 + 10) – ((30*(38 + 40 + 30 + 10) * .042 +
(30*(38 + 40 + 30 + 10) * .007 + (30*(38 + 40 + 30 + 10) * .01) );
} }
§ Der Ausdruck (Anzahl Stunden) (38 + 40 + 30 + 10) wird wiederholt
§ Abzüge werden mehrfach berechnet
§ So viele println Anweisungen
8
Variable
§ Variable (“variable”): Name der es erlaubt, auf einen gespeicherten Wert zuzugreifen
Variable
§ Variable (“variable”): Name der es erlaubt, auf einen gespeicherten Wert zuzugreifen
§ Wert muss (irgendwo) vom Programm gespeichert werden
§ In Speicherzelle(n) im Computer
§ Aehnlich Schnellwahl (Telefon)
Variable
§ Variable (“variable”): Name der es erlaubt, auf einen gespeicherten Wert zuzugreifen
§ Wert muss (irgendwo) vom Programm gespeichert werden
§ In Speicherzelle(n) im Computer
§ Aehnlich Schnellwahl (Telefon)
Variable
§ Wie man diese Wahlknöpfe benutzt:
§ Konfiguration
§ Einsatz
§ Aehnlicher Ablauf für Variablen in einem Programm
§ Deklaration - gibt Namen und Typ an
§ Initialisierung - speichert einen Wert in der Variablen
§ Gebrauch - in einem Ausdruck oder println Anweisung
Deklaration
Deklaration einer Variablen: Reserviert Speicher für Werte
§ Variable müssen deklariert sein bevor sie verwendet werden können.
§ Syntax:
type name;
name ist ein Bezeichner (“identifier”) type ist der Typ
§ int x;
§ double myGPA; x
myGPA
Deklaration
Variable müssen deklariert sein bevor sie verwendet werden können.
type name;
EBNF Description variabledeclaration
typeidentifier ⟸ bezeichner variableidentifier ⟸ bezeichner
variabledeclaration ⟸ typeidentifier variableidentifier { , variableidentifier } ;
Zuweisungen (“Assignment”)
§ Zuweisung: Eine Anweisung die einen Wert in einer Variable speichert.
§ Der Wert kann ein Ausdruck sein, die Zuweisung speichert das Ergebnis
§ Syntax:
name = expression;
§ int x;
x = 3;
§ double myGPA;
myGPA = 1.0 + 2.25; x 3
myGPA 3.25
Assignment
§ Java verwendet = um eine Zuweisung auszudrücken
§ "Assignment operator"
name = expression;
EBNF Description assignment
variableidentifier ⟸ bezeichner
assignment ⟸ variableidentifier = expression ;
Die EBNF Beschreibung für expression kommt später.
19
String Operationen
§ String Verkettung (“concatenation”): Der Operator + erlaubt es, zwei Strings zu verketten (verknüpfen)
"hello" + ”world" ergibt "helloworld"
"a" + "b" + "c" ergibt "abc"
§ Der Operator + mit einem String und einem anderen Wert als Operanden ergibt einen längeren String.
"hello" + 42 ergibt "hello42"
1 + "abc" + 2 ergibt "1abc2"
"abc" + 1 + 2 ergibt "abc12”
22
String Operationen
§ Können + verwenden um einen String und den Wert eines Ausdrucks auszugeben.
§ System.out.println("Note: " + (4.8 + 5.4) / 2);
• Output: Note: 5.1
• Warum brauchen wir ( und )?
Gebrauch von Variablen
§ Nachdem eine Variable einen Wert erhalten hat, kann die Variable in Ausdrücken verwendet werden:
int x;
x = 3;
System.out.println("x is " + x); // x is 3 System.out.println(5 * x - 1); // 5 * 3 - 1
§ Wiederholte Zuweisungen sind erlaubt:
int x;
x = 3;
System.out.println(x + " here"); // 3 here x = 4 + 7;
System.out.println("now x is " + x); // now x is 11
x 3
x 11
Deklaration/Initialisierung
§ Deklaration und Initialisierung können in einer Anweisung gemacht werden.
§ Syntax:
type name = value;
§ double myGPA = 3.95;
§ int x = (11 % 3) + 12;
x 14
myGPA 3.95
Deklaration mit Initialisierung
EBNF Description variabledeclaration
typeidentifier ⟸ bezeichner variableidentifier ⟸ bezeichner
variablelist ⟸ variableidentifier { , variableidentifier } variableinitialization ⟸ variableidentifier = expression variablespecification ⟸ variableinitialization | variablelist variabledeclaration ⟸ typeidentifier variablespecification ;
Zuweisung (Programm) und Algebra (Mathematik)
§ Zuweisung verwendet = , aber eine Zuweisung ist keine algebraische Gleichung!
= bedeutet: ”speichere den Wert der RHS in der Variable der LHS "
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; // ??? xx 35
30
31
32
34
Compiler Fehler Meldungen
§ Eine Variable kann erst nach einer Zuweisung verwendet werden.
§ int x;
System.out.println(x); // ERROR: x has no value
§ Keine Doppeltdeklarationen.
§ int x;
int x; // ERROR: x already exists
§ int x = 3;
int x = 5; // ERROR: x already exists
Drucken des Wertes einer Variablen
Operator + zum Drucken eines String und des Wertes einer Variable in einer Zeile.
double punkte = (95.1 + 71.9 + 82.6) / 3.0;
System.out.println("Im Schnitt " + punkte + "Punkte");
int students = 11 + 17 + 4 + 19 + 14;
System.out.println("There are " + students +
" students in the course.");
Drucken des Wertes einer Variablen
Operator + zum Drucken eines String und des Wertes einer Variable in einer Zeile.
double punkte = (95.1 + 71.9 + 82.6) / 3.0;
System.out.println("Im Schnitt " + punkte + "Punkte");
int students = 11 + 17 + 4 + 19 + 14;
System.out.println("There are " + students +
" students in the course.");
• Output:
Im Schnitt 83.2 Punkte
There are 65 students in the course.
Beispiel Lohnabrechnung
Wir erinnern uns … wie können wir dieses Programm verbessern?
public class Lohn{
public static void main(String[] args) {
// Calculate net wages based on weekly hours worked // deduct AHV 4.2%, IV 0.7%, ALV 1.0%, 30 CHF/Stunde
System.out.println("Hours worked:");
System.out.println(38 + 40 + 30 + 10);
System.out.println("AHV:");
System.out.println(30*(38 + 40 + 30 + 10) * .042);
System.out.println("IV:");
System.out.println(30*(38 + 40 + 30 + 10) * .007);
...
Lohnabrechnung, Version 2
public class Lohn{
public static void main(String[] args) {
// Calculate net wages based on weekly hours worke; deduct AHV 4.2%, IV 0.7%, ALV 1.0%
int stunden = 38 + 40 + 30 + 10;
int lohnBrutto = 30 * stunden;
double ahvAbzug = lohnBrutto * .042;
double ivAbzug = lohnBrutto * .007;
double alvAbzug = lohnBrutto * .01;
double lohnNetto = lohnBrutto – (ahvAbzug + ivAbzug +alvAbzug);
System.out.println("Lohn: " + lohnNetto);
} }
2.3 Einfache Schleifen: for loop
§ Schleifen erlauben wiederholte Ausführung einer (oder mehrerer) Anweisung(en).
§ Schleifen (“loops”) kommen in verschiedenen Varianten
§ Zuerst: for loop
for loops erlauben einfache Wiederholungen
§ Bisher waren Wiederholungen eigentlich redundant:
System.out.println(”Ich werde die Schulhausregeln beachten");
System.out.println(”Ich werde die Schulhausregeln beachten");
System.out.println(”Ich werde die Schulhausregeln beachten");
System.out.println(”Ich werde die Schulhausregeln beachten");
System.out.println(”Ich werde die Schulhausregeln beachten");
for loops erlauben Wiederholungen
§ Bisher waren Wiederholungen eigentlich redundant:
System.out.println(”Ich werde die Schulhausregeln beachten");
System.out.println(”Ich werde die Schulhausregeln beachten");
System.out.println(”Ich werde die Schulhausregeln beachten");
System.out.println(”Ich werde die Schulhausregeln beachten");
System.out.println(”Ich werde die Schulhausregeln beachten");
§ Sie machen das Programm unübersichtlich
§ Javas for loop Anweisung führt Anweisungen wiederholt aus.
for (int i = 1; i <= 5; i = i + 1) { // repeat 5 times
System.out.println(”Ich werde die Schulhausregeln beachten");
}
for loop Syntax
for (initialization; test; update) { statement;
statement;
...
statement;
}
§ Initialisierung ("Initialization") wird einmal ausgeführt.
§ Wiederhole diese Schritte:
§ Prüfe ob test wahr ("true") ergibt. Wenn nicht, stop.
§ Führe die Anweisung(en) ("statement"s) aus.
§ Führe die Aktualisierung ("update") aus.
body (Rumpf) header (Kopf)
Initialisierung
for (int i = 1; i <= 5; i = i + 1) {
System.out.println("Ich werde die Schulhausregeln beachten");
}
§ Legt die Variable fest, die im Loop verwendet wird
§ Wird einmal am Anfang der Schleife ausgeführt
§ Diese Variable heisst Schleifenzähler (“loop counter”)
§ Kann jeden Namen haben, nicht nur i
§ Kann mit jedem Wert anfangen, nicht nur 1
Test
for (int i = 1; i <= 5; i = i + 1) {
System.out.println("Ich werde die Schulhausregeln beachten");
}
§ Vergleicht die Zählervariable (loop counter) mit einem Grenzwert
§Verwendet Vergleichsoperatoren (“comparison operators”):
< kleiner als (“less than”)
<= kleiner als oder gleich (“less than or equal to”)
> grösser als (“greater than”)
>= grösser als oder gleich (“greater than or equal to”)
48
Kurzformen für Zuweisungen
§ Zuweisungen der Form j = j+1 tretten häufig auf
§ Machen Programm unübersichtlich
§ Früher: unnötige Extra-Arbeit für Compiler und Computer
§ Kurzformen erlauben Inkrement (Addition von 1) und Dekrement (Subtraktion von 1)
§ “increment” und “decrement”
§ Veränderung immer um 1
Inkrement und Dekrement
Kurzform Aequivalente ausführlichere Version
variable++; variable = variable + 1;
variable--; variable = variable - 1;
Beispiele
int x = 2;
x++; // x = x + 1;
// x now stores 3 double note = 4.5;
note--; // note = note - 1;
// note now stores 3.5
Inkrement und Dekrement
Kurzform Aequivalente ausführlichere Version
variable++; variable = variable + 1;
variable--; variable = variable - 1;
variable wird verwendet und dann verändert
Beispiel
int x = 2;
int y;
y = x++;
Inkrement und Dekrement
Kurzform Aequivalente ausführlichere Version
variable++; variable = variable + 1;
variable--; variable = variable - 1;
variable wird verwendet und dann verändert
Beispiel
int x = 2;
int y;
y = x++;
int temp = x;
y = temp;
temp++;
x = temp;
// x now stores 3
54
Wiederholungen für ein Interval [1..6]
System.out.println("1 hoch 2 = " + 1 * 1);
System.out.println("2 hoch 2 = " + 2 * 2);
System.out.println("3 hoch 2 = " + 3 * 3);
System.out.println("4 hoch 2 = " + 4 * 4);
System.out.println("5 hoch 2 = " + 5 * 5);
System.out.println("6 hoch 2 = " + 6 * 6);
§ Intuition: ”Ich will eine Zeile für jede Zahl von 1 bis 6 ausgeben”
§ Ein for loop erledigt genau diesen Job!
for (int i = 1; i <= 6; i++) {
System.out.println(i + " hoch 2 = " + (i * i));
}
§ "Für jede ganze Zahl i von 1 bis 6, drucke..."
Die Schleife in Zeitlupe
for (int i = 1; i <= 4; i++) {
System.out.println(i + " hoch 2 = " + (i * i));
}
System.out.println("Whoa!");
Output:
1 hoch 2 = 1 2 hoch 2 = 4 3 hoch 2 = 9 4 hoch 2 = 16 Whoa!
1 2 3
4
5 1
2
3 4
5
Initialisierung einmal ausführen
Anweisung(en) im Loop ausführen Ist test wahr?
Aktualisierung ausführen
Anweisung nach Loop ausführen
ja nein
Mehrere Anweisungen im Rumpf
System.out.println("+----+");
for (int i = 1; i <= 3; i++) {
System.out.println("\\ /");
System.out.println("/ \\");
}
System.out.println("+----+");
Mehrere Anweisungen im Rumpf
System.out.println("+----+");
for (int i = 1; i <= 3; i++) {
System.out.println("\\ /");
System.out.println("/ \\");
}
System.out.println("+----+");
§ Output:
+----+
\ /
/ \
\ /
/ \
\ /
/ \ +----+
Schleifenkontrolle
int highTemp = 5;
for (int i = -3; i <= highTemp / 2; i++) {
System.out.println(i + " C = " + (i * 1.8 + 32) + " F");
}
Output:
-3 C = 26.6 F -2 C = 28.4 F -1 C = 30.2 F 0 C = 32.0 F 1 C = 33.8 F 2 C = 35.6 F
System.out.print
§ Druckt ohne eine Reihe mit “newLine” abzuschliessen
§ Erlaubt es eine Zeile sukzessive auszugeben int highTemp = 5;
for (int i = -3; i <= highTemp / 2; i++) { System.out.print((i * 1.8 + 32) + " ");
}
• Output:
26.6 28.4 30.2 32.0 33.8 35.6
§ Verwende " " um die Zahlen zu trennen
Hochzählen, herunterzählen
§ Die Aktualisierung (“update”) kann auch -- verwenden um den Schleifenzähler herunterzuzählen
Aber der Vergleich in “test” muss dann > anstatt von < verwenden System.out.print("T-minus ");
for (int i = 10; i >= 1; i--) { System.out.print(i + ", ");
}System.out.println("blastoff!");
System.out.println("The end.");
Output: T-minus 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, blastoff!
The end.