die aufgabe mit dem baumobjekt

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

die aufgabe mit dem baumobjekt
hi leuts! ich hatte doch neulich was gepostet bzgl der aufgabe 6.10.93 wos um binaere baeume geht, gell? naja etz kommt leider nochmal ne neue frage dazu. All die anderen schoenen objekte hab ich eigentlich ganz gut und schnell hingekriegt aber dieser baumkram nervt mich … ich brauch 2 dinge:

  1. was soll die bintree variable sein? ist das die var in der der baum gespeichert wird ??
  2. wie soll ich da denn nen zustand reinkriegen, wenn ich den neuen baum erst ueber ne lokale prozedur auf selber ebene wie die anderen methoden des objekts erzeugen soll? ich mein das ding kriegt so einfach keinen dauerhaften zustand.

Ich versteh nicht wo die Aufgabe zu finden ist. Wenn du mal sagst, wo ich die finde, schau ich mir die später noch an.


Klausur vom 6.10.1993
Seite 6
Aufgabe 4

26 bungde!!!


ich finde diese aufgabe ehrlich gesagt auch etwas hirnrissig. aber ich denke, da darf man nicht ueberlegen, was das soll, sondern einfach hinschreiben. mein code sieht jetzt folgendermassen aus:

[CODE]
(define (make-bintree)
(let ((tree '()))
(define (emptytree)
(set! tree '()))
(define (cons-tree label left right)
(set! tree (list label left right)))
(define (leaf label)
(set! tree (list label '() '())))
(define (root)
(if (is-emptytree?)
(display “no root in empty tree”)
(car tree)))
(define (left)
(if (is-emptytree?)
(display “no left in empty tree”)
(cadr tree)))
(define (right)
(if (is-emptytree?)
(display “no right in empty tree”)
(caddr tree)))
(define (is-emptytree?)
(null? tree))
(define (dispatch m)
(cond ((eq? m 'emptytree) emptytree)
((eq? m 'cons-tree) cons-tree)
((eq? m 'leaf) leaf)
((eq? m 'root) root)
((eq? m 'left) left)
((eq? m 'right) right)
((eq? m 'is-emptytree?) is-emptytree?)
(else (display “MAKE-BINTREE: unknown message”))))
dispatch))
;beispiel: baum mit wurzel 1 und linkem blatt 2 und rechtem unterbaum, der als wurzel 3 hat und links ein 4-blatt und rechts ein 5-blatt
; 1
; 2 3
; 4 5
(define b1 (make-bintree))
(define b2 (make-bintree))
(define b3 (make-bintree))
(define b4 (make-bintree))
(define b5 (make-bintree))

;erst unterste ebene definieren
((b2 'leaf) 2)
((b4 'leaf) 4)
((b5 'leaf) 5)
;dann raufarbeiten
((b3 'cons-tree) 3 b4 b5)
((b1 'cons-tree) 1 b2 b3)

;testen der funktionen
((b1 'root))
((((b1 'left)) 'root))
((((b1 'right)) 'root))[/CODE]

have fun beim nachvollziehen :).


genau das hatte ich etz naemlich vermutet dass ich am anfang dieses schwachsinnige (let ((tree '()) …
schreiben muss um es dann gleich im (empty-tree bintree) wieder nochmal zu setzen … wer auch immer sich diese aufgabe ausgedacht hat der hat meiner meinung nach n echtes problem


also ich hab mein datenobjekt eigentlich fast genauso wie du.
blos der scheiss is: wenn zum beispiel der linke teilbaum leer ist, heisst das ja eigentlich nicht dass der rechte auch leer sein muss oder? und genau sowas geht dann immer nicht weil er, wenn ich schau ob cadr die leere liste ist, er mir da schon sagt dass er den wert nicht cadrn kann.
Und dann ist da noch sowas merkwuerdiges gewesen wegen den beispielen die du noch angefuegt hast. ich habs probiert aber da kam dann sowas raus:
(1 #procedure:dispatch #procedure:dispatch)(2 () ())(3 #procedure:dispatch #procedure:dispatch)

:frowning: :frowning: :frowning: :rolleyes: :rolleyes: :rolleyes: :rolleyes:


das kam aber bei deiner implementation, oder? bei funktioniert das ganze naemlich wunderbar, er gibt halt eben 1 2 und 3 aus. auch wenn ich wie gesagt die ganze aufgabe fuer schwachsinn halte.


Wieso schreibst du als if-Bedingung in left und right
(is-emptytree)???

Denn dein Baum kann auch die Form (x () ()) haben und somit ist er nicht leer. left und right-tree sind dagegen nil.
Ich hab deswegen das so gemacht:

(if  (null? (cadr tree))  
         (display "left-tree empty")  
         (caadr tree)))...

Ausserdem fällt mir noch was auf: laut der Aufgabenstellung müssen die Aufrufe in minimaler Form erfolgen, z.B.
(left tr) und nicht ((tr 'left))!
Sollte man deswegen nicht zusätzlich Redefiner schreiben,z.B

(define (left tree) ((tree 'left))) usw...

hmm, k. a., aber so viel zeit hat man da auch wieder nicht fuer! das hatte ich mir auch schon gedacht, allerdings finde ich wie gesagt die ganze aufgabe schon kaum nachzuvollziehen, da hab ich mich dann um sowas gar nicht gekuemmert …


jungs ich hoffe nachwievor dass DER mist morgen nicht drankommt … weil falls ja waere das aeusserst unpraktisch. ich waere da eher fuer nen suessen kleinen stack oder ne queue die sind so schoen zu programmieren.

@T3 so wie du es hast hab ich das inzwischen auch mal probiert. aber es kommt immer noch mist raus. hm, vielleicht sollte ich den baum einfach nochmal schreiben


Okay, nachdem ich durch diesen Thread rausgefunden hab, dass es ja noch ältere Klausuren als 1998 gibt…
hab ich mal meine Taliban geschickt da weiter nachzuforschen.

Hier der Bericht:

1.) Im April 01 kam KEINE Objektorientierte Aufgabe (schwach!)

2.) Stacks kamen 2x
3.) Queues kamen 3x
4.) Konto kam 2x
5.) Heap kam 2x
6.) Binäre Bäume kamen 2x
7.) Trie kam 2x
8.) Ansonsten kamen noch ein Zähler, bzw ein binärer Schalter.

Und jetzt DIE Überraschung:

Der Funktionsmanager kam nur einmal und gab glaub ich auch ganz gut Punkte, also ich behaupte mal, die Chancen stehen nicht schlecht, dass der mal wieder dran ist (zuvor im Okt 98 )


in welcher klausur ist der funktionsmanager ?


Meinst du den Funktionsverwalter Aufgabe 4 Okt98?
Der is gar net so einfach, weil du ja unendlich viele Parameter übergeben musst, hab ganz schön lange gebraucht, bis ich das mit der (f . args)-Schreibweise hinbekommen habe.


@robert: du hast bei deinem bericht die hashtable aufgabe vergessen … aber ich glaub um die muessen wir uns im 1sten semester genauso wenig kuemmern wie um den trie und den heap


@dawell: kannst du den funktionsverwalter mal posten? Biiiiiiitttteeee ggg


(define (make-function-manager fnc)
  (define nCalls 0)
  (define lCalls '())
  
  (define (call lst)
    (let ((result (apply fnc lst)))
          (set! nCalls (+ nCalls 1))
          (set! lCalls (cons (cons lst result) lCalls))
          result))
  
  (define (number-of-calls)
    nCalls)
  
  (define (calls)
    lCalls)
  
  (define (reset)
    (set! nCalls 0)
    (set! lCalls '())
    )
  
  (define (dispatch m . args)
    (cond ((eq? m 'call) (call args))
          ((eq? m 'number-of-calls) (number-of-calls))
          ((eq? m 'calls) (calls))
          ((eq? m 'reset) (reset))
          (else (error "uknown command!"))))
  dispatch)

Hier, so sieht mein Function Manager aus. Ist der aus der Klausur vom 07.10.1998


@The Void: hm so den ansatz hab ich auch, aber was uns beiden fehlt ist der teil von der call methode der ueberpruefen soll ob ein aufruf mit einer bestimmten kombination von argumenten schon mal statgefunden hat. Ich weiss naemlich bis etz nur dass ich das irgendwie mit unendlich vielen Argumeneten loesen muss und der Funktion assoc.

ohoh… hat vielleicht jemand die “memoization” beruecksichtigt und kann die noch posten? Das ist naemlich mein einziges aber dafuer groesstes problem mit dem Funktionsverwalter.


(define (make-function-manager fnc) 
  (define nCalls 0) 
  (define lCalls '()) 
   
  (define (call . args) 
    (if (not (assoc args lcalls))
        (begin
          (let ((result (apply fnc args))) 
            (set! nCalls (+ nCalls 1)) 
            (set! lCalls (cons (cons args result) lCalls)) 
            result))
        (begin
          (display "Wart ma kurz, ich guck ob ich das schon hab...")
          (cdr (assoc args lcalls)))))
   
  (define (number-of-calls)
    nCalls) 
   
  (define (calls) 
    lCalls) 
   
  (define (reset) 
    (set! nCalls 0) 
    (set! lCalls '()) 
    ) 
   
  (define (dispatch m . args) 
    (cond ((eq? m 'call) call) 
          ((eq? m 'number-of-calls) number-of-calls) 
          ((eq? m 'calls) calls) 
          ((eq? m 'reset) reset) 
          (else (display "Bissu blöd oda was? Sowas gibts hier nicht... IDIOT!")))) 
  dispatch) 

Check!


Ja, so hab ich das auch gemacht. Ich hoffe fast, dass morgen sowas drankommt, was andres kann ich nämlich net…