Programeer opdrachtenOpdracht : opdr1b_engelbertus.txt

Terug naar de inzendingen
Opdracht 1b,Engelbertus Tijseling
16 Jan 2004
 hierbij mijn late oplossing voor het rpobleem.
 ik heb toch maar geen excell blad gemaakt,
 maar het had nu dus even iets meer voeten in de aarde om er iets van te maken,
  heb nog getwijfeld tussen bash en lisp, maar zie hier het resultaat:
 1 
*****bankrekening.lsp*****
  
 2;;;; Naam van het programma: bankrekening.lsp
 3;;;; Doel van het programma: Saldo berekenen op de bankrekening aan de hand van opgegeven waarden,
 4;;;;                         alsmede het verlies dat geleden wordt door toedoen van de bank.
 5;;;;                         Ook het inkomen (door uitlenen van het geld) van de bank wordt uitgerekend.
 6;;;;                   Dan wordt nog de spaarrente, en de winst van de bank berekend.
 7;;;;
 8;;;; Geschreven door:      - E. Tijseling  met hulp van een geduldige Dirk H.P. Gerrits
 9;;;; Credits:              - Dirk H.P. Gerrits
 10;;;;
 11;;;; Dit programma is geschreven naar aanleiding van een programeeropdracht door Pascal Schiks
 12;;;; De opdracht is te lezen op: http://forum.nedlinux.nl/viewtopic.php?t=16433
 13;;;; Deze code is NIET door wat dan ook beschermd en mag door iedereen vrij worden gebruikt
 14;;;;
 15;;;; Gebruik:
 16;;;;
 17;;;; Laad het bestand in je favoriete Commom Lisp implementatie. Met 
 18;;;; CLISP (http://clisp.cons.org/) kun je dit vanaf de commando-prompt
 19;;;; doen op de volgende manier:
 20;;;;
 21;;;; $ clisp bankrekening.lsp
 22;;;;
 23;;;; Daarna wordt gevraagd een aantal gegevens in te voeren en zal de berekening volgen.
 24;;;; Bestudeer de programma-code om de werking te begrijpen en eventueel aan te passen
 25;;;; aan uw situatie
 26;;;;
 27;;;;
 28
 29(defun bankrekening ()
 30(let ( spaarrente leenrente boekingsdagenverschil verliesdagen amaanden adagen schrikkeljaar startsaldo astortingen
 31jaardagen dagspaarrente dagleenrente saldo aspaarsaldo stortingsrentedagen aspaarmaxsaldo auitleenopbrengsten arentedragend banksrente uwrente)
 32;vaste gegevens
 33;deze heb ik hier gezet zodat ze kunnen worden gewijzigd, of het programma hier
 34;meteen kan worden uitgebreid door te vragen naar de invoer van actuele gegevens
 35(setq spaarrente 0.04)             ;uit opgave
 36(setq leenrente 0.09)             ;uit opgave
 37(setq boekingsdagenverschil 1)      ;een overboeking is soms niet "on the fly" mogelijk
 38                           ;zodat er dan minstens 1 dag tussen boekings- en rentedatum zit
 39                           ;bijv bij overboeking vanaf een andere bank (dus alleen rente over hele dagen)
 40                           ;hier heb ik nu 1 ingevuld om in de berekening ook een effect te hebben
 41(setq verliesdagen 3)            ;uit opgave. deze 3 dagen zijn echt onnodig. en zodoende "diefstal"
 42;arrays voor de maanden en de dagen per maand
 43;de variabelenaam van een array heb ik laten beginnen met een a
 44(setq amaanden #("januari" "februari" "maart" "april" "mei" "juni" "juli" "augustus" "september" "oktober" "november" "december"))
 45(setq adagen #(31 28 31 30 31 30 31 31 30 31 30 31))
 46
 47;invoer
 48(setq schrikkeljaar (get-0-1 "is het een schrikkeljaar? 0=nee 1 =ja"))
 49;hierboven heb ik 0 of 1 gekozen zodat je alleen numeriek hoeft in te voeren. op een rekenmachine erg handig
 50;ook komt het goed van pas een schrikkeljaar is 1 dag langer dan 365 en een gewoon jaar 0 dagen langer dan 365
 51(format t "~%")
 52(setq startsaldo (getint "wat is het startsaldo? (in cijfers)"))
 53;invoer van de stortingen -> array
 54(format t "~%")
 55(setq astortingen (make-array 12))
 56(loop for i below 12 do
 57  (setf (aref astortingen i)(getint (format nil "~&storting in de maand ~A: (alleen cijfertoetsen gebruiken)" (aref amaanden i))))
 58)
 59;berekening overige vaste gegevens
 60(setf (aref adagen 1) (+ (aref adagen 1) schrikkeljaar)) ;in een schrikkeljaar heeft de tweede maand 29 dagen = 28+1
 61(setq jaardagen (+ 365 schrikkeljaar)) ;in een schrikkeljaar zitten er 365 +1 dagen in een jaar
 62(setq dagspaarrente (/ spaarrente jaardagen)) ;spaarrentepercentage per dag
 63(setq dagleenrente ( / leenrente jaardagen)) ;leenrentepercentage per dag
 64
 65;--------------------------------------------------------
 66;berekeningen en uitvoer
 67;saldo's op de spaarrekening aan het eind van de maanden:
 68(setq saldo startsaldo)                 ; het saldo voor de berekening is bij het begin gelijk het startsaldo
 69(setq aspaarsaldo (make-array 12))      ; array maken   
 70(loop for i below 12 do                 ; array vullen dmv een loop   
 71   (setq stortingsrentedagen (- (aref adagen i) (+ boekingsdagenverschil verliesdagen))) ;voor de stortingen de effectieve
 72   (setf                                                                                 ;rentedagen in de maand berekenen
 73      (aref aspaarsaldo i )
 74         (+ saldo                                                     ;saldo +
 75         (* (* saldo (aref adagen i)) dagspaarrente)                  ;rente over saldo +
 76         (aref astortingen i)                                         ;storting van de maand +
 77         (* (aref astortingen i) stortingsrentedagen dagspaarrente)   ;rente over de storting
 78         )
 79   )
 80   (format t "~&saldo eind ~A: ~,2F euro. " (aref amaanden i) (aref aspaarsaldo i)) ;afdrukken van het saldo aan het eind van d betreffende maand
 81   (setq saldo (aref aspaarsaldo i)) ;saldo gelijk stellen aan het saldo aan het eind van de maand voor gebruik in de volgende "i"
 82)
 83
 84
 85;maximale rente
 86(setq saldo startsaldo)
 87(setq aspaarmaxsaldo (make-array 12))
 88(loop for i below 12 do
 89   (setq stortingsrentedagen (- (aref adagen i) boekingsdagenverschil))
 90   (setf
 91      (aref aspaarmaxsaldo i)
 92         (+ saldo 
 93         (* saldo (aref adagen i) dagspaarrente)
 94         (aref astortingen i)
 95         (* (aref astortingen i) stortingsrentedagen dagspaarrente)
 96         )
 97   )
 98   (setq saldo (aref aspaarmaxsaldo i))
 99)
 100;maximale rente - uitbetaalde rente = wat u hebt verloren aan de bank / de bank heeft bespaard.
 101(format t "~2&Doordat de bank uw storting ~A dagen op hun eigen rekening laat staan loopt u rente mis." verliesdagen)
 102(format t "~&U hebt hierdoor ~,2F euro minder rente gekregen." (- (aref aspaarmaxsaldo 11)(aref aspaarsaldo 11)))
 103;hier de uitvoer buiten de loop omdat we slechts het eindresultaat nodig hebben ipv na elke "i"
 104
 105;uitgeleend geld   
 106;verdiensten van de bank door uitlenen van het spaargeld
 107;ik ga er van uit dat al het geld dat op de bank komt, uitgeleend kan worden
 108;en dat er geen premies worden gestort. daarover is niks vermeldt in de opdracht.
 109;ook omdat al het geld ( ook de premies) uitgeleend kunnen worden.
 110;ook nu weer laten we buiten beschouwing alle kosten die een bank heeft.
 111;het verschil tussen het uitgeleende geld en wat aanvankelijk werd gestort(arentedragend) (zonder rente ed)
 112;is wat de bank heeft verdiend (extra terug krijgt, boven op het uitgeleende geld).
 113;ik ga hierbij uit van het maandelijks vaststellen van de schulden, en de verschuldigde rente
 114
 115;totale uitgeleend geld plus te ontvangen rente
 116(setq saldo startsaldo)
 117(setq auitleenopbrengsten (make-array 12))
 118(loop for i below 12 do
 119   (setq stortingsrentedagen (aref adagen i))
 120   (setf
 121      (aref auitleenopbrengsten i)
 122         (+ saldo 
 123         (* saldo (aref adagen i) dagleenrente)
 124         (aref astortingen i)
 125         (* (aref astortingen i) stortingsrentedagen dagleenrente)
 126         )
 127   )
 128   (setq saldo (aref auitleenopbrengsten i))
 129)
 130
 131;rentedragende schuld exclusief rente
 132(setq arentedragend (make-array 12))
 133(setq saldo startsaldo)
 134(loop for i below 12 do
 135   (setf
 136      (aref arentedragend i)
 137      (+ saldo (aref astortingen i))
 138   )
 139   (setq saldo (aref arentedragend i))
 140)
 141;uitvoer. wat de bank heeft verdiend. (totaal uitgeleend geld plus te ontvangen rente(op rente)) - (rentedragende schuld)
 142(format t"~2&Door het uitlenen van uw geld en het maandelijks berekenen van rente daarover, heeft de bank geld verdiend.")
 143(setq banksrente (- (aref auitleenopbrengsten 11)(aref arentedragend 11)))
 144(format t "~&Dit is in feite de verschuldigde rente door de lener. Totaal is dit ~,2F euro. " banksrente)
 145
 146
 147;extra:
 148;uw rente in euro's
 149(setq uwrente (-(aref aspaarsaldo 11) (aref arentedragend 11))) ;eindsaldo - totale inleg
 150(format t "~2&U hebt totaal ~,2F euro rente ontvangen." uwrente)
 151;de bank heeft aan het beheer van uw geld verdiend, exclusief kosten:
 152
 153(format t "~2&De bank heeft aan u dus ~,2F euro verdiend (exclusief kosten).~%" (- banksrente uwrente))
 154(values) ;zorgt voor geen lelijke NIL return van het programma op de commandline
 155)
 156)
 157
 158;------------------------------------------------------------
 159;hieronder de routines die invoer ophalen en controleert
 160
 161(defun get-0-1 (prompt)
 162   (loop for input = (getint prompt)
 163      until (<= 0 input 1) ;controleert: 0<=input<=1 dus moet tussen 0 en 1. niet juist? opnieuw!
 164      finally (return input)
 165   )
 166)
 167
 168(defun getint (prompt)
 169   (loop for line = (progn (format t prompt) (read-line))
 170      for number = (parse-integer line :junk-allowed t)
 171        until (integerp number) ;controleert op een integer. geen integer? opnieuw!
 172        finally (return number)
 173   )
 174)
 175
 176;einde
 
 
Mijn commentaar
 
 Dank je voor je inzending Engelbertus.
 Mijn kennis van functionele talen is niet voldoende om er echt een eerlijk oordeel over te geven.
 Ik vind het wel erg tof dat je toch alsnog besloten hebt om niet de weg van de minste weerstand te kiezen !
 Hoop je bij de volgende opgave ook weer terug te zien.