FAQ C++ BuilderConsultez toutes les FAQ

Nombre d'auteurs : 60, nombre de questions : 670, dernière mise à jour : 21 novembre 2010  Ajouter une question

 

Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum C++ Builder de developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, contactez pottiez

Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.

L'équipe C++ Builder de Developpez.

Commentez cette FAQ : Commentez


SommaireLangageTypes de donnéesNombres (8)
précédent sommaire suivant
 

Pour convertir un entier en chaîne, utilisons la fonction IntToStr. Cette fonction convertit un entier en un AnsiString.

Code c++ : Sélectionner tout
1
2
3
AnsiString Chaine; 
int i = 10; 
Chaine = IntToStr(i); // Chaine = "10"

Mis à jour le 1er septembre 2004 Geronimo

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 :

Code c++ : Sélectionner tout
1
2
3
4
5
__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 :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) 
{ 
    if (Key == '.' || Key == ',') 
    { 
        Key = DecimalSeparator; 
    } 
}

Mis à jour le 1er septembre 2004 Nono40

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.

Mis à jour le 1er septembre 2004 Geronimo

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) :

Code c++ : Sélectionner tout
int Ceil(long double X);
Ceil arrondit à l'entier supérieur :
Ceil(1.2) donne 2
Ceil(1.9) donne 2
Ceil(-1.5) donne -1

Code c++ : Sélectionner tout
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

Code c++ : Sélectionner tout
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

Code c++ : Sélectionner tout
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 :

Code c++ : Sélectionner tout
int i = (int) 2.9; // i vaut 2

Mis à jour le 31 janvier 2005 Nono40 Ricky81

Pour transformer un réel en chaîne sans formatage particulier il suffit d'utiliser la fonction FloatToStr() :

Code c++ : Sélectionner tout
AnsiString FloatToStr(long double Value);
Mais dans la plupart des cas, il est utile de formater le nombre de décimales. Pour ce faire il y a différentes fonctions proposées par C++ Builder : FloatToStrF(), FormatFloat() ou Format().

Par exemple pour afficher une valeur avec deux chiffres après la virgule :

Code c++ : Sélectionner tout
1
2
3
4
float f = 12345.6789; 
ShowMessage(FloatToStrF(f, ffFixed, 8, 2)); 
ShowMessage(FormatFloat("0.00", f)); 
ShowMessage(Format("%8.2f", ARRAYOFCONST((f))));
N'hésitez pas à consulter l'aide pour une utilisation avancée de ces fonctions.

Mis à jour le 31 janvier 2005 Nono40 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 :

Code c++ : Sélectionner tout
1
2
3
4
5
ShowMessage(SimpleRoundTo(3.1415, -2)); // affiche 3.14 
ShowMessage(RoundTo(3.1415, -2)); // affiche 3.14 
  
ShowMessage(SimpleRoundTo(250, 2)); // affiche 300 
ShowMessage(RoundTo(250, 2)); // affiche 200

Mis à jour le 31 janvier 2005 Ricky81

La fonction suivante propose un tel traitement en utilisant tout simplement la fonction StrToInt :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
int __fastcall HexToInt(AnsiString Value) 
{ 
   if (Value.AnsiPos("$") == 0) 
   { 
      // on ajoute $ en tête de chaîne    
      Value = "$" + Value; 
   }      
  
   return StrToInt(Value); 
}
Exemples d'utilisation :

Code c++ : Sélectionner tout
1
2
3
ShowMessage(HexToInt("12")); // affiche 18 
ShowMessage(HexToInt("F1")); // affiche 241 
ShowMessage(HexToInt("$FF")); // affiche 255

Mis à jour le 31 janvier 2005 Bloon Ricky81

Une première méthode :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//--------------------------------------------------------------------------- 
// IntToBinStr 
//  Number : entier ou hexadecimal non signé 
//  Digits : nombre de quartets affichés 
//--------------------------------------------------------------------------- 
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 "";    // par exemple 
  
    for(i = Digits; i > 0 ; i--) 
        KeyString += BitSTring[(Number >> (4 * (i - 1))) & 0x0F]; 
  
    return KeyString; 
}
Une seconde méthode :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
AnsiString IntToBitStr(UINT I, int nBits) 
{ 
    AnsiString N=""; 
    if(nBits > 32) nBits = 32; 
    for(int j = 0; j < nBits; j++) 
    { 
        N = "0" + N; //remplissage par le début de la chaîne 
        N[1] = (char)(N[1] + (I & 1)); // on évite un if 
        I = I / 2; // prêt pour le bit suivant 
    } 
    return N; 
}
Exemples de résultats :
  • 19 -> 0001011
  • 0x13 -> 0001011

Mis à jour le 6 décembre 2006 cryptonyx henderson

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2020 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.