Type Fest=Record                {Aufbau einer Festkommazahl}
            Vork,
            Nachk:Integer
          End;

Var Var1,                       {Beispielvariablen}
    Var2:Fest;

Const Nachk_Max=100;            {2 Nachkommastellen}
      Nachk_Stellen=2;

Function Strg(FZahl:Fest):String;
{wandelt eine Festkommazahl in einen String um}
Var Nachk_Str,                  {String zum bilden des Nachkommateils}
    Vork_Str:String;            {String zum bilden des Vorkommateils}
    i:Word;
Begin
  If FZahl.Nachk < 0 Then       {bei Ausgabe Nachkommateil ohne Vorzeichen}
    FZahl.Nachk:=-FZahl.Nachk;
  Str(FZahl.Nachk:Nachk_Stellen,Nachk_Str);
                                {Nachkommstring generieren}
  For i:=0 to Nachk_Stellen do  {und Leerzeichen durch 0en ersetzen}
    If Nachk_Str[i] = ' ' Then Nachk_Str[i]:='0';
  Str(FZahl.Vork,Vork_Str);     {Vorkommstring generieren}
  Strg:=Vork_Str+','+Nachk_Str; {String zusammensetzen}
End;

Procedure Convert(RZahl:Real;Var FZahl:Fest);
{Konvertiert Real RZahl in Festkommazahl FZahl}
Begin
  FZahl.Vork:=Trunc(RZahl);
    {Vorkommateil bestimmen}
  FZahl.Nachk:=Trunc(Round(Frac(RZahl)*Nachk_Max));
    {Nachommateil bestimmen und als ganze Zahl speichern}
End;

Procedure Adjust(Var FZahl:Fest);
{bringt bergebene Festkommazahl wieder in legales Format}
Begin
  If FZahl.Nachk > Nachk_Max Then Begin
    Dec(FZahl.Nachk,Nachk_Max); {wenn Nachkommateil positiv bergelaufen}
    Inc(FZahl.Vork);            {zurcksetzen und Vorkommateil verringern}
  End;
  If FZahl.Nachk < -Nachk_Max Then Begin
    Inc(FZahl.Nachk,Nachk_Max); {wenn Nachkommateil positiv bergelaufen}
    Dec(FZahl.Vork);            {zurcksetzen und Vorkommateil erh”hen}
  End;
End;

Procedure Add(Var Summe:Fest;FZahl1,FZahl2:Fest);
{Addiert FZahl1 und FZahl2 und legt Ergebnis in Summe ab}
Var Ergebnis:Fest;
Begin
  Ergebnis.Nachk:=FZahl1.Nachk+FZahl2.Nachk;
    {Nachkommateil addieren}
  Ergebnis.Vork:=FZahl1.Vork+FZahl2.Vork;
    {Vorkommateil addieren}
  Adjust(Ergebnis);
    {Ergebnis wieder auf richtiges Format bringen}
  Summe:=Ergebnis;
End;

Procedure Sub(Var Differenz:Fest;FZahl1,FZahl2:Fest);
{Subtrahiert FZahl1 von FZahl2 und legt Ergebnis in Differenz ab}
Var Ergebnis:Fest;
Begin
  Ergebnis.Nachk:=FZahl1.Nachk-FZahl2.Nachk;
    {Nachkommateil subtrahieren}
  Ergebnis.Vork:=FZahl1.Vork-FZahl2.Vork;
    {Vorkommateil subtrahieren}
  Adjust(Ergebnis);
    {Ergebnis wieder auf richtiges Format bringen}
  Differenz:=Ergebnis;
End;

Procedure Mul(Var Produkt:Fest;FZahl1,FZahl2:Fest);
{multipliziert FZahl1 und FZahl und legt Ergebnis in Produkt ab}
Var Ergebnis:LongInt;
Begin
  Ergebnis:=Var1.Vork*Nachk_Max + Var1.Nachk;
    {ersten Faktor bilden}
  Ergebnis:=Ergebnis * (Var2.Vork*Nachk_Max + Var2.Nachk);
    {zweiten Faktor bilden}
  Ergebnis:=Ergebnis div Nachk_Max;
    {Hilfsfaktor Nachk_Max ausgleichen}
  Produkt.Vork:=Ergebnis div Nachk_Max;
    {Vor- und Nachkommateil extrahieren}
  Produkt.Nachk:=Ergebnis mod Nachk_Max;
End;

Procedure Divi(Var Quotient:Fest;FZahl1,FZahl2:Fest);
{dividiert FZahl1 durch FZahl2 und legt Ergebnis in Quotient ab}
Var Ergebnis:LongInt;           {Zwischenergebnis}
Begin
  Ergebnis:=FZahl1.Vork*Nachk_Max + FZahl1.Nachk;
    {Z„hler bilden}
  Ergebnis:=Ergebnis * Nachk_Max div (FZahl2.Vork*Nachk_Max+FZahl2.Nachk);
    {durch Nenner teilen, vorher mehr Stellen zur Verfgung stellen}
  Quotient.Vork:=Ergebnis div Nachk_Max;
    {Vor- und Nachkommateil extrahieren}
  Quotient.Nachk:=Ergebnis mod Nachk_Max;
End;

Begin
  WriteLn;
  Convert(-10.2,Var1);          {zwei Demo-Zahlen laden}
  Convert(25.3,Var2);

  {zur Demonstration einige Rechnungen:}

  Write(Strg(Var1),'*',Strg(Var2),'= ');
  Mul(Var1,Var1,Var2);
  WriteLn(Strg(Var1));

  Write(Strg(Var1),'-',Strg(Var2),'= ');
  Sub(Var1,Var1,Var2);
  WriteLn(Strg(Var1));

  Write(Strg(Var1),'/',Strg(Var2),'= ');
  Divi(Var1,Var1,Var2);
  WriteLn(Strg(Var1));

  Write(Strg(Var1),'+',Strg(Var2),'= ');
  Add(Var1,Var1,Var2);
  WriteLn(Strg(Var1));
End.
