12.07.2015 Aufrufe

Tutoraufgabe 1 (Syntax und Semantik): Lösung: Tutoraufgabe 2 ...

Tutoraufgabe 1 (Syntax und Semantik): Lösung: Tutoraufgabe 2 ...

Tutoraufgabe 1 (Syntax und Semantik): Lösung: Tutoraufgabe 2 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN
  • Keine Tags gefunden...

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Prof. aa Dr. J. GieslProgrammierung WS12/13Tutoriumslösung - Übung 1 (Abgabe 26.10.2012)M. Brockschmidt, F. Emmes, C. Otto, T. Ströder<strong>Tutoraufgabe</strong> 1 (<strong>Syntax</strong> <strong>und</strong> <strong>Semantik</strong>):1. Was ist <strong>Syntax</strong>? Was ist <strong>Semantik</strong>? Erläutern Sie den Unterschied.2. Impliziert gleiche <strong>Syntax</strong> auch gleiche <strong>Semantik</strong>? Geben Sie ein Beispiel.3. Erläutern Sie folgende Aussage: Ein syntaktisch korrektes Programm ist nicht immer korrekt.<strong>Lösung</strong>:1. Die <strong>Syntax</strong> einer Programmiersprache bezeichnet die Regeln, welche festlegen, ob eine Zeichenketteein strukturell korrektes Programm ist, d.h. vom Compiler oder Interpreter der Programmierspracheeingelesen <strong>und</strong> ausgeführt werden kann. In der Regel wird die <strong>Syntax</strong> einer Programmiersprache durcheine Grammatik (beispielsweise in EBNF) skizziert. Oftmals beschreibt eine solche Grammatik allerdingseine Obermenge der vom Compiler oder Interpreter akzeptierten Programme, da dieser weitere Kriterienfordert (beispielsweise könnte er nur wohlgetypte Programme akzeptieren).Die <strong>Semantik</strong> einer Programmiersprache gibt ihren syntaktisch korrekten Programmen eine Bedeutung.Sie legt somit fest, was das Ergebnis <strong>und</strong> nach außen sichtbare Verhalten einer Ausführung eines Programmsist.2. Nein. Zwei syntaktisch identische Programme (d.h. die gleiche Zeichenkette) können mit verschiedener<strong>Semantik</strong> verschieden interpretiert werden.Beispielsweise könnte man festlegen, dass die Division div(x,y) zweier Integer x <strong>und</strong> y in Sprache Adefiniert ist als ⌊ x y ⌋ <strong>und</strong> in Sprache B als ⌈ x y⌉. Somit hat der Ausdruck div(3,2) in Sprache A die<strong>Semantik</strong> 1 <strong>und</strong> in Sprache B die <strong>Semantik</strong> 2.3. Die Aussage ist richtig. Ein Programm ist korrekt, wenn es genau die Anforderungen erfüllt, für diees entwickelt wurde. Lautet die Anforderung, dass das Programm die ersten eintausend Primzahlenausgeben soll, so ist ein syntaktisch korrektes Programm welches stattdessen “Hello world!” ausgibtnicht korrekt.<strong>Tutoraufgabe</strong> 2 (Formale Sprachen <strong>und</strong> Grammatiken):Gegeben sei die folgende Sprache:L = {w ∈ {a, b} ∗ | Es existiert ein y ∈ {a, b} ∗ mit w = ay oder ♯ b (w) = 2}Hierbei bezeichnet ♯ b (w) die Anzahl der b-s in dem Wort w. Das heißt, L enthält genau die endlichen Wörter,die mit a beginnen oder genau zwei b-s enthalten.Die folgenden Wörter sind beispielsweise in der Sprache enthalten:bab ababba abbaFolgende Wörter sind nicht Bestandteil der Sprache:baa babaab b εa) Geben Sie eine kontextfreie Grammatik an, welche die Sprache L erzeugt.b) Geben Sie eine Grammatik in EBNF mit nur einer Regel an, die L definiert.Um die Lesbarkeit zu erhöhen, dürfen Sie Anführungszeichen um Terminalsymbole weglassen.c) Geben Sie ein <strong>Syntax</strong>diagramm ohne Nichtterminalsymbole an, das die Sprache L definiert.1


Programmierung WS12/13Tutoriumslösung - Übung 1 (Abgabe 26.10.2012)<strong>Lösung</strong>:a) Die kontextfreie Grammatik G = (N, T, P, S) mit N = {S, A, B}, T = {a, b} <strong>und</strong> P definiert wie folgt:S −→ AbAbAS −→ aBA −→ aAA −→ εB −→ aBB −→ bBB −→ εerzeugt genau die Sprache L. Mit dem Nonterminal S wählt man, ob man ein Wort mit zwei b-s erzeugenmöchte oder eines, das mit a beginnt. Das Nonterminal A erzeugt beliebig viele a-s. Dadurch bleibt dieAnzahl der b-s im Wort konstant. B erzeugt beliebige Wörter aus {a, b} ∗ , da nach dem Wortanfang abeliebige Folgen von a <strong>und</strong> b folgen können.Es ist auch möglich, die <strong>Lösung</strong> leicht abzuwandeln. Die erste Regel, S −→ AbAbA, dient eigentlich zurKonstruktion eines Wortes, das genau zwei b-s enthält. Nutzt man aber das erste A zur Ableitung einesa, ist das Wort wegen der zweiten Bedingung in der Sprache enthalten <strong>und</strong> könnte genauso mithilfe derzweiten Regel abgeleitet werden. Es ist daher möglich, die erste Regel durch S −→ bAbA zu ersetzen.b) Die folgende Grammatik in EBNF mit nur einer Regel definiert genau L.S = ({a}b{a}b{a} | a{(a | b)} )} {{ } } {{ }12Diese Konstruktion ist ähnlich zu der Grammatik aus Teilaufgabe a). In der ersten Hälfte wird ein Wortmit genau zwei b-s erzeugt. Im zweiten Teil wird ein Wort erzeugt, das mit a beginnt <strong>und</strong> mit einembeliebigen Wort aus {a, b} ∗ endet.Analog zur alternativen <strong>Lösung</strong> in Teilaufgabe a) kann hier eine Vereinfachung vorgenommen werden:S = (b{a}b{a} | a{(a | b)} )} {{ } } {{ }12c) Das folgende <strong>Syntax</strong>diagramm definiert die Sprache L:a b a b aaabAuch hier gibt es wie in Teilaufgaben a) <strong>und</strong> b) eine etwas weniger komplexe <strong>Lösung</strong>:2


Programmierung WS12/13Tutoriumslösung - Übung 1 (Abgabe 26.10.2012)b a b aaab<strong>Tutoraufgabe</strong> 4 (Zweierkomplement):a) Erklären Sie im Detail, wie die beiden Ausgaben des folgenden Programms berechnet werden.public class Test {public static void main ( String [] args ) {int zahl = -2147483648;}}System . out . println ( zahl + 1);System . out . println ( zahl - 1);Hinweis: −2 31 = −2147483648b) Welche Zahlen repräsentieren die folgenden Bitfolgen im 5-Bit Zweierkomplement?00010 10111 11011 01101 10000c) Sei x eine ganze Zahl. Wie unterscheidet sich die Zweierkomplement-Darstellung von x <strong>und</strong> −x?<strong>Lösung</strong>:a) Im Folgenden werden Binärzahlen mit einem Z markiert, wenn die Zahl im Zweierkomplement verstandenwerden muss. Die Zahl 1111Z ist also als −1 zu verstehen, während 1111 für die Zahl 15 steht.Der Datentyp int benutzt 32 Bit. Die Darstellung der Zahl −2147483648 im Zweierkomplement ist10000000000000000000000000000000 Z (31 Nullen)Das Ergebnis der Addition zahl + 1 berechnet sich wie folgt:10000000000000000000000000000000 Z00000000000000000000000000000001 Z--------------------------------10000000000000000000000000000001 ZAuch hier gibt die führende 1 an, dass die dargestellte Zahl negativ ist. Den Dezimalwert der dargestelltenZahl erhält man durch Invertieren <strong>und</strong> Addieren von 10111111111111111111111111111111000000000000000000000000000000001--------------------------------011111111111111111111111111111113


Programmierung WS12/13Tutoriumslösung - Übung 1 (Abgabe 26.10.2012)was für 2147483647 steht. Mit der Vorzeicheninformation von oben ergibt sich -2147483647.Berechnet man zahl - 1, berechnet sich das Ergebnis durch die Addition mit -1. Die Zahl -1 ist imZweierkomplement dargestellt durch11111111111111111111111111111111 ZDie Addition -2147483648 + (-1) ergibt demzufolge10000000000000000000000000000000 Z11111111111111111111111111111111 Z--------------------------------01111111111111111111111111111111 ZDas Ergebnis ist also nicht negativ (angedeutet durch die führende 0) <strong>und</strong> entspricht der Dezimalzahl+2147483647. Dieses Ergebnis wird auch durch das Java-Programm ausgegeben.b)Bitfolge 5-Bit Zweierkomplement00010 210111 -911011 -501101 1310000 -16c) Ausgehend von der Zweierkomplement-Darstellung von x erreicht man durch die folgenden beiden Schrittedie Zweierkomplement-Darstellung von −x.a) vertausche alle 0 <strong>und</strong> 1enb) addiere 1Mit diesen beiden Schritten ist es auch die Rückrichtung (−x zu x) möglich.In der folgenden Tabelle finden Sie alle Binärzahlen mit drei Ziffern. Man erkennt, dass das genannteVerfahren funktioniert.3 0112 0101 0010 000-1 111-2 110-3 101-4 100<strong>Tutoraufgabe</strong> 6 (Typkonversion):Bestimmen Sie, falls möglich, den Typ <strong>und</strong> das Ergebnis der folgenden Java-Ausdrücke. Dabei seien die Variablenx, y <strong>und</strong> z wie folgt deklariert: int x = 1; int y = 2; int z = 3;a) false && trueb) 10 / 3c) 10 / 3.d) x == y ? x > y : y < z4


Programmierung WS12/13Tutoriumslösung - Übung 1 (Abgabe 26.10.2012)e) (byte) (127 + 1)f) ’x’ + y + zg) x + y + "z"h) 1 || 0<strong>Lösung</strong>:int x = 1; int y = 2; int z = 3;a) false && trueDer Ausdruck liefert den Wert false vom Typ boolean.b) 10 / 3Der Ausdruck liefert den int-Wert 3.c) 10 / 3.Der Ausdruck liefert den double-Wert 3.3333333333333335, da der int-Wert 10 für die double-Divisionerst zu double konvertiert wird.d) x == y ? x > y : y < zDer Ausdruck liefert den boolean-Wert true, da zuerst der boolean-Vergleich x == y zu false <strong>und</strong>anschließend y < z zu true ausgewertet wird. Der Typ von x > y ist ebenfalls boolean, weshalb keinFehler auftritt.e) (byte) (127 + 1)Der Ausdruck liefert das Ergebnis -128, da zuerst die int-Addition durchgeführt wird <strong>und</strong> das Ergebnis+128 anschließend in den byte-Datentypen konvertiert wird, wobei dieser den Wert allerdings nichtdarstellen kann. Hierbei werden nur die letzten 8 Bit berücksichtigt (alle zusätzlichen Bits werden also„abgeschnitten“).f) ’x’ + y + zDurch 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 derint-Zahl 3 addiert, <strong>und</strong> 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 Wertwird dann mit dem String "z" verkettet, <strong>und</strong> somit wird der Gesamtaudruck zu "3z" vom Typ Stringausgewertet.h) 1 || 0Der Ausdruck liefert einen Fehler, da 1 <strong>und</strong> 0 vom Typ int sind <strong>und</strong> damit der boolean-Vergleich nichtmöglich ist.5


Programmierung WS12/13Tutoriumslösung - Übung 1 (Abgabe 26.10.2012)<strong>Tutoraufgabe</strong> 8 (Einfache Programmierung):Schreiben Sie ein einfaches Java-Programm, welches den Benutzer auffordert, eine positive Zahl ganze Zahl(d. h. größer als 0) einzugeben. Danach soll das Programm eine durch die Return-Taste beendete Zahl einlesen.Diese Eingabeaufforderung mit anschließendem Einlesen soll solange wiederholt werden, bis der Benutzer einepositive Zahl eingibt. Anschließend soll der Benutzer aufgefordert werden, ein Wort einzugeben. Dieses sollebenfalls durch die Return-Taste beendet werden. Das Wort soll eingelesen <strong>und</strong> schließlich so oft hintereinanderin einer Zeile ausgeben werden, wie durch die eingegebene positive Zahl festgelegt.<strong>Lösung</strong>:public class Multiecho {}public static void main ( String [] args ) {int zahl = 0;while ( zahl < 1) {System . out . println (" Bitte geben Sie eine positive Zahl ein :");zahl = Integer . parseInt ( System . console (). readLine ());}System . out . println (" Bitte geben Sie ein Wort ein :");String wort = System . console (). readLine ();int i = 0;while (i < zahl ) {System . out . print ( wort );i ++;}}6

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!