Programeer opdrachtenOpdracht : opdr1b_mart.txt

Terug naar de inzendingen
Opdracht 1b, Mart Kelder
14 Jan 2004
 
 k heb deze opdracht als oefening uitgewerkt in PostScript.
 
 Ik weet dat PostScript arrays ondersteunt, maar de opdracht moet natuurlijk wel leuk blijven (ik vind spelen met een stack leuker)...
 
 Behalve dat de andere opdracht niet in PostScript te maken is (PostScript ondersteunt geen invoer van de gebruiker, voor zover ik weet), vond ik deze opdracht interressanter door de wiskundige aspecten die er in zitten (rente-op-rente).
 1 
*****bank.ps*****
  
 2%PS
 3
 4%Doel van het programma: een overzicht van de gegevens zoals geformuleert is in http://forum.nedlinux.nl/viewtopic.php?t=16433
 5
 6% Copyright (C) 2005, Mart Kelder
 7%
 8% This program is free software; you can redistribute it and/or modify
 9% it under the terms of the GNU General Public License as published by
 10% the Free Software Foundation; either version 2 of the License, or
 11% (at your option) any later version.
 12%
 13% This program is distributed in the hope that it will be useful,
 14% but WITHOUT ANY WARRANTY; without even the implied warranty of
 15% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 16%
 17% You should have received a copy of the GNU General Public License
 18% along with this program; if not, write to the Free Software
 19% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 20
 21%Opmerking: Ja, ik weet dat PostScript ook arrays aankan, maar het moet natuurlijk wel leuk blijven...
 22
 23%Deze script kan geintepreteerd worden door ghostview. Het script is uit te voeren met het volgende commando:
 24% gv bank.ps
 25
 26%Constantes
 27/rente_percentage { 4 } def
 28/rente_lening { 9 } def
 29
 30%Het bedrag waarmee begonnen wordt.
 31/beginbedrag
 32{
 33  430
 34} def
 35
 36%De stortingen per maand
 37/stortingen
 38{
 39  40 30 50 50 60 40 60 80 40 50 30 20
 40} def
 41
 42%Het aantal dagen in een bepaalde maand
 43/dagen
 44{
 45  31 28 31 30 31 30 31 31 30 31 30 31
 46} def
 47
 48%Het aantal dagen dat er in een jaar zit
 49/dagen_in_jaar
 50{
 51  365
 52} def
 53
 54%De namen van de verschillende maanden
 55/maanden
 56{
 57  (januari) (februari) (maart) (april) (mei) (juni) (juli) (augustus) (september) (oktober) (november) (december)
 58} def
 59
 60%De locatie van de verschillende onderdelen
 61/links  { 40 } def  %De x-co\"ordinaat van de meest linker lijn
 62/rechts { 540 } def %De x-co\"ordinaat van de meest rechter lijn
 63/boven  { 695 } def %De y-co\"ordinaat van de meest bovenste lijn
 64/onder  { 420 } def %De y-co\"ordinaat van de meest onderste lijn
 65
 66/hoogte_titel_lijn { 670 } def %De hoogte van de lijn onder de titel
 67
 68/vlijn_1 { 140 } def  %De x-co\"ordinaat van van de eerste linker lijn (de lijn tussen de 1-ste en de 2-de kolom)
 69/vlijn_2 { 240 } def  %De x-co\"ordinaat van van de tweede linker lijn (de lijn tussen de 2-de  en de 3-de kolom)
 70/vlijn_3 { 340 } def  %De x-co\"ordinaat van van de derde  linker lijn (de lijn tussen de 3-de  en de 4-de kolom)
 71/vlijn_4 { 440 } def  %De x-co\"ordinaat van van de vierde linker lijn (de lijn tussen de 4-de  en de 5-de kolom)
 72
 73/hlijn_bovenste     { 654 } def %De hoogte van de bovenste horizontale lijn
 74/hlijn_onderste     { 444 } def %De hoogte van de onderste horizontale lijn
 75/hlijn_tussenruimte { 20 } def  %De tussenruimte tussen de horizontale lijnen
 76
 77/links_kolom_1 { links 10 add } def   %De linkermarge in de 5-de kolom bij alle data.
 78/links_kolom_2 { vlijn_1 13 add } def %De linkermarge in de 5-de kolom bij alle data.
 79/links_kolom_3 { vlijn_2 13 add } def %De linkermarge in de 5-de kolom bij alle data.
 80/links_kolom_4 { vlijn_3 13 add } def %De linkermarge in de 5-de kolom bij alle data.
 81/links_kolom_5 { vlijn_4 13 add } def %De linkermarge in de 5-de kolom bij alle data.
 82
 83/links_titel_1 { links 10 add } def   %De linkermarge in de 1-de kolom bij de titel.
 84/links_titel_2 { vlijn_1 10 add } def %De linkermarge in de 2-de kolom bij de titel.
 85/links_titel_3 { vlijn_2 10 add } def %De linkermarge in de 3-de kolom bij de titel.
 86/links_titel_4 { vlijn_3 10 add } def %De linkermarge in de 4-de kolom bij de titel.
 87/links_titel_5 { vlijn_4 10 add } def %De linkermarge in de 5-de kolom bij de titel.
 88
 89/boven_marge1 { 15 sub } def %De marge tussen de bovenste lijn en de titel
 90/boven_marge2 { 45 sub } def %De marge tussen de bovenste lijn en het eerste data-object
 91
 92/ruimte_euroteken_komma { 65 } def
 93
 94%Deze functie haalt een bepaalt element uit een lijst van lengte 12 en verwijdert de rest.
 95%Invoer: i x_1 x_2 ... x_12
 96%Uitvoer: x_i
 97/get_index
 98{
 99 %Stack: i x_1 x_2 ... x_12
 100 13 12 roll
 101 %Stack: x_1 x_2 ... x_12 i
 102 13 exch sub
 103 %Stack: x_1 x_2 ... x_12 13-i
 104 12 exch
 105 %Stack: x_1 x_2 ... x_12 12 13-i
 106 roll
 107 %Stack: x_i ... x_12 x_1 ... x_{i-1}
 108 11
 109 {
 110  pop
 111 } repeat
 112 %Stack: x_i
 113} def
 114
 115
 116%De volgende functie haalt de storting uit een bepaalde maand op
 117%Invoer: een getal tussen 1 en 12; 1 staat voor jan, 12 voor dec.
 118%Uitvoer: de storting in die maand
 119/get_storting
 120{
 121 stortingen
 122 get_index
 123} def
 124
 125%De volgende functie haalt het aantal dagen van een maand op.
 126%Invoer: een getal tussen 1 en 12; 1 staat voor jan, 12 voor dec.
 127%Uitvoer: het aantal dagen van die maand
 128/get_dagen
 129{
 130 dagen
 131 get_index
 132} def
 133
 134%Dit commando tekent een euro-teken op plaats (x,y). Er mag niet al een pad getekent worden.
 135%Invoer: x y
 136%Uitvoer:
 137/euro_teken
 138{
 139 [ 1 0 ] 0 setdash
 140 1 setlinewidth
 141 
 142 %Stack: x y
 143 dup
 144 %Stack: x y y
 145 3 2 roll
 146 %Stack: y y x
 147 dup
 148 %Stack: y y x x
 149 4 1 roll
 150 %Stack: x y y x
 151 exch
 152 %Stack: x y x y
 153 
 154 %Stack: x y x y
 155 5 add
 156 %Stack: x y x y+5
 157 5 45 315 arc
 158  
 159 %Stack: x y
 160 6 add
 161 %Stack: x y+6
 162 exch
 163 %Stack: y+1 x
 164 8 sub
 165 %Stack: y+1 x-8
 166 exch
 167 %Stack: x-8 y+1
 168 moveto
 169 %Stack: 
 170 11 0 rlineto
 171 -11 -2 rmoveto
 172 10 0 rlineto
 173} def
 174
 175%Invoer: bedrag x y
 176%Uitvoer: 
 177%Uitvoer op scherm: {euroteken} euro's,centen
 178/print_money
 179{
 180 newpath
 181 %Stack: bedrag x y
 182 3 2 roll
 183 %Stack: x y bedrag
 184 %Afronden op yyyxx
 185 100 mul round cvi
 186 %Euro's en centen afsplitsen
 187 dup
 188 %Stack: x y bedrag*100 bedrag*100
 189 100 mod
 190 %Stack: x y bedrag*100 centen
 191 exch
 192 %Stack: x y centen bedrag*100
 193 100 idiv
 194 %Stack: x y centen euro's
 195 4 2 roll
 196 %Stack: centen euro's x y
 197 exch dup
 198 %Stack: centen euro's y x x
 199 3 2 roll
 200 %Stack: centen euro's x x y
 201 dup
 202 %Stack: centen euro's x x y y
 203 3 1 roll
 204 %Stack: centen euro's x y x y
 205 euro_teken
 206 %Stack: centen euro's x y
 207 moveto
 208 %Stack: centen euro's
 209 ruimte_euroteken_komma 0 rmoveto
 210 %Stack: centen euro's
 211 10 string cvs
 212 %Stack: centen euro_string
 213 dup
 214 %Stack: centen euro_string euro_string
 215 stringwidth
 216 %Stack: centen euro_string rwidth rheight
 217 neg exch neg exch
 218 %Stack: centen euro's -rwidth -rheight
 219 rmoveto
 220 %Stack: centen euro's
 221 10 string cvs show
 222 (,) show
 223 %Stack: centen
 224 dup
 225 %Stack: centen centen
 226 10 lt
 227 {
 228  %Als centen strict kleiner dan 10, maar ongelijk aan 0
 229  (0) show
 230 } if
 231 
 232 %Omzetten naar een string en weergeven
 233 10 string cvs show
 234 stroke
 235} def
 236
 237%Invoer: x_1 x_2 x_3 ... x_n n links boven tussenruimte
 238%Uitvoer:
 239/print_kolom
 240{
 241 %Stack: x_1 x_2 x_3 ... x_n n links boven tussenruimte
 242 3 1 roll
 243 %Stack: x_1 x_2 x_3 ... x_n n tussenruimte links boven
 244 4 3 roll
 245 %Stack: x_1 x_2 x_3 ... x_n tussenruimte links boven n
 246 dup
 247 %Stack: x_1 x_2 x_3 ... x_n tussenruimte links boven n n
 248 5 1 roll
 249 %Stack: x_1 x_2 x_3 ... x_n n tussenruimte links boven n
 250 {
 251  %Stack: x_1 x_2 x_3 ... x_n n tussenruimte links boven
 252  dup
 253  %Stack: x_1 x_2 x_3 ... x_n n tussenruimte links boven boven
 254  3 2 roll
 255  %Stack: x_1 x_2 x_3 ... x_n n tussenruimte boven boven links
 256  dup
 257  %Stack: x_1 x_2 x_3 ... x_n n tussenruimte boven boven links links
 258  4 1 roll
 259  %Stack: x_1 x_2 x_3 ... x_n n tussenruimte links boven boven links
 260  exch
 261  %Stack: x_1 x_2 x_3 ... x_n n tussenruimte links boven links boven
 262  5 4 roll
 263  %Stack: x_1 x_2 x_3 ... x_n n links boven links boven tussenruimte
 264  dup
 265  %Stack: x_1 x_2 x_3 ... x_n n links boven links boven tussenruimte tussenruimte
 266  4 1 roll
 267  %Stack: x_1 x_2 x_3 ... x_n n links boven tussenruimte links boven tussenruimte
 268  sub
 269  %Stack: x_1 x_2 x_3 ... x_n n links boven tussenruimte links boven_nieuw
 270  6 5 roll
 271  %Stack: x_1 x_2 x_3 ... x_n links boven tussenruimte links boven_nieuw n
 272  dup
 273  %Stack: x_1 x_2 x_3 ... x_n links boven tussenruimte links boven_nieuw n n
 274  1 sub
 275  %Stack: x_1 x_2 x_3 ... x_n links boven tussenruimte links boven_nieuw n n-1
 276  7 1 roll
 277  %Stack: x_1 x_2 x_3 ... x_n n-1 links boven tussenruimte links boven_nieuw n
 278  6 add
 279  %Stack: x_1 x_2 x_3 ... x_n n-1 links boven tussenruimte links boven_nieuw n+6
 280  dup
 281  %Stack: x_1 x_2 x_3 ... x_n n-1 links boven tussenruimte links boven_nieuw n+6 n+6
 282  1 sub
 283  %Stack: x_1 x_2 x_3 ... x_n n-1 links boven tussenruimte links boven_nieuw n+6 n+5
 284  roll
 285  %Stack: x_2 x_3 ... x_n n-1 links boven tussenruimte links boven_nieuw n_1
 286  %n-1 -> n', x_2 -> x'_1, x_3 -> x'_2 ... x_n -> x'_n'
 287  %Stack: x'_1 x'_2 ... x'_n' n' links boven tussenruimte links boven_nieuw n_1
 288  dup
 289  %Stack: x'_1 x'_2 ... x'_n' n' links boven tussenruimte links boven_nieuw n_1 n_1
 290  type
 291  %Stack: x'_1 x'_2 ... x'_n' n' links boven tussenruimte links boven_nieuw n_1 type_of_n_1
 292  7 5 roll
 293  %Stack: x'_1 x'_2 ... x'_n' n' tussenruimte links boven_nieuw n_1 type_of_n_1 links boven
 294  3 2 roll
 295  %Stack: x'_1 x'_2 ... x'_n' n' tussenruimte links boven_nieuw n_1 links boven type_of_n_1
 296  /stringtype eq
 297  {
 298   newpath
 299   moveto
 300   show
 301   stroke
 302  }
 303  {
 304   print_money
 305  } ifelse
 306  %Stack: x'_1 x'_2 ... x'_n' n' tussenruimte links boven_nieuw
 307 } repeat
 308 %Stack: 0 tussenruimte links boven_nieuw
 309 pop
 310 pop
 311 pop
 312 pop
 313 %Stack:
 314} def
 315
 316%Invoer: rente bedrag aantal_dagen aantal_dagen_in_maand
 317%Uitvoer: de_rente
 318/rente
 319{
 320 %Bereken eerst het rentepercentage van de hele maand
 321 %Stack: rente bedrag aantal_dagen aantal_dagen_in_maand
 322 dup
 323 %Stack: rente bedrag aantal_dagen aantal_dagen_in_maand dagen_in_maand
 324 dagen_in_jaar div
 325 %Stack: rentepercentage bedrag aantal_dagen aantal_dagen_in_maand dagen_in_maand/dagen_in_jaar
 326 5 4 roll
 327 %Stack: bedrag aantal_dagen aantal_dagen_in_maand dagen_in_maand/dagen_in_jaar rentepercentage
 328 100 div
 329 1 add
 330 %Stack: bedrag aantal_dagen aantal_dagen_in_maand dagen_in_maand/dagen_in_jaar 1+rentepercentage/100
 331 exch
 332 %Stack: bedrag aantal_dagen aantal_dagen_in_maand 1+rentepercentage/100 dagen_in_maand/dagen_in_jaar
 333 exp
 334 %Stack: bedrag aantal_dagen aantal_dagen_in_maand rente_in_maand
 335 
 336 %Bereken nu hoeveel procent van de maand het geld op de rekening stond
 337 3 1 roll
 338 %Stack: bedrag rente_in_maand aantal_dagen aantal_dagen_in_maand
 339 div
 340 %Stack: bedrag rente_in_maand aantal_dagen/aantal_dagen_in_maand
 341 
 342 %Het rentepercentage dat over het bedrag berekent moet worden
 343 exch
 344 %Stack: bedrag aantal_dagen/aantal_dagen_in_maand rente_in_maand
 345 1 sub
 346 %Stack: bedrag aantal_dagen/aantal_dagen_in_maand rente_in_maand-1
 347 mul
 348 %Stack: bedrag aantal_dagen/aantal_dagen_in_maand*(rente_in_maand-1)
 349 1 add
 350 %Stack: bedrag aantal_dagen/aantal_dagen_in_maand*(rente_in_maand-1)+1
 351
 352 %Het berekenen van het bedrag
 353 mul
 354} def
 355
 356%Invoer: x_1 x_2 ... x_n n
 357%Uitvoer: x_1 x_2 ... x_n x_1 x_2 ... x_n
 358/dup_lijst
 359{
 360 dup
 361 %Stack: x_1 x_2 ... x_n n n
 362 1 1
 363 %Stack: x_1 x_2 ... x_n n n 1 1
 364 3 2 roll
 365 %Stack: x_1 x_2 ... x_n n 1 1 n
 366 {
 367  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_n n i
 368  dup
 369  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_n n i i
 370  3 2 roll
 371  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_n i i n
 372  dup
 373  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_n i i n n
 374  4 1 roll
 375  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_n n i i n
 376  exch sub
 377  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_n n i n-i
 378  3 add
 379  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_n n i n-i+3
 380  dup
 381  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_n n i n-i+3 n-i+3
 382  1 sub
 383  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_n n i n-i+3 n-i+2
 384  roll
 385  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_{i-1} x_{i+1} ... x_n n i x_i
 386  3 2 roll
 387  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_{i-1} x_{i+1} ... x_n i x_i n
 388  dup
 389  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_{i-1} x_{i+1} ... x_n i x_i n n
 390  3 2 roll
 391  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_{i-1} x_{i+1} ... x_n i n n x_i
 392  dup
 393  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_{i-1} x_{i+1} ... x_n i n n x_i x_i
 394  3 2 roll
 395  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_{i-1} x_{i+1} ... x_n i n x_i x_i n
 396  3 add
 397  %Stack: x_1 x_2 ... x_{i-1} x_1 x_2 ... x_{i-1} x_{i+1} ... x_n i n x_i x_i n+3
 398  1 roll
 399  %Stack: x_1 x_2 ... x_i x_1 x_2 ... x_{i-1} x_{i+1} ... x_n i n x_i
 400  3 1 roll
 401  %Stack: x_1 x_2 ... x_i x_1 x_2 ... x_{i-1} x_{i+1} ... x_n x_i i n
 402  dup
 403  %Stack: x_1 x_2 ... x_i x_1 x_2 ... x_{i-1} x_{i+1} ... x_n x_i i n n
 404  4 1 roll
 405  %Stack: x_1 x_2 ... x_i x_1 x_2 ... x_{i-1} x_{i+1} ... x_n n x_i i n
 406  exch sub
 407  %Stack: x_1 x_2 ... x_i x_1 x_2 ... x_{i-1} x_{i+1} ... x_n n x_i n-i
 408  2 add
 409  %Stack: x_1 x_2 ... x_i x_1 x_2 ... x_{i-1} x_{i+1} ... x_n n x_i n-i+2
 410  1 roll
 411  %Stack: x_1 x_2 ... x_i x_1 x_2 ... x_n n
 412 } for
 413 pop
 414 %Stack: x_1 x_2 ... x_n x_1 x_2 ... x_n
 415} def
 416
 417%Invoer: x_1 x_2 ... x_n n
 418%Uitvoer: -x_1 -x_2 ... -x_n n
 419/neg_lijst
 420{
 421 %Stack: x_1 x_2 x_3 ... x_n n
 422 dup
 423 %Stack: x_1 x_2 x_3 ... x_n n n
 424 {
 425  %Stack: x_1 x_2 x_3 ... x_n n
 426  exch neg exch
 427  %Stack: x_1 x_2 x_3 ... -x_n n
 428  dup
 429  %Stack: x_1 x_2 x_3 ... -x_n n n
 430  3 1 roll
 431  %Stack: x_1 x_2 x_3 ... n -x_n n
 432  1 add
 433  %Stack: x_1 x_2 x_3 ... n -x_n n+1
 434  1 roll
 435  %Stack: -x_n x_1 x_2 ... x_{n-1} n
 436 } repeat
 437 %Stack: -x_1 -x_2 -x_3 ... -x_n n
 438} def
 439
 440%Invoer: x_1 x_2 x_3 ... x_n y_1 y_2 y_3 ... y_n n
 441%Uitvoer: y_1 y_2 y_3 ... y_n x_1 x_2 x_3 ... x_n n
 442/exch_lijst
 443{
 444 %Stack: x_1 x_2 x_3 ... x_n y_1 y_2 y_3 ... x_n n
 445 dup
 446 dup
 447 %Stack: x_1 x_2 x_3 ... x_n y_1 y_2 y_3 ... x_n n n n
 448 2 add
 449 %Stack: x_1 x_2 x_3 ... x_n y_1 y_2 y_3 ... x_n n n n+2
 450 1 roll
 451 %Stack: x_1 x_2 x_3 ... x_n n y_1 y_2 y_3 ... x_n n
 452 dup
 453 %Stack: x_1 x_2 x_3 ... x_n n y_1 y_2 y_3 ... x_n n n
 454 2 mul
 455 1 add
 456 %Stack: x_1 x_2 x_3 ... x_n n y_1 y_2 y_3 ... x_n n 2*n+1
 457 exch
 458 %Stack: x_1 x_2 x_3 ... x_n n y_1 y_2 y_3 ... x_n 2*n+1 n
 459 roll
 460 %Stack: y_1 y_2 y_3 ... y_n x_1 x_2 x_3 ... x_n n
 461} def
 462
 463%Invoer x_1 x_2 ... x_n y_1 y_2 ... y_n n
 464%Uitvoer: x_1+y_1 x_2+y_2 x_3+y_3 ... x_n+y_n
 465/add_lijst
 466{
 467 %Stack: x_1 x_2 x_3 ... x_n y_1 y_2 ... y_n n
 468 dup
 469 %Stack: x_1 x_2 x_3 ... x_n y_1 y_2 ... y_n n n
 470 1 1
 471 %Stack: x_1 x_2 x_3 ... x_n y_1 y_2 ... y_n n n 1 1
 472 3 2 roll
 473 %Stack: x_1 x_2 x_3 ... x_n y_1 y_2 ... y_n n 1 1 n
 474 {
 475  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_i y_1 y_2 ... y_i n j
 476  exch
 477  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_i y_1 y_2 ... y_i j n
 478  dup
 479  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_i y_1 y_2 ... y_i j n n
 480  3 1 roll
 481  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_i y_1 y_2 ... y_i n j n
 482  exch sub
 483  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_i y_1 y_2 ... y_i n n-j
 484  1 add
 485  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_i y_1 y_2 ... y_i n n-j+1
 486  % i = n-j+1
 487  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_i y_1 y_2 ... y_i n i
 488  dup
 489  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_i y_1 y_2 ... y_i n i i
 490  3 add
 491  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_i y_1 y_2 ... y_i n i i+3
 492  dup
 493  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_i y_1 y_2 ... y_i n i i+3 i+3
 494  1 sub
 495  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_i y_1 y_2 ... y_i n i i+3 i+2
 496  roll
 497  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_{i-1} y_1 y_2 ... y_i n i x_i
 498  4 3 roll
 499  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_{i-1} y_1 y_2 ... y_{i-1} n i x_i y_1
 500  add
 501  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_{i-1} y_1 y_2 ... y_{i-1} n i x_i-y_1
 502  exch
 503  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_{i-1} y_1 y_2 ... y_{i-1} n x_i-y_1 i
 504  3 2 roll
 505  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_{i-1} y_1 y_2 ... y_{i-1} x_i-y_1 i n
 506  dup
 507  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_{i-1} y_1 y_2 ... y_{i-1} x_i-y_1 i n n
 508  4 1 roll
 509  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_{i-1} y_1 y_2 ... y_{i-1} n x_i-y_1 i n
 510  add
 511  %Stack: x_{i+1}-y_{i+1} ... x_n-y_n x_1 x_2 x_3 ... x_{i-1} y_1 y_2 ... y_{i-1} n x_i-y_1 i+n
 512  1 roll
 513  %Stack: x_i-y_i ... x_n-y_n x_i-y_i x_1 x_2 x_3 ... x_{i-1} y_1 y_2 ... y_{i-1} n
 514 } for
 515} def
 516
 517%Invoer x_1 x_2 ... x_n y_1 y_2 ... y_n n
 518%Uitvoer: x_1-y_1 x_2-y_2 x_3-y_3 ... x_n-y_n
 519/sub_lijst
 520{
 521 neg_lijst
 522 add_lijst
 523} def
 524
 525%Invoer: rente bedrag wachttijd maandnr
 526%Uitvoer: nieuw_bedrag
 527/bereken_maand
 528{
 529 %Stack: rente bedrag wachttijd maandnr
 530 %Bereken eerst de rente over het bedrag dat al aanwezig is.
 531 dup
 532 %Stack: rente bedrag wachttijd maandnr maandnr
 533 get_dagen
 534 %Stack: rente bedrag wachttijd maandnr dagen_in_maand
 535 dup
 536 %Stack: rente bedrag wachttijd maandnr dagen_in_maand dagen_in_maand
 537 6 5 roll
 538 %Stack: bedrag wachttijd maandnr dagen_in_maand dagen_in_maand rente
 539 dup
 540 %Stack: bedrag wachttijd maandnr dagen_in_maand dagen_in_maand rente rente
 541 4 1 roll
 542 %Stack: bedrag wachttijd maandnr rente dagen_in_maand dagen_in_maand rente
 543 7 6 roll
 544 %Stack: wachttijd maandnr rente dagen_in_maand dagen_in_maand rente bedrag
 545 4 2 roll
 546 %Stack: wachttijd maandnr rente rente bedrag dagen_in_maand dagen_in_maand
 547 rente
 548 %Stack: wachttijd maandnr rente bedrag_plus_rente1
 549 3 2 roll
 550 %Stack: wachttijd rente bedrag_plus_rente1 maandnr
 551 dup
 552 %Stack: wachttijd rente bedrag_plus_rente1 maandnr maandnr
 553 get_dagen
 554 %Stack: wachttijd rente bedrag_plus_rente1 maandnr dagen_in_maand
 555 dup
 556 %Stack: wachttijd rente bedrag_plus_rente1 maandnr dagen_in_maand dagen_in_maand
 557 6 5 roll
 558 %Stack: rente bedrag_plus_rente1 maandnr dagen_in_maand dagen_in_maand wachttijd
 559 sub
 560 %Stack: rente bedrag_plus_rente1 maandnr dagen_in_maand dagen_in_maand-wachttijd
 561 exch
 562 %Stack: rente bedrag_plus_rente1 maandnr dagen_in_maand-wachttijd dagen_in_maand
 563 5 4 roll
 564 %Stack: bedrag_plus_rente1 maandnr dagen_in_maand-wachttijd dagen_in_maand rente
 565 4 3 roll
 566 %Stack: bedrag_plus_rente1 dagen_in_maand-wachttijd dagen_in_maand rente maandnr
 567 get_storting
 568 %Stack: bedrag_plus_rente1 dagen_in_maand-wachttijd dagen_in_maand rente storting
 569 4 2 roll
 570 %Stack: bedrag_plus_rente1 rente storting dagen_in_maand-wachttijd dagen_in_maand
 571 rente
 572 %Stack: bedrag_plus_rente1 storting_plus_rente
 573 add
 574 %Stack: bedrag_met_rente
 575} def
 576
 577%Invoer: beginbedrag
 578%Uitvoer: lijst met saldo zonder rente per maand
 579/maak_storting_lijst
 580{
 581 %Stack: beginbedrag
 582 stortingen
 583 %Stack: beginbedrag x_1 x_2 x_3 .., x_12
 584 1 1 12
 585 {
 586  2
 587  {
 588   %Stack: beginbedrag x_1 x_2 x_3 .. x_12 maandnr
 589   dup
 590   %Stack: beginbedrag x_1 x_2 x_3 .. x_12 maandnr maandnr
 591   15 exch sub
 592   %Stack: beginbedrag x_1 x_2 x_3 .. x_12 maandnr 15-maandnr
 593   dup
 594   %Stack: beginbedrag x_1 x_2 x_3 .. x_12 maandnr 15-maandnr 15-maandnr
 595   1 sub
 596   %Stack: beginbedrag x_1 x_2 x_3 .. x_12 maandnr 15-maandnr 14-maandnr
 597   roll
 598   %i = maandnr - 1
 599   %Stack: beginbedrag x_1 x_2 x_3 ... x_{i-1} x_{i+1} ... x_12 maandnr x_i
 600   dup
 601   %Stack: beginbedrag x_1 x_2 x_3 ... x_{i-1} x_{i+1} ... x_12 maandnr x_i x_i
 602   3 2 roll
 603   %Stack: beginbedrag x_1 x_2 x_3 ... x_{i-1} x_{i+1} ... x_12 x_i x_i maandnr
 604   dup
 605   %Stack: beginbedrag x_1 x_2 x_3 ... x_{i-1} x_{i+1} ... x_12 x_i x_i maandnr maandnr
 606   4 1 roll
 607   %Stack: beginbedrag x_1 x_2 x_3 ... x_{i-1} x_{i+1} ... x_12 maandnr x_i x_i maandnr
 608   16 exch sub
 609   %Stack: beginbedrag x_1 x_2 x_3 ... x_{i-1} x_{i+1} ... x_12 maandnr x_i x_i 16-maandnr
 610   1 roll
 611   %Stack: beginbedrag x_1 x_2 x_3 ... x_12 maandnr x_i
 612   exch
 613   %Stack: beginbedrag x_1 x_2 x_3 ... x_12 x_i maandnr
 614  } repeat
 615  %Stack: beginbedrag x_1 x_2 x_3 ... x_12 x_i x_{i+1} maandnr
 616  3 1 roll
 617  %Stack: beginbedrag x_1 x_2 x_3 ... x_12 maandnr x_i x_{i+1}
 618  add
 619  %Stack: beginbedrag x_1 x_2 x_3 ... x_12 maandnr x_{i+1}_nieuw
 620  exch
 621  %Stack: beginbedrag x_1 x_2 x_3 ... x_12 x_{i+1}_nieuw maandnr
 622  dup
 623  %Stack: beginbedrag x_1 x_2 x_3 ... x_12 x_{i+1}_nieuw maandnr maandnr
 624  15 exch sub
 625  %Stack: beginbedrag x_1 x_2 x_3 ... x_12 x_{i+1}_nieuw maandnr 15-maandnr
 626  dup
 627  %Stack: beginbedrag x_1 x_2 x_3 ... x_12 x_{i+1}_nieuw maandnr 15-maandnr 15-maandnr
 628  1 sub
 629  %Stack: beginbedrag x_1 x_2 x_3 ... x_12 x_{i+1}_nieuw maandnr 15-maandnr 14-maandnr
 630  roll
 631  %Stack: beginbedrag x_1 x_2 x_3 ... x_i x_{i+2} x_12 x_{i+1}_nieuw maandnr x_{i+1}
 632  pop
 633  %Stack: beginbedrag x_1 x_2 x_3 ... x_i x_{i+2} ... x_12 x_{i+1}_nieuw maandnr
 634  13 exch sub
 635  %Stack: beginbedrag x_1 x_2 x_3 ... x_i x_{i+2} ... x_12 x_{i+1}_nieuw 13-maandnr
 636  1 roll
 637  %Stack: beginbedrag x_1 x_2 x_3  ... x_12
 638 } for
 639 %Stack: beginbedrag x_1 x_2 x_3 ... x_12
 640 13 12 roll
 641 %Stack: x_1 x_2 x_3 ... x_12 beginbedrag 
 642 pop
 643 %Stack: x_1 x_2 x_3 ... x_12
 644 
 645} def
 646
 647%Invoer: rente beginbedrag
 648%Uitvoer: een lijst met beginbedrag + stortingen + rente na elke maand waarbij de storting direct plaatsvind
 649/maak_theoretische_lijst
 650{
 651 1 1 12
 652 {
 653  %Stack: rente bedrag maandnr
 654  0 exch
 655  %Stack: rente bedrag 0 maandnr
 656  4 3 roll
 657  %Stack: bedrag 0 maandnr rente
 658  dup
 659  %Stack: bedrag 0 maandnr rente rente
 660  5 2 roll
 661  %Stack: rente rente bedrag 0 maandnr
 662  bereken_maand
 663  %Stack: rente bedrag_na_maand
 664  dup
 665  %Stack: rente bedrag_na_maand bedrag_na_maand
 666  3 1 roll
 667  %Stack: bedrag_na_maand rente bedrag_na_maand
 668 } for
 669 %Stack: ... rente bedrag_na_maand
 670 pop
 671 pop
 672 %Stack: ... rente bedrag_na_maand
 673} def
 674
 675%Invoer: rente beginbedrag
 676%Uitvoer: %Uitvoer: een lijst met beginbedrag + stortingen + rente na elke maand waarbij de storting na 3 dagen plaatsvind
 677/maak_werkelijke_lijst
 678{
 679 1 1 12
 680 {
 681  %Stack: rente bedrag maandnr
 682  3 exch
 683  %Stack: rente bedrag 3 maandnr
 684  4 3 roll
 685  %Stack: bedrag 3 maandnr rente
 686  dup
 687  %Stack: bedrag 3 maandnr rente rente
 688  5 2 roll
 689  %Stack: rente rente bedrag 3 maandnr
 690  bereken_maand
 691  %Stack: rente bedrag_na_maand
 692  dup
 693  %Stack: rente bedrag_na_maand bedrag_na_maand
 694  3 1 roll
 695  %Stack: bedrag_na_maand rente bedrag_na_maand
 696 } for
 697 %Stack: rente bedrag_na_maand
 698 pop 
 699 pop
 700 %Stack:
 701} def
 702
 703%Kies lettertype
 704/Times-Roman findfont
 70512 scalefont
 706setfont
 707newpath
 708
 709%Teken kolommen
 710newpath
 711links_titel_1 boven boven_marge1 moveto
 712(Maand) show
 713stroke
 714maanden 12 links_kolom_1 boven boven_marge2 20 print_kolom
 715
 716newpath
 717links_titel_3 boven boven_marge1 moveto
 718(Werkelijk saldo) show
 719stroke
 720%Stack:
 721rente_percentage beginbedrag maak_werkelijke_lijst
 722%Stack: x_1 x_2 x_3 ... x_12
 72312 dup_lijst
 724%Stack: x_1 x_2 x_3 ... x_12 x_1 x_2 x_3 ... x_12 
 72512 dup_lijst
 726%Stack: x_1 x_2 x_3 ... x_12 x_1 x_2 x_3 ... x_12 x_1 x_2 x_3 ... x_12 
 72712 links_kolom_3 boven boven_marge2 20 print_kolom
 728%Stack: x_1 x_2 x_3 ... x_12 x_1 x_2 x_3 ... x_12 
 729
 730newpath
 731links_titel_2 boven boven_marge1 moveto
 732(Theoretisch saldo) show
 733stroke
 734%Stack: x_1 x_2 x_3 ... x_12 x_1 x_2 x_3 ... x_12 
 735rente_percentage beginbedrag maak_theoretische_lijst
 736%Stack: x_1 x_2 x_3 ... x_12 x_1 x_2 x_3 ... x_12 y_1 y_2 y_3 ... y_12
 73712 dup_lijst
 738%Stack: x_1 x_2 x_3 ... x_12 x_1 x_2 x_3 ... x_12 y_1 y_2 y_3 ... y_12 y_1 y_2 y_3 ... y_12
 73912 links_kolom_2 boven boven_marge2 20 print_kolom
 740%Stack: x_1 x_2 x_3 ... x_12 x_1 x_2 x_3 ... x_12 y_1 y_2 y_3 ... y_12
 741
 742newpath
 743links_titel_4 boven boven_marge1 moveto
 744(Verschil) show
 745stroke
 746%Stack: x_1 x_2 x_3 ... x_12 x_1 x_2 x_3 ... x_12 y_1 y_2 y_3 ... y_12
 74712
 748%Stack: x_1 x_2 x_3 ... x_12 x_1 x_2 x_3 ... x_12 y_1 y_2 y_3 ... y_12 12
 749exch_lijst
 750%Stack: x_1 x_2 x_3 ... x_12 y_1 y_2 y_3 ... y_12 x_1 x_2 x_3 ... x_12 12
 751sub_lijst
 752%Stack: x_1 x_2 x_3 ... x_12 y_1-x_1 y_2-x_2 y_3-x_3 ... y_12-x_12 12
 753links_kolom_4 boven boven_marge2 20 print_kolom
 754%Stack: x_1 x_2 x_3 ... x_12
 755
 756newpath
 757links_titel_5 boven boven_marge1 moveto
 758(Winst bank) show
 759stroke
 760%Stack: x_1 x_2 x_3 ... x_12
 761rente_lening beginbedrag maak_theoretische_lijst
 762%Stack: x_1 x_2 x_3 ... x_12 z_1 z_2 z_3 ... z_12
 76312
 764%Stack: x_1 x_2 x_3 ... x_12 z_1 z_2 z_3 ... z_12 12
 765exch_lijst
 766%Stack: z_1 z_2 z_3 ... z_12 x_1 x_2 x_3 ... x_12 12
 767sub_lijst
 768%Stack: z_1-x_1 z_2-x_2 z_3-x_3 ... z_12-x_12 12
 769links_kolom_5 boven boven_marge2 20 print_kolom
 770%Stack: 
 771
 772%Tekenen lijnen
 773%Tekenen rand
 774newpath
 7753 setlinewidth
 776links  boven moveto
 777rechts boven lineto
 778rechts onder lineto
 779links  onder lineto
 780closepath
 781stroke
 782
 783%Teken lijn onder de titels
 784newpath
 7851 setlinewidth
 786links  hoogte_titel_lijn 1 add moveto
 787rechts hoogte_titel_lijn 1 add lineto
 788links  hoogte_titel_lijn 1 sub moveto
 789rechts hoogte_titel_lijn 1 sub lineto
 790stroke
 791
 792%Lijn naast de maanden
 793newpath
 7941 setlinewidth
 795vlijn_1 boven moveto
 796vlijn_1 onder lineto
 797stroke
 798
 799%Overige verticale lijnen
 800newpath
 8011 setlinewidth
 802[ 1 2 ] 0 setdash
 803
 804vlijn_2 boven moveto
 805vlijn_2 onder lineto
 806
 807vlijn_3 boven moveto
 808vlijn_3 onder lineto
 809
 810vlijn_4 boven moveto
 811vlijn_4 onder lineto
 812stroke
 813
 814%De lijnen tussen de maanden
 815newpath
 8161 setlinewidth
 817[ 1 3 ] 0 setdash
 818
 819hlijn_onderste hlijn_tussenruimte hlijn_bovenste
 820{
 821 %Stack: hoogte
 822 dup
 823 %Stack: hoogte hoogte
 824 links exch
 825 %Stack: hoogte 40 hoogte
 826 moveto
 827 %Stack: hoogte
 828 rechts exch
 829 %Stack: 560 hoogte
 830 lineto
 831} for
 832
 833stroke
 
 
Mijn commentaar
 
 Mart,
 Dit is zeer zeker een zeer ongebruikelijke en dus inovatieve oplossing !
 Ik heb in een grijs verleden wel eens iets met postscript gedaan,
 maar was al ruim vergeten hoe krachtig deze "taal" is !