uni/se3/G08_B07_Jim-2martens_Britta...

197 lines
5.3 KiB
Racket

#lang racket
#|
SE 3 Funktional Blatt 7
Abgebende: Jim 2martens, Britta 2noack, Jan-Simon 0giesel
|#
; 1)
; allgemeine rekursive Version
(define (produkt1 n f)
(letrec ((rec (λ (xs r)
(if [empty? xs]
r
(rec
(cdr xs)
(cons (* (car xs) f) r))))))
(reverse (rec n '()))))
; endrekursive Version
(define (produkt2 n f)
(let ((revList (reverse n)))
(letrec ((rec (λ (xs acc)
(if (empty? xs)
acc
(rec
(cdr xs)
(cons (* (car xs) f) acc)
)
))))
(rec revList '()))))
; Funktionen höherer Ordnung
(define (produkt3 n f)
(map (curryr * f) n))
; 2)
; 2.1
; Eine Liste mit sieben Elementen, die je eine Leuchtdiode
; repräsentieren. Jedes Element ist entweder #f oder #t.
; -1-
;| |
;2 3
;| |
; -4-
;| |
;5 6
;| |
; -7-
; Die Leuchtdioden werden in dieser Reihenfolge in der Liste
; angegeben.
; Die möglichen Zustände für die Zahlen 0-9 werden mithilfe
; einer Liste von oben beschriebenen Listen realisiert.
(define zustandstabelle
'((0 . (#t #t #t #f #t #t #t))
(1 . (#f #f #t #f #f #t #f))
(2 . (#t #f #t #t #t #f #t))
(3 . (#t #f #t #t #f #t #t))
(4 . (#f #t #t #t #f #t #f))
(5 . (#t #t #f #t #f #t #t))
(6 . (#t #t #f #t #t #t #t))
(7 . (#t #f #t #f #f #t #f))
(8 . (#t #t #t #t #t #t #t))
(9 . (#t #t #t #t #f #t #t))))
(define (key->value key tabelle)
(cdr (assoc key tabelle)))
; 2.2
(require 2htdp/image)
; erzeugte ein senkrechtes Segment
(define (zeichneSegmentSenkrecht active)
(if active
(rectangle 10 80 "solid" "Red")
(rectangle 10 80 "solid" "DimGray")
))
; erzeugt ein waagerechtes Segment
(define (zeichneSegmentWaagerecht active)
(if active
(rectangle 80 10 "solid" "Red")
(rectangle 80 10 "solid" "DimGray")
))
; zeichnet die Segmente
(define (zeichneSegmente zustand)
(beside
; Segmente 2 und 5
(above
(zeichneSegmentSenkrecht (cadr zustand))
(rectangle 10 10 "solid" "Black")
(zeichneSegmentSenkrecht (cadddr (cdr zustand)))
)
; Segmente 1, 4 und 7
(above
(zeichneSegmentWaagerecht (car zustand))
(rectangle 80 80 "solid" "Black")
(zeichneSegmentWaagerecht (cadddr zustand))
(rectangle 80 80 "solid" "Black")
(zeichneSegmentWaagerecht (cadddr (cdddr zustand)))
)
; Segmente 3 und 6
(above
(zeichneSegmentSenkrecht (caddr zustand))
(rectangle 10 10 "solid" "Black")
(zeichneSegmentSenkrecht (cadddr (cddr zustand)))
)
))
; zeigt eine Sieben-Segment-Anzeige
(define (zeigeSiebenSegment zustand)
(overlay
(zeichneSegmente zustand)
(rectangle 100 200 "solid" "Black")
))
; 2.3
(define (zeige-7segment t)
(let ((zustand (floor (/ t 28))))
(if (and [exact? zustand]
[< zustand 10])
(zeigeSiebenSegment (key->value zustand zustandstabelle))
(zeigeSiebenSegment (key->value (- zustand 10) zustandstabelle)))))
(require 2htdp/universe)
; zum Animieren auskommentieren
;(animate zeige-7segment)
; 2.4
; Für die Darstellung von 6 Anzeigen müssen 6 Zustands-
; variablen eingeführt werden, die den Zustand für jede
; der sechs Anzeigen repräsentieren.
; Dazu muss die eben definierte Funktion dahingehend
; erweitert werden.
; Die Anzeigen seien von links nach rechts mit 1 bis 6 bezeichnet.
; modT entspricht dem Rest der Division t durch 2419200.
; Anzeige 6 schaltet auf 1, wenn modT 28 ist und auf 2 wenn modT 56 ist, etc.
; Anzeige 5 schaltet auf 1, wenn Anzeige 1 auf 10 ist und
; auf 2 wenn 6 auf 20 ist, etc.
; Anzeige 4 schaltet auf 1, wenn Anzeige 5 auf 6 ist und
; auf 2 wenn 5 auf 12 ist, etc.
; Anzeige 3 schaltet auf 1, wenn Anzeige 4 auf 10 ist und
; auf 2 wenn 4 auf 20 ist, etc.
; Anzeige 2 schaltet auf 1, wenn Anzeige 3 auf 6 ist und
; auf 2 wenn 3 auf 12 ist, etc.
; Anzeige 1 schaltet auf 1, wenn Anzeige 2 auf 10 ist und
; auf 2 wenn 2 auf 20 ist, etc.
(define trenner
(underlay/xy
(underlay/xy
(rectangle 100 200 'solid 'black)
40
70
(rectangle 20 20 'solid 'red)
)
40
140
(rectangle 20 20 'solid 'red)
))
(define trenner2
(rectangle 10 200 "solid" "Black"))
; diese Funktion wird bis 99h 59m 59s zählen und dann wieder bei 0
; anfangen
(define (zeigedauer t)
(let* ((modT (modulo t 10080000)) ; 10080000 entspricht 100h
(zustand6 (floor (/ modT 28)))
(zustand5 (floor (/ zustand6 10)))
(zustand4 (floor (/ zustand5 6)))
(zustand3 (floor (/ zustand4 10)))
(zustand2 (floor (/ zustand3 6)))
(zustand1 (floor (/ zustand2 10))))
(beside
(zeigeSiebenSegment (key->value (modulo zustand1 10) zustandstabelle))
trenner2
(zeigeSiebenSegment (key->value (modulo zustand2 10) zustandstabelle))
trenner
(zeigeSiebenSegment (key->value (modulo zustand3 6) zustandstabelle))
trenner2
(zeigeSiebenSegment (key->value (modulo zustand4 10) zustandstabelle))
trenner
(zeigeSiebenSegment (key->value (modulo zustand5 6) zustandstabelle))
trenner2
(zeigeSiebenSegment (key->value (modulo zustand6 10) zustandstabelle)))
))
; zum Animieren auskommentieren
; (animate zeigedauer)