Advertisement
MikadoBlanket

Racket Bootcamp

Jun 1st, 2023 (edited)
516
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 15.10 KB | Source Code | 0 0
  1. ;---------[RACKET-BOOTCAMP]----------
  2.  
  3.  
  4. ;-----------[1. EINFÜHRUNG]------------
  5. ; --> Lektion 1.1: Elementare Ausdrücke <--
  6. ; (operator operand-1 operand-2 ... operand-n)
  7. (+ 1 2 3)
  8. (* 3 4 5)
  9. (/ 9 3)
  10. (/ 3 9)
  11. (* (+ 2 2) (/ (* (+ 3 5) (/ 30 10)) 2))
  12.  
  13. ; --> Lektion 1.2: Einfache Funktionen <--
  14. ; Eigene Funktion definieren:
  15. ; - (define <FunktionsName> (lambda [operand-1 operand-2 ...] (...Logik...) ))
  16. ; Eine Funktion aufrufen:
  17. ; - (function operand-1 operand-2 operand-3)
  18.  
  19. ; Ökosteuer berechnen bei Ökosteueranteil von 7 Cent
  20. (define oeko-steuer
  21.   (lambda [preis-fuer-tankfuellung preis-pro-liter]
  22.           (* (/ preis-fuer-tankfuellung preis-pro-liter) 7)))
  23.  
  24. ; Eigene Funktion aufrufen
  25. (oeko-steuer 4500 150)
  26.  
  27. ; --> Spezial 1.3: Operatoren vs. Operanden <--
  28. ; Operatoren sind:
  29. ; - Standardfunktionen wie z. B: +, /, *, - für die vier Grundrechenarten
  30. ; - eigenen Funktionen: oeko-steuer
  31. ; - Pseudofunktionen: define, lambda
  32. ; - namenlose Funktionen (lambda-Ausdrücke)
  33.  
  34. ; Operanden sind:
  35. ; - Zahlen: 3.14, 4500, 2/3
  36. ; - Variable: preis-pro-liter
  37. ; - Ausdrücke: (f ...)
  38. ; - boolesche Werte: #true und #false
  39.  
  40.  
  41. ;-----------[2. Aufschreiben von Funktionen]------------
  42. ; Regeln zum Aufschreiben von Funktionen (alle: https://johbra.github.io/EidP17/Regeln.pdf)
  43.  
  44. ; --> Regel 1 <--
  45. ; Regel 1: Verwende aussagekräftige Namen für Funktionen und Variablen („sprechende Bezeichner”)!
  46. (define endkapital
  47.   (lambda [anfangskapital jahreszinssatz laufzeit-in-monaten]
  48.     (+ anfangskapital
  49.        (* anfangskapital
  50.           (/ jahreszinssatz 100 12) laufzeit-in-monaten))))
  51.  
  52. ; --> Regel 2 <--
  53. ; Regel 2: Beschreibe den Zweck der Funktion durch einen Satz, der das Resultat der Funktion in Abhängigkeit von ihren Argumenten beschreibt.
  54. ;; Aus dem anfangskapital, einem jahreszinssatz  und einer laufzeit-in-monaten wird
  55. ;; das Endkapital ermittelt, wobei die Zinsgutschrift einmalig am Ende der Laufzeit
  56. ;; erfolgt.
  57. (define endkapital2
  58.   (lambda [anfangskapital jahreszinssatz laufzeit-in-monaten]
  59.     (+ anfangskapital
  60.        (* anfangskapital
  61.           (/ jahreszinssatz 100 12) laufzeit-in-monaten))))
  62.  
  63. ; --> Regel 3 <--
  64. ; Regel 3: Schreibe Beispielanwendungen der Funktion auf, die das Resultat der Funktion mit dem Erwartungswert vergleicht. Die Auswertung der Ausdrücke muss dabei immer den Wahrheitswert #true liefern:
  65. ;; Aus dem anfangskapital, einem jahreszinssatz  und einer laufzeit-in-monaten wird
  66. ;; das Endkapital ermittelt, wobei die Zinsgutschrift einmalig am Ende der Laufzeit
  67. ;; erfolgt.
  68. (define endkapital3
  69.   (lambda [anfangskapital jahreszinssatz laufzeit-in-monaten]
  70.     (+ anfangskapital
  71.        (* anfangskapital
  72.           (/ jahreszinssatz 100 12) laufzeit-in-monaten))))
  73. ;; Beispielanwendungen:
  74. (= (endkapital 1000 0 24) 1000)   ;; => #true
  75. (= (endkapital 1000 12 12) 1120)  ;; => #true
  76. (= (endkapital 1000 12 24) 1240)  ;; => #true
  77.  
  78. ; --> Regel 4 <--
  79. ; Regel 4: Definiere für jeden Zusammenhang zwischen Größen, die sich aus der Problembeschreibung ergeben, eine Funktion.
  80. ;; Ausgangsfunktion
  81. (define kreisring-flaeche
  82.   (lambda [radius-aussen radius-innen]
  83.     (- (* 3.14 (* radius-aussen radius-aussen))
  84.        (* 3.14 (* radius-innen  radius-innen)))))
  85. ;; Nun kann die Hilfsfunktion *kreis-flaeche definiert und genutzt werden
  86. (define kreis-flaeche
  87.   (lambda [radius]
  88.     (* 3.14 (* radius radius))))
  89. ;; Daraus ergibt sich:
  90. (define kreisring-flaeche2
  91.   (lambda [radius-aussen radius-innen]
  92.     (- (kreis-flaeche radius-aussen)
  93.        (kreis-flaeche radius-innen))))
  94.  
  95. ; --> Regel 5 <--
  96. ; Regel 5: Ersetze jede Konstante, deren Bedeutung sich nicht aus dem Kontext ergibt, durch einen sprechenden Variablennamen.
  97. ; (define <variablenname> <funktion|wert>)
  98. (define myPI 3.14)
  99. ; Die Variable myPI kann nun genutzt werden
  100. (define kreis-flaeche3
  101.   (lambda [radius]
  102.     (* myPI (* radius radius))))
  103.  
  104. ; --> Operatoren zum Vergleich von Zahlen <--
  105. ; <, >, <=, >= (wie in Mathe)
  106. (< 3 5)  ;; => #true, da 3 kleiner als 5
  107. (> 3 5)  ;; => #false, da 3 nicht größer als 5
  108. (>= 4 4) ;; => #true, da 4 größer gleich 4
  109.  
  110.  
  111. ;-----------[3. Fallunterscheidungen]------------
  112.  
  113. ; --> Vergleichsausdrücke und Boolesche Ausdrücke <--
  114. ;; Wir kennen bereits <, >, <= und >=. Damit verbundene Ausdrücke können
  115. ;; nun aucg logisch miteinander verbunden werden mit den logische Operatoren:
  116. ;; - (and bool-1 bool-2) => logisched "und", gibt #true zurück, wenn ALLE bools #true sind
  117. (and #true #true) ; => #true
  118. (and (> 3 2) (< 2 3)) ; => #true
  119. (and (> 3 2) (< 3 2)) ; => #false (nicht ALLE Ausdrücke sind #true)
  120. ;; - (or bool-1 bool-2)  => logisched "oder", gibt #true zurück, wenn MINDESTENS EIN bool #true ist
  121. (or #true #true) ; => #true
  122. (or (> 3 2) (< 2 3)) ; => #true
  123. (or (> 3 2) (< 3 2)) ; => #true (MINDESTENS EIN Ausdruck ist #true)
  124. (or (< 3 2) (> 2 3)) ; => #false (KEIN Ausdruck ist #true)
  125. ;; - (not bool-1) => logisches "nicht", negiert den boolschen Wert (#true -> #false) und (#false -> #true)
  126. (not (> 3 2)) ; => #false, da der Ausdruck #true ergibt und das negiert wird
  127. (not (< 3 2)) ; => #true, da der Ausdruck #false ergibt und das negiert wird
  128.  
  129. ; --> COND (Fallunterscheidung) <--
  130.  
  131. ; Grundlage (wenn frage-1 ist #true, dann antwort 1, sonst zu frage-2...)
  132. ; (cond
  133. ;   [frage-1 antwort-1]
  134. ;   [frage-2 antwort-2]
  135. ;   ...
  136. ;   [else antwort-n]) ; nicht notwendig
  137.  
  138.  
  139. ; Das cond-Skelett
  140. ;; berechnet aus einer gegebenen Stueckzahl
  141. ;; den Stueckpreis gemaess Preisstaffel
  142. (define stueckpreis
  143.   (lambda [stueckzahl]
  144.     (cond
  145.       [... ...]
  146.       [... ...]
  147.       [... ...])))
  148.  
  149. ; Funktion: Wenn Stückzahl eine bestimmte Menge hat, gibt es MENGENRABATT
  150. ;; berechnet aus einer gegebenen Stueckzahl
  151. ;; den Stueckpreis gemaess Preisstaffel
  152. (define stueckpreis2
  153.   (lambda [stueckzahl]
  154.     (cond
  155.       [(and (>= stueckzahl 0)
  156.             (<= stueckzahl 1000))  ...]
  157.       [(and (> stueckzahl 1000)
  158.             (<= stueckzahl 10000)) ...]
  159.       [(> stueckzahl 10000)        ...])))
  160.  
  161. ; Die Ausdrücke für die Berechnung der Antworten ergeben sich direkt aus der Tabelle für die Preisstaffelung:
  162. ;; berechnet aus einer gegebenen Stueckzahl
  163. ;; den Stueckpreis gemaess Preisstaffel
  164. (define stueckpreis3
  165.   (lambda [stueckzahl]
  166.     (cond
  167.       [(and (>= stueckzahl 0)
  168.             (<= stueckzahl 1000))  1500]
  169.       [(and (> stueckzahl 1000)
  170.             (<= stueckzahl 10000)) 1250]
  171.       [(> stueckzahl 10000)        975])))
  172.  
  173. ; Nachdem die Funktion getestet wurde, können die Bedingungen vereinfacht werden:
  174. (define stueckpreis4
  175.   (lambda [stueckzahl]
  176.     (cond
  177.       [(<= stueckzahl 1000) 1500]
  178.       [(<= stueckzahl 10000) 1250]
  179.       [else 975])))
  180.  
  181.  
  182. ;-----------[4. Nicht-numerische Daten]------------
  183.  
  184. ; ---> Symbole (Strings?) <---
  185. ; - Symbole sind eine einfache Möglichkeit für die Repräsentation nicht-numerischer Daten.
  186. ; - Symbole sind aufgebaut wie Variablennamen; damit sie nicht als solche interpretiert werden, ist ein Hochkomma voranzustellen.
  187. ; - Symbole dürfen Buchstaben, Ziffern und ein paar Sonderzeichen (keine Leerzeichen!) enthalten.
  188. ; - Symbole sind – wie Zahlen – atomare Daten.
  189. ; - Symbole werden – wie Zahlen – zu sich selbst ausgewertet.
  190. 'symbol 'KarlMarx 'Dies-ist-auch-ein-Symbol 'x1
  191. (equal? 'Hallo 'Hallo) ;;=> #true
  192. (equal? 'Karl 'Rosa)   ;;=> #false
  193. (define hallo 'Hallo)
  194. (equal? 'Hallo hallo)  ;;=> #true, wenn hallo für 'Hallo steht
  195.  
  196. ; ---> 4.2: S-Ausdrücke (Strings + Zeichenketten) <---
  197. ; Ein S-Ausdruck ist
  198. ; - ein Atom, z.B. 27, ’Karl, ’ist
  199. ; - eine Folge von S-Ausdrücken, eingeschlossen in (), z.B.
  200.      '(Karl ist 27) ; Liste mit 3 Elementen
  201.      '((Dies ist) (eine Liste) (mit 3 Listen)) ; Liste mit 3 Listen
  202. ;   -> Solche S-Ausdrücke heißen LISTEN. (Man beachte die Rekursivität dieser Definition!)
  203. ; Atome sind entweder numerisch, boolesch oder symbolisch
  204.  
  205. ; ---> 4.3: Darstellung von Formeln als S-Ausdrücke <---
  206.  
  207. ; Die Formel x^2+3y-5
  208. ; wird beschrieben, durch den S-Ausdruck
  209. '(ADD (EXP x 2) (SUB (MUL 3 y ) 5))
  210.  
  211. ; ---> 4.4 : Konstruktion von Listen <---
  212. ; Ausgangspunkt für die Konstruktion einer Liste ist die leere Liste, die durch
  213. span class="kw3"> empty
  214. ; oder
  215. '()
  216. ; repräsentiert wird.
  217.  
  218. ; Mit der Funktion cons kann ein Element als neues erstes Element einer Liste hinzugefügt werden.
  219. (cons 'Karl empty)                            ;;=> (Karl)
  220. (cons 'Rosa (cons 'Karl empty))               ;;=> (Rosa Karl)
  221. (cons 'Klara (cons 'Rosa (cons 'Karl empty))) ;;=> (Klara Rosa Karl)
  222.  
  223. ; Die Standardfunktion cons erwartet zwei Argumente:
  224. ; - ein neues erstes Element
  225. ; - eine Liste
  226. ; jede Liste kann man sich aus zwei Teilen bestehend vorstellen:
  227. ; - das erste Element
  228. ; - die Restliste
  229.  
  230. ; ---> 4.5: Zerlegung von Listen <---
  231. ; Racket stellt zwei Funktionen bereit zum Zugriff auf die beiden Komponenten einer Liste:
  232. ; - first liefert – angewendet auf eine nicht leere Liste – das erste Element.
  233. ; - rest liefert – angewendet auf eine nicht leere Liste – die Restliste.
  234. ; Der Zusammenhang zwischen cons, first und rest kann durch die folgenden Gleichungen beschrieben werden:
  235. ; -> (first(cons elem liste))=elem
  236. ; -> (rest(cons elem liste))=liste
  237. (first (cons 1 (cons 2 (cons 3 empty))))        ;;=> 1
  238. (first (rest (cons 1 (cons 2 (cons 3 empty))))) ;;=> 2
  239. (first empty) ;;=> first: expects a non-empty list; given: ()
  240.  
  241.  
  242. ; ---> 4.6: Rekursivität (Arbeit mit Listen) <---
  243. ;; Listen können beliebig lang werden. Eine LISTE-VON-SYMBOLEN (lvs) kann als
  244. ;; Datenstruktur wie folgt rekursiv definiert werden:
  245. ;; -> Eine LISTE-VON-SYMBOLEN ist entweder
  246. ;;    1. die leere Liste: empty ODER
  247. ;;    2. (cons s lvs), wobei s ein Symbol und lvs eine LISTE-VON-SYMBOLEN ist
  248. ;; -> Erkennen einer leeren Liste:
  249. ;;    - (empty? lvz)
  250. ;; -> Erkennen einer nicht-leeren Liste:
  251. ;;    - (cons? lvz)
  252.  
  253.  
  254. ; ---> 4.7: Verträge für Funktionen <---
  255. ;; Es soll geprüft werden können, ob in der Liste mit den Automarken 'BMW vorkommt
  256. ;; ermittelt, ob das Symbol 'BMW in der liste-von-symbolen auftritt
  257. (define enthaelt-bmw1?
  258.   (lambda [lvs] ...))
  259.  
  260. ;; Ein Vertrag beschreibt, welche Arten von Daten (Datentypen) die Funktion als
  261. ;; Argumente/Parameter erwartet und welche Datenart die Funktion als Resultat liefert:
  262. ;; -> <Typ von Argument 1> ... <Typ von Argument n> -> <Typ des Resultats>
  263. ;; Für enthaelt-bmw? entspricht das:
  264. ;; -> enthaelt-bmw? : (list-of symbol) -> boolean
  265.  
  266. ;; Überarbeitete Funktion:
  267. ;; ermittelt, ob das Symbol 'BMW in der liste-von-symbolen auftritt
  268. ;; enthaelt-bmw? : (list-of symbol) -> boolean
  269. (define enthaelt-bmw?
  270.   (lambda [lvs] ...))
  271.  
  272.  
  273. ; ---> 4.8: Angabe von Tests für enthaelt-bmw? <---
  274. (check-expect (enthaelt-bmw? empty) #false)
  275.  
  276. (check-expect
  277.  (enthaelt-bmw?
  278.   (cons 'VW (cons 'Opel (cons 'Toyota empty))))
  279.  #false)
  280.  
  281. (check-expect
  282.  (enthaelt-bmw?
  283.   (cons 'VW (cons 'BMW (cons 'Toyota empty))))
  284.  #true)
  285.  
  286. ; ---> 4.9: Anlegen einer Funktionsschablone <---
  287. ;; Da diese zwei Fälle, die leere und die nicht-leere Liste, unterscheidet, ergibt sich folgende Schablone:
  288.  (define f
  289.    (lambda [lvs]
  290.      (cond [(empty? lvs) ...]
  291.            [(cons? lvs)  ...])))
  292.  
  293. ;; Eine nicht-leere Liste ist eine aus zwei Komponenten zusammengesetzte Datenstruktur:
  294. ;;   1. dem ersten Element
  295. ;;   2. der Restliste (ohne das erste Element)
  296.  
  297. ;; Aus diesen Überlegungen ergibt sich folgende Schablone:
  298. (define f
  299.   (lambda [lvs]
  300.     (cond
  301.       [(empty? lvs) ...]
  302.       [(cons? lvs)  ... (first lvs)
  303.                     ... (rest lvs) ...])))
  304.  
  305. ; ---> 4.10: Ausfüllen der Schablone für enthaelt-bmw? <---
  306. ;; Nun betrachten wir die Komponenten der nicht-leeren Liste. Falls das erste Element das gesuchte ist, muss die Funktion #true liefern:
  307. (define enthaelt-bmw?
  308.   (lambda [lvs]
  309.     (cond
  310.       [(empty? lvs) #false]
  311.       [(cons? lvs)
  312.        (cond [(equal? (first lvs) 'BMW) #true]
  313.              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  314.              [else ... (rest lvs) ...])])))
  315.  
  316. ;; Falls das gesuchte Symbol nicht das erste in der Liste ist, hängt das Ergebnis der Funktion davon ab,
  317. ;; ob es in der Restliste gefunden wird. Da die Restliste ja selbst wieder eine Liste-von-Symbolen ist, ist auf sie die Funktion enthaelt-bmw? anwendbar:
  318. (define enthaelt-bmw?
  319.   (lambda [lvs]
  320.     (cond
  321.       [(empty? lvs) #false]
  322.       [(cons? lvs)
  323.        (cond [(equal? (first lvs) 'BMW) #true]
  324.              [else (enthaelt-bmw? (rest lvs))])])))
  325.  
  326.  
  327. ; ---> 4.11: Erweiterte rekursive Funktionsschablone <---
  328. (define listen-funktion
  329.   (lambda [lvs]
  330.     (cond
  331.       [(empty? lvs) ...]
  332.       [else ... (first lvs) ...
  333.             ... (listen-funktion (rest lvs)) ...])))
  334.                  ;;;Rekursiver Aufruf;;;
  335.  
  336. ; ---> 4.12: Liste als Resultate <---
  337. ;; Anwendung der Regeln für die Entwicklung rekursiver Funktionen auf Funktionen, die eine Liste als Resultat liefern.
  338. ;; Dem Gebrauchtwagenhändler soll eine Funktion zur Verfügung gestellt werden, mit dem er ein Modell aus seiner Angebotspalette entfernen kann.
  339.  
  340. ;; -> Vertrag,Funktionskopf, Zweckbestimmung <-
  341. ;; entfernt eine Modell (symbol) aus der  
  342. ;; Modellpalette (liste-von-symbolen)
  343. ;; entferne-modell: (list-of symbol) symbol -> (list-of symbol)
  344. (define entferne-modell
  345.   (lambda [modellpalette modell] ...))
  346.  
  347. ;; -> Hinzufügen der Tests <-
  348. ;; entfernt eine Modell (symbol) aus der  
  349. ;; Modellpalette (liste-von-symbolen)
  350. ;; entferne-modell: (list-of symbol) symbol -> (list-of symbol)
  351. (check-expect (entferne-modell empty 'BMW) empty)
  352. (check-expect (entferne-modell '(BMW) 'BMW) empty)
  353. (check-expect (entferne-modell '(BMW) 'OPEL) '(BMW))
  354. (check-expect (entferne-modell '(BMW OPEL FORD) 'TOYOTA) '(BMW OPEL FORD))
  355. (check-expect (entferne-modell '(BMW OPEL FORD) 'OPEL) '(BMW FORD))
  356. (define entferne-modell
  357.    (lambda [modellpalette modell] ...))
  358.  
  359. ;; -> Hinzufügen der Funktionsschablone <-
  360. ;; entfernt eine Modell (symbol) aus der  
  361. ;; Modellpalette (liste-von-symbolen)
  362. ;; entferne-modell: (list-of symbol) symbol -> (list-of symbol)
  363. (check-expect (entferne-modell empty 'BMW) empty)
  364. (check-expect (entferne-modell '(BMW) 'BMW) empty)
  365. (check-expect (entferne-modell '(BMW) 'OPEL) '(BMW))
  366. (check-expect (entferne-modell '(BMW OPEL FORD) 'TOYOTA) '(BMW OPEL FORD))
  367. (check-expect (entferne-modell '(BMW OPEL FORD) 'OPEL) '(BMW FORD))
  368. (define entferne-modell
  369.   (lambda [modellpalette modell]
  370.     (cond
  371.       [(empty? modellpalette) ...]
  372.       [else ... (first modellpalette) ...
  373.             ... (entferne-modell (rest modellpalette)  modell) ...])))
  374.  
  375. ;; -> Vervollständigung des Funktionsrumpfs <-
  376. ;; entfernt eine Modell (symbol) aus der Modellpalette (liste-von-symbolen)
  377. ;; entferne-modell: (list-of symbol) symbol -> (list-of symbol)
  378. (check-expect (entferne-modell empty 'BMW) empty)
  379. (check-expect (entferne-modell '(BMW) 'BMW) empty)
  380. (check-expect (entferne-modell '(BMW) 'OPEL) '(BMW))
  381. (check-expect (entferne-modell '(BMW OPEL FORD) 'TOYOTA) '(BMW OPEL FORD))
  382. (check-expect (entferne-modell '(BMW OPEL FORD) 'OPEL) '(BMW FORD))
  383. (define entferne-modell
  384.   (lambda [modellpalette modell]
  385.     (cond [(empty? modellpalette) empty]
  386.           [(equal? (first modellpalette) modell) (rest modellpalette)]
  387.           [else (cons (first modellpalette)
  388.                       (entferne-modell (rest modellpalette) modell))])))
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement