\ Josephspfennig DB 1998-12-06 \ Anleitung und Text-Auswahl am 8.3.2002 hinzugefuegt, \ Key?-leave, Vornullen-Unterdrueckung, Mark/Pfennig, Values und Kommentare ergaenzt am 29.12.2008 decimal 65 Constant Stellen \ Anzahl der maximalen Stellen insgesamt 15 Value Kommastellen \ Anzahl der maximalen Nachkommastellen 1 Value Starteinlage \ Start-Einlage 5 Value Prozent \ Prozent Zinseszins \ Der Microsoft-Calculator zeigt bis zu 33 Kommastellen an, solange die Zahl kleiner als 1 ist, \ eine 34. Stelle wird zum Aufrunden berechnet. Danach werden maximal 32 Stellen angezeigt. \ Zum Vergleichen kann hier die Anzahl der Kommastellen auf 34 geaendert werden \ mit "34 to Kommastellen", allerdings rundet dieses Programm hier am Ende nicht auf. \ Dieses Aufrunden oder nicht wurde gelegentlich bei Bank-Software verwendet, \ um die Differenz auf das Konto des Programmierers abzuzweigen. \ Beim Microsoft-Calculator koennen maximal 32 stellige Zahlen eingegeben werden, \ weitere Eingaben werden nicht angenommen. \ Fazit: Berechnungsergebnisse mit Kommastellen koennen nicht bei allen (Taschen-)Rechnern gleich sein. vocabulary Josephspfennig Josephspfennig definitions Variable Wert Stellen allot \ Ablage des errechneten Wertes Variable % Stellen allot \ Ablage des Prozentwertes Variable Vornullen \ Steuerung der Vornullenunterdrueckung Variable Printer \ Druckersteuerung \ Ergaenzungen : 2+ 2 + ; : 2- 2 - ; \ eingefuegt fuer Win32Forth Variable PRINTING \ entfernen fuer Druckerausgabe bei FPC \ : ascii postpone [char] ; immediate \ einfuegen fuer gforth. \ Ende Ergaenzungen Variable Pfennig Pfennig on \ Pfennig off schaltet um auf Mark statt Pfennig als Start-Einlage : Waehrung ( -- ) \ Mark oder Pfennig Pfennig @ if 1- else 1+ then ; : "Waehrung ( -- ) \ Mark oder Pfennig Pfennig @ if ." Pfennig" else ." Mark" then ; : Wert>% ( -- ) \ Uebertrag des letzten Wertes zur %-Berechnung 0 % ! Wert % 2+ Stellen 2- cmove ; : .Wert ( -- ) \ Ausgabe des ermittelten Wertes Vornullen on \ Vornullen-Unterdrueckung ein Stellen Kommastellen - dup 0 do dup I 2 + < if Vornullen off then Wert I + c@ 15 and Vornullen @ \ Vorkommastellen if ?dup if 0 .r Vornullen off else space then else 0 .r then loop drop ascii , emit \ Komma Stellen dup Kommastellen - do Wert I + c@ 15 and 0 .r loop \ Nachkommastellen ; : Clear ( -- ) \ Nullsetzen aller Werte Wert Stellen erase % Stellen erase ; : setzen ( Wert -- ) \ Setze Waehrung-Startwert ( 1-9 ) Wert Stellen + Kommastellen Waehrung - c! ; : Add ( Wert1 Wert2 Carry -- Wert3 Carry ) \ addiere zwei Werte mit Carry + + dup 9 > if 10 - 1 else 0 then ; : +1% ( -- ) \ Addiere %-Wert zu bisherigem Wert 0 0 Stellen 1- do Wert i + c@ 15 and % i + c@ 15 and add swap Wert i + c! -1 +loop drop ; : +% ( % -- ) \ Addiere % zu bisherigem Wert Wert>% 0 do +1% loop ; : .Z-Ziffern ( -- ) \ Zeige Zehnerstellen an cr 7 Spaces Stellen Kommastellen - 0 do Stellen Kommastellen - i - 10 / 0 .r loop ascii , emit Stellen dup Kommastellen - do i Stellen Kommastellen - - 1+ 10 / 0 .r loop ; : .E-Ziffern ( -- ) \ Zeige Einerstellen an cr 7 Spaces Stellen Kommastellen - 0 do Stellen Kommastellen - i - 10 /mod drop 0 .r loop ascii , emit Stellen dup Kommastellen - do i Stellen Kommastellen - - 1+ 10 /mod drop 0 .r loop ; : Jahr ( Jahr -- ) \ Zeige Jahr und Zinseszins-Ergebnis an cr 5 .r 2 Spaces .Wert ; : >Printer ( Jahr -- ) \ Ausgabe auf Drucker (nur mit FPC) Printer @ if printing on then ; : All ( Jahre -- ) \ Ergebnis fuer alle Jahre bis "Jahre" >Printer Clear Starteinlage setzen 1+ cr 7 Spaces ." Josephspfennig - " Starteinlage . "Waehrung ." im Jahre 0, mit " Prozent 0 .R ." % Zinseszins" cr 7 Spaces ." dargestellt fuer " dup 1- . ." Jahre" cr .Z-Ziffern .E-Ziffern cr 0 do key? if leave else i Jahr Prozent +% then loop cr .E-Ziffern .Z-Ziffern cr Printer @ if 12 emit Printing off Printer off then ; : Years ( Jahre -- ) \ Ergebnis fuer jedes hundertste Jahr bis "Jahre" >Printer Clear Starteinlage setzen dup 1+ cr 7 Spaces ." Josephspfennig - " Starteinlage . "Waehrung ." im Jahre 0, mit " Prozent 0 .R ." % Zinseszins" cr 7 Spaces ." dargestellt fuer jedes hundertste Jahr bis " dup 1- . cr .Z-Ziffern .E-Ziffern cr 1- 0 do i 100 /mod drop 0= if i Jahr then key? if drop 0 leave else Prozent +% then loop ?dup if Jahr then cr .E-Ziffern .Z-Ziffern cr Printer @ if 12 emit printing off Printer off then ; : Jahrevonbis ( von bis -- ) >Printer Clear Starteinlage setzen 1+ cr 7 Spaces ." Josephspfennig - " Starteinlage . "Waehrung ." im Jahre 0, mit " Prozent 0 .R ." % Zinseszins" cr 7 Spaces ." dargestellt vom Jahr " over . ." bis zum Jahr " dup 1- . cr .Z-Ziffern .E-Ziffern cr dup 0 do key? if leave else 2dup 1+ i rot rot within if i Jahr then Prozent +% then loop cr .E-Ziffern .Z-Ziffern cr 2drop Printer @ if 12 emit printing off Printer off then ; Variable Auswahl Auswahl on : Alle 1 Auswahl ! ; : Jahre ; : von 2 Auswahl ! ; : bis Auswahl @ true = if 3 Auswahl ! then ; : anzeigen ( -- ) Auswahl @ 1 = if ." :" cr All Auswahl on then Auswahl @ 2 = if ." :" cr Jahrevonbis Auswahl on then Auswahl @ 3 = if ." :" cr Years Auswahl on then ; : A cr All ; : J cr Years ; : VB cr JahreVonBis ; : P Printer on ; : Anleitung ( -- ) cr cr ." Das Programm zur Berechnung des Josephspfennig ist betriebsbereit !" cr cr ." Es gibt drei Anzeigemoeglichkeiten: " cr cr ." Alle Jahre bis 2010 anzeigen " cr ." Jahre von 2000 bis 2010 anzeigen " cr ." Jahre bis 2010 anzeigen " cr cr ." Der Text muss wie angezeigt eingegeben werden, die Jahreszahlen" cr ." koennen beliebig sein, danach Eingabetaste betaetigen." cr cr ." Alternative:" cr cr ." 2010 A - zeigt alle Jahre bis 2010 an," cr ." 2010 J - zeigt die Jahre von 0 bis 2010 in hunderter Schritten an," cr ." 2000 2010 VB - zeigt die Jahre von 2000 bis 2010 an." cr cr ." P - gibt Werte auf Drucker aus (nur mit FPC), z.B.: " cr ." P 2000 2010 VB - gibt die Jahre von 2000 bis 2010 auf Drucker aus!" cr ." ? - zeigt die Anleitung an . Beenden des Programms: Bye" ; : ? Anleitung ; \ Folgendes bitte auskommentieren fuer gforth: cls Anleitung \S Mindestens vier Kommastellen sind noetig, um bei einem Pfennig Einlage Zinsen zu bekommen, das Ergebnis ist etwa 60% vom Ergebnis mit 15 Kommastellen. Mit 6 Kommastellen werden 99,5% des Ergebnisses der Berechnung mit 15 Kommastellen erreicht. Mit 1 Mark als Starteinlage werden nur 2 Kommastellen benoetigt - das Ergebnis ist 171 mal so hoch. Test mit: 2 to Kommastellen Pfennig off 2003 j