BuK/IIm11/Studenten/sirorose/hilbert

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
'''TODO: Erläuterungen hinzufügen'''

= Streams =

Zunächst einmal einige Funktionen, um mit den Streams umgehen zu können. (Herausgenommen aus streams.ss von Prof. Wagenknecht, Programmierparadigmen). Einige davon mussten auf den vom Wiki verwendeten Interpreter angepasst werden.

<code id="4f74c62cb0830">
(define stream-car car)

(define stream-cdr
  (lambda (stm)
    (force (cdr stm))))


;; Konstruktoren

(define-syntax stream-cons
  (syntax-rules ()
    ((_ head tail) (cons head (delay tail)))))
  
(define stream-item
  (lambda (str k)
    (if (= k 0)
      (stream-car str)
      (stream-item (stream-cdr str) (- k 1)))))


(define print-stream
  (lambda (stm n)
    (cond
      ((<= n 0) (display "...\n"))
      (else
       (display (stream-car stm))
       (display ", ")
       (print-stream (stream-cdr stm) (- n 1))))))

</code>

= Errichten des Hilbert-Hotels =


<code id="4f74c62cb08a9">
; Funktion zum Erstellen des Hotel-Streams. Die zunächst noch leeren Zimmer werden mit #f belegt.
(define baue-hilberthotel 
  (lambda()
   (stream-cons #f (baue-hilberthotel))))

; Funktion zum zeigen der ersten n Zimmer des Hotels
(define zeige-mir
  (lambda(hotel n)
    (print-stream hotel n)))

; Erstellen eines Hotels
(define hilberthotel (baue-hilberthotel))
</code>

<run id="4f74c62cb0b22">
(zeige-mir hilberthotel 5)
</run>

= Die ersten Gäste erscheinen =

<code id="4f74c62cb091a">

(define setzegast
   (lambda(name hotel nr)
    (cond 
      ((and (= 0 nr) (not (stream-car hotel))) (stream-cons name (stream-cdr hotel)))
      (else (stream-cons (stream-car hotel) (setzegast name (stream-cdr hotel) (- nr 1)))))))

(define einzelbuchung
  (lambda(name hotel nr)
    (if (not (stream-item hotel nr)) (setzegast name hotel nr)
        ((error "Error in einzelbuchung: Zimmer ~a ist belegt! Hier wohnt ~a" nr (stream-item hotel nr)))
    )))

(set! hilberthotel (einzelbuchung "Otto Grundmann" hilberthotel 3))
</code>

<run id="4f74c62cb0b8f">
(zeige-mir hilberthotel 12)
</run>

= Weitere Hotelgäste werden erwartet =

<code id="4f74c62cb0991">


; Anzeige-Methode
(define kleinbusfabrik
  (lambda (busnummer anzahl nr)
     (if (= nr anzahl) (cons (cons busnummer nr) '())
     (cons (cons busnummer nr) (kleinbusfabrik busnummer anzahl (+ nr 1)))
   )
)) 

(define zeige-mir-kleinbus
  (lambda (bus)
    (display bus)))

(define baue-kleinbus
  (lambda(busnummer anzahl)
    (kleinbusfabrik busnummer anzahl 0)))



(define kleingruppenbuchung
  (lambda (bus hotel)
      (cond
        ((and (null? (cdr bus)) (not (stream-car hotel))) (stream-cons (car bus) (stream-cdr hotel))) ;Letztes Element und nicht belegt
        ((and (not (null? (cdr bus))) (not (stream-car hotel))) (stream-cons (car bus) (kleingruppenbuchung (cdr bus) (stream-cdr hotel)))) ;Nicht das letzte Element und Hotelzimmer nicht belegt
        (else (stream-cons (stream-car hotel)(kleingruppenbuchung bus (stream-cdr hotel)))) ;Sonst, es wohnt jemand im Zimmer
   )
))

(define kleinbus815 (baue-kleinbus 815 8))
(set! hilberthotel (kleingruppenbuchung kleinbus815 hilberthotel))
</code>

<run id="4f74c62cb0bfb">
(zeige-mir hilberthotel 10)
</run>

== Der Hilbert-Bus ==

<code id="4f74c62cb0a10">
; Hilbert-Bus
(define baue-hilbertbus
  (lambda (busname)
     (letrec
         ((hilbertbusfabrik
           (lambda (platznummer)
             (stream-cons (cons busname platznummer) (hilbertbusfabrik (+ platznummer 1)))
           )
         )) 
       (hilbertbusfabrik 0)
       )
    )
) 


; Check-In für hilbertbus
(define check-in
  (lambda (bus hotel)
     (cond
       ((not (stream-car hotel)) (stream-cons (stream-car bus) (check-in (stream-cdr bus) (stream-cdr hotel))))
       (else (stream-cons (stream-car hotel) (check-in bus (stream-cdr hotel))))
     )
   )
)  

; Gehe in Gerade
(define gehe-in-gerade
  (lambda (hotel)
    (letrec
        ((gehe-in-gerade-helfer
          (lambda (hotel zimmernummer)
            (if (even? zimmernummer) (stream-cons (stream-car hotel) (gehe-in-gerade-helfer (stream-cdr hotel) (+ zimmernummer 1)))
                (stream-cons #f (gehe-in-gerade-helfer hotel (+ zimmernummer 1)))
          )
         )))
      (gehe-in-gerade-helfer hotel 0)
    
    )    
  )
) 
</code>

<run id="4f74c62cb0c6d">
(set! hilberthotel (gehe-in-gerade hilberthotel))
(zeige-mir hilberthotel 10)
(define hilbertbus1 (baue-hilbertbus "X"))
(set! hilberthotel (check-in hilbertbus1 hilberthotel))
(zeige-mir hilberthotel 10)
</run>

= Eine Vielzahl von Hilbertbussen =

<code id="4f74c62cb0a85">
; Konvoi-Macher
(define konvoimacher
  (lambda (konvoiname)
    (letrec
        ((konvoifabrik
          (lambda (konvoinummer)
            (stream-cons (baue-hilbertbus (string-append konvoiname (number->string konvoinummer))) (konvoifabrik (+ konvoinummer 1)))
          )))
     (konvoifabrik 0))   
  )
)  

; Konvoi-Anzeiger
(define zeige-mir-konvoi
  (lambda (konvoi busse leute)
    (cond
      ((<= busse 0) (display "...\n"))
      (else
        (print-stream (stream-car konvoi) leute)
        (zeige-mir-konvoi (stream-cdr konvoi) (- busse 1) leute)))))

(define konvoi->kette
  (lambda (konvoi)
    (letrec
        ((konvoi->kettehelfer
          (lambda (zeile relzeile spalte)
            (cond
              ((= relzeile 0) (stream-cons (stream-item (stream-item konvoi relzeile) spalte) (konvoi->kettehelfer (+ zeile 1) (+ zeile 1) 0) ))
              (else (stream-cons (stream-item (stream-item konvoi relzeile) spalte) (konvoi->kettehelfer zeile (- relzeile 1) (+ spalte 1))))
            )
          )  
          ))
      
    (konvoi->kettehelfer 0 0 0))
   )
) 


(define zeige-konvoikette
  (lambda (kette anzahl)
    (letrec
        ((zeige-konvoikettehelfer
          (lambda (kette anz aktzeile aktspalte)
            (cond 
              ((<= anz 0) (display "\n...\n"))
              ((= aktzeile aktspalte) (display (stream-car kette)) (display ", \n") (zeige-konvoikettehelfer (stream-cdr kette) (- anz 1) (+ aktzeile 1) 0))
              (else (display (stream-car kette)) (zeige-konvoikettehelfer (stream-cdr kette) (- anz 1) aktzeile (+ aktspalte 1)))
              ))))
    (zeige-konvoikettehelfer kette anzahl 0 0))
         
  )
)  
</code>

<run id="4f74c62cb0cda">
(define k (konvoimacher "M"))
(zeige-konvoikette (konvoi->kette k) 20)
</run>