4. Aufgabe G= [A,M,s,R] A= {a,b,…,z,A,B,…Z,0,1,…,9,>,<,=, ; , + , * , - , \ , ( , ) ,MOD, DIV, BEGIN, END, FOR, IF, ENDIF, THEN, ELSE TO, DO, WHILE, ENDWHILE, REPEAT, UNTIL, WRITE, READ} M= {S, Anweisung, Zuweisung, Test, Schleife, Eingabe, Ausgabe, Variable, Zahl, ArithOperator, Funktion, Vergleich, VergOperator, Ziffer, Buchstabe} s=S R: S::= “BEGIN“ {Anweisung} “END“ Anweisung::= ( Zuweisung; | Ausdruck; | Test; | Schleife; | Eingabe; | Ausgabe; ) Zuweisung::= Variable ’’:=’’ Ausdruck Ausdruck::= ( “(“ Ausdruck “)“ | Variable | Zahl | Ausdruck ArithOperator Ausdruck | Funktion(Ausdruck) ) ArithOperator::= ( + | - | * | \ | MOD | DIV ) Test::= “IF“ Vergleich “THEN“ Anweisung {Anweisung}[ “ELSE“ Anweisung {Anweisung} ] “ENDIF“ Vergleich::= ( Ausdruck VergOperator Ausdruck | “NOT“ Ausdruck ) VergOperator::= ( < | > | = | >= | <= | <>) Schleife::= ( “FOR“ Zuweisung “TO“ Ausdruck “DO“ Anweisung {Anweisung} “ENDFOR“ | “WHILE“ Vergleich “DO“ Anweisung {Anweisung} “ENDWHILE“ | “REPEAT“ Anweisung {Anweisung} “UNTIL“ Vergleich ) Eingabe::= “READ(“ Variable “)“ Ausgabe::= “WRITE(“ Variable “)“ Zahl::= Ziffer { Ziffer } [ “.“ Ziffer { Ziffer } ] Ziffer::= (0 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ) Funktion::= Buchstabe { ( Buchstabe | Ziffer ) } Variable::= Buchstabe { ( Buchstabe | Ziffer ) } Buchstabe::= (a|b|c|…|x|y|z|A|B|C|…|X|Y|Z) 2. Aufgabe G= A= s= M= [A,M,s,R] {=,\,*,M,(,),∩,Ø,U} G {G,T,O,V,S} R= { (G, T=T), (T, (VO)O), (T, VO), (V, Ø), (V, MS), (V, ), (S, *S), (S, ), (O, ∩T), (O, UT), (O, \T), (O, ) } 3. Aufgabe Als WHILE-Schleife: BEGIN READ(m); n := 0; WHILE n <= 0 DO WRITE(n); n := n+ 1; ENDWHILE; END Als REPEAT-Schleife: BEGIN READ(m); n := 1; REPEAT WRITE(n); n := n + 1; UNTIL n := ( m – 1); END Aufgabe 1 a) BEGIN m := 101; n := 1; REPEAT f:= ROUND( (m - n) / 2 ) + n ; IF ( m – n ) > 1 THEN antwort = FRAGE(f); IF antwort = wahr THEN m := f; ELSE n := f; ELSE ende := 1; ENDIF; UNTIL ende=1; WRITE(f); END Die Funktion ROUND(x) rundet den übergebenen Wert: BEGIN xN:= x DIV 1; Tmp := x –xN; Tmp := Tmp * 10; Tmp := Tmp DIV 1; IF tmp > 5 THEN ROUND := xN +1; ELSE ROUND := xN; ENDIF; END b) ungünstigster Fall: 7 günstigster Fall: 6 Kommentar: Das Programm aus Aufgabe 1 ist als Pascal-Programm unter: http://www.informatik.huberlin.de/~hachenbe/Dateien/ zu finden! (Zahlenraten.pas, Zahlenraten.exe)