11.08.2013 Aufrufe

Lösungen zum 3. Übungsblatt/Testatblatt Informatik I

Lösungen zum 3. Übungsblatt/Testatblatt Informatik I

Lösungen zum 3. Übungsblatt/Testatblatt Informatik I

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Aufgabe 1<br />

<strong>Lösungen</strong> <strong>zum</strong> <strong>3.</strong> <strong>Übungsblatt</strong>/<strong>Testatblatt</strong><br />

<strong>Informatik</strong> I<br />

David Borowsky, Tobias Müller<br />

Gruppe Björn Appel<br />

Tübingen, den 16. November 2004<br />

1 ; Datendefinition/Analyse:<br />

2 ; ========================<br />

3 ; Der Tiger wird als Record repräsentiert:<br />

4 ; (make-tiger AnzahlderZaehne LaengeDerKrallen ZuletztGrfressenePerson AnzahlStreifen)<br />

5 ; Die Eigenschaften des Tigers:<br />

6 ; AnzahlderZaehne: Anzahl der Zaehne des Tigers, Wert ist eine Zahl (number)<br />

7 ; LaengeDerKrallen: Laenge der Krallen des Tigers in cm, Wert ist eine Zahl (number)<br />

8 ; ZuletztGefressenePerson: Name der zuletzt gefressenen Person, Wer ist ein Symbol (symbol).<br />

9 ; Wenn der Tiger noch niemand gegessen hat wird das Symbol ’niemand verwendet.<br />

10 ; AnzahlStreifen: Anzahl der Streifen auf dem Fell des Tigers, Wert ist eine Zahl (number)<br />

12 (define-record-procedures tiger<br />

13 make-tiger<br />

14 tiger?<br />

15 (tiger-AnzahlDerZaehne<br />

16 tiger-LaengeDerKrallen<br />

17 tiger-ZuletztGefressenePerson<br />

18 tiger-AnzahlStreifen))<br />

20 ; Jetzt erzeugen wir mal einen normalen Zootiger und einen amerikanischen Präsidententiger<br />

21 (define zoo-tiger (make-tiger 10 2 ’niemand 50))<br />

22 (define usa-tiger (make-tiger 20 10 ’GeorgeWBush 100))<br />

24 (display "Jetzt schauen wir erstmal ob unsere beiden Tiger überhaupt vom Record Typ Tiger sind")<br />

25 (equal? (tiger? zoo-tiger) #t)<br />

26 (equal? (tiger? usa-tiger) #t)<br />

28 (display "Nun überprüfen wir noch ob der Zoo-Tiger derselbe ist wie der USA-Tiger (sollte ja nicht der Fall sein)")<br />

29 (equal? zoo-tiger usa-tiger)<br />

30 (display "und ob der zoo-tiger derselbe Tiger wie der (make-tiger 10 2 ’niemand 50) ist (sollte der Fall sein)")<br />

31 (equal? zoo-tiger (make-tiger 10 2 ’niemand 50))<br />

33 ; Nun definieren wir eine Funktion die einen Tiger gefährlicher macht.<br />

34 ; Ein gefährlicher Tiger sei für uns ein Tiger der mehr Zähne und längere Krallen hat.<br />

35 ; Anzahl der Streifen auf dem Fell ist eher was für einen Tiger-Beauty-wettbewerb und ob ein<br />

36 ; Tiger schon jemand (einen Menschen) gefressen sagt auch nicht wirklich was über seine<br />

37 ; Gefährlichkeit, da er ja vielleicht irgendwo lebt, wo es (fast) gar keine Menschen gibt.<br />

39 ; Funktion "Mache-Gefaehrlicher!"<br />

40 ; Vertrag: tiger -> tiger<br />

41 (define Mache-Gefaehrlicher! (lambda (a-tiger) (make-tiger<br />

42 (+ (tiger-AnzahlDerZaehne a-tiger) 2 )<br />

43 (+ (tiger-LaengeDerKrallen a-tiger) 1 )<br />

44 (tiger-ZuletztGefressenePerson a-tiger)<br />

45 (tiger-AnzahlStreifen a-tiger)<br />

46 )))<br />

48 (display "Ein gefährlicher Zootiger sollte 12 Zähne und 3 cm lange Krallen haben.")<br />

49 (equal? (Mache-Gefaehrlicher! zoo-tiger) (make-tiger 12 3 ’niemand 50))<br />

Aufgabe 2<br />

Heiners Freudin Eva Lu Ator hat natürlich Recht, da Scheme beim Auswerten des heiner-if zuerst alle Operanden<br />

komplett auswertet und diese dann an die Funktion heiner-if übergibt. Das native if macht dies nicht.<br />

1


<strong>Lösungen</strong> <strong>zum</strong> <strong>3.</strong> <strong>Übungsblatt</strong>/<strong>Testatblatt</strong><br />

<strong>Informatik</strong> I 2<br />

Es wertet zuerst nur den Test aus und macht dann einen der beiden „Operanden“ <strong>zum</strong> Wert der if Verzweigung<br />

und Scheme wertet dann danach nur diesen aus. Das ganze hat 2 Auswirkungen: Zum einem muss<br />

natürlich Scheme beim heiner-if viel unnützes arbeiten, da Dinge ausgewertet werden, die später nicht gebraucht<br />

werden. Zum anderen aber kann es gut sein, das z.B. mache Dinge gar nicht ausgewertet werden<br />

können (z.B. Division durch 0) und so das Programm gar nicht funktioniert (siehe Beispiel, dort funtioniert<br />

(Heiner-Reziprok 0) nicht!).<br />

1 ; Heiner Hackers if-Prozedur<br />

2 (define heiner-if<br />

3 (lambda (test then-clause else-clause)<br />

4 (if test then-clause else-clause)))<br />

6 (display "Heiners Beispiele")<br />

7 (equal? (heiner-if #t (* 6 7) 0) 42)<br />

8 (equal? (heiner-if #f 43 23) 23)<br />

10 ; Wir schreiben ein Programm das uns den Kehrwert einer Zahl zurückliefern soll.<br />

11 ; Wenn die Zahl 0 ist, möchte wir das es 0 zurückliefert.<br />

12 ; Beide Funktionen Reziprok und Heiner-Reziprok haben den Vetrag:<br />

13 ; number -> number<br />

14 (define Reziprok (lambda (zahl)<br />

15 (if (= 0 zahl)<br />

16 0<br />

17 (/ 1 zahl)<br />

18 )))<br />

20 (define Heiner-Reziprok (lambda (zahl)<br />

21 (heiner-if (= 0 zahl)<br />

22 0<br />

23 (/ 1 zahl)<br />

24 )))<br />

26 (display "Nun testen wir beide Funktionen")<br />

27 (display "mit dem Wert 5 sollte 1/5 rauskommen")<br />

28 (equal? (Reziprok 5) 1/5)<br />

29 (equal? (Heiner-Reziprok 5) 1/5)<br />

30 (display "mit dem Wert -3 sollte -1/3 rauskommen")<br />

31 (equal? (Reziprok -3) -1/3)<br />

32 (equal? (Heiner-Reziprok -3) -1/3)<br />

33 (display "mit dem Wert 0 sollte 0 rauskommen")<br />

34 (equal? (Reziprok 0) 0)<br />

35 (equal? (Heiner-Reziprok 0) 0)<br />

Aufgabe 3<br />

• reflexiv ⇔ ∀a ∈ A : aρa<br />

Das heißt für alle Terme t einer Termalgebra muss gelten : t passt zu t<br />

Damit dies gilt, muss eine Substitution σ, so dass σ(t) = t. Sei σ die Identität, dann ist σ(t) = t, also<br />

reflexiv.<br />

• transitiv ⇔ aus aρb und bρc folgt aρc<br />

Das heißt für die Terme a, b, c einer Termalgebra gilt: a passt zu b, b passt zu c, also gibt es zwei Substitutionen<br />

σ1, σ2, so dass σ1(b) = a und σ2(c) = b. Wie man sieht muss also σ1(σ2(c)) = a sein, also ist σ3 die<br />

Verkettung von σ1 mit σ2, d.h. es gibt eine Substition σ3(c) = a und damit passt a zu c.<br />

• nicht antisymmetrisch ⇔ aus aρb und bρa folgt nicht a = b<br />

Das heißt aus a passt zu b und b passt zu a folgt nicht a gleich b. Es gibt also ein σ, so dass σ(b) = a und<br />

σ(a) = b. Nehmen wir an, wir haben 2 Terme a(x) und a(h) mit x = h und σ : x → h, h → x. Dann gilt:<br />

a(x) passt zu a(h), da σ(a(h)) = a(x) und<br />

a(h) passt zu a(x), da σ(a(x)) = a(h).<br />

Da aber a(x) = a(h), weil x = h wegen Vorraussetzung, ist passt zu also nicht antisymmetrisch.<br />

Aufgabe 4<br />

1 ; Datendefinition/Analyse:<br />

2 ; ========================<br />

3 ; Die Quadratische Funktion wird als Record dargestellt.<br />

4 ; (make-binom a b c)<br />

5 ; Die Eigenschaften der Quadratische Funktion sind:<br />

David Borowsky, Tobias Müller<br />

Gruppe Björn Appel


<strong>Lösungen</strong> <strong>zum</strong> <strong>3.</strong> <strong>Übungsblatt</strong>/<strong>Testatblatt</strong><br />

<strong>Informatik</strong> I 3<br />

6 ; a: Erster Koeffizient der Funktion (vor dem x^2), Wert ist eine Zahl (number)<br />

7 ; b: Zweiter Koeffizient der Funktion (vor dem x), Wert ist eine Zahl (number)<br />

8 ; b: Dritter Koeffizient der Funktion, Wert ist eine Zahl (number)<br />

9 (define-record-procedures binom<br />

10 make-binom<br />

11 binom?<br />

12 (binom-a<br />

13 binom-b<br />

14 binom-c))<br />

16 ; Jetzt erzeugen wir 3 Beispielfunktionen<br />

17 (define binom1 (make-binom 1 2 3))<br />

18 (define binom2 (make-binom -3 -2 -1))<br />

19 (define binom3 (make-binom 3 10 7))<br />

21 (display "Jetzt überprüfen wir ob die beiden Binome vom Typ binom sind")<br />

22 (equal? (binom? binom1) #t)<br />

23 (equal? (binom? binom2) #t)<br />

25 (display "Jetzt schauen wir ob beide Binome diesselbe sind (sollte nicht der Fall sein)")<br />

26 (equal? binom1 binom2)<br />

27 (display "und ob binom1 dasselbe Binom wie (make-binom 1 2 3)-Tiger ist (sollte der Fall sein)")<br />

28 (equal? binom1 (make-binom 1 2 3))<br />

30 ; Funktion zur Auswertung eines Binoms<br />

31 ; Die Funktion hat 2 Parameter:<br />

32 ; Binom: Die Funktion in welcher der X-Wert ausgewertet werden soll.<br />

33 ; x: Den X-Wert an dem die Funktion ausgewertet werden soll.<br />

34 ; Vertrag:<br />

35 ; WerteAus: binom number -> number<br />

36 (define WerteAus (lambda (a-binom a-x)<br />

37 (+<br />

38 (* (binom-a a-binom) a-x a-x)<br />

39 (* (binom-b a-binom) a-x)<br />

40 (binom-c a-binom)<br />

41 )))<br />

43 (display "2 Beispiele, die beide #t ergeben sollten")<br />

44 (equal? (WerteAus binom1 1) 6)<br />

45 (equal? (WerteAus binom2 3) -34)<br />

47 ; Funktionen zur Bestimmung der Nullstellen eines Binoms<br />

48 ; !! Das übergebene Binom muss 2 reelle Nullstellen besitzten !!<br />

49 ; Die Funktion hat 1 Paramter:<br />

50 ; Binom: Die Funktion deren Nullstellen ausgerechnetet werden sollen<br />

51 ; Vertrag:<br />

52 ; Nullstellen: binom -> number<br />

53 (define Nullstelle1 (lambda (a-binom)<br />

54 (/ (+ (- (binom-b a-binom))<br />

55 (sqrt (- (* (binom-b a-binom) (binom-b a-binom))<br />

56 (* 4 (binom-a a-binom) (binom-c a-binom)))))<br />

57 (* 2 (binom-a a-binom)))<br />

58 ))<br />

60 (define Nullstelle2 (lambda (a-binom)<br />

61 (/ (- (- (binom-b a-binom))<br />

62 (sqrt (- (* (binom-b a-binom) (binom-b a-binom))<br />

63 (* 4 (binom-a a-binom) (binom-c a-binom)))))<br />

64 (* 2 (binom-a a-binom)))<br />

65 ))<br />

68 (display "Wir überprüfen die Funktion am Beispield es Binoms 3x^2+10x+7. Es sollte -1 und -7/3 rauskommen")<br />

69 (equal? (Nullstelle1 binom3) -1)<br />

70 (equal? (Nullstelle2 binom3) -7/3)<br />

72 ; Funktion zur Addition Quadratischer Funktionen<br />

73 ; Die Funktion hat 2 Paramter<br />

74 ; Binom1, Binom 2: Die beiden zu addieren Binome<br />

75 ; Vertrag<br />

76 ; AddiereBinom: binom binom -> binom<br />

77 (define AddiereBinom (lambda (a-binom b-binom)<br />

78 (make-binom<br />

79 (+ (binom-a a-binom) (binom-a b-binom))<br />

80 (+ (binom-b a-binom) (binom-b b-binom))<br />

81 (+ (binom-c a-binom) (binom-c b-binom))<br />

82 )))<br />

84 (display "Wir testen die Funktion in dem wir binom1 und binom2 addieren. Es sollte -2x^2+0x+2 rauskommen.")<br />

85 (equal? (AddiereBinom binom1 binom2) (make-binom -2 0 2))<br />

David Borowsky, Tobias Müller<br />

Gruppe Björn Appel


<strong>Lösungen</strong> <strong>zum</strong> <strong>3.</strong> <strong>Übungsblatt</strong>/<strong>Testatblatt</strong><br />

<strong>Informatik</strong> I 4<br />

Aufgabe 5<br />

a) Infix-Schreibweise:<br />

(3 + ((3 − 4) ∗ (1 + 2)))<br />

b) Präfix-Schreibweise:<br />

+ 3 ∗ − 3 4 + 1 2<br />

c) Postfix-Schreibweise:<br />

3 3 4 − 1 2 + ∗ +<br />

d) Baumdarstellung:<br />

Aufgabe 6<br />

1 ; Datendefinition/Analyse:<br />

2 ; ========================<br />

3 ; Die Uhrzeit wird als Record repräsentiert:<br />

4 ; (make-uhrzeit stunden minunten sekunden)<br />

5 ; Die Eigenschaften der Uhrzeit:<br />

6 ; stunden: Der Stundenanteil der Uhrzeit, Wert ist vom Typ Nummer (number)<br />

7 ; minuten: Der Minutenanteil der Uhrzeit, Wert ist vom Typ Nummer (number)<br />

8 ; sekunden: Der Sekundenanteil der Uhrzeit, Wert ist vom Typ Nummer (number)<br />

9 (define-record-procedures uhrzeit<br />

10 make-uhrzeit<br />

11 uhrzeit?<br />

12 (uhrzeit-stunden<br />

13 uhrzeit-minuten<br />

14 uhrzeit-sekunden<br />

15 ))<br />

17 ; Jetzt erzeugen wir 2 Testuhrzeiten<br />

18 (define mittag (make-uhrzeit 12 0 0))<br />

19 (define informatik (make-uhrzeit 17 10 30))<br />

21 (display "Jetzt schauen wir erstmal ob unsere beiden Uhrzeiten überhaupt vom Record Typ Uhrzeit sind")<br />

22 (equal? (uhrzeit? mittag) #t)<br />

23 (equal? (uhrzeit? informatik) #t)<br />

25 (display "Nun überprüfen wir noch ob mittag und informatik dasselbe ist (sollte ja nicht der Fall sein)")<br />

26 (equal? mittag informatik)<br />

27 (display "und ob mittag dieselbe Uhrzeit wie (make-uhrzeit 12 0 0) ist (sollte der Fall sein)")<br />

28 (equal? mittag (make-uhrzeit 12 0 0))<br />

30 ; Nun definieren wir eine Funktion die eine, in Sekunden angegene Zeitspanne (seit Mitternacht),<br />

31 ; in eine Uhrzeit umrechnet<br />

32 ; Funktion: Sekunden2Uhrzeit<br />

33 ; Vertrag:<br />

34 ; Sekunden2Uhrzeit: number -> uhrzeit<br />

36 (define Sekunden2Uhrzeit (lambda<br />

37 (a-sekunden)<br />

38 (make-uhrzeit<br />

39 (quotient a-sekunden 3600)<br />

40 (quotient (remainder a-sekunden 3600) 60)<br />

41 (remainder (remainder a-sekunden 3600) 60)<br />

42 )))<br />

44 (display "2 Tests obs die Funktion Sekunden2Uhrzeit funktioniert")<br />

45 (equal? (Sekunden2Uhrzeit 3665) (make-uhrzeit 1 1 5))<br />

46 (equal? (Sekunden2Uhrzeit 65533) (make-uhrzeit 18 12 13))<br />

48 ; Nun definieren wir eine Funktion die eine Uhrzeit in die seit Mitternacht vergangenen Sekunden umrechnet<br />

49 ; Funktion: Uhrzeit2Sekunden<br />

David Borowsky, Tobias Müller<br />

Gruppe Björn Appel


<strong>Lösungen</strong> <strong>zum</strong> <strong>3.</strong> <strong>Übungsblatt</strong>/<strong>Testatblatt</strong><br />

<strong>Informatik</strong> I 5<br />

50 ; Vertrag:<br />

51 ; Uhrzeit2Sekunden: uhrzeit -> number<br />

53 (define Uhrzeit2Sekunden (lambda<br />

54 (a-uhrzeit)<br />

55 (+<br />

56 (* (uhrzeit-stunden a-uhrzeit) 3600)<br />

57 (* (uhrzeit-minuten a-uhrzeit) 60)<br />

58 (uhrzeit-sekunden a-uhrzeit)<br />

59 )<br />

60 ))<br />

62 (display "2 Tests ob die Funktion Uhrzeit2Sekunden funktioniert")<br />

63 (equal? (Uhrzeit2Sekunden (make-uhrzeit 1 1 5)) 3665)<br />

64 (equal? (Uhrzeit2Sekunden (make-uhrzeit 18 12 13)) 65533)<br />

David Borowsky, Tobias Müller<br />

Gruppe Björn Appel

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!