Aufgabe12-12-02 
 

Komplexere Scheme-Anwendungen

Aufgaben 1-3: Lösung:
(define todual (lambda (x n) (cond ((= x 0) 0) (else (+ (* (expt 10 n) (modulo x 2)) (todual (truncate (/ x 2)) (+ n 1))))))) (define todual2 (lambda (x n) (cond ((= x 0) 0) ((< n -16) 0) (else (+ (* (expt 10 n) (truncate (* x 2))) (todual2 (- (* x 2) (truncate (* x 2))) (- n 1))))))) (define dualzahl (lambda (x) (if (equal? x (truncate x)) (if (< x 0) (number->string (- (todual (truncate (- x)) 0) )) (number->string (todual (truncate x) 0) )) (let ((x (exact->inexact x))) (if (< x 0) (number->string (- (+ (todual (truncate (- x)) 0) (todual2 (- (- x) (truncate (- x))) -1)))) (number->string (+ (todual (truncate x) 0) (todual2 (- x (truncate x)) -1)))))))) (define hack-zahl (lambda (x) (if (number? x) (/ (round (* x 1000000)) 1000000 )))) (define intervall (lambda (f min max) (cond ((= (signum (f min)) (signum (f max))) '()) ((< (abs (f (/ (+ min max) 2.0))) 0.000000001) (/ (+ min max) 2.0)) (else (if (> 0 (f min )) (if (< (f (/ (+ min max) 2.0)) 0) (intervall f (/ (+ min max) 2.0) max) (intervall f min (/ (+ min max) 2.0))) (if (> (f (/ (+ min max) 2.0)) 0) (intervall f (/ (+ min max) 2.0) max) (intervall f min (/ (+ min max) 2.0))) ))))) (define nst (lambda (f min max dx) (cond ((> min max) '()) (else (if (null? (intervall f min (+ min dx))) (nst f (+ min dx) max dx) (cons (hack-zahl (intervall f min (+ min dx))) (nst f (+ min dx) max dx))))))) (define integral (lambda (f li re dx) (if (> (+ li dx) re) 0 (+ (/ (* dx (+ (f li) (f (+ li dx)) )) 2) (integral f (+ li dx) re dx))))) Kommentar: Zur ersten Aufgabe haben wir einfach die Zahlen mit 10er Potenzen aufgerechnet (function todual). Für die Zahl hinter dem Komma gibt es die todual2. Das Ergebnis von den beiden Functionen wird addiert und dann in einen String umgewandelt. Schwachsinniger Weise muß man aufpassen das nicht etwa 10110.0 statt 10110 herauskommt deshalb noch ein paar Abfragen in der function dualzahl. Aufgabe 2: Die Hilfsfunktion intervall nimmt eine obere und untere Grenze. Zerlegt die in dem Fall, daß der Funktionswert der oberen Grenze nicht das selbe Vorzeichen hat wie der Funktionswert der unteren Grenze solange in einzelne Teilbereiche bis das Ergebniss gefunden wurde - Funktionswert < 0.00001. Da das ganze unbedingt mit 6 Kommastellen sein soll gibts noch die Funktion hack-zahl die genau das bewerk- stelligt. Aufgabe 3 ist denk ich kurz genug um noch in Ansätzen übersichtlich zu sein *grins*. Grundlage ist die Funktion 1/2*(a+b)*h für die Fläche eines Trapez.