Einführung in die imperative Programmierung mit Java Seite 1 1 Grundlagen 1.1 Erste Programme Zahl a einlesen Zahl b einlesen c=a+b Ausgabe Zahl c AUFGABE 1.1 a) Beschreibe die Struktur des Programms und nenne seine Aufgabe. b) Gib die einzelnen Programmschritte bei einer Eingabe von a = 3 und b = 5 an. Ein Struktogramm (oder Nassi-Shneiderman-Diagramm, s.o.) ist ein Diagrammtyp zur Darstellung von Programmentwürfen im Rahmen der Methode der strukturierten Programmierung. AUFGABE 1.2 Zeichne ein Struktogramm für ein Programm, das aus drei Kantenlängen Umfang und Volumen eines Quaders berechnet und ausgibt. 1.2 (Einige) einfache Datentypen in Java Typ Schlüsselwort (1) numerische Datentypen Byte byte Short short Integer int Beschreibung Wertebereich ganzzahliger Wert ganzzahliger Wert ganzzahliger Wert Gleitkommazahl reellwertige Zahl -128 ... 127 -32 768 ... 32 767 -2 147 483 648 ... 2 147 483 647 ca. -10303 ... 10303 (2) Zeichen und Zeichenketten Character char String String Zeichen Zeichenkette - (3) Wahrheitswert Boolean boolean logische Variable double Beispiele Beachte, dass Java zwischen Groß- und Kleinschreibung unterscheidet! AUFGABE 1.3 a) Ergänze für jeden Datentyp zwei Beispiele in die Tabelle. b) Gib begründet an, welchen Datentypen die Werte 77, -3.14, 15.11.2002, a, Informatik, % und false zugeordnet werden können. c) Nenne die beiden Werte, die eine boolesche Variable annehmen kann. d) Begründe: 2600 kann sowohl als Zahl, als auch als Zeichenkette aufgefasst werden. 1.3 Textausgaben in Java Textausgaben in Java-Programmen (wie z.B. oben die Zahl c in Aufgabe 1.1), lassen sich über die Anweisung System.out.println realisieren, z.B. System.out.println("Dies ist eine Bildschirmausgabe"); AUFGABE 1.4 Benenne die einzelnen Bestandteile des Befehls. In Java wird jeder Befehl mit einem Semikolon abgeschlossen. AUFGABE 1.5 Analysiere folgendes Code-Fragment: 1 2 3 4 int g = 5; double h = 3; // Rechnen... Einführung in die imperative Programmierung mit Java Seite 2 5 System.out.println("Fläche: " + 0.5*g*h); a) b) c) d) Überlege, welche Bedeutung die Befehle in Zeile 1 und 2 haben. Was passiert in Zeile 5? Um welche Fläche handelt es sich hier? Nenne die notwendigen Änderungen im Programm, wenn die Grundseite 3 cm und die Höhe 2,7 cm betragen sollen. e) Nenne zwei prinzipielle Schwächen des Programms; beachte dafür die Datentypen. AUFGABE 1.6 Ein erstes Java-Programm a) Öffne den Java-Editor und wähle Datei Neu Console. Da bei Java bei der Programmierung jedes Programms mehrere Dateien verwendet werden können bzw. zusätzlich automatisch erstellt werden, ist es dringend notwendig, die einzelnen Programme in sinnvoll genannten unterschiedlichen Ordnern abzuspeichern. b) Erstelle aus dem Dialog heraus einen neuen Ordner mit dem Namen HelloWord (siehe rechts). Navigiere in den neuen Ordner und gib als Dateinamen für die zu speichernde Java-Datei ebenfalls HelloWorld.java ein. Darauf sollte ein Editorfenster erscheinen, in dem bereits ein paar Zeilen Quellcode eingefügt sind. Die Dateinamen für Java-Dateien dürfen keine Leer- oder Sonderzeichen enthalten und dürfen außerdem nicht mit Zahlen beginnen. Eine sinnvolle Benennung ist hier also bspw. auch A1_6_HelloWorld.java. Die vom Java-Editor automatisch erzeugten Zeilen spielen im Moment noch keine Rolle, ihre Bedeutung sollte im Laufe der nächsten Monate deutlich werden. Diese Zeilen sollten in keinem Fall verändert werden! c) Ergänze den Quellcode in Zeile 12 (dort steht bereits der blinkende Cursor) so, dass das Programm die Zeile „Hallo World“ ausgibt. Um das nun erstellte Mini-Programm auszuführen (d.h. um es die Nachricht „Hello World“ auf der Konsole ausgeben zu lassen), muss das Java-Programm kompiliert werden. Dies geschieht über Start Compilieren bzw. kürzer über Start Starte Applikation bzw. per Klick auf den grünen Startbutton / die Taste F9. Java-Programme werden in Bytecode übersetzt und dann in einer speziellen Umgebung ausgeführt, die als JavaLaufzeitumgebung bezeichnet wird. Deren wichtigster Bestandteil ist die Java Virtual Machine, die die Programme ausführt, indem sie den Bytecode interpretiert. AUFGABE 1.7 a) Informiere dich über die Unterschiede der oben angegebenen Zeile gegenüber der Zeile System.out.print("test test"); b) Erstelle ein Struktogramm zu dem Programm HelloWorld. c) Begründe, warum die drei Zeilen System.out.print("Zeile 1"); System.out.println(""); System.out.println("Zeile 2"); dasselbe Ergebnis wie die beiden Zeilen System.out.println("Zeile 1"); System.out.println("Zeile 2"); liefern. Einführung in die imperative Programmierung mit Java Seite 3 1.4 Variablenkonzept und Einlesen AUFGABE 1.8 Stelle die Schritte des folgenden Codefragments in Form des Schubladenbox-Modells dar: ... double g = 5; double h = 3; double f; 1 2 3 4 5 6 7 8 f = 0.5 * g * h; System.out.println("Fläche: " + f); ... AUFGABE 1.9 Das Einlesen von Buchstaben oder Zahlen geschieht in Java über folgenden Befehl, wobei die Variable text vom Datentyp String ist: text = System.console().readLine(); a) Fertigt ein Struktogramm für ein Programm an, das einen Vor- und Nachnamen in zwei String-Variablen einliest und anschließend in der Form Nachname, Vorname ausgibt. Stellt die einzelnen Schritte in einem Schubladenbox-Modell dar. b) Setzt das Struktogramm in ein Java-Programm um. Erstelle dafür eine neue Datei A1_8.java, da die Dateinamen nicht mit Zahlen beginnen oder Leerzeichen enthalten dürfen. Für die Benennung von Variablen in Java gilt: Sie werden immer klein geschrieben und tragen sprechende Namen. AUFGABE 1.10 Verfahre wie in der vorherigen Aufgabe: Erstelle ein Programm, das drei Worte einliest und diese in umgekehrter Reihenfolge in drei Zeilen ausgibt. 1.5 Typenumwandlung In Programmiersprachen ist es oft notwendig, nicht nur Zeichenketten einzulesen, sondern auch Zahlen, mit denen gerechnet werden kann (dies ist mit Zeichenketten nicht möglich!). Aus diesem Grund gibt es Befehle (Methoden), mit denen sich Werte in andere Typen umwandeln lassen. Beispiel 1 int zahl; String a; a = System.console().readLine("Bitte geben Sie eine Zahl ein: "); zahl = Integer.valueOf(a); zahl = zahl + 2; ... Beispiel 2 1. Zeichenkette Zahl [String int] Befehl: Integer.valueOf(s) int zahl; zahl = Integer.valueOf(System.console().readLine("Bitte geben Sie eine Zahl ein: ")); zahl = zahl + 2; ... 2. Zahl Zeichenkette [int String] Befehl: String.valueOf(i) 3. Kommazahl Befehl: Ganzzahl [double int] (int)d Es gibt eine Vielzahl weiterer z. T. erheblich komplexerer Typenumwandlungsoperationen – diese lassen sich einfach im Internet über bspw. eine Suche von java Quelltyp to Zieltyp finden. AUFGABE 1.11 Vergleiche die beiden Beispiele und nenne Unterschiede und Gemeinsamkeiten. Einführung in die imperative Programmierung mit Java Seite 4 AUFGABE 1.12 Erstelle ein Java-Programm, das das Quadrat einer eingegebenen Zahl berechnet und anschließend ausgibt. AUFGABE 1.13 Aus einem gegebenen Radius r eines Kreises sollen die Kreisfläche und der Kreisumfang berechnet werden. Die Zahl Pi kann mit 3,14 angegeben werden. a) Erstelle ein Struktogramm. b) Zeichne das Schubladenbox-Modell. c) Setze das Struktogramm in ein Java-Programm um. AUFGABE 1.14 Beschreibe verbal, was bei den Zuweisungen in Zeile 6 und 7 passiert. Benutze dazu das Modell der Schubladenbox aus dem Unterricht. 1 2 3 4 5 6 7 double preis; double preiserhoehung; preis = 75; preiserhoehung = 5; preis = preis + preiserhoehung; preiserhoehung = preiserhoehung * 2; AUFGABE 1.15 Erkläre das Variablenkonzept in Java zunächst allgemein und dann anhand eines selbst gewählten Beispiels. Verwende dabei auch die Begriffe und Initialisierung. AUFGABE 1.16 Begründe, warum Variablen, mit denen im Anweisungsteil gearbeitet werden soll, vorher im Vereinbarungsteil mit Angabe des Datentyps vereinbart werden müssen. Einführung in die imperative Programmierung mit Java Seite 5 1.6 Fehlerarten (1) Syntaxfehler Fehler, die der Compiler zum Zeitpunkt des Kompilierens erkennt. Der Kompiliervorgang wird abgebrochen. Beispiel: Einer Variablen vom Typ int wird im Programm der Wert einer Variablen vom Typ double zugewiesen. (2) Laufzeitfehler Fehler, die erst zum Zeitpunkt der Programmaufführung auftreten. Die Programmausführung wird abgebrochen. Beispiel: Wertzuweisung eines Wertes außerhalb des Wertebereichs einer Variablen durch den Benutzer während der Programmausführung. AUFGABE 1.17 Gegeben ist folgender Java-Quelltext: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // berechnet den Flächeninhalt eines Dreiecks a) b) c) d) Nenne die syntaktischen Fehler, die der Programmcode enthält. Stelle den Programmablauf in einem Struktogramm dar. Nenne die Ausgabe des Programms, wenn der Benutzer bei der Ausführung 3 und 4 eingegeben hat. Ein Benutzer vertippt sich und gibt in das (korrigierte) Programm als Höhe den Buchstaben a ein. Was passiert? public class Dreieck { public static void main(String[] args) { double hoehe double grundseite; double flaeche; hoehe = Double.valueOf(System.console().readln("Geben Sie die Höhe ein: "); grundseite = String.valueOf(System.console().readLine(Geben Sie die Grundseite ein: )); flaeche = grundseite * hoehe / 2; System.out.println() System.out.println(); System.out.println('Die Fläche beträgt: ' + fläche); } AUFGABE 1.18 1 2 3 4 5 6 7 8 9 10 11 public static void main(String[] args) { double zinsen, betrag, endkapital; betrag = Double.valueOf(console().readLine("Eingabe Betrag: ")); zinssatz = Double.valueOf(System.console().readLine("Eingabe Zinssatz: ")); zinsen = betrag * 0,01 * zinssatz; endkapital := betrag + zinsen; System.out.println("Die Zinsen betragen: + zinsen + Euro"); System.out.println("Der Endbetrag ist: " + endkapital + " Euro"; } a) Markiere die syntaktischen Fehler. b) Zeile 9 verhält sich nicht wie gewünscht – warum? AUFGABE 1.19 Welche Fehlerart liegt hier vor? Teste! int a, b; b = 0; a = 2; System.out.println(a / b); Einführung in die imperative Programmierung mit Java Seite 6 1.7 Divisionsarten (1) ganzzahlige Division bei zwei ganzzahligen Werten (2) reellwertige Division bei mindestens einer Gleitkommazahl (3) Divisionsrest (ModuloOperation) int a = 10, int b = 3; wert = a / b; int a = 10, double b = 3; wert = a / b; int a = 10, int b = 3; wert = a % b; Variableninhalt: wert = 3 Variableninhalt: wert = 3.333333 Variableninhalt: wert = 1 Eventuelle Multiplikationen werden vor Modulo-Operationen durchgeführt, d.h. z.B. 3*5%3 = 0. Um in Java Gleitkommazahlen zu formatieren und mit einer bestimmten Anzahl an Vor- und Nachkommastellen auszugeben, verwende z.B. folgende Befehle: import java.text.*; // in der allerersten Zeile ... // mind. 1 Vorkommastelle, genau 2 Nachkommastellen DecimalFormat f = new DecimalFormat("#0.00"); double wert = 10.0 / 3; System.out.println(f.format(wert)); ... AUFGABE 1.20 Erweitere dein Programm zur Berechnung von Kreisumfang und Volumen so, dass jeweils nur zwei Nachkommastellen ausgegeben werden. AUFGABE 1.21 a) 12 % 7 e) (23 / 5.0) / 2 Berechne die Werte der folgenden Ausdrücke und begründe die Ergebnisse. b) 12.0 / 7 c) 45 % 6 + 3 d) 45 % (6 + 3) f) (23 / 5) / 2 g) (23 % 5) / 2 h) 7 + 1 % 2 – 8 % 9 AUFGABE 1.22 Ein Taxi kann höchstens drei Touristen vom Hotel zum Aussichtsturm transportieren. Schreibe mit Hilfe der bekannten Operatoren ein Programm, das die Zahl t der benötigten Taxis für z.B. zunächst 10 Touristen ausgibt. Erweitere das Programm, dass eine beliebige Anzahl von Touristen eingelesen werden kann. AUFGABE 1.23 Es gilt die folgende Variablendeklaration; welche Java-Anweisung wird durch den Compiler nicht beanstandet? Begründe. double a, b; int c; boolean d; a) c) a = c / d; d = "False"; b) c = a * b; d) b = c / a; Einführung in die imperative Programmierung mit Java Seite 7 1.8 Weiterführende Aufgaben AUFGABE 1.24 Mithilfe der Steigungsformel m y1 y2 lässt sich die Steigung einer Geraden durch die Punkte x1 x2 P(x1|y1) und Q(x2|y2) berechnen. a) Erstelle ein Struktogramm. b) Erstelle das entsprechende Java-Programm. AUFGABE 1.25 Mit der Eingabe von p und q kann ein Programm mithilfe der p-q-Formel die Nullstellen des Polynoms f(x) = x² + px + q berechnen. Wurzel: Math.sqrt(double zahl) Quadrat: Math.pow(double zahl, 2) a) Schreibe die Java-Formel für die beiden Nullstellen x1 und x2 als Term auf, b) erstelle das Struktogramm c) und programmiere. AUFGABE 1.26 Auch bei der Division von Gleitkommazahlen kann es einen Rest geben. Der Rest der Division von 44 durch 2,2 kann in Java beispielsweise mit dem Ausdruck 44.0 % 2.2 geschrieben werden. Welchen Wert erwartest du für diesen Ausdruck und welcher Wert ergibt sich tatsächlich? Einführung in die imperative Programmierung mit Java Seite 8 2 Verzweigungen 2.1 Einseitige Auswahl (if) Syntax if (Bedingung erfüllt (oder Wahrheitswert)) { Anweisung 1.1; Beispiel } if (a < b) { System.out.println("a ist kleiner als b"); } AUFGABE 2.1 a) Beschreibe, was im Flussdiagramm dargestellt wird und wie der Programmfluss verläuft. b) Schreibe das Flussdiagramm in ein Struktogramm um. In Struktogrammen wird folgendes Zeichen für eine if-Anweisung verwendet: AUFGABE 2.2 Gegeben sei folgendes Programmfragment: // Das Programm berechnet die Wurzel einer Zahl mit der Standardfunktion Math.sqrt(x) double zahl, wurzel; zahl = Double.valueOf(System.console().readLine("Eingabe einer Zahl: ")); if _____________________________ wurzel = Math.sqrt(zahl); System.out.println(wurzel); a) Ergänze die Bedingung der if-Anweisung, so dass eine sinnvolle Abfrage entsteht. Setzte anschließend passende geschweifte Klammern. b) Erkläre die Bedeutung der geschweiften Klammern in diesem Fall. c) Zeichne das entsprechende Struktogramm. AUFGABE 2.3 a) Schreibe ein Programm, das zwei Zahlen einliest und anschließend ausgibt, welche der beiden Zahlen größer ist. (Dies ist eine geringfügige Abwandlung des o. g. Beispiels). b) Erweitere das Programm so, dass eine weitere dritte Zahl eingelesen werden kann und das Programm ausgibt, welche der Zahlen die größte ist. AUFGABE 2.4 Mit der if-Anweisung in dieser Form lassen sich bestimmte Probleme über erfüllte oder nicht erfüllte Probleme nur umständlich lösen. Betrachte die Aufgabe zur Wurzelberechnung und beschreibe, was notwendig ist, um im Falle einer negativen Zahl eine Fehlermeldung auszugeben. Einführung in die imperative Programmierung mit Java Seite 9 2.2 Zweiseitige Auswahl (if – else) Syntax if (Bedingung (oder Wahrheitswert)) { Anweisung 1.1; Beispiel } else { Anweisung 1.2; } if (a < b) { System.out.println("a ist kleiner als b"); } else { System.out.println("a ist größer oder gleich b"); } AUFGABE 2.5 a) Beschreibe, was im Flussdiagramm dargestellt wird und wie der Programmfluss verläuft. b) Schreibe das Flussdiagramm in ein Struktogramm um. AUFGABE 2.6 In einem Parkhaus ist das Parken bis zu 2 Stunden kostenlos, jede weitere angefangene Stunde kostet 2 €. a) Entwirf ein Struktogramm zur Berechnung der Parkgebühr. b) Schreibe das entsprechende Java-Programm. Die Parkzeit soll dabei in einer Variablen in Minuten eingelesen werden. c) Es ist außerdem eine Höchstgebühr von 30 € festgesetzt. Erweitere dein Programm entsprechend. AUFGABE 2.7 Interpretiere den im Folgenden dargestellten Zusammenhang und veranschauliche ihn mit einem selbst gewählten Beispiel. a<b true / false Die Bedingungsanweisung liefert einen Wahrheitswert. Es handelt sich um die Auswertung eines Ausdrucks, nicht die Beantwortung einer Frage mit ja / nein. Die Bestandteile der Bedingungsanweisung: (1) Vergleichsoperatoren der Bedingungsanweisung > == größer < >= kleiner gleich größer gleich <= != kleiner gleich ungleich (2) Boolesche Variablen (Wahrheitswerte) Variablen vom Typ boolean können nur die Werte true oder false annehmen. Daher können diese Variablen auch an die Stelle eines Vergleichsoperators treten. Einführung in die imperative Programmierung mit Java Seite 10 AUFGABE 2.8 Gegeben ist folgendes Programm: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 double double double double double a b c d e = = = = = Double.valueOf(System.console().readLine("Eingabe von a: ")); Double.valueOf(System.console().readLine("Eingabe von b: ")); Double.valueOf(System.console().readLine("Eingabe von c: ")); 0; 0; if (a < b) { d = a + b; } if (a > c) { if (b > c) { d = a * b; } else { d = a * c; } } else { e = a + b + c; } System.out.println(d); System.out.println(e); a) Zeichne zur besseren Übersicht ein Struktogramm des Programms. b) An welcher Stelle schließt die geschweifte Klammer, die in Zeile 12 geöffnet wird? c) Es sind in dem Programm ein paar geschweifte Klammern gesetzt, die nicht unbedingt notwendig sind, aber für einen schöneren Programmierstil stehen. Welche? d) Bestimme die Werte, die für die Variablen d und e ausgegeben werden. Werte der Variablen Ergebnisse a b c d e 7 3 4 -3 11 46 9 -5 5 12 4 2 AUFGABE 2.9 In einem Unternehmen gilt folgende Rabattregel: Kundennummer kleiner als 3000 3000 bis 5000 größer als 5000 gewährter Rabattsatz 12 % 0% 10 % Mithilfe des folgenden Programms soll nach der Eingabe der Kundennummer der entsprechende Rabattsatz berechnet werden: int kNr, rabattsatz; kNr = Integer.valueOf(System.console().readLine("Eingabe der Kundennummer: ")); rabattsatz = 0; if (kNr <= 5000) if (kNr < 3000) rabattsatz = 12; else rabattsatz = 10; System.out.println("Der Rabattsatz beträgt: " + rabattsatz + "%"); Beim Testen liefert das Programm fehlerhafte Ergebnisse. a) Zeichne ein Struktogramm der Auswahlbedingungen und b) ermittle die Fehlerstelle. Einführung in die imperative Programmierung mit Java Seite 11 AUFGABE 2.10 Der sogenannte Body Mass Index einer Person gibt an, ob diese unter-, normal- oder übergewichtig ist. Er berechnet sich über folgende Formel: BMI Körpergewicht (kg) . Körpergröße (m)2 Erstelle ein Programm, das anhand der Werte folgender Tabelle ausgibt, in welchem Bereich sich ein BMI befindet: Altersgruppe 19-24 Jahre 25-34 Jahre 35-44 Jahre 45-54 Jahre 55-64 Jahre ≥ 65 Jahre wünschenswerter BMI 19-24 20-25 21-26 22-27 23-28 24-29 Erweitere dein Programm für die Auswahl zwischen Mann und Frau – für Frauen sind die Werte jeweils um einen kleiner als bei den Männern mit gleichem Alter. AUFGABE 2.11 In einem Parkhaus gilt folgender Tarif: Parkdauer bis zu 1 ½ Stunden jede weitere angefangene Stunde Höchstgebühr pro Tag Höchstgebühr überhaupt Parkgebühr 3€ 1,50 € 10 € 200 € Die Parkzeit wird in einer Variablen in Minuten eingegeben. a) Entwirf ein Struktogramm zur Darstellung des Lösungsalgorithmus’ und b) schreibe ein Java-Programm, das die Aufgabe löst. AUFGABE 2.12 Die Anweisung if (a < b) kann auch wie folgt umgeschrieben werden: int a, b; boolean wert; ... wert = (a < b); ... if (wert) ... Welchen programmtechnischen Vorteil könnte diese Form der Auswertung haben? AUFGABE 2.13 Was wird bei der Programmausführung an der Stelle der Punkte der Bedingung if ... { } geprüft bzw. erwartet? Einführung in die imperative Programmierung mit Java Seite 12 2.4 Logische Operatoren Die logischen Operatoren kombinieren zwei boolesche Ausdrücke, um ebenfalls einen booleschen Wert zu liefern. && und || oder ^ entweder – oder (exclusive – or) ! nicht Bei && und || wird zuerst die linke Seite der Operation ausgewertet. Nur, wenn das Ergebnis noch wahr werden kann, wird auch die rechte Seite betrachtet. (Bei & bzw. | wird immer komplett ausgewertet.) true && true = true true && false = false false && true = false false && false = false true || true = true true || false = true false || true = true false || false = false true ^ true = false true ^ false = true false ^ true = true false ^ false = false !(true && true) = false AUFGABE 2.14 a) Begründe, warum in der Tabelle manche Operatoren kursiv geschrieben sind. b) Nenne einen Grund, warum die Verwendung der „Doppeloperatoren“ && und || gegenüber & und | Vorteile haben kann. AUFGABE 2.15 Nenne begründet die Ausgabe des folgenden Programms. 1 2 3 4 5 6 7 8 9 10 2.5 int a = 5; int b = 3; int c = 99; if (a == 5 || b > 2) System.out.println("Ich "); if (a < 5 && b > 2) System.out.println("Du "); if (a == 5 && b == 2) System.out.println("hatten "); 11 12 13 14 15 16 17 18 19 20 if (c != 6 && b > 10) System.out.println("hast "); else System.out.println("habe "); if (b == 3 && c == 99) System.out.println("keinen "); if (a == 1 && b == 2) System.out.println("viel "); if (!(a < 5 && b > 2)) System.out.println("Spaß!"); Weiterführende Aufgaben AUFGABE 2.16 Im Restaurant am Rubbenbruchsee gibt es besondere Grillspezialitäten nur nach 18 Uhr, bei gutem Wetter und nicht an Sonntagen. Schreibe ein Programm, das drei boolesche Variablen für die drei Bedingungen einliest und anschließend ausgibt, ob gegrillt wird. Vielleicht hilft dir der Befehl Boolean.valueOf(String s), der eine Zeichenkette true / false in den entsprechenden Wahrheitswert umwandelt. AUFGABE 2.17 Nach Eingeben der Parameter a, b und c werden vorhandene Lösungen der allgemeinen quadratischen Gleichung der Form ax² + bx + c = 0 berechnet. a) Erstelle ein Struktogramm eines möglichen Lösungsalgorithmus mittels der p-q-Formel. Beachte auch die Fälle Diskriminante < 0 und Diskriminante = 0. Die Diskriminante ist D := b2 – 4ac. b) Schreibe das entsprechende Java-Programm. Einführung in die imperative Programmierung mit Java Seite 13 3 Schleifen Anweisung Anweisung Anweisung Anweisung Anweisung Anweisung Anweisung Anweisung 1; 2; 1; 2; 1; 2; 1; 2; ... Anweisung 1; Anweisung 2; ... AUFGABE 3.1 Nenne das Konzept, das anscheinend hinter den Schleifen steht. AUFGABE 3.2 Überlege dir eine Situation, die sinnvoll über die Verwendung von Schleifen zu programmieren ist. 3.1 Zählergesteuerte Wiederholung (for) Syntax Beispiel for (Laufvariable = Anfangswert; Laufvariable < Endwert; Laufvariable erhöhen) { Anweisung; } // Ausgabe von 10 mal Hello World auf der Konsole for (int i = 0; i < 10; i++) System.out.println("Hello World"); AUFGABE 3.3 a) Ordne die einzelnen Elemente der for-Schleife aus dem Beispiel den Elementen des Syntaxblocks zu. b) Benenne die Änderung in der Programmausgabe, die sich durch Abändern von i=0 in i=1 ergeben würden. c) Die Ausgabe soll doppelt so oft erzeugt werden, was ist zu ändern? AUFGABE 3.4 Schreibe ein Java-Programm, das sämtliche gerade Zahlen unter 100 auf der Konsole ausgibt. AUFGABE 3.5 Die Summe der Zahlen 1 bis 100 soll berechnet werden: 1 2 3 4 100 i1 i 100 a) Erstelle ein Struktogramm. b) Schreibe das zugehörige Programm. AUFGABE 3.6 Verallgemeinere das Programm aus der vorherigen Aufgabe so, dass ein Anfangswert a und ein Endwert b eingelesen werden, zwischen denen alle ganzen Zahlen summiert werden. Als mathematische Formel sieht das für a < b so aus: b i a i a (a 1) (a 2) (b 1) b Einführung in die imperative Programmierung mit Java Seite 14 AUFGABE 3.7 a) Ein 6-seitiger Würfel hat als Würfelergebnis die Zahlen 1-6. Schreibe eine Folge von 20 Zufallszahlen auf die entstanden sein kann, wenn ein Würfel zwanzigmal geworfen wurde. b) Folgendes Programm erzeugt 20 Zufallszahlen im Zahlbereich 1-6. int zahl; for (int i = 1; i < 21; i++) { zahl = (int)(Math.random()*6) + 1; System.out.println(i + ": " + zahl); } Erzeuge 20 Zufallszahlen und vergleiche mit deinen aufgeschriebenen Zahlen. c) Ändere das Programm so, dass bei der Programmausführung ein Zählwert eingelesen wird, der bestimmt, wie oft die Schleife durchlaufen wird (wie viele Zufallszahlen ausgegeben werden). AUFGABE 3.8 In bestimmten Fällen kann es praktisch sein, die Schleifenvariable herunterzuzählen. Gib den Schleifenkopf für diesen Fall an. AUFGABE 3.9 Bei einem Würfelspiel werden drei Würfel hintereinander geworfen. Ein Spieler tippt auf eine Zahl und gewinnt in Abhängigkeit davon, wie oft seine Zahl geworfen wurde. a) Schreibe ein Programm, das einen Tipp einholt, in einer Schleife dreimal würfelt, die Anzahl der Treffer zählt und dann ausgibt. b) Das Programm soll erweitert werden, dass ein Gewinn ausgeschüttet (ausgegeben) wird. 0 Treffer – 1 € 1 Treffer 1 € 2 Treffer 2 € 3 Treffer 5 € c) Wird der Spieler auf lange Sicht gewinnen oder verlieren? Wie könnte das in einem Programm überprüft werden? AUFGABE 3.10 For-Schleifen lassen sich selbstverständlich auch schachteln, d.h. mehrfach ineinander anwenden. Hiermit lässt sich z.B. mit Hilfe einer jeweils einmaligen Verwendung der Befehle System.out.print("*") und System.out.println() folgendes Muster zu erzeugen: ***** ***** ***** ***** ***** a) Erstelle ein Programm, das dieses Muster erzeugt. b) Ändere das Programm so, dass dies ausgegeben wird: ***** **** *** ** * c) ***** **** *** ** * Erzeuge folgende Ausgaben: 12345 23451 34512 45123 51234 12345 23454 34543 45432 54321 Einführung in die imperative Programmierung mit Java Seite 15 Exkurs: Java-Applets AUFGABE 1 Informiere dich im Internet über die Bedeutung von Java-Applets. AUFGABE 2 Erstelle eine neue Java-Datei (Datei Neu Java), schreibe folgenden Programmcode ab, speichere ihn als Linien01.java ab, compiliere ihn, erzeuge ein HTML für Applet und starte den Appletviewer. 1 2 3 4 5 6 7 8 import java.awt.* ; import java.applet.*; public class Linien01 extends Applet { public void paint (Graphics g) { g.drawLine(20, 50, 250, 150) ; } } a) Benenne die wesentlichen Unterschiede im Aufbau gegenüber deinen zuvor erstellten Konsolenprogrammen. b) Teste das Programm und erkläre den Befehl in Zeile 6. AUFGABE 3 Verwende Schleifen, um die folgenden Muster zu erzeugen: AUFGABE 4 Informiere dich in der Java-Dokumentation oder allgemein im Internet über die Verwendung von Farben. Erstelle ein Applet, das vier horizontale Linien in den Farben blau, grün, rot und gelb mit etwas Abstand zeichnet. AUFGABE 5 Programmiere ein Applet, das einen Farbverlauf ähnlich dem rechts im Screenshot dargestellten erzeugt. Erzeuge eine Variable farbe vom Datentyp Color und lass diese von blau (farbe = new Color(0, 0, 255)) nach grün (0, 255, 0) übergehen. AUFGABE 6 Programmiere ein Applet, das 1000 rote Punkte mit der Seitenlänge 3 an zufälligen Koordinaten in das Fenster zeichnet. Verwende für die Koordinaten Zufallszahlen, die du über die Funktion Math.random() erzeugst. Diese liefert einen Doublewert zwischen 0 und 1, den du per Multiplikation auf den Bereich 0 bis Fensterbreite bzw. Fensterhöhe streckst. Das Ergebnis (ein Doublewert) wird anschließend über den Befehl int i = (int) d; // d vom Typ double in eine taugliche ganzzahlige Koordinate überführt. Verwende außerdem den Sleep-Befehl, um die Punkte etwa 20 ms nacheinander zeichnen zu lassen: try { Thread.sleep(20); } catch (Exception e) {} AUFGABE 7 Erweitere das Programm aus der vorherigen Aufgabe so, dass die Punkte zufällig in den Farben rot, grün und blau gezeichnet werden. Einführung in die imperative Programmierung mit Java Seite 16 3.2 Fußgesteuerte Wiederholung (do – while) Syntax Beispiel do { Anweisung 1; Anweisung 2; ... Anweisung n; } while (Bedingung); i = 0; do { System.out.println(i); i++; } while (i < 10); AUFGABE 3.10 Ergänze die Schleifenaustrittsbedingung, so dass der folgende Schleifenrumpf die Summe der Zahlen 1 bis 100 berechnet: 100 i 1 i 1 2 3 ... 100 summe = 0; zahl = 1; do { summe = summe + zahl; zahl++; } while ____________ AUFGABE 3.11 Entwickle ein Programm, das aus einer Reihe von positiven Zahlen das arithmetische Mittel (Durchschnitt) a a1 a2 a3 ... an bildet. n Die Anzahl der Zahlen n ist beim Programmstart noch nicht bekannt, die Eingabe soll beendet sein, wenn nach der Zahl an die Zahl -1 eingegeben wird. Einführung in die imperative Programmierung mit Java Seite 17 3.3 Kopfgesteuerte Wiederholung (while) Syntax Beispiel while (Bedingung) Anweisung 1; Anweisung 2; . . . Anweisung n; } { i = 0; while (i < 10) { System.out.println(i); i++; } AUFGABE 3.12 Gib dem folgenden Programmfragment eine geeignete Schleifeneintrittsbedingung und beschreibe, welche Funktion das Programmstück mit dieser Bedingung erfüllt: summe = 0; zahl = 1; while ________________ { summe := summe + zahl; zahl++; } AUFGABE 3.13 Ersetze die Schleife for (int i = 2; i < 30; i++) System.out.println(i); a) durch eine do-while, b) durch eine while-Schleife. AUFGABE 3.14 a) Zeichne ein Struktogramm zu folgendem Algorithmus: int zahl, wert; zahl = Integer.valueOf(System.console().readLine("Eingabe einer Zahl: ")); wert = 1; while (zahl > 0) { wert = wert * zahl; zahl--; } wert = wert / 2; System.out.println("Ergebnis = "+ wert); b) Welchen Wert gibt das Programm aus, wenn als Zahl 4 eingegeben wird? AUFGABE 3.15 Gegeben sei das Applet Autorennen1.java. a) Analysiere den Programmcode und benenne die Aufgaben der einzelnen Programmteile. b) Erweitere das Programm so, dass etwa folgendes Ergebnis entsteht: Einführung in die imperative Programmierung mit Java Seite 18 4 Weiterführende Aufgaben AUFGABE 4.1 Mithilfe von Schleifen kann man die Multiplikation zweier Zahlen durch eine Folge von Additionen ersetzen: a·b a a a a b mal a) Entwirf ein Struktogramm mit geeigneter Schleife zur Beschreibung des Algorithmus. b) Schreibe das entsprechende Java-Programm. AUFGABE 4.2 Vergleiche die drei Schleifentypen, indem du folgende Tabelle vervollständigst: Schleife mit konstanter Anzahl von Durchläufen Schlüsselwörter Schleifenüberwachung Anzahl der Schleifendurchläufe - mindestens/höchstens - festgelegt / nicht festgelegt Besonderheiten - wann wird dieser Typ benutzt? for Schleifentyp Abbrechende Schleifen Wiederholung mit Ausgangsbedingung do - while while Zähler AUFGABE 4.3 Auf dem Schulfest führt die Theater AG „Romeo und Julia“ um 18.00 auf der Probebühne auf. Der Eintritt ist frei. Der Theatersaal fasst 45 Plätze. Den Kartenverkauf soll ein Programm der Informatik AG regeln. Bei dem Programm gibt der Kunde (Eltern, Lehrer, Schüler) die Anzahl der gewünschten Karten ein (z.B. 3), der Rechner gibt die Sitznummern (1-45) auf dem Bildschirm aus, wünscht einen schönen Tag und ist für die nächste Eingabe bereit. Ist der Saal voll erscheint ein entsprechender Hinweis und das Programm beendet sich auf Tastendruck. a) Fertige ein Struktogramm an. b) Entwickle das Programm. c) Wegen der großen Nachfrage soll es nun drei Vorstellungen geben: 11:00, 14:30 und 18:00 Uhr. Das Programm fragt nun nach der Uhrzeit der gewünschten Vorstellung und verfährt wie oben. Erweitere dein Programm entsprechend. AUFGABE 4.5 Vom Schaum in einem Bierglas zerfällt pro Minute 15 %. a) Entwickle ein Programm, das die Zeit berechnet, nach der sich der Schaum auf 1 % der Ausgangsmenge reduziert hat. b) Erweitere das Programm um die Eingabe der Variablen n, so dass die Zeit gemessen wird, bis sich der Schaum auf n % der Ausgangsmenge reduziert hat. AUFGABE 4.6 Entwickle ein Programm, das eine in Dezimalschreibweise gegebene natürliche Zahl in römischer Schreibweise ausgibt. 1 = I; 5 = V; 10 = X; 50 = L; 100 = C; D = 500; M = 1000 Du brauchst nicht zu beachten, dass die Werte einen unter den jeweiligen höherwertigen Buchstaben (z.B. 4 = IV, 9 = IX) eigentlich recht kompliziert gebildet werden. Einführung in die imperative Programmierung mit Java Seite 19 AUFGABE 4.7 Überall muss man sich in Schlangen einreihen: An der Tür zum Klassensaal, an der Straßenbahnhaltestelle, bei der Passkontrolle, beim Arzt oder auf der Post. Für denjenigen, der gerade in der Schlange steht, ist es wichtig zu wissen, wie lange er noch etwa warten muss. Noch wichtiger ist herauszufinden, wie lange die Schlange überhaupt werden kann. Die Einmündung einer Nebenstraße in eine Hauptstraße ist durch eine Ampelanlage gesichert, die im Verlauf einer Minute 15 Sekunden lang „Grün“ zeigt. Während dieser Grünphase können höchstens fünf Fahrzeuge die Ampel passieren. Die Erfahrung zeigt, dass in jeder Minute etwa drei Fahrzeuge an die Ampel heranfahren. Wie groß wird die durchschnittliche Länge der Schlange? Der Vorgang soll mit dem Computer simuliert werden. Dazu wählt man als Zeiteinheit eine Sekunde. Da im Mittel drei Autos in der Minute an der Ampel ankommen, ist die Wahrscheinlichkeit, dass während einer Sekunde ein Auto ankommt, 1/20. Wir veranlassen daher den Computer, für jede Sekunde eine Zufallszahl zwischen 0 und 19 zu ermitteln. Ist die Zufallszahl 0, so nähert sich ein Fahrzeug der Ampel, und die Schlange wächst um 1 Fahrzeug. Falls noch Fahrzeuge an der Ampel warten, kann alle 3 Sekunden ein Auto die Ampel passieren. Es muss also die Warteschlage um 1 vermindert werden, falls der Wert der Variablen sekunde kleiner 16 und durch 3 teilbar ist. AUFGABE 4.8 Der Rechner „denkt“ sich eine Zahl zwischen 1 und 100. Der Spieler tippt so lange Zahlen, bis gedachte und getippte Zahl übereinstimmen. Als Hinweis gibt der Rechner bei jeder getippten Zahl aus, ob seine gedachte Zahl größer oder kleiner als die getippte Zahl ist. a) Schreibe ein entsprechendes Programm. b) Wie viele Tipps benötigt ein Spieler höchstens, um die gedachte Zahl zu „raten“? c) Wie viele Versuche würde ein Spieler höchstens benötigen bei einer Feldgröße von 1000 [5000, 9000, 100000] Zahlen?