y-Achsenschnittpunkt berechnen < Scheme < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 11:04 Mi 31.10.2007 | Autor: | Igor1 |
Hallo,
ich muss eine Funktion find-n definieren, die 2 Punkte konsumiert und den y-Achsenschnittpunkt einer Geraden durch diese errechnet(n=y-mx). Ich habe z.B so angefangen:
(define (find-n e f)
(-(point-y e) (* (find-m e f) (point-x e)))
(find-m e f) ist die Funktion, die die Steigung m berechnet.
(define (find-m e f) a b)
(make-point (-(point-y a)(point-y b))
(-(point-x a)(point-x b))))
und der Wert dieser Prozedur ist (make a b), also keine Zahl, mit der man rechnen könnte. Deshalb wollte ich es in "number" umwandeln. Ich habe so vorgegangen, wie ich wusste:
zuerst habe ich ( make a b) in einen String mit Hilfe print-point umgewandelt , also "b/a". Ich weiss, dass man dann Strings wieder in number umwandeln kann(print-number).Dann wollte ich find-n so definieren:
(define (find-n e f)
(-(point-y e)(*(print-number(print-point(find-m e f)))(point-x e))))
Nach dem Testen : (find-n (make-point 3 4)(make-point 5 6))
ist die Fehlermeldung: *:expects type number as 1st argument,given:false; other arguments were: 3
Die Frage ist: wie definiert man diese Funktion find-n ?
Schöne Grüße
Igor
|
|
|
|
Hallo,
ich programmiere in Scheme erst seit einer halben Stunde (war einfach neugierig), also weiß ich nicht, ob ich mitreden kann, aber falls man make-point selber definieren darf, dann würde ich das Problem so lösen:
(define (make-point a b) (cons a b))
(define (p-x a) (car a))
(define (p-y a) (cdr a))
(define (find-m a b) (/ (- (p-y b) (p-y a)) (- (p-x b) (p-x a))))
(define (find-n a b) (- (p-y a) (* (p-x a) (find-m a b))))
Und bei Eingabe von
(find-n (make-point 7 22) (make-point -3 12))
erhalte ich die richtige Antwort 15.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:50 Mi 31.10.2007 | Autor: | Igor1 |
Hallo Martin,
make-point braucht man nicht zu definieren, das wird von der structur point erzeugt.
Wie kann man eigentlich find-m in number umwandeln, also so , dass man find-n ausrechnen kann?
SG
Igor
|
|
|
|
|
Hallo,
okay, wenn point schon vordefiniert wird, dann ändern sich bloß die Namen:
(define (find-m a b) (/ (- (point-y b) (point-y a)) (- (point-x b) (point-x a))))
(define (find-n a b) (- (point-y a) (* (point-x a) (find-m a b))))
Den ganzen Umweg über Strings zu gehen ist nicht nötig.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 12:53 Mi 31.10.2007 | Autor: | Igor1 |
bei find-n steht (* selektor Funktion find-m)
find-m nimmt den Wert (make-point .....)an, d.h das ist keine Zahl. Deshalb kann man hier nicht die Multiplikation durchführen. Das war mein Problem, dass ich irgendwie den Wert der Prozedur find-m als eine Zahl darstelle.
SG
Igor
|
|
|
|
|
Hast du find-m selbst definiert oder war es schon gegeben?
Falls es schon so gegeben war, dann musst du eben wieder über die Selektoren point-x und point-y gehen.
Falls du es aber selbst definiert hast, dann mach es einfach so wie ich.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:58 Mi 31.10.2007 | Autor: | Igor1 |
Was bedeutet cdr und car?
|
|
|
|
|
Damit greift man auf die beiden Elemente eines Paares zu.
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:59 Mi 31.10.2007 | Autor: | Igor1 |
Hallo Martin ,
ich habe den Fehler bei mir gefunden. Der ganze Fehler war der, dass ich bei def. von find-m make-point geschrieben hatte. Richtig war einfach / zu schreiben . Ich habe halt zwei Sachen verwechselt.
Danke Dir für die Aufmerksamkeit !
Schöne Grüße
Igor
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 13:22 Mi 31.10.2007 | Autor: | Igor1 |
Ich habe den code den Du geschrieben hast ins Drscheme kopiert und es gab eine Fehlermeldung:
cons: second argument must be of type <list>, given 7 and 22.
SG
Igor
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:20 Fr 02.11.2007 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|