252-0027 Einführung indie Programmierung 2.2Typenund Variable ThomasR.Gross DepartmentInformatik ETHZürich Uebersicht § 2.2Typen undVariable § Deklaration vonVariablen § 2.3Schleifen (Loops) § 2.3.1“for”Loops § 2.3.2Verschachtelte Schleifen § 2.4“if”-Anweisungen § 2.5Nochmals Schleifen § “while”Loops § 2.6Input 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*(38 + 40 + 30 + 10) (30*(38 + 40 + 30 + 10) (30*(38 + 40 + 30 + 10) } } 30 + 10) – * .042 + * .007 + * .01) ); § DerAusdruck (Anzahl Stunden)(38 + 40 + 30 + 10) wird wiederholt § Abzüge werden mehrfach berechnet § So viele println Anweisungen 8 Variable § Variable(“variable”):Namederes erlaubt,aufeinen gespeicherten Wertzuzugreifen Variable § Variable(“variable”):Namederes erlaubt,aufeinen gespeicherten Wertzuzugreifen § Wertmuss(irgendwo)vom Programm gespeichert werden § InSpeicherzelle(n)im Computer § Aehnlich Schnellwahl (Telefon) Variable § Variable(“variable”):Namederes erlaubt,aufeinen gespeicherten Wertzuzugreifen § Wertmuss(irgendwo)vom Programm gespeichert werden § InSpeicherzelle(n)im Computer § Aehnlich Schnellwahl (Telefon) Variable § Wie mandiese Wahlknöpfe benutzt: § Konfiguration § Einsatz § Aehnlicher Ablauf für Variablen ineinem Programm § Deklaration - gibt Namen undTyp an § Initialisierung - speichert einen WertinderVariablen § Gebrauch - ineinem Ausdruck oder println Anweisung Deklaration Deklaration einer Variablen:Reserviert Speicherfür Werte § Variablemüssen deklariert seinbevorsie verwendet werden können. § Syntax: type name; nameist ein Bezeichner (“identifier”) typeist der Typ § int x; § double myGPA; x myGPA Deklaration Variablemüssen deklariert seinbevorsie verwendet werden können. type name; EBNFDescriptionvariabledeclaration typeidentifier ⟸ bezeichner variableidentifier ⟸ bezeichner variabledeclaration ⟸ typeidentifier variableidentifier {,variableidentifier }; Zuweisungen (“Assignment”) § Zuweisung:Eine Anweisung dieeinen Wertineiner Variable speichert. § DerWertkann ein Ausdruck sein,dieZuweisung speichert dasErgebnis § Syntax: name = expression; § int x; x = 3; § double myGPA; myGPA = 1.0 + 2.25; x myGPA 3 3.25 Assignment § Javaverwendet = umeine Zuweisung auszudrücken § "Assignmentoperator" name=expression; EBNFDescriptionassignment variableidentifier ⟸ bezeichner assignment⟸ variableidentifier =expression ; DieEBNFBeschreibung für expression kommt später. 19 StringOperationen § StringVerkettung (“concatenation”):DerOperator+ erlaubt es,zwei Stringszu verketten (verknüpfen) "hello" + ”world" ergibt "helloworld" "a" + "b" + "c" ergibt "abc" § DerOperator+ mit einem Stringundeinem anderen Wertals Operanden ergibt einen längeren String. "hello" + 42 ergibt "hello42" 1 + "abc" + 2 ergibt "1abc2" "abc" + 1 + 2 ergibt "abc12” 22 StringOperationen § Können + verwenden umeinen StringunddenWerteines Ausdrucks auszugeben. § System.out.println("Note: " + (4.8 + 5.4) / 2); • Output:Note: 5.1 • Warum brauchen wir (und)? Gebrauch vonVariablen § Nachdem eine Variableeinen Werterhalten hat,kann dieVariablein Ausdrücken verwendet werden: int x; x = 3; System.out.println("x is " + x); System.out.println(5 * x - 1); // x is 3 // 5 * 3 - 1 § Wiederholte Zuweisungen sind erlaubt: int x; x x = 3; System.out.println(x + " here"); // 3 here x = 4 + 7; System.out.println("now x is " + x); // now x is 11 11 3 Deklaration/Initialisierung § Deklaration undInitialisierung können ineiner Anweisung gemacht werden. § Syntax: type name = value; § double myGPA = 3.95; § int x = (11 % 3) + 12; myGPA x 3.95 14 Deklaration mit Initialisierung EBNFDescriptionvariabledeclaration typeidentifier ⟸ bezeichner variableidentifier ⟸ bezeichner variablelist ⟸ variableidentifier {,variableidentifier } variableinitialization ⟸ variableidentifier =expression variablespecification ⟸ variableinitialization |variablelist variabledeclaration ⟸ typeidentifier variablespecification ; Zuweisung (Programm)undAlgebra(Mathematik) § Zuweisung verwendet = ,aber eine Zuweisung ist keine algebraische Gleichung! = bedeutet:”speichere denWertderRHSinderVariablederLHS" Dierechte Seite desAusdrucks wird zuerst ausgewertet, dann wird dasErgebnis inderVariableaufderlinken Seite gespeichert § Waspassiert hier? int x = 3; x = x + 2; // ??? x 3 5 30 31 32 34 CompilerFehler Meldungen § Eine Variablekann 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 desWertes einer Variablen Operator+ zum Drucken eines StringunddesWertes einer Variablein 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 desWertes einer Variablen Operator+ zum Drucken eines StringunddesWertes einer Variablein 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 …wiekönnenwirdiesesProgrammverbessern? 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,Version2 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.3Einfache Schleifen:for loop § Schleifen erlauben wiederholte Ausführung einer (oder mehrerer)Anweisung(en). § Schleifen (“loops”)kommen inverschiedenen Varianten § Zuerst:for loop for loopserlauben einfache Wiederholungen § Bisher waren Wiederholungen eigentlich redundant: System.out.println(”Ich System.out.println(”Ich System.out.println(”Ich System.out.println(”Ich System.out.println(”Ich werde werde werde werde werde die die die die die Schulhausregeln Schulhausregeln Schulhausregeln Schulhausregeln Schulhausregeln beachten"); beachten"); beachten"); beachten"); beachten"); for loopserlauben Wiederholungen § Bisher waren Wiederholungen eigentlich redundant: System.out.println(”Ich System.out.println(”Ich System.out.println(”Ich System.out.println(”Ich System.out.println(”Ich werde werde werde werde werde die die die die die Schulhausregeln Schulhausregeln Schulhausregeln Schulhausregeln Schulhausregeln beachten"); beachten"); beachten"); beachten"); beachten"); § Sie machen dasProgramm unübersichtlich § Javasfor 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 loopSyntax 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 dieAnweisung(en)("statement"s)aus. § Führe dieAktualisierung ("update")aus. header (Kopf) body (Rumpf) Initialisierung for (int i = 1; i <= 5; i = i + 1) { System.out.println("Ich werde die Schulhausregeln beachten"); } § Legt dieVariablefest,dieim Loopverwendet wird § Wird einmal amAnfang derSchleife ausgeführt § Diese Variableheisst Schleifenzähler (“loopcounter”) § Kann jeden Namen haben,nicht nur i § Kann mit jedem Wertanfangen,nicht nur 1 Test for (int i = 1; i <= 5; i = i + 1) { System.out.println("Ich werde die Schulhausregeln beachten"); } § Vergleicht dieZählervariable (loopcounter)mit einem Grenzwert § Verwendet Vergleichsoperatoren (“comparisonoperators”): < <= > >= kleiner als (“lessthan”) kleiner als oder gleich (“lessthanorequalto”) grösser als (“greaterthan”) grösser als oder gleich (“greaterthanorequalto”) 48 Kurzformen für Zuweisungen § Zuweisungen derForm j = j+1 tretten häufig auf § MachenProgramm unübersichtlich § Früher:unnötige Extra-Arbeit für CompilerundComputer § Kurzformen erlauben Inkrement (Additionvon1)und Dekrement (Subtraktion von1) § “increment”und“decrement” § Veränderung immer um1 Inkrement undDekrement Kurzform Aequivalente ausführlichere Version variable++; variable--; variable = variable + 1; 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 undDekrement Kurzform Aequivalente ausführlichere Version variable++; variable--; variable = variable + 1; variable = variable - 1; variablewird verwendet unddann verändert Beispiel int x = 2; int y; y = x++; Inkrement undDekrement Kurzform Aequivalente ausführlichere Version variable++; variable--; variable = variable + 1; variable = variable - 1; variablewird verwendet unddann 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 System.out.println("2 System.out.println("3 System.out.println("4 System.out.println("5 System.out.println("6 hoch hoch hoch hoch hoch hoch 2 2 2 2 2 2 = = = = = = " " " " " " + + + + + + 1 2 3 4 5 6 * * * * * * 1); 2); 3); 4); 5); 6); § Intuition: ”Ich willeine Zeile für jede Zahl von1bis 6ausgeben” § 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 von1bis 6, drucke..." DieSchleife inZeitlupe 1 2 3 for (int i = 1; i <= 4; i++) { 4 System.out.println(i + " hoch 2 = " + (i * i)); } 1 Initialisierung einmal 5System.out.println("Whoa!"); ausführen nein Output: 1 hoch 2 hoch 3 hoch 4 hoch Whoa! ja 2 Ist testwahr? 2 2 2 2 = = = = 1 4 9 16 5 Anweisung nach Loopausführen 4 Anweisung(en)im Loopausführen 3 Aktualisierung ausführen 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: -3C=26.6F -2C=28.4F -1C=30.2F 0C=32.0F 1C=33.8F 2C=35.6F 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 " " umdieZahlen zu trennen Hochzählen,herunterzählen § DieAktualisierung (“update”)kann auch -- verwenden umden Schleifenzähler herunterzuzählen Aber der Vergleich in“test”mussdann > 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.