• Keine Ergebnisse gefunden

Übungen zu Einführung in die Informatik:

N/A
N/A
Protected

Academic year: 2021

Aktie "Übungen zu Einführung in die Informatik:"

Copied!
6
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Ludwig-Maximilians-Universität München WS 2017/18

Institut für Informatik Übungsblatt 3

Prof. Dr. R. Hennicker, P. Wendler

Übungen zu Einführung in die Informatik:

Programmierung und Software-Entwicklung: Lösungsvorschlag

Aufgabe 3-1 Überprüfen von Ausdrücken Präsenz

In dieser Aufgabe sollen Sie Ausdrücke auf Korrektheit untersuchen. Als Grundlage für Ausdrücke in Java verwenden wir folgende EBNF-Grammatik. Die NichtterminaleVariableundValuesind wie in der Vorlesung definiert.

Expression = Variable | Value |

Expression BinOp Expression | UnOp Expression |

"(" Expression ")"

BinOp = "&" | "|" | "&&" | "||" | "+" | "-" | "*" | "/" | "%" |

"==" | "!=" | ">" | ">=" | "<" | "<="

UnOp = "!" | "(" Type ")" | "-" | "+"

Gegeben seien folgende Ausdrücke:

1. 1 + 2 2. 1 &&

3. (3 == 7) && (0 < 1) 4. 3 == 7 && 0 < 1 5. 3 == (7 && 0) < 1 6. 3 != 3 | !false 7. * 1 == 0

8. -1 == 0 9. (1 < 2) < 3 10. true + false

Geben Sie für jeden dieser Ausdrücke an, ob er syntaktisch korrekt ist oder nicht (mit Begrün- dung) und ob er typkorrekt ist oder nicht (mit Begründung). Für typkorrekte Ausdrücke ist außerdem deren Typ anzugeben.

(2)

Lösung:

1. 1 + 2 ist syntaktisch korrekt und typkorrekt und vom Typint.

2. 1 && ist syntaktisch nicht korrekt, da && eine zweistellige Operation ist, die hier nur ein- stellig verwendet wird.

3. (3 == 7) && (0 < 1)ist syntaktisch korrekt und typkorrekt und vom Typboolean.

4. 3 == 7 && 0 < 1 ist syntaktisch korrekt und typkorrekt und vom Typ boolean, denn:

Nach vollständiger Klammerung erhält man(3 == 7) && (0 < 1)wie in 3.

5. 3 == (7 && 0) < 1 ist nicht typkorrekt, da && eine boolesche Operation ist, die hier auf Ausdrücke vom Typint angewendet wird.

6. 3 != 3 | !false: Nach vollständiger Klammerung erhält man (3 != 3) | (!false).

Dieser Ausdruck ist syntaktisch korrekt und typkorrekt und vom Typboolean.

7. * 1 == 0 ist syntaktisch nicht korrekt, da * eine zweistellige Operation ist, die hier nur einstellig verwendet wird.

8. -1 == 0: Nach vollständiger Klammerung erhält man(-1) == 0. Dieser Ausdruck ist syn- taktisch korrekt und typkorrekt und vom Typ boolean.

9. (1 < 2) < 3ist nicht typkorrekt, da der erste Teil des Ausdruck(1 < 2)den Typboolean hat, der zweite Teil 3 den Typ int und < eine Operation ist, die auf beiden Argumenten einen numerischen Typ erwartet.

10. true + false ist nicht typkorrekt, da + eine zweistellige Operation mit numerischen Ar- gumenttypen ist, die hier auf Ausdrücke vom Typboolean angewendet wird.

Aufgabe 3-2 Überprüfen von Ausdrücken Hausaufgabe In dieser Aufgabe sollen Sie Ausdrücke auf Korrektheit untersuchen. Als Grundlage für Ausdrücke in Java verwenden wir die in Aufgabe 3-1 gegebene EBNF-Grammatik.

Gegeben seien folgende Ausdrücke:

1. !(3 > 5) 2. !3 < 5 3. 5 ! <= 5

4. 14 < 3 || 1/5 == 4567 5. false && (false || true) 6. false & -1

7. 5 < 7 == !

Geben Sie für jeden dieser Ausdrücke an, ob er syntaktisch korrekt ist oder nicht (mit Begrün- dung) und ob er typkorrekt ist oder nicht (mit Begründung). Für typkorrekte Ausdrücke ist außerdem deren Typ anzugeben.

(3)

Lösung:

1. !(3 > 5)ist syntaktisch korrekt und typkorrekt und vom Typboolean.

2. !3 < 5: Nach vollständiger Klammerung erhält man(!3) < 5. Dieser Ausdruck ist nicht typkorrekt, da ! eine boolesche Operation ist, die hier auf einen Ausdruck vom Typ int angewendet wird.

3. 5 ! <= 5 ist syntaktisch nicht korrekt, da nicht zwei Operationen (hier! und <=) direkt hintereinander verwendet werden dürfen.

4. 14 < 3 || 1/5 == 4567: Nach vollständiger Klammerung erhält man (14 < 3) || ((1/5) == 4567). Dieser Ausdruck ist syntaktisch korrekt und typkorrekt und vom Typboolean.

5. false && (false || true)ist syntaktisch korrekt und typkorrekt und vom Typboolean.

6. false & -1: Nach vollständiger Klammerung erhält manfalse & (-1). Dieser Ausdruck ist nicht typkorrekt, da & eine boolesche Operation ist, die hier auf einen Ausdruck vom Typint im zweiten Argument angewendet wird.

7. 5 < 7 == !ist syntaktisch nicht korrekt, da nicht zwei Operationen (hier==und!) direkt hintereinander verwendet werden dürfen.

Aufgabe 3-3 Auswertung von Ausdrücken in Java Präsenz In dieser Aufgabe sollen Sie sich mit der Auswertung von Ausdrücken in Java vertraut machen.

a) Gegeben seien folgende Variablendeklarationen:

1 i n t z a h l = 17;

2 i n t t e i l e r = 0;

Welcher Zustandσ wird durch diese Deklarationen beschrieben?

Lösung:

σ= [(zahl,17),(teiler,0)]

b) Werten Sie folgende Ausdrücke bezüglich des Zustandsσ aus Teilaufgabe a) aus:

1 1 -1 -1 -1 - z a h l

2 1 -1 -1 -1* z a hl

3 z a h l == t e i l e r

4 t e i l e r != 0 & z a h l / t e i l e r > 1

5 t e i l e r != 0 && z a h l / t e i l e r > 1

Lösung:

Vollständig geklammert:

(((1-1)-1)-1)-zahl=σ

((0-1)-1)-zahl=σ

(-1-1)-zahl=σ -2-zahl=σ -2-17=σ

-19

(4)

Vollständig geklammert:

((1-1)-1)-(1*zahl)=σ (0-1)-(1*zahl)=σ -1-(1*zahl)=σ

-1-(1*17)=σ -1-17=σ -18

Schon vollständig geklammert:

zahl == teiler=σ

17 == 0=σ false

Vollständig geklammert:

(teiler != 0) & ((zahl/teiler) > 1)=σ (0 != 0) & ((zahl/teiler) > 1)=σ

(0 != 0) & ((zahl/teiler) > 1)=σ

false & ((zahl/teiler) > 1)=σ (wegen striktem “und”) false & ((17/0) > 1)=σ

−→Laufzeitfehler Vollständig geklammert:

(teiler != 0) && ((zahl/teiler) > 1)=σ (0 != 0) && ((zahl/teiler) > 1)=σ

false && ((zahl/teiler) > 1)=σ (wegen sequentiellem “und”) false

c) Schreiben Sie ein Java-Programm, das die Ausdrücke aus Teilaufgabe b) auswertet und das Ergebnis am Bildschirm zeigt.

Lösung:

1 p u b l i c c l a s s C a l c u l a t i o n {

2 p u b l i c s t a t i c void m a i n ( S t r i n g [] a r g s ){

3 i n t z a h l = 17;

4 i n t t e i l e r = 0;

5

6 i n t c a l c u l a t i o n 1 = 1 - 1 - 1 - 1 - z a hl ;

7 S y s t e m . out . p r i n t l n ( " E r g e b n i s B e r e c h n u n g 1: " + c a l c u l a t i o n 1 );

8

9 i n t c a l c u l a t i o n 2 = 1 - 1 - 1 - 1 * z a hl ;

10 S y s t e m . out . p r i n t l n ( " E r g e b n i s B e r e c h n u n g 2: " + c a l c u l a t i o n 2 );

11

12 boolean t e s t 1 = z a h l == t e i l e r ;

13 S y s t e m . out . p r i n t l n ( " E r g e b n i s Te s t 1: " + t e s t 1 );

14

15 boolean t e s t 3 = t e i l e r != 0 && z a h l / t e i l e r > 1;

16 S y s t e m . out . p r i n t l n ( " E r g e b n i s Te s t 3: " + t e s t 3 );

17

18 boolean t e s t 2 = t e i l e r != 0 & z a h l / t e i l e r > 1;

19 S y s t e m . out . p r i n t l n ( " E r g e b n i s Te s t 2: " + t e s t 2 );

20 }

21 }

(5)

Aufgabe 3-4 Auswertung von Ausdrücken in Java Hausaufgabe In dieser Aufgabe sollen Sie sich mit der Auswertung von Ausdrücken in Java vertraut machen.

a) Gegeben seien folgende Variablendeklarationen:

1 i n t t d a y = 26; //t o d a y

2 i n t t m o n t h = 10; //t h i s m o n t h

3 i n t b d a y = 27; //my G r a n d m a ’ s b i r t h d a y is on the 27 th

4 int b m o n t h = 10; //my G r a n d m a ’ s b i r t h d a y is in O c t o b e r

Welcher Zustandσ wird durch diese Deklarationen beschrieben?

Lösung:

σ= [(tday,26),(tmonth,10),(bday,27),(bmonth,10)]

b) Werten Sie folgende Ausdrücke bezüglich des Zustandsσ aus Teilaufgabe a) aus:

1 b d a y - t d a y

2 bday - tday / 30

3 t d a y == b d a y && t m o n t h == b m o n t h

Lösung:

bday - tday=σ

27 - 26=σ 1

Vollständig geklammert:

bday - (tday / 30)=σ

27 - (tday / 30)=σ

27 - (26 / 30)=σ 27 - 0=σ

27

Vollständig geklammert:

(tday == bday) && (tmonth == bmonth)=σ

(26 == 27) && (tmonth == bmonth)=σ false && (tmonth == bmonth)=σ

false

c) Schreiben Sie ein Java-Programm, das die Ausdrücke aus Teilaufgabe b) auswertet und das Ergebnis am Bildschirm zeigt.

Lösung:

1 p u b l i c c l a s s B i r t h d a y {

2 p u b l i c s t a t i c void m a i n ( S t r i n g [] a r g s ){

3 i n t t d a y = 26; //t o d a y

4 i n t t m o n t h = 10; //t h i s m o n t h

5 i n t b d a y = 27; //my G r a n d m a ’ s b i r t h d a y is on O c t o b e r 27 th

6 int b m o n t h = 10;

7

8 int d a y s l e f t = b d a y - t d ay ;

9 S y s t e m . out . p r i n t l n (" T h e r e are s t i l l " + d a y s l e f t +

(6)

11

12 int m o n t h s l e f t = b d a y - td a y / 30; //s e m a n t i s c h n i c h t k o r r e k t

13 S y s t e m . out . p r i n t l n ( " T h e r e are s t i l l " + m o n t h s l e f t +

14 " m o n t h s l e f t u n t i l G r a n d m a ’ s b i r t h d a y . " ) ;

15

16 b o o l e a n h a p p y b i r t h d a y = t d a y == b d a y && t m o n t h == b m o n t h ;

17 S y s t e m . out . p r i n t l n (" T o d a y is G r a n d m a ’ s b i r t h d a y is " +

18 h a p p y b i r t h d a y + " . " );

19 }

20 }

Besprechung der Präsenzaufgaben in den Übungen ab 10.11.2017. Abgabe der Hausaufgaben bis Mittwoch, 22.11.2017, 14:00 Uhr über UniworX (siehe Folien der ersten Zentralübung).

• Der Java-Code in ihrer Abgabe muss als separate .java-Datei abgegeben werden. Öffnen Sie dazu im Explorer den Ordner, den Sie als Eclipse-Workspace ausgewählt haben und navigieren Sie in den entsprechenden Unterordner anhand ihrer Projektstruktur.

• Kopieren Sie alle Dateien Ihrer Abgabe in einen eigenen Ordner (für jedes Übungsblatt ein eigener Ordner) und geben Sie den gesamten Ordner als ZIP-Archiv ab. In dem Ordner dürfen nur Dateien mit der Endung .java, .pdf, .jpg oder .txt enthalten sein. Word- Dokumente werden nicht korrigiert!

• Unter Windows kann ein ZIP-Archiv wie folgt erstellt werden: rechter Mausklick auf den Ordner, Auswahl von Senden an -> ZIP-komprimierter Ordner. Unter Mac OS hinge- hen: rechter Mausklick auf den Ordner, Auswahl von Komprimieren/Compress.

Referenzen

ÄHNLICHE DOKUMENTE

Geben Sie für jeden dieser Ausdrücke an, ob er syntaktisch korrekt ist oder nicht (mit Begrün- dung) und ob er typkorrekt ist oder nicht (mit Begründung).. c) Schreiben Sie

[r]

Es gibt auch einen POSIX-Standard für reguläre Ausdrücke (siehe man 7 regex).. Reguläre Ausdrücke

• Zeichenklassen sind eine Zusammenfassung verschiedener Zeichen, die an genau einer Stelle stehen können, und werden mit Hilfe von eckigen Klammern definiert (z.B..

Dann muß dieses Programm compiliert und gewöhnlich zusammen mit einer Bibliothek von LEX-Unterprogrammen geladen werden... Das uebersetzte Programm: a.out oder Name.exe

Je nachdem, wie eine Variable mit anderen Parametern oder Konstanten in einer Aufgabenstellung verknüpft ist, entstehen unterschiedliche Ausdrücke, die in

(a) Es seien A, B, C drei Ereignisse aus dem Grundraum Ω. Geben Sie Ausdrücke für die folgenden Sachverhalte an:.. i) Es tritt keines dieser

Mit $line =&lt;INPUT&gt;; schreiben Sie die erste Zeile der Datei in die Variable $line.. Mit close (INPUT); schlieÿen Sie