Übungsblatt 3 Julia Wolters 1-Fach Bachelor Informatik Aufgabe erhaltene Punkte mögliche Punkte 10 9 10 11 11 10 12 4 10 Korrektur vorhanden! :) 13 7 10 31 40 Abgabe: 10. 11. 2008 Donnerstag, 08 – 10 Uhr 2 Informatik I Übungsblatt 3 Übung WS 08 – 09 10. Anzahl der Nullstellen einer quadratischen Gleichung 1 Punkt Abzug: a = b = c = 0 ⇒ ∞ viele Lösungen (ergänzt) 1 Punkt Abzug: Verträge fehlen 1 Bonuspunkt: Lösungen berechnet! ;; 1. Hilfsdefinition: ungleich: a != b (define (!= a b) (not (= a b))) ;; ;; 2. Hilfsdefinition: -a (define (minus a) (- 0 a)) ;; ;; 3. Hilfsdefinition: pq-Forum: x^2 + px + q ;; ==> pq-Forum-pos: x1 = -(p / 2) + sqrt(p^2 / 4 - q) (define (pq-Formel-pos a b c) (if (> 0 (- (expt (/ b (* 2 a)) 2) (/ c a))) "ERROR: negative Wurzel ==> keine Loesung" (+ (/ (minus b) (* 2 a)) (sqrt (- (expt (/ b (* 2 a)) 2) (/ c a)))))) ;; ==> pq-Forum-neg: x2 = -(p/2) - sqrt(p^2/4 - q) (define (pq-Formel-neg a b c) (if (> 0 (- (expt (/ b (* 2 a)) 2) (/ c a))) "ERROR: negative Wurzel --> keine Loesung" (- (/ (minus b) (* 2 a)) (sqrt (- (expt (/ b (* 2 a)) 2) (/ c a)))))) ;; ;; Abfrage: a = b = c = 0 => unendlich viele Lösungen (if (and (= a 0) (= b 0) (= c 0)) "unendlich viele Lösungen" ;; 1. Abfrage: wenn a = 0: 0x^2 bx + c = 0 <=> x = -c/b (if (= a 0) (string-append "1 Loesung: x = " (number->string (/ (minus c) b))) ;; 2. Abfrage: wenn b = 0: ax^2 + 0x + c = 0 <=> x1 = sqrt(-c / a) ;; und x2 = sqrt - sqrt(-c / a) ;; Dies hat aber nur eine Lösung, wenn a < 0 und c > 0, oder a > 0 ;; und c < 0 (if (or (and (< a 0) (= b 0) (> c 0)) (and (> a 0) (= b 0) (< c 0))) (string-append "2 Loesung: x1 = " (number->string (sqrt (/ (minus c) a))) " und x2 = " (number->string (minus (sqrt (/ (minus c) a))))) Julia Wolters Übung WS 08 – 09 Informatik I Übungsblatt 3 Donnerstag, 08 – 10 Uhr 3 ;; anderenfalls: jommt ein Fehler: neagtive Wurzel (if (or (and (< a 0) (= b 0) (< c 0)) (and (> a 0) (= b 0) (> c 0))) "ERROR: negative Wurzel ---> keine Loesung" ;; 3. Abfrage: wenn b^2/4a^2 - c/a = 0, dann gibt es ;; nur eine Lösung! (if (= 0 (- (expt (/ b (* 2 a)) 2) 2 (/ c a))) (string-append "1 Loesung: x = " (number->string (/ (minus b) (* 2 a)))) ;; wenn keiner der oberen Faelle eintritt, dann hat ;; die Funktion 2 Lösungen durch die pqFormel (string-append "2 Loesungen: x1 = " (number->string (pq-Formel-pos a b c)) " und x2 = " (number->string(pq-Formel-neg a b c))))))))) ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; Beispiele: > (no-of-roots 0 1 2) "1 Loesung: x = -2" > (no-of-roots 3 2 -1) "2 Loesungen: x1 = 1/3 und x2 = -1" > (no-of-roots 1 0 2) "ERROR: negative Wurzel ---> keine Loesung" > (no-of-roots -1 0 2) "2 Loesung: x1 = 1.4142135623730951 und x2 = -1.4142135623730951" > (no-of-roots 1 0 -2) "2 Loesung: x1 = 1.4142135623730951 und x2 = -1.4142135623730951" > (no-of-roots 1 2 0) "2 Loesungen: x1 = 0 und x2 = -2" > (no-of-roots -1 0 -2) "ERROR: negative Wurzel ---> keine Loesung" > (no-of-roots 0 0 0) "unendlich viele Lösungen" 11. Bücher 1 Bonuspunkt für die Beispiele (a) Die Definition der Struktur ;; Eine Buchstruktur: ;; title: Gibt den Titel des Buches aus ;; price: Eintrag des Preises vom Buch ;; number: Anzahl der bisher bestellten Bücher (define-struct book (title price number)) Julia Wolters Donnerstag, 08 – 10 Uhr 4 Informatik I Übungsblatt 3 Übung WS 08 – 09 (display "Bitte zunaechst Buecher definieren mit: (define name(make-book title price number)) fuer price und number bitte nur positive Werte eingeben und der Titel muss in Strings") (b) Abfrage zum Preis ;; get-Price wird nur der Name des Buches übergeben. ;; Es wird dann der Selector vom Preis aufgerufen ;; ;; Beispiel: ;; > (define katePepper(make-book "5 days in summer" 8.95 3)) ;; > (book-price katePepper) ;; 8.95 ;; > (define jkRowling(make-book "Harry Potter 1" 20.00 20)) ;; > (get-Price jkRowling) ;; 20 (define (get-Price name) (book-price name)) (c) Das nachträgliche Bestellen von Büchern + Beispiele für alle 3 Funktionen ;; das Programm order geift auf die bisherige Anzahl der bestellten ;; Bücher (number) zu und addiert. Außerdem wird ein Fehler geworfen, ;; wenn eine negative Anzahl neuer Bücher bestellt wird. (define (order name newNumber) (if (< newNumber 0) (’Error:Only_Positiv_numbers_of_orders_possible) (+ newNumber (book-number name)))) ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; Beispiele für alle 3 Programme: > (define HarryPotter1(make-book > (define HarryPotter2(make-book > (define HarryPotter3(make-book > (define HarryPotter4(make-book > (define HarryPotter5(make-book > (define HarryPotter6(make-book > (define HarryPotter7(make-book > > (get-Price HarryPotter1) 14.5 > (get-Price HarryPotter2) "and "and "and "and "and "and "and the the the the the the the Sorcerer’s Stone" 14.50 14)) Chambre of Secretes" 9.75 4)) Prizior of Azkaban" 92.42 10)) Goblet of fire" 26.23 2)) Order of the Phonex" 12.75 -2)) Half-Blood Prince" 2 200)) Deathly Hollows" 19.99 153)) Julia Wolters Übung WS 08 – 09 Informatik I Übungsblatt 3 Donnerstag, 08 – 10 Uhr 5 ;; 9.75 ;; > (get-Price HarryPotter3) ;; 92.42 ;; > (get-Price HarryPotter4) ;; 26.23 ;; > (get-Price HarryPotter5) ;; 12.75 ;; > (get-Price HarryPotter6) ;; 2 ;; > (get-Price HarryPotter7) ;; 19.99 ;; ;; > (order HarryPotter1 5) ;; 19 ;; > (order HarryPotter2 -2) ;; procedure application: expected procedure, given: ’Error:Only_Positiv_numbers_of_orders_possible (no arguments) ;; > (order HarryPotter3 09) ;; 19 ;; > (order HarryPotter4 -100) ;; procedure application: expected procedure, given: ’Error:Only_Positiv_numbers_of_orders_possible (no arguments) ;; > (order HarryPotter5 10) ;; 8 ;; > (order HarryPotter6 12) ;; 212 ;; > (order HarryPotter7 75) ;; 228 12. Complexe Zahlen 2 Punkte Abzug: keine Verträge 3 Punkte Abzug: Division funktioniert nicht (korrigierte Fassung ist vorhanden) 1 Punkt Abzug: keine Beispiele ;; Ausgangsstruktur (define-struct komplex(R I)) ;; Hinweis für den Nutzer (display "bitte 2 komplexe Zahlen definieren mit: (define name(make-komplex (R I)) und für R und I Zahlen einsetzten") ;; Hilfsdefinition des i Julia Wolters Donnerstag, 08 – 10 Uhr 6 Informatik I Übungsblatt 3 Übung WS 08 – 09 (define i (sqrt -1)) ;; Hilfsdefinition quadrieren (define (quad a) (* a a)) ;; Addition (define (complex-add complexe1 complexe2) (make-komplex (+ (komplex-R complexe1) (komplex-R complexe2)) (+ (komplex-I complexe1) (komplex-I complexe2)))) ;; Subtraktion (define (complex-sup complexe1 complexe2) (make-komplex (- (komplex-R complexe1) (komplex-R complexe2)) (- (komplex-I complexe1) (komplex-I complexe2)))) ;; Multiplikation (define (complex-mult (make-komplex (- (* (* (+ (* (* complexe1 complexe2) (komplex-R complexe1) (komplex-I complexe1) (komplex-R complexe1) (komplex-I complexe2) (komplex-R (komplex-I (komplex-I (komplex-R complexe2)) complexe2))) complexe2)) complexe1))))) ;; Division (define (complex-div complexe1 complexe2) ;; (if (= 0 (* (+ (komplex-R complexe2) (komplex-I complexe2)) ‘i)) (alte Fassung) (if (= 0 (+ (expt(komplex-R complexe2) 2) (expt(komplexe-I complexe2)2))) ;; (’Error:_Nulldivision_nicht_möglich) (make-komplex (/ (+ (* (komplex-R complexe1) (komplex-R complexe2)) (* (komplex-I complexe1) (komplex-I complexe2))) (+ (quad (komplex-R complexe2)) (quad (komplex-I complexe2)))) (/ (- (* (komplex-I complexe1) (komplex-R complexe2)) (* (komplex-R complexe1) (komplex-I complexe2))) (+ (quad (komplex-R complexe2)) (quad (komplex-I complexe2))))))) 13. Geradengleichung 1 Punkt Abzug, weil posn nicht benutzt 2 Punkte Abzug, weil falsche Reihenfolge 3 Punkte und Tolleranz, ihr macht Tolleranz und 3 Punkte, außerdem: Punkt 1 und 2 bilgen Geraden, prüfen, ob Punkt 3 auf Gerade, ihr Prüft aber Punkt 1 (Reihenfolge habe ich nicht geändert) Julia Wolters Übung WS 08 – 09 Informatik I Übungsblatt 3 Donnerstag, 08 – 10 Uhr 7 (a) Berechnung von Steigung und y-Achsenabschnitt ;; Steigung einer Geraden durch zwei Punkte p1(x1 | y1) und p2(x2 | y2) ;; ;; Die Gleichung lautet: find-m = (y1 - y2)/(x1 - x2) ;; ;; Beispiel: ;; > (finde-m 4 5 3 2) ;; 3 ;; > (find-m 2 3 2 5) ;; "Parallele zur Y-Achse" (define (find-m x1 y1 x2 y2) (if (= x1 x2) "Parallele zur Y-Achse" (/ (- y1 y2) (- x1 x2)))) ;; Bestimmung des y-Achsenabschnitts mit Hilfe von find-m und zwei ;; Punkten P1(x1 | y1) und P2(x2 | y2) ;; ;; Die Gleichung latuet: b = y1 - x1 * (y1 - y2)/(x1 - x2) ;; ;; Beispiel: ;; > (find-b2 1 2 3 4) ;; 1 ;; > (find-b 2 3 2 4) ;; "Parallele zur Y-Achse" (define (find-b x1 y1 x2 y2) (if (= x1 x2) "Parallele zur Y-Achse" (- y1 (* x1 (find-m x1 y1 x2 y2))))) (b) Berechnen, ob der Punkt auf der Geraden liegt! ;; ;; ;; ;; ;; ;; ;; ;; ;; Julia Wolters Überprüfung, ob ein Punkt auf der Geraden liegt, soll einen boolschen Wert zurück gegeben Durch die Abfrage (= a b) überprüft der ob die beiden Werte gleich sind und gibt einen boolschen Wert zurück mit den vorherigen Definitionen Der Punkt P(x | y) wird überpüft, ob P auf der Geraden durch P1(x1 | y1) und P2(x2 | y2) verläuft Donnerstag, 08 – 10 Uhr 8 Informatik I Übungsblatt 3 ;; ;; Beispiel 1: ;; > (is-in-line 5 3 3 1 4 ;; true ;; Beispiel 2: ;; > (is-in-line 5 3 3 1 5 ;; false (define (is-in-line x y x1 (= y (+ (* (find-m x1 y1 Übung WS 08 – 09 2) 2) y1 x2 y2) x2 y2) x) (find-b x1 y1 x2 y2)))) (c) Überprüfung, ob die Entfernung zwischen dem Punkt und der Geraden zwischen 0 und dem Toleranzwert liegt. ;; Diese Abfrage soll wieder einen booschen Wert zurück geben. ;; ;; Durch die Abfrage mit or erhalte ich diesen und mache eine ;; Fallunterscheidung: ;; 1. Fall: 3 > |y - m*x + b| ;; 2. Fall: 3 = ||y - m*x + b| ;; ;; Ich habe den Absolutbetrag gewählt, damit kein Unterschied ;; gemacht wird, ob die Entfernung -tol oder tol beträgt. ;; Somit wird die negative Entfernung auch abgefangen ;; (define(absolute x) (if(< x 0) (* -1 x) x)) ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; Der Punkt P(x | y) wird überpüft, ob P auf der Geraden durch P1(x1 | y1) und P2(x2 | y2) verläuft Beispiel 1: > (is-in-line-tol 2 true > (is-in-line-tol 7 true > (is-in-line-tol 2 false > (is-in-line-tol 1 false > (is-in-line-tol 3 /: division by zero 1 2 3 4 5 6) 6 5 4 3 2 1) 5 7 3 2 1 3) 4 2 4 4 3 4) 0 2 3 2 3 1) Julia Wolters Übung WS 08 – 09 Informatik I Übungsblatt 3 ;; > (is-in-line-tol 3 0 2 3 3 2 3) ;; true (define (is-in-line-tol tol x y x1 y1 x2 y2) (or (> tol (absolute (- y (+ (* (find-m x1 (find-b x1 (= tol (absolute (- y (+ (* (find-m x1 (find-b x1 ;; ;; ;; ;; ;; ;; ;; Julia Wolters Donnerstag, 08 – 10 Uhr 9 y1 y1 y1 y1 x2 x2 x2 x2 y2) x) y2))))) y2) x) y2))))))) Beispiel draw: > (start 500 500) true > (draw-solid-line (make-posn 400 300) (make-posn 200 100) ’black ) true > (draw-solid-disk (make-posn 50 70) 5 ’black) true