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) 
      | 
     
    
   | 
  
 
 |   
  
   |