Sie sind auf Seite 1von 12

Programmierung WiSe 19/20

Lösung - Übung 2
Prof.aa
Dr. J. Giesl S. Dollase, M. Hark

Tutoraufgabe 1 (Casting):
Bestimmen Sie den Typ und das Ergebnis der folgenden Java-Ausdrücke und begründen Sie Ihre Antwort.
Sollte der Ausdruck nicht typkorrekt sein, begründen Sie, worin der Fehler besteht.
Dabei seien die Variablen x, y und z wie folgt deklariert: int x = 1; int y = 2; int z = 3;

a) false && true

b) 10 / 3

c) 10 / 3.

d) x == y ? x > y : y < z

e) (byte) (127 + 1)

f ) 'x' + y + z

g) x + y + "z"

h) 1 || 0

1
Programmierung WiSe 19/20
Lösung - Übung 2

Lösung:
int x = 1; int y = 2; int z = 3;

a) false && true


Der Ausdruck liefert den Wert false vom Typ boolean, da die logische Und-Verknüpfung zweier boolean
Werte hier ganz normal ausgeführt werden kann.

b) 10 / 3
Der Ausdruck liefert den int-Wert 3, da bei der Division zweier int-Werte in Java Ganzzahldivision
ohne Rest verwendet wird.

c) 10 / 3.
Der Ausdruck liefert den double-Wert 3.3333333333333335, da der int-Wert 10 für die double-Division
erst zu double konvertiert wird.

d) x == y ? x > y : y < z
Der Ausdruck liefert den boolean-Wert true, da zuerst der boolean-Vergleich x == y zu false und
anschlieÿend y < z zu true ausgewertet wird. Der Typ von x > y ist ebenfalls boolean, weshalb kein
Fehler auftritt.

e) (byte) (127 + 1)
Der Ausdruck liefert das Ergebnis-128, da zuerst die int-Addition durchgeführt wird und das Ergebnis
+128 anschlieÿend in den byte-Datentypen konvertiert wird. Dieser Datentyp kann diesen Wert allerdings
nicht darstellen. Daher werden nur die letzten 8 Bit berücksichtigt (alle zusätzlichen Bits werden also
 abgeschnitten ; dies wird auch  Overow oder auf Deutsch Überlauf genannt).

f ) 'x' + y + z
Durch die Auswertung von links nach rechts wird zuerst 'x' + y ausgewertet. Dafür wird das Zeichen
'x' zuerst in die int-Zahl 120 konvertiert. Dies ergibt also 120 + 2 = 122. Dieser Wert wird dann mit
der int-Zahl 3 addiert, und somit wird der Gesamtausdruck zu 125 vom Typ int ausgewertet.

g) x + y + "z"
Durch die Auswertung von links nach rechts wird zuerst x + y zur int-Zahl 3 ausgewertet. Dieser Wert
wird dann mit dem String "z" verkettet, und somit wird der Gesamtausdruck zu "3z" vom Typ String
ausgewertet.

h) 1 || 0
Der Ausdruck liefert einen Fehler, da 1 und 0 vom Typ int sind und damit der boolean-Vergleich nicht
möglich ist.

Aufgabe 2 (Casting): (8 Punkte)


Bestimmen Sie den Typ und das Ergebnis der folgenden Java-Ausdrücke und begründen Sie Ihre Antwort.
Sollte der Ausdruck nicht typkorrekt sein, begründen Sie, worin der Fehler besteht.
Dabei seien die Variablen x, y und z wie folgt deklariert: int x = 120; int y = 2; int z = 3;

a) 2147483647 + '1'

b) (byte) 256 * 2147483648

c) "x" + y + z

d) x < y && true

e) 9f / 3d

f ) x + "y" - z

2
Programmierung WiSe 19/20
Lösung - Übung 2

g) 1 + 3f

h) x != 'x'? 2f : 1

Lösung:
int x = 120; int y = 2; int z = 3;

a) 2147483647 + '1'
Der Ausdruck liefert -2147483600 vom Typ int. Der char-Wert '1' wird zunächst zum int-Wert 49
konvertiert. Die anschlieÿende Addition führt zu einem Überlauf mit dem genannten negativen Ergebnis.

b) (byte) 256 * 2147483648


Der Ausdruck liefert einen Fehler, da die Zahl 2147483648 nicht als int dargestellt werden kann.

c) "x" + y + z
Der Ausdruck liefert "x23" vom Typ String. Von links nach rechts wird zunächst "x" + y berechnet
und y zu dem String "2" konvertiert. Das Zwischenergebnis "x2" wird anschlieÿend analog mit dem
konvertierten String "3" verkettet.
d) x < y && true
Der Ausdruck liefert den Wert false vom Typ boolean, da die logische Und-Verknüpfung zweier boolean
Werte hier ganz normal ausgeführt werden kann und 120 nicht kleiner ist als 2.

e) 9f / 3d
Der Ausdruck liefert 3.0 vom Typ double, da der Dividend 9f erst in einen double-Wert konvertiert
wird und anschlieÿend eine double-Division durchgeführt wird.

f ) x + "y" - z
Der Ausdruck liefert einen Fehler. Zunächst würde x zum String "120" konvertiert und anschlieÿend
mit "y" zum String "120y" verkettet. Dieser String wäre nun ein Operand für den - Operator, welcher
aber nicht für Strings deniert ist und somit zu einem Typfehler führt.

g) 1 + 3f
Der Ausdruck liefert 4.0f vom Typ float, da der erste Operand 1 erst in einen float-Wert konvertiert
und anschlieÿend eine float-Addition durchgeführt wird.
h) x != 'x'? 2f : 1
Der Ausdruck liefert 1.0f vom Typ float. Zur Auswertung des booleschen Ausdrucks wird zunächst
der char-Wert 'x' zum int-Wert 120 konvertiert. Der Vergleich schlägt also fehl, da der Wert von
x gleich 120 ist. Demnach wird die zweite Alternative zurückgegeben. Da bei primitiven Datentypen
aber die beiden Alternativen den gleichen Typ haben müssen, wird der Ausdruck 1 zunächst noch zum
float-Wert 1.0f konvertiert.

Tutoraufgabe 3 (Programmierung):
Schreiben Sie ein einfaches Java-Programm, welches den Benutzer auordert, eine positive ganze Zahl (d. h. grö-
ÿer als 0) einzugeben. Danach soll das Programm die Zahl einlesen. Diese Eingabeauorderung mit anschlie-
ÿendem Einlesen soll solange wiederholt werden, bis der Benutzer wirklich eine positive Zahl eingibt. Wenn
die Benutzereingabe keine Zahl ist, darf sich das Programm beliebig verhalten. Anschlieÿend soll der Benut-
zer aufgefordert werden, ein Wort einzugeben. Das Wort soll eingelesen und schlieÿlich so oft hintereinander
geschrieben ausgeben werden, wie durch die eingegebene positive Zahl festgelegt wurde.
Ein Ablauf des Programms könnte z.B. so aussehen:

Bitte geben Sie eine positive Zahl ein


0
Bitte geben Sie eine positive Zahl ein

3
Programmierung WiSe 19/20
Lösung - Übung 2

3
Bitte geben Sie ein Wort ein
Programmierung
ProgrammierungProgrammierungProgrammierung
Hinweise:

• Verwenden Sie die Klasse SimpleIO zum Einlesen und Ausgeben von Werten.

4
Programmierung WiSe 19/20
Lösung - Übung 2

Lösung:

/* *
* Programm zum Einlesen einer positiven Zahl und eines Worts , welches das Wort
* anschliessend so oft ausgibt , wie durch die Zahl festgelegt wurde .
*/
public class Multiecho {
public static void main ( String [] args ) {
// Einlesen der Zahl mit Ueberpruefung , dass die Zahl positiv ist :
int zahl = 0;
while ( zahl < 1) {
zahl = SimpleIO . getInt ( " Bitte geben Sie eine positive Zahl ein " );
}
// Einlesen des Wortes :
String wort = SimpleIO . getString ( " Bitte geben Sie ein Wort ein " );
// Ausgabe des Wortes so oft wie durch die Zahl festgelegt wurde :
int i = 0;
String multi = " ";
while ( i < zahl ) {
multi += wort ;
i ++;
}
SimpleIO . output ( multi , " MultiEcho " );
}
}

Aufgabe 4 (Programmierung): (7 Punkte)


Implementieren Sie einen einfachen Zinseszinz-Rechner in Java. Für die Ein-/Ausgabe soll die bereitgestell-
te KlasseSimpleIO genutzt werden. Um einen String str1 in einem Fenster mit dem Titel1 str2 auszu-
geben, nutzen Sie SimpleIO.output(str1, str2). Um einen Wert vom Typ type einzulesen, nutzen Sie
SimpleIO.getType(str), wobei str der Text ist, der dem Benutzer im Eingabefenster angezeigt wird. Um
einen Wert vom Typ int einzulesen, benutzen Sie also z.B.
SimpleIO.getInt("Bitte eine ganze Zahl eingeben").

Das Programm soll den Benutzer zunächst nach dem Startbetrag und dem Zinssatz in Prozent fragen. Beide
Werte sollen als double eingelesen werden.
Anschlieÿend soll der Benutzer gefragt werden, was er berechnen möchte. Dabei stehen ein Ziel (das die Dauer
Zeit (die den nach einer gewissen Zeit angesparten Betrag
berechnet, bis ein Zielbetrag erreicht wird) oder die
berechnet) zur Auswahl. Der Benutzer soll also entweder Ziel oder Zeit als String eingeben. Gibt der Benutzer
keines von beidem ein, soll Ihr Programm eine Fehlermeldung anzeigen und sich beenden.

Ziel Bei dieser Auswahl soll der Benutzer nach einem Zielbetrag als double gefragt werden. Anschlieÿend
soll das Programm mit Hilfe einer geeigneten Schleife berechnen, wie viele Jahre es braucht, bis der Zielbetrag
erreicht oder überschritten wurde.
Das Programm soll dann eine Ausgabe der Form Es dauert 2 Jahre bei einem Zinssatz von 5%, um von 100
auf den Betrag 110 zu sparen. Nach dieser Zeit hat man 110.25. liefern. Die Werte in diesem Beispiel sollen
vom Programm natürlich durch die Benutzereingaben und die berechneten Werte ersetzt werden.

Zeit Bei dieser Auswahl soll das Programm den Benutzer nach einer Anzahl von Jahren als int-Wert fragen.
Anschlieÿend berechnet das Programm mit einer geeigneten Schleife wie viel man nach dieser Zeit gespart hat.
Die Werte werden dann in der Form Bei einem Zinssatz von 5% und einem Startbetrag von 100 hat man nach
2 Jahren 110.25 gespart. ausgegeben.

1 Sie dürfen in dieser Aufgabe immer z.B. Zinseszinsrechner als Titel verwenden.

5
Programmierung WiSe 19/20
Lösung - Übung 2

Ein Beispiellauf des Programms könnte also so aussehen:

Bitte geben Sie den Startbetrag ein .


100
Bitte geben Sie den Zinssatz als Prozentwert ein .
5
Bitte waehlen Sie aus :
Ziel : Berechnet die Zeit , bis ein gegebener Betrag angespart wurde .
Zeit : Berechnet den Betrag , der nach einer gegebenen Zeit angespart wurde .
Ziel
Bitte geben Sie den Zielbetrag ein .
110
Es dauert 2 Jahre bei einem Zinssatz von 5% , um von 100 auf den Betrag 110
zu sparen . Nach dieser Zeit hat man 110.25.

Hinweise:

• Um zwei Strings str1 und str2 auf Gleichheit zu testen, verwenden Sie str1.equals(str2) (und nicht
str1 == str2).
• Beim Zinseszins wird jedes Jahr der aktuelle Betrag um den Zinssatz erhöht. Im obigen Beispiel wird der
Betrag im ersten Jahr um 5 (=5% · 100) erhöht. Im zweiten Jahr dann um 5.25 (=5% · 105). Im dritten
Jahr würden dann 5.5125 (=5% · 110.25) hinzu kommen.
• Legen Sie die bereitgestellte Datei SimpleIO.java einfach im gleichen Verzeichnis wie ihre Lösung ab.
Dann ndet Java diese automatisch.

Lösung:

public class Zinseszins {


public static void main ( String [] args ) {
double startbetrag = SimpleIO . getDouble ( " Bitte geben Sie den Startbetrag ein . " );

double zinssatz = SimpleIO . getDouble ( " Bitte geben Sie den Zinssatz als " +
" Prozentwert ein . " );
double multiplikator = 1.0 + 0.01 * zinssatz ;

String input = SimpleIO . getString ( " Bitte waehlen Sie aus :\ n " +
" Ziel : Berechnet die Zeit , bis ein gegebener Betrag angespart wurde .\ n " +
" Zeit : Berechnet den Betrag , der nach einer gegebenen Zeit angespart wurde . " );

if ( input . equals ( " Ziel " )) {


double zielbetrag = SimpleIO . getDouble (" Bitte geben Sie den Zielbetrag ein . " );
int jahre = 0;
double aktuell = startbetrag ;
while ( aktuell < zielbetrag ) {
aktuell *= multiplikator ;
jahre += 1;
}
SimpleIO . output (" Es dauert " + jahre + " Jahre bei einem Zinssatz von " +
zinssatz + " % , um von " + startbetrag + " auf den Betrag " + zielbetrag +
" zu sparen . Nach dieser Zeit hat man " + aktuell , " Zinseszins " );
} else if ( input . equals ( " Zeit " )) {
int jahre = SimpleIO . getInt ( " Bitte geben Sie die Zeit in Jahren ein . " );
double aktuell = startbetrag ;
for ( int i = 0; i < jahre ; i ++) {
aktuell *= multiplikator ;
}
SimpleIO . output (" Bei einem Zinssatz von " +
zinssatz + " % und einem Startbetrag von " + startbetrag + " hat man nach " +

6
Programmierung WiSe 19/20
Lösung - Übung 2

jahre + " Jahren " + aktuell + " gespart . " , " Zinseszins " );
} else {
SimpleIO . output (" Falsche Eingabe ! " , " Fehler " );
}
}
}

Tutoraufgabe 5 (Verikation):
Gegeben sei folgendes Java-Programm P über den Integer-Variablen x , y, c und res:

hy≥0i (Vorbedingung)

res = 1;
c = y;
while (c > 0) {
res = res * x;
c = c - 1;
}
h res = xy i (Nachbedingung)

a) Vervollständigen Sie die folgende Verikation des Algorithmus im Hoare-Kalkül, indem Sie die unterstri-
chenen Teile ergänzen. Hierbei dürfen zwei Zusicherungen nur dann direkt untereinander stehen, wenn
die untere aus der oberen folgt. Hinter einer Programmanweisung darf nur eine Zusicherung stehen, wenn
dies aus einer Regel des Hoare-Kalküls folgt.

Hinweise:

• Sie dürfen beliebig viele Zusicherungs-Zeilen ergänzen oder streichen. In der Musterlösung werden
allerdings genau die angegebenen Zusicherungen benutzt.

• Bedenken Sie, dass die Regeln des Kalküls syntaktisch sind, weshalb Sie semantische Änderungen
(beispielsweise von x+1 = y+1 zu x = y ) nur unter Zuhilfenahme der Konsequenzregeln vornehmen
dürfen.

b) Untersuchen Sie den Algorithmus P auf seine Terminierung. Für einen Beweis der Terminierung muss eine
Variante angegeben werden und mit Hilfe des Hoare-Kalküls die Terminierung unter der Voraussetzung
y≥0 bewiesen werden.

Lösung:

a) hy ≥ 0i
hy ≥ 0 ∧ 1 = 1 ∧ y = yi
res = 1;
hy ≥ 0 ∧ res = 1 ∧ y = yi
c = y;
hy ≥ 0 ∧ res = 1 ∧ c = yi
hxy = res ∗ xc ∧ c ≥ 0i
while (c > 0) {
hxy = res ∗ xc ∧ c ≥ 0 ∧ c > 0i
hxy = res ∗ x ∗ xc−1 ∧ c − 1 ≥ 0i
res = res * x;
hxy = res ∗ xc−1 ∧ c − 1 ≥ 0i
c = c - 1;
hxy = res ∗ xc ∧ c ≥ 0i

7
Programmierung WiSe 19/20
Lösung - Übung 2

}
hxy = res ∗ xc ∧ c ≥ 0 ∧ ¬c > 0i
hres = xy i

b) Eine gültige Variante für die Terminierung ist V = c, denn die Schleifenbedingung B=c>0 impliziert
c≥0 und es gilt:

hc = m ∧ c > 0i
hc − 1 < mi
res = res * x;
hc − 1 < mi
c = c - 1;
hc < mi

Damit ist die Terminierung der einzigen Schleife in P gezeigt.

Aufgabe 6 (Verikation): (7 + 2 = 9 Punkte)


Gegeben sei folgendes Java-Programm P über den Integer-Variablen n, i, sign und res:
h0 ≤ ni (Vorbedingung)
sign = 1;
res = 0;
i = 0;
while (i < n) {
res = -(res + sign);
sign = -sign;
i = i + 1;
}
hres = (−1)n · ni (Nachbedingung)

a) Vervollständigen Sie die folgende Verikation des Algorithmus im Hoare-Kalkül, indem Sie die unterstri-
chenen Teile ergänzen. Hierbei dürfen zwei Zusicherungen nur dann direkt untereinander stehen, wenn
die untere aus der oberen folgt. Hinter einer Programmanweisung darf nur eine Zusicherung stehen, wenn
dies aus einer Regel des Hoare-Kalküls folgt.

Hinweise:

• Sie dürfen beliebig viele Zusicherungs-Zeilen ergänzen oder streichen. In der Musterlösung werden
allerdings genau die angegebenen Zusicherungen benutzt.

• Bedenken Sie, dass die Regeln des Kalküls syntaktisch sind, weshalb Sie semantische Änderungen
(beispielsweise von x+1 = y+1 zu x = y ) nur unter Zuhilfenahme der Konsequenzregeln vornehmen
dürfen.

b) Untersuchen Sie den Algorithmus P auf seine Terminierung. Für einen Beweis der Terminierung muss
eine Variante angegeben werden und mit Hilfe des Hoare-Kalküls die Terminierung bewiesen werden.

Lösung:

a) h0 ≤ ni
h0 = 1 · 0 ∧ 1 = (−1)0 ∧ 0 ≤ ni

8
Programmierung WiSe 19/20
Lösung - Übung 2

sign = 1;
h0 = sign · 0 ∧ sign = (−1)0 ∧ 0 ≤ ni
res = 0;
hres = sign · 0 ∧ sign = (−1)0 ∧ 0 ≤ ni
i = 0;
hres = sign · i ∧ sign = (−1)i ∧ i ≤ ni
while (i < n) {
hres = sign · i ∧ sign = (−1)i ∧ i ≤ n ∧ i < ni
h−(res + sign) = (−sign) · (i + 1) ∧ −sign = (−1)i+1 ∧ i + 1 ≤ ni
res = -(res + sign);
hres = (−sign) · (i + 1) ∧ −sign = (−1)i+1 ∧ i + 1 ≤ ni
sign = -sign;
hres = sign · (i + 1) ∧ sign = (−1)i+1 ∧ i + 1 ≤ ni
i = i + 1;
hres = sign · i ∧ sign = (−1)i ∧ i ≤ ni
}
hres = sign · i ∧ sign = (−1)i ∧ i ≤ n ∧ ¬(i < n)i
hres = (−1)n · ni

b) Wir wählen als Variante V = n − i. Hiermit lässt sich die Terminierung von P beweisen, denn für die
einzige Schleife im Programm (mit Schleifenbedingung B = i < n) gilt:

• B ⇒ V ≥ 0, denn B ⇔i<n⇔n−i>0⇔V >0 und

• die folgende Ableitung ist korrekt:


hn − i = m ∧ i < ni
hn − (i + 1) < mi
res = -(res + sign);
hn − (i + 1) < mi
sign = -sign;
hn − (i + 1) < mi
i = i + 1;
hn − i < mi

Tutoraufgabe 7 (Verikation):
Gegeben sei folgendes Java-Programm P , das zu zwei Eingaben x = a und y = b den Wert |a − b| berechnet.

hx=a∧y=bi (Vorbedingung)

res = 0;
while (x != y) {
if (x > y) {
x = x - 1;
} else {
y = y - 1;
}
res = res + 1;
}
h res = |a − b| i (Nachbedingung)

9
Programmierung WiSe 19/20
Lösung - Übung 2

a) Vervollständigen Sie die folgende Verikation des Algorithmus im Hoare-Kalkül, indem Sie die unterstri-
chenen Teile ergänzen. Hierbei dürfen zwei Zusicherungen nur dann direkt untereinander stehen, wenn
die untere aus der oberen folgt. Hinter einer Programmanweisung darf nur eine Zusicherung stehen, wenn
dies aus einer Regel des Hoare-Kalküls folgt.

Hinweise:

• Für alle x, y ∈ Z gilt:


x > y =⇒ |(x − 1) − y| = |x − y| − 1
und
x 6= y ∧ ¬(x > y) =⇒ |x − (y − 1)| = |x − y| − 1.
Achtung: Falls lediglich x≥y bzw. x≤y gilt, gelten beide Gleichungen nicht im Allgemeinen.

• Sie dürfen beliebig viele Zusicherungs-Zeilen ergänzen oder streichen. In der Musterlösung werden
allerdings genau die angegebenen Zusicherungen benutzt.

• Bedenken Sie, dass die Regeln des Kalküls syntaktisch sind, weshalb Sie semantische Änderungen
(beispielsweise von x+1 = y+1 zu x = y ) nur unter Zuhilfenahme der Konsequenzregeln vornehmen
dürfen. Klammern dürfen und müssen Sie jedoch eventuell bei der Anwendung der Zuweisungsregel
setzen.

• Es empehlt sich oft, bei der Erstellung der Zusicherungen in der Schleife von unten (d. h. von der
Nachbedingung aus) vorzugehen.

b) Beweisen Sie die Terminierung des Algorithmus im Hoare-Kalkül.

Lösung:

a) hx = a ∧ y = bi
hx = a ∧ y = b ∧ 0 = 0i
res = 0;
hx = a ∧ y = b ∧ res = 0i
hres = |a − b| − |x − y|i
while (x != y) {
hres = |a − b| − |x − y| ∧ x 6= yi
hres + 1 = |a − b| − (|x − y| − 1) ∧ x 6= yi
if (x > y) {
hres + 1 = |a − b| − (|x − y| − 1) ∧ x 6= y ∧ x > yi
hres + 1 = |a − b| − |(x − 1) − y|i
x = x - 1;
hres + 1 = |a − b| − |x − y|i
} else {
hres + 1 = |a − b| − (|x − y| − 1) ∧ x 6= y ∧ ¬(x > y)i
hres + 1 = |a − b| − |x − (y − 1)|i
y = y - 1;
hres + 1 = |a − b| − |x − y|i
}
hres + 1 = |a − b| − |x − y|i
res = res + 1;
hres = |a − b| − |x − y|i
}
hres = |a − b| − |x − y| ∧ x = yi
hres = |a − b|i

b) Eine gültige Variante für die Terminierung ist V = |x − y|.


Die Schleifenbedingung B = x 6= y impliziert |x − y| > 0 und damit V ≥ 0. Es gilt:

10
Programmierung WiSe 19/20
Lösung - Übung 2

h|x − y| = m ∧ x 6= yi
h|x − y| − 1 < m ∧ x 6= yi
if (x > y) {
h|x − y| − 1 < m ∧ x 6= y ∧ x > yi
h|(x − 1) − y| < mi
x = x - 1;
h|x − y| < mi
} else {
h|x − y| − 1 < m ∧ x 6= y ∧ ¬(x > y)i
h|x − (y − 1)| < mi
y = y - 1;
h|x − y| < mi
}
h|x − y| < mi
res = res + 1;
h|x − y| < mi

Damit ist die Terminierung der einzigen Schleife in P gezeigt.

Aufgabe 8 (Verikation): (7 + 2 = 9 Punkte)


Gegeben sei folgendes Java-Programm P über den Integer-Variablen n, i und res:
h0 ≤ ni (Vorbedingung)
i = 0;
res = 0;
while (i < n) {
if (i % 2 == 0) {
res = res + n;
} else {
res = res - 1;
}
i = i + 1;
}
hres = d 2n e · n − b 2n ci (Nachbedingung)

Vervollständigen Sie die folgende Verikation des Algorithmus im Hoare-Kalkül, indem Sie die unterstrichenen
Teile ergänzen. Hierbei dürfen zwei Zusicherungen nur dann direkt untereinander stehen, wenn die untere aus
der oberen folgt. Hinter einer Programmanweisung darf nur eine Zusicherung stehen, wenn dies aus einer Regel
des Hoare-Kalküls folgt.

Hinweise:

• Sie dürfen beliebig viele Zusicherungs-Zeilen ergänzen oder streichen. In der Musterlösung werden aller-
dings genau die angegebenen Zusicherungen benutzt.

• Bedenken Sie, dass die Regeln des Kalküls syntaktisch sind, weshalb Sie semantische Änderungen (bei-
spielsweise von x+1 = y+1 zu x = y) nur unter Zuhilfenahme der Konsequenzregeln vornehmen
dürfen.

• dxe ist die kleinste Zahl n ∈ Z, sodass n≥x gilt. bxc ist die gröÿte Zahl n ∈ Z, sodass n≤x gilt.

• Für nicht-negative Zahlen berechnet der Java-Operator % die modulo-Funktion.

11
Programmierung WiSe 19/20
Lösung - Übung 2

Lösung:

h0 ≤ ni
h0 = d 02 e · n − b 02 c ∧ 0 ≤ ni
i = 0;
h0 = d 2i e · n − b 2i c ∧ i ≤ ni
res = 0;
hres = d 2i e · n − b 2i c ∧ i ≤ ni
while (i < n) {
hres = d 2i e · n − b 2i c ∧ i ≤ n ∧ i < ni
if (i % 2 == 0) {
hres = d 2i e · n − b 2i c ∧ i ≤ n ∧ i < n ∧ i%2 = 0i
hres + n = d i+1 i+1
2 e · n − b 2 c ∧ i + 1 ≤ ni
res = res + n;
hres = d i+1 i+1
2 e · n − b 2 c ∧ i + 1 ≤ ni
} else {
hres = d 2i e · n − b 2i c ∧ i ≤ n ∧ i < n ∧ i%2 6= 0i
hres − 1 = d i+1 i+1
2 e · n − b 2 c ∧ i + 1 ≤ ni
res = res - 1;
hres = d i+1 i+1
2 e · n − b 2 c ∧ i + 1 ≤ ni
}
hres = d i+1 i+1
2 e · n − b 2 c ∧ i + 1 ≤ ni
i = i + 1;
hres = d 2i e · n − b 2i c ∧ i ≤ ni
}
hres = d 2i e · n − b 2i c ∧ i ≤ n ∧ ¬(i < n)i
hres = d 2n e · n − b 2n ci

Im if-Fall gilt i%2 = 0 =⇒ d i+1 i i+1 i


2 e · n = d 2 e · n + n sowie i%2 = 0 =⇒ b 2 c = b 2 c.
i+1 i i+1 i
gilt i%2 6= 0 =⇒ d
Im else-Fall
2 e · n = d 2 e · n sowie i%2 6= 0 =⇒ b 2 c = b 2 c + 1.

Aufgabe 9 (Deck 1): (Codescape)


Lösen Sie die Räume von Deck 1 des Spiels Codescape.
Ihre Lösung für Räume dieses Codescape Decks wird nur dann für die Zulassung gezählt, wenn Sie die Lösung
bis Montag, den 04.11.2019, um 12:00 Uhr abschicken.

Lösung:

12

Das könnte Ihnen auch gefallen