| auteur : Geronimo |
Pour convertir un entier en chaîne, utilisons la fonction IntToStr. Cette fonction convertit un entier en un AnsiString.
AnsiString Chaine;
int i = 10 ;
Chaine = IntToStr (i);
|
|
| auteur : Nono40 |
En fonction des ordinateurs et de la configuration des options régionales, le caractère décimal par défaut n'est pas toujours le même. Si votre application est sensible à ce caractère, il est conseillé de le fixer à l'initialisation de l'application. Par exemple dans le constructeur de la fiche principale :
__fastcall TForm1:: TForm1 (TComponent* Owner)
: TForm (Owner)
{
DecimalSeparator = " . " ;
}
|
Ainsi le caractère sera toujours le même. Il faut aussi penser à gérer la saisie de ce caractère dans les TEdit ou autres zones de saisie devant contenir des nombres réels :
void __fastcall TForm1:: Edit1KeyPress (TObject * Sender, char & Key)
{
if (Key = = ' . ' | | Key = = ' , ' )
{
Key = DecimalSeparator;
}
}
|
|
| auteur : Geronimo |
En C++, les types standards ne peuvent pas représenter de très grands nombres. Cela dépend bien sûr de l'implémentation. Par exemple, avec C++Builder, un entier peut être utilisé pour un nombre de 20 chiffres grand maximum (au moyen du type __int64. Consultant l'aide, on pourrait souhaiter utiliser le type double qui permet d'utiliser des nombres de 5.0 x 10^-324 à 1.7 x 10^308. Mais les calculs se font alors de manière approchée, ce qui n'est pas du tout souhaitable.
La solution est d'utiliser des librairies qui se chargent de représenter de très grands entiers. Il y en a plusieurs dont GMP, ou la librairie NTL . La librairie NTL s'est compilée sans aucun problème sous Windows avec C++Builder, ce qui n'a pas été le cas de la première. De plus, cette librairie dispose de multiples fonctions très utiles en cryptographie.
Vous pouvez également créer votre propre librairie. Le principe est donc de créer un type de grands entiers, soit une classe, cette classe contenant toutes les opérations ; donc vous devrez définir les opérateurs de base tels +, -, /, *, % sans oublier quelques fonctions très utiles telles la fonction puissance, la fonction factorielle... Pour représenter l'entier dans cette classe, vous devrez utiliser un tableau.
Pour plus d'informations, consultez les liens ci-dessous.
|
lien : GMP
lien : NTL
lien : MIRACL
lien : MPFR
lien : HaypoCalc
|
| auteurs : Nono40, Ricky81 |
Pour extraire un nombre entier à partir d'un réel, vous pouvez faire appel à l'une des fonctions classiques C/C++ ou alors aux suivantes (nécessite d'inclure Math.hpp) :
Ceil arrondit à l'entier supérieur : Ceil(1.2) donne 2 Ceil(1.9) donne 2 Ceil(-1.5) donne -1
int Floor (long double X);
|
Floor arrondit à l'entier inférieur : Floor(1.2) donne 1 Floor(1.9) donne 1 Floor(-1.5) donne -2
double RoundTo (const double Avalue, signed char ADigit);
|
RoundTo(f, 0) arrondit à l'entier le plus proche. Dans le cas où la valeur est juste entre deux entiers, c'est l'entier pair qui est choisi. RoundTo(1.2, 0) donne 1 RoundTo(1.9, 0) donne 2 RoundTo(1.5, 0) donne 2 RoundTo(2.5, 0) donne 2 RoundTo(2.500001, 0) donne 3 RoundTo(-1.4, 0) donne -1 RoundTo(-1.5, 0) donne -2
double SimpleRoundTo (double Avalue, signed char ADigit);
|
SimpleRoundTo(f, 0) arrondit à l'entier le plus proche. Dans le cas où la valeur est juste entre deux entiers, c'est l'entier supérieur qui est choisi. SimpleRoundTo(1.2, 0) donne 1 SimpleRoundTo(1.9, 0) donne 2 SimpleRoundTo(1.5, 0) donne 2 SimpleRoundTo(2.5, 0) donne 3 SimpleRoundTo(-1.4, 0) donne -1 SimpleRoundTo(-1.5, 0) donne -1
Pour imiter la fonction Trunc() en Pascal, on pourra faire un simple cast vers un entier :
|
lien : Comment arrondir un réel ?
lien : Comment formater l'affichage d'un réel ?
|
| auteur : Ricky81 |
Pour arrondir un réel, vous pouvez utiliser les fonctions SimpleRoundTo() et RoundTo() de l'unité Math (nécessite d'inclure Math.hpp). La différence se situe au niveau de l'arrondi pour les valeurs se situant à distance égale de 2 nombres : dans ce cas SimpleRoundTo() arrondit vers la valeur supérieure alors que RoundTo() vers la valeur finissant par un chiffre pair.
Exemple :
ShowMessage (SimpleRoundTo (3 .1415 , - 2 ));
ShowMessage (RoundTo (3 .1415 , - 2 ));
ShowMessage (SimpleRoundTo (250 , 2 ));
ShowMessage (RoundTo (250 , 2 ));
|
|
| auteurs : Ricky81, Bloon |
La fonction suivante propose un tel traitement en utilisant tout simplement la fonction StrToInt :
int __fastcall HexToInt (AnsiString Value)
{
if (Value.AnsiPos (" $ " ) = = 0 )
{
Value = " $ " + Value;
}
return StrToInt (Value);
}
|
Exemples d'utilisation :
ShowMessage (HexToInt (" 12 " ));
ShowMessage (HexToInt (" F1 " ));
ShowMessage (HexToInt (" $FF " ));
|
|
| auteurs : henderson, cryptonyx |
Une première méthode :
AnsiString IntToBinStr (unsigned int Number, int Digits)
{
int i;
AnsiString KeyString;
char * BitSTring[] = { " 0000 " , " 0001 " , " 0010 " , " 0011 " , " 0100 " , " 0101 " , " 0110 " , " 0111 " ,
" 1000 " , " 1001 " , " 1010 " , " 1011 " , " 1100 " , " 1101 " , " 1110 " , " 1111 " } ;
if (Digits > 4 | | Digits < 1 )
return " " ;
for (i = Digits; i > 0 ; i- - )
KeyString + = BitSTring[(Number > > (4 * (i - 1 ))) & 0x0F ];
return KeyString;
}
|
Une seconde méthode :
AnsiString IntToBitStr (UINT I, int nBits)
{
AnsiString N= " " ;
if (nBits > 32 ) nBits = 32 ;
for (int j = 0 ; j < nBits; j+ + )
{
N = " 0 " + N;
N[1 ] = (char )(N[1 ] + (I & 1 ));
I = I / 2 ;
}
return N;
}
|
- 19 -> 0001011
- 0x13 -> 0001011
|
Consultez les autres F.A.Q.
|
|