home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / mathe / opbase.pas < prev    next >
Pascal/Delphi Source File  |  1994-10-04  |  4KB  |  134 lines

  1. program OPBASE;
  2.  
  3. Type Fixe=Record                {Structure d'un nombre à virgule fixe}
  4.         PEnt,
  5.         PDec:Integer
  6.       End;
  7.  
  8. Var Var1,                       {Variables d'exemple }
  9.     Var2:Fixe;
  10.  
  11. Const FacDec=100;            {2 chiffres après la virgule }
  12.       NbDec=2;
  13.  
  14. Function Strg(FNombre:Fixe):String;
  15. {transforme un nombre à virgule fixe en chaîne de chiffres}
  16. Var PDec_Str,        {Sous-chaîne de la partie décimale}
  17.     PEnt_Str:String; {Sous-chaîne de la partie entière}
  18.     i:Word;
  19. Begin
  20.   If FNombre.PDec < 0 Then   {pas de signe après la virgule}
  21.     FNombre.PDec:=-FNombre.PDec;
  22.   Str(FNombre.PDec:NbDec,PDec_Str);
  23.             {crée la sous-chaîne décimale (après la virgule)}
  24.   For i:=0 to NbDec do  {remplace les espaces par des 0}
  25.     If PDec_Str[i] = ' ' Then PDec_Str[i]:='0';
  26.   Str(FNombre.PEnt,PEnt_Str);
  27.   {crée la sous-chaîne de la partie entière (avant la virgule)}
  28.   Strg:=PEnt_Str+','+PDec_Str; {réunit les deux sous-chaînes}
  29. End;
  30.  
  31. Procedure Convert(RNombre:Real;Var FNombre:Fixe);
  32. {convertit un nombre Real RNombre en nombre à virgule fixe FNombre}
  33. Begin
  34.   FNombre.PEnt:=Trunc(RNombre);
  35.     {Partie entière}
  36.   FNombre.PDec:=Trunc(Round(Frac(RNombre)*FacDec));
  37.     {Partie décimale stockée comme entier }
  38. End;
  39.  
  40. Procedure Adjust(Var FNombre:Fixe);
  41. {remet le nombre à virgule fixe transmis en format légal}
  42. Begin
  43.   If FNombre.PDec > FacDec Then Begin
  44.     Dec(FNombre.PDec,FacDec); {si la partie décimale est trop grande }
  45.     Inc(FNombre.PEnt);        {la diminuer et augmenter la partie entière  }
  46.   End;
  47.   If FNombre.PDec < -FacDec Then Begin
  48.     Inc(FNombre.PDec,FacDec); {si la partie décimale est trop petite}
  49.     Dec(FNombre.PEnt);        {l'augmenter et diminuer la partie entière }
  50.   End;
  51. End;
  52.  
  53. Procedure Add(Var Somme:Fixe;FNombre1,FNombre2:Fixe);
  54. {Additionne FNombre1 und FNombre2 et mémorise le résultat dans Somme}
  55. Var Resultat:Fixe;
  56. Begin
  57.   Resultat.PDec:=FNombre1.PDec+FNombre2.PDec;
  58.     {Somme les parties décimales}
  59.   Resultat.PEnt:=FNombre1.PEnt+FNombre2.PEnt;
  60.     {Somme les parties entières}
  61.   Adjust(Resultat);
  62.     {Traduit le résultat dans un format correct }
  63.   Somme:=Resultat;
  64. End;
  65.  
  66. Procedure Sub(Var Difference:Fixe;FNombre1,FNombre2:Fixe);
  67. {Soustrait FNombre2 de FNombre1 et mémorise le résultat
  68. dans la variable Difference }
  69. Var Resultat:Fixe;
  70. Begin
  71.   Resultat.PDec:=FNombre1.PDec-FNombre2.PDec;
  72.     {Soustraction des parties décimales }
  73.   Resultat.PEnt:=FNombre1.PEnt-FNombre2.PEnt;
  74.     {Soustraction des parties entières }
  75.   Adjust(Resultat);
  76.     {Traduit le résultat dans un format correct }
  77.   Difference:=Resultat;
  78. End;
  79.  
  80. Procedure Mul(Var Produit:Fixe;FNombre1,FNombre2:Fixe);
  81. {Multiplie FNombre1 par FNombre et mémorise le résultat dans
  82. la variable Produit }
  83. Var Resultat:LongInt;
  84. Begin
  85.   Resultat:=Var1.PEnt*FacDec + Var1.PDec;
  86.     {Multiplicande}
  87.   Resultat:=Resultat * (Var2.PEnt*FacDec + Var2.PDec);
  88.     {Multiplicateur}
  89.   Resultat:=Resultat div FacDec;
  90.     {Redivise par le facteur décimal FacDec }
  91.   Produit.PEnt:=Resultat div FacDec;
  92.     {Extrait les parties entière et décimale }
  93.   Produit.PDec:=Resultat mod FacDec;
  94. End;
  95.  
  96. Procedure Divi(Var Quotient:Fixe;FNombre1,FNombre2:Fixe);
  97. {divise FNombre1 par FNombre2 et mémorise le résultat
  98. dans la variable Quotient }
  99. Var Resultat:LongInt;            {Résultat intermédiaire}
  100. Begin
  101.   Resultat:=FNombre1.PEnt*FacDec + FNombre1.PDec;
  102.     {Dividende... }
  103.   Resultat:=Resultat * FacDec div (FNombre2.PEnt*FacDec+FNombre2.PDec);
  104.     {... multiplié par le facteur décimal pour plus de précision et divisé par le diviseur }
  105.   Quotient.PEnt:=Resultat div FacDec;
  106.     {Extrait les parties entière et décimale }
  107.   Quotient.PDec:=Resultat mod FacDec;
  108. End;
  109.  
  110. Begin
  111.   WriteLn;
  112.   Convert(-10.2,Var1);     {Deux nombres pour la démonstration) }
  113.   Convert(25.3,Var2);
  114.  
  115.   {Quelques calculs pour tester le programme:}
  116.  
  117.   Write(Strg(Var1),'*',Strg(Var2),'= ');
  118.   Mul(Var1,Var1,Var2);
  119.   WriteLn(Strg(Var1));
  120.  
  121.   Write(Strg(Var1),'-',Strg(Var2),'= ');
  122.   Sub(Var1,Var1,Var2);
  123.   WriteLn(Strg(Var1));
  124.  
  125.   Write(Strg(Var1),'/',Strg(Var2),'= ');
  126.   Divi(Var1,Var1,Var2);
  127.   WriteLn(Strg(Var1));
  128.  
  129.   Write(Strg(Var1),'+',Strg(Var2),'= ');
  130.   Add(Var1,Var1,Var2);
  131.   WriteLn(Strg(Var1));
  132. End.
  133.  
  134.