13.04.2000 Aufgabe 4

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.

13.04.2000 Aufgabe 4
Irgendwie komm ich da auf keine so tolle Lösung, was habt ihr denn da so???


also ich hab des etz mal so gemacht (mit passwortschutz weil ich die zwei kontoaufgaben zusammengeworfen hab)

(define (make-account balance password max-credit)
 (let ((transaktionsliste '()))
  (define (deposit! amount)
    (if (>= amount 0)
        (begin
          (set! balance (+ balance amount))
           balance
          (set! transaktionsliste (cons (list (- balance amount) (list 'einbuchung amount) balance) transaktionsliste)))
        (display "trying do deposit negative money")))
  
  (define (withdraw! amount)
    (cond ((and (< balance amount) (< (abs (- balance amount)) max-credit)) (set! balance (- balance amount))
                                                   (set! transaktionsliste (cons (list (+ balance amount)
                                                                                 (list 'abhebung amount) balance) transaktionsliste)))
          ((> balance amount) (set! balance (- balance amount))
                              (set! transaktionsliste (cons (list (+ balance amount)
                                                            (list 'abhebung amount) balance) transaktionsliste)))
          ((< amount 0) (display "trying to withdraw negative money!"))
          (else (display "insufficient funds"))))
  
  (define (get-balance)
    (display "your balance is currently:")
    (display balance))
  
  (define (change-password new-password) 
    (begin
      (set! password new-password)
      password))
  
  (define (kontoauszug)
    (begin
      (display transaktionsliste)
      (set! transaktionsliste '())))
  
  
  (define (dispatch m p)
    (if (eq? p password)
    (cond ((eq? m 'deposit!) deposit!)
          ((eq? m 'withdraw!) withdraw!)
          ((eq? m 'get-balance) get-balance)
          ((eq? m 'change-password) change-password)
          ((eq? m 'kontoauszug) kontoauszug)
          (else (display "unknown request!")))
    (display "error: password incorrect!")))
  
  dispatch))
          


(define myaccount (make-account 100 'geheim 500))

((myaccount 'deposit! 'geheim) 100)
((myaccount 'deposit! 'geheim) 20)
((myaccount 'deposit! 'geheim) 60)
((myaccount 'deposit! 'geheim) 700)
((myaccount 'withdraw! 'geheim) 100)
;((myaccount 'withdraw! 'geheim) 100)
;((myaccount 'withdraw! 'geheim) 100)
((myaccount 'kontoauszug 'geheim))

hier die etwas kürzere Version ohne passwort:

(define (make-account balance)
  (let ((kontoauszug '()))
    
    (define (withdraw amount)
      (cond ((< balance amount) (display "error withdraw: unsufficient funds!"))
            (else (begin (set! balance (- balance amount))
                         (auszug (+ balance amount)
                                 'withdraw
                                 amount
                                 balance)
                         balance))))
    (define (deposit amount)
      (begin (set! balance (+ balance amount))
             (auszug (- balance amount)
                     'deposit
                     amount
                     balance)
             balance))
    (define (get-balance)
      balance)
    (define (auszug vorher name betrag nachher)
      (set! kontoauszug (cons (list vorher (list name betrag) nachher) kontoauszug)))
    (define (show-auszug)
      (begin (display (reverse kontoauszug))
             (set! kontoauszug '())
             'danke))
    
    (define (dispatch m)
      (cond ((eq? m 'withdraw) withdraw)
            ((eq? m 'deposit) deposit)
            ((eq? m 'kontostand) get-balance)
            ((eq? m 'kontoauszug) show-auszug)
            (else (lambda x (display "unknown command!")))))
    dispatch))
  
(define my-account (make-account 100))