; $Id: ub1-7.scm,v 1.4 2000/11/13 09:45:06 walterj Exp $ ; (Mit Bugfixes von Andreas Witzel) ;;; SIGNATUR ;;; note: number number number number number number -> number ;;; ERKLÄRUNG ;;; (note test1 test2 projekt1 projekt2 klausur1 klausur2) berechnet die ;;; Endnote aus den Punktzahlen der beiden Tests (test1 und test2), ;;; der beiden Programmierprojekte (projekt1 und projekt2) sowie der ;;; beiden Klausuren (klausur1 und klausur2). ;;; Wir treffen die Konvention, daß bei einer Täuschung der Wert -1 übergeben ;;; wird. ;;; Falls die betreffende Person nicht zur Abschlußklausur zugelassen ist, ;;; wird 5.0 zurückgegeben. In diesem Fall kann man aber eigentlich gar nicht ;;; an der Abschlußklausur teilnehmen und bekommt demzufolge dafür auch keine ;;; Punkte die man der Funktion als Argument übergeben könnte. Da in diesem Fall ;;; aber sowieso konstant 5.0 zurückgegeben wird, macht das nichts. ;;; BEISPIEL ;;; (note 10 0 15 16 20 20) ;;; => 2.7 ;;; DEFINITION (define note (lambda (test1 test2 projekt1 projekt2 klausur1 klausur2) (if (zugelassen test1 test2 projekt1 projekt2 klausur1) (let ((gesamt (+ (tests-projekte-punkte test1 test2 projekt1 projekt2) (if (< klausur1 0) 0 klausur1) (if (< klausur2 0) 0 klausur2)))) (punkte->note gesamt)) (punkte->note 0)))) ;;; SIGNATUR ;;; zugelassen: number number number number number -> boolean ;;; ERKLÄRUNG ;;; (zugelassen test1 test2 projekt1 projekt2 klausur1) überprüft, ;;; ob der Student mit den als Argumente übergebenen Punktzahlen zu der ;;; Abschlußklausur zugelassen ist. ;;; Der Rückgabewert ist #t, falls der Student zur Abschlußklausur ;;; zugelassen ist, #f sonst. ;;; BEISPIEL ;;; (zugelassen 0 10 10 5 10) ;;; => #t ;;; DEFINITION (define zugelassen (lambda (test1 test2 projekt1 projekt2 klausur1) (>= (+ (if (>= test1 10) 1 0) (if (>= test2 10) 1 0) (if (>= projekt1 10) 1 0) (if (>= projekt2 10) 1 0) (if (>= klausur1 10) 1 0)) 3))) ;;; SIGNATUR ;;; punkte->note: number -> number ;;; ERKLÄRUNG ;;; (punkte->note p) berechnet die zur Gesamtpunktzahl p gehörige Note. ;;; BEISPIEL ;;; (punkte->note 62) ;;; => 3.3 ;;; DEFINITION (define punkte->note (lambda (p) (if (>= p 95) 1.0 (if (>= p 90) 1.3 (if (>= p 85) 1.7 (if (>= p 80) 2.0 (if (>= p 75) 2.3 (if (>= p 70) 2.7 (if (>= p 65) 3.0 (if (>= p 60) 3.3 (if (>= p 55) 3.7 (if (>= p 50) 4.0 5.0)))))))))))) ;;; SIGNATUR ;;; tests-projekte-punkte: number number number number -> number ;;; ERKLÄRUNG ;;; (tests-projekte-punkte test1 test2 projekt1 projekt2) berechnet aus den ;;; Punkten der beiden Tests und der beiden Programmierprojekte die Anzahl ;;; der in Tests und Projekten erworbenen Punkte, die in die Note eingeht. ;;; Die Grundidee für diese Funktion besteht darin, daß zunächst die erste ;;; in die Note eingehende Punktzahl bestimmt wird (entweder das Maximum aller ;;; Punkte oder 0, falls ein Täuschungsversuch vorlag) und die Entscheidung ;;; über die andere Punktzahl an die Hilfsfunktion tests-projekte-punkte-1 ;;; übergeben wird. ;;; BEISPIEL ;;; (tests-projekte-punkte -1 15 13 14) ;;; => 15 ;;; DEFINITION (define tests-projekte-punkte (lambda (test1 test2 projekt1 projekt2) (let ((m (if (< (min test1 test2 projekt1 projekt2) 0) (min test1 test2 projekt1 projekt2) ; Täuschung (max test1 test2 projekt1 projekt2)))) ; Keine Täuschung (let ((p (if (< m 0) 0 m))) (if (= m test1) (+ p (tests-projekte-punkte-1 test2 projekt1 projekt2)) (if (= m test2) (+ p (tests-projekte-punkte-1 test1 projekt1 projekt2)) (if (= m projekt1) (+ p (tests-projekte-punkte-1 test1 test2 projekt2)) (+ p (tests-projekte-punkte-1 test1 test2 projekt1))))))))) ;;; SIGNATUR ;;; tests-projekte-punkte-1: number number number -> number ;;; ERKLÄRUNG ;;; (tests-projekte-punkte-1 p1 p2 p3) liefert von drei Punktzahlen aus Tests ;;; und Programmierprojekten diejenige zurück, die zur Berechnung der Note ;;; verwendet wird. ;;; BEISPIEL ;;; (tests-projekte-punkte-1 0 5 13) ;;; => 13 ;;; DEFINITION (define tests-projekte-punkte-1 (lambda (p1 p2 p3) (if (< (min p1 p2 p3) 0) 0 ; Täuschung (max p1 p2 p3)))) ; Keine Täuschung