home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
mathe
/
opbase.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-10-04
|
4KB
|
134 lines
program OPBASE;
Type Fixe=Record {Structure d'un nombre à virgule fixe}
PEnt,
PDec:Integer
End;
Var Var1, {Variables d'exemple }
Var2:Fixe;
Const FacDec=100; {2 chiffres après la virgule }
NbDec=2;
Function Strg(FNombre:Fixe):String;
{transforme un nombre à virgule fixe en chaîne de chiffres}
Var PDec_Str, {Sous-chaîne de la partie décimale}
PEnt_Str:String; {Sous-chaîne de la partie entière}
i:Word;
Begin
If FNombre.PDec < 0 Then {pas de signe après la virgule}
FNombre.PDec:=-FNombre.PDec;
Str(FNombre.PDec:NbDec,PDec_Str);
{crée la sous-chaîne décimale (après la virgule)}
For i:=0 to NbDec do {remplace les espaces par des 0}
If PDec_Str[i] = ' ' Then PDec_Str[i]:='0';
Str(FNombre.PEnt,PEnt_Str);
{crée la sous-chaîne de la partie entière (avant la virgule)}
Strg:=PEnt_Str+','+PDec_Str; {réunit les deux sous-chaînes}
End;
Procedure Convert(RNombre:Real;Var FNombre:Fixe);
{convertit un nombre Real RNombre en nombre à virgule fixe FNombre}
Begin
FNombre.PEnt:=Trunc(RNombre);
{Partie entière}
FNombre.PDec:=Trunc(Round(Frac(RNombre)*FacDec));
{Partie décimale stockée comme entier }
End;
Procedure Adjust(Var FNombre:Fixe);
{remet le nombre à virgule fixe transmis en format légal}
Begin
If FNombre.PDec > FacDec Then Begin
Dec(FNombre.PDec,FacDec); {si la partie décimale est trop grande }
Inc(FNombre.PEnt); {la diminuer et augmenter la partie entière }
End;
If FNombre.PDec < -FacDec Then Begin
Inc(FNombre.PDec,FacDec); {si la partie décimale est trop petite}
Dec(FNombre.PEnt); {l'augmenter et diminuer la partie entière }
End;
End;
Procedure Add(Var Somme:Fixe;FNombre1,FNombre2:Fixe);
{Additionne FNombre1 und FNombre2 et mémorise le résultat dans Somme}
Var Resultat:Fixe;
Begin
Resultat.PDec:=FNombre1.PDec+FNombre2.PDec;
{Somme les parties décimales}
Resultat.PEnt:=FNombre1.PEnt+FNombre2.PEnt;
{Somme les parties entières}
Adjust(Resultat);
{Traduit le résultat dans un format correct }
Somme:=Resultat;
End;
Procedure Sub(Var Difference:Fixe;FNombre1,FNombre2:Fixe);
{Soustrait FNombre2 de FNombre1 et mémorise le résultat
dans la variable Difference }
Var Resultat:Fixe;
Begin
Resultat.PDec:=FNombre1.PDec-FNombre2.PDec;
{Soustraction des parties décimales }
Resultat.PEnt:=FNombre1.PEnt-FNombre2.PEnt;
{Soustraction des parties entières }
Adjust(Resultat);
{Traduit le résultat dans un format correct }
Difference:=Resultat;
End;
Procedure Mul(Var Produit:Fixe;FNombre1,FNombre2:Fixe);
{Multiplie FNombre1 par FNombre et mémorise le résultat dans
la variable Produit }
Var Resultat:LongInt;
Begin
Resultat:=Var1.PEnt*FacDec + Var1.PDec;
{Multiplicande}
Resultat:=Resultat * (Var2.PEnt*FacDec + Var2.PDec);
{Multiplicateur}
Resultat:=Resultat div FacDec;
{Redivise par le facteur décimal FacDec }
Produit.PEnt:=Resultat div FacDec;
{Extrait les parties entière et décimale }
Produit.PDec:=Resultat mod FacDec;
End;
Procedure Divi(Var Quotient:Fixe;FNombre1,FNombre2:Fixe);
{divise FNombre1 par FNombre2 et mémorise le résultat
dans la variable Quotient }
Var Resultat:LongInt; {Résultat intermédiaire}
Begin
Resultat:=FNombre1.PEnt*FacDec + FNombre1.PDec;
{Dividende... }
Resultat:=Resultat * FacDec div (FNombre2.PEnt*FacDec+FNombre2.PDec);
{... multiplié par le facteur décimal pour plus de précision et divisé par le diviseur }
Quotient.PEnt:=Resultat div FacDec;
{Extrait les parties entière et décimale }
Quotient.PDec:=Resultat mod FacDec;
End;
Begin
WriteLn;
Convert(-10.2,Var1); {Deux nombres pour la démonstration) }
Convert(25.3,Var2);
{Quelques calculs pour tester le programme:}
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.