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.
Nochmal 7.1/7.2
Meine Lösung entspricht dem Lösungsansatz von Gandalf!
Nur halt etwas anders codiert, besser oder schlechter ???
Kann ja jeder für sich entscheiden!
; Aufgabe 7.1 Schaltjahr:
;===================================
(define (schaltjahr? n)
(cond ;1.Fall
((and (zero? (modulo n 4)) (not (zero? (modulo n 100))))
#t)
;2.Fall
((and (zero? (modulo n 4)) (zero? (modulo n 100)) (zero? (modulo n 400)))
#t)
( else #f )))
; Aufgabe 7.2 Tagesalter
;===================================
;Prinzip: Rufe die Fkt. solange auf bis vom einen Datum zum anderen
(define lebenstage
(lambda (t1 m1 j1 t2 m2 j2)
;Zwischenspeichervariablen:
(define ltage 0)
(define (datum+1 nt nm nj)
;Hochzählen der Lebenstage
(set! ltage (+ ltage 1))
; Anpassen des Datums
(cond
( (or (= nm 1) (= nm 3) (= nm 5) (= nm 7) (= nm :cool: (= nm 10) (= nm 12))
(if (= nt 32)
(begin (set! nt 1)
(set! nm (+ nm 1))
(if (= nm 13)
(begin (set! nm 1)
(set! nj (+ nj 1)))))))
( (or (= nm 4) (= nm 6) (= nm 9) (= nm 11))
(if (= nt 31)
(begin (set! nt 1)
(set! nm (+ nm 1))
(if (= nm 13)
(begin (set! nm 1)
(set! nj (+ nj 1)))))))
( (= nm 2)
(if (schaltjahr? nj)
; Schaltjahr
(begin (if (= nt 30)
(begin (set! nt 1)
(set! nm (+ nm 1)))))
; Kein Schaltjahr
(begin (if (= nt 29)
(begin (set! nt 1)
(set! nm (+ nm 1))))))))
(cond ;Abbruch falls gleiche Daten erreicht:
( (and (= nt t2) (= nm m2) (= nj j2))
(display "Sie sind ") (display ltage) (display " Tage jungn"))
;Andernfalls neu Aufruf mit nt = nt + 1
(else (datum+1 (+ nt 1) nm nj))))
;Funktionsaufruf
(datum+1 t1 m1 j1)))
Ich würd sagen Deine Version is übersichtlicher, und basiert mehr auf anderen Programmiersprachen, dafür is meine kürzer und baut auf dem auf, was wir in Algo bis jetzt gemacht haben