Einführung in die JavaProgrammierung Dr. Volker Riediger Tassilo Horn riediger|[email protected] WiSe 2012/13 1 Rückblick ● Datentypen (int, long, double, boolean, String) ● Variablen und Variablendeklarationen ● Zuweisung ● Ausdrücke und Operationen ● Eingabe und Ausgabe ● Fallunterscheidungen (if ... else ) ● Nachtrag: Vergleichsoperationen für Strings (Folie 23) ● ● Zuweisungs-Kurzformen (Folien 24, 25) 2 Nachtrag: Typkonvertierung ● Zuweisungen an „kleinere“ Variablen sind ein Fehler: double d = 1.25; int x = d; // Fehler, double kann nicht // automatisch in int konvertiert // werden ● Man kann aber den Typ eines Ausdrucks absichtlich festlegen (und damit wissentlich Information verlieren): int y = (int)d; // OK, Nachkommastellen // werden abgeschnitten // y == 1 3 TypeCast ● Es geht NICHT: ● int x = (int) “1234“; ● String x = (String) 5; ● ● aber: ● int x = Integer.parseInt(“1234“); ● String x = ““ + 5; 4 Themen ● Schleifen ● Methoden 5 Schleifen ● ● Schleifen dienen der Wiederholung von Anweisungen. Ob wiederholt wird, wird durch eine Bedingung bestimmt Die einfachste Art der Schleife ist die whileSchleife while (<Bedingung>) { // Schleifenrumpf: Anweisungen } 6 while-Schleife 7 Demo: WhileSchleifeGGT.java ● Aufgabe: Lasst uns ein Programm schreiben, welches 2 ganze Zahlen vom Benutzer einließt und deren ggT bestimmt ● ● ● Lösungsansatz: Wiederholt die kleinere von der größeren Zahl abziehen Wird eine der Zahlen 0, so ist die andere der ggT Klappt nur für nicht-negative Zahlen (aber für den ggT können wir sowieso Absolutwerte nehmen) 8 Demo: Zinsen.java ● Aufgabe: Lasst und ein Programm schreiben, welches die den Kontostand bei fester Verzinsung nach beliebig vielen Jahren berechnet ● ● ● Der Anfangsbetrag, der Zinssatz und die Laufzeit werden vom Benutzer eingelesen Nach jedem Jahr (Schleife) muss der Kontostand neu berechnet werden (auf Basis des alten Standes und dem Zinswert) Nach Berechnung der Gesamtlaufzeit muss der Endkontostand ausgegeben werden 9 do-while-Schleife ● ● Neben der „normalen“ while-Schleife, gibt es noch die do-while-Schleife Der Rumpf wird hier zuerst ausgeführt, und erst dann wird die Bedingung überprüft do { // Schleifenrumpf: Anweisungen } while (<Bedingung>); 10 do-while-Schleife 11 Demo: SummeDurchschnitt.java ● Aufgabe: Schreibe ein Programm, welches beliebig viele Zahlen vom Benutzer einliest und dann die Summe und den Durchschnitt ausgibt ● Der Benutzer signalisiert durch die Eingabe von 0, dass alle Zahlen eingelesen sind 12 Demo: ZahlRaten.java ● Aufgabe: Lasst uns ein Programm schreiben, welches zufällig eine Zahl zwischen 0 und 99 auswählt ● ● ● Der Benutzer soll diese Zahl erraten Das Programm gibt nach jedem Versuch entweder einen Tipp (größer, kleiner), oder es bestätigt den richtigen Tipp und gibt die Anzahl der benötigten Versuche aus Bemerkung: Die Methode Math.random() liefert einen zufälligen double-Wert zwischen 0.0 (inkl.) und 1.0 (exkl.) 13 Zählschleifen ● ● Häufg benötigt man Schleifen, die von 1..n zählen (oder n..m) Dazu gibt es die for-Schleife for (int i = 0; i < 10; i++) { // Rumpf } int i = 0; while (i < 10) { // Rumpf i++; } 14 Demo: Quadratzahlen.java ● Aufgabe: Schreibe ein Programm, welches die Quadratzahlen von 1 bis n (wird vom Benutzer eingegeben) ausgibt, und benutze dabei eine for-Schleife 15 Demo: QuadratzahlenWhile.java ● Aufgabe: Schreibe ein Programm, welches die Quadratzahlen von 1 bis n (wird vom Benutzer eingegeben) ausgibt, und benutze dabei eine while-Schleife 16 Demo: Fakultaet.java ● Aufgabe: Schreibe ein Programm, welches die Fakultät von einer natürlichen Zahl n (wird vom Benutzer eingegeben) ausgibt 17 Aus Schleifen ausbrechen ● Es gibt 2 mögliche Anweisungen, um vorzeitig aus einer Schleife auszubrechen ● ● continue beendet nur den aktuellen Durchlauf break beendet die gesamte Schleife 18 Demo: BreakAndContinue.java ● Aufgabe: Schreibe ein Programm, welches alle ganzen Zahlen von 1 an ausgibt, es sein denn ● ● die Zahl ist durch 2 oder 3 teilbar, dann soll diese Zahl übersprungen werden die Zahl ist 123, dann soll die gesamte Schleife beendet werden 19 Geschachtelte Schleifen ● Alle Arten von Schleifen können auch geschachtelt werden while (<b1>) { for (int a = 100; a > 0; a--) { do { // mach was } while (<b2>); } } 20 Demo: EinMalEins.java ● Aufgabe: Schreibe ein Programm, welches das kleine Ein-mal-Eins in tabellarischer Form ausgibt ● ● ● Die erste Spalte/Zeile sind jeweils die Zahlen 1 bis 10 Die Zellen der Tabelle sind jeweils die Produkte aus Spalte/Zeile Tipp: Der String "\t" druckt einen Tabulator (Einrückung zu einem festen Punkt) 21 Demo: XhochK.java ● Aufgabe: Schreibe ein Programm, welches eine reelle Zahl x und eine ganze Zahl k einliest und dann „x hoch k“ berechnet (Numerikaufgabe 3a) ● ● k kann auch negativ sein! Math.pow() darf nur zum Testen der Lösung verwendet werden! 22 Methoden ● ● ● Bislang haben wir unsere Programme einfach in die main()-Methode gepackt Zur Strukturierung von etwas komplexeren Programmen bietet es sich an, eigene Methoden zu defnieren Diese können dann immer wieder aufgerufen werden, statt jedes mal den Code einzufügen 23 Methoden ● ● Wir haben schon viele Methoden benutzt, z.B.: ● Math.sqrt() // Wurzel ● Math.pow() ● System.out.println() // Textausgabe ● JConsole.readInt() // Potenz // int-Wert lesen Um eine Methode zu benutzen, muss man deren Signatur kennen: ● Typ des Ergebnisses (void, falls kein Ergebnis) ● Name der Methode ● Typen und Anzahl der Parameter double Math.sqrt(double x) 24 Methoden als BlackBox ● Es ist dokumentiert, was eine Methode macht, aber (i.d.R.) nicht wie sie es macht Prints the given string to standard out. Promtps the user for a int value. String String JConsole.readInt System.out.println int Kein Ergebnis Returns the correctly rounded positive square root of a double value. double Math.sqrt double Returns the value of the first argument raised to the power of the second argument. double double Math.pow double 25 Methodenaufrufe ● ● Methoden werden über Methodenaufrufe benutzt Die Anzahl und Typen der aktuellen Parameter müssen zu den der formalen Parameter passen double exp = Math.pow(17, -0.4); // Ok! double exp = Math.pow(17); // Falsch! double exp = Math.pow("17", 2); // Falsch! 26 Methoden-Defnitionen public class Math { Einfach so mit Math.pow(x, y) aufrufbar „formale“ Parameter Aufrufbar aus anderen Klassen … public static double pow(double x, double k) { // Verarbeitung } … } double double Math.pow double 27 Ergebnis liefern ● Methoden, die ein Ergebnis berechnen, müssen dieses mit der return-Anweisung zurückgeben public static int foo(int x) { // berechne int ergebnis return ergebnis; } //Irgendwo anders in derselben Klasse int x = foo(17); 28 Demo: Rechner.java ● Aufgabe: Erstelle eine Klasse Rechner, die eine Methode add() zum Addieren zweier ganzer Zahlen hat ● Spaßeshalber: Man darf den +-Operator nicht verwenden, nur ++ bzw. -- 29 Demo: Rechner.java ● Aufgabe: Erweitert den Rechner um die Methode sub() und mul() ● ● Spaßeshalber: Bei sub() ist der Operator – verboten, bei mul() ist der Operator * verboten Nutzt stattdessen unsere add()-Methode! 30 Demo: Rechner.java ● Aufgabe: Erweitert den Rechner um die Methoden div() und modulo() ● div(): Ganzzahldivision ● modulo(): Rest der Ganzzahldivision ● Spaßeshalber: Bei div() ist der Operator / verboten, bei modulo() ist der Operator % verboten 31 Demo: Wurzel.java ● ● Aufgabe: Schreibe eine Methode, die genau wie Math.sqrt() die Quadratwurzel einer positiven, reellen Zahl zieht Math.sqrt() darf natürlich nicht benutzt werden! 32 Demo: Wurzel.java ● Idee: Annäherungslösung durch Intervallschachtelung 33