imperative Programmierung mit Java

Werbung
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   i1 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?
Herunterladen