Le C++ étant en quelque sorte un descendant du C, la totalité de la bibliothèque standard du C est disponible dans la SL. Il y a quelques outils qui sont toujours utilisés, d'autres qui ont été remplacés par des versions améliorées et finalement d'autres qui sont totalement obsolètes. J'espère ne pas vous décevoir en ne parlant que des éléments utiles. C'est déjà beaucoup !
Si vous avez fait du C, vous devriez reconnaître les en-têtes dont je vais vous parler. La principale différence est le nom du fichier. En C, on utilise math.h, alors qu'en C++, c'est cmath. Le ".h" a disparu et un "c" a été ajouté devant le nom.
Comme tout le reste de la SL, la partie héritée du C est séparée en différents fichiers d'en-tête plus ou moins cohérents.
L'en-tête cmath
Celui-là, vous le connaissez déjà. Vous l'avez découvert tout au début du cours. C'est dans ce fichier que sont définies toutes les fonctions mathématiques usuelles. Comme je suis sympa, voici un petit rappel pour ceux qui dorment au fond de la classe.
Code : C++ - Rappel sur cmath 1
2
3
4
5
6
7
8
9
10
11
12 | #include<iostream>
#include<cmath>
using namespace std;
int main()
{
double a(4.3), b(5.2);
cout << pow(a,b) << endl; //Calcul de a^b
cout << sqrt(a) << endl; //Calcul de la racine carrée de a
cout << cos(b) << endl; //Calcul du cosinus de b
return 0;
}
|
Ah je vois que vous vous en souvenez encore. Parfait ! C'est donc le fichier à inclure lorsque vous avez des calculs mathématiques à effectuer. Je ne vais pas vous réécrire toute la liste des fonctions, vous les connaissez déjà.
Pour vous habituer à la documentation, essayez donc de retrouver ces fonctions dans les différentes ressources que je vous ai indiquées. Pour le site cplusplus.com, vous devriez arriver sur cette
page.
L'en-tête cctype
Ce fichier propose quelques fonctions pour connaître la nature d'un
char. Quand on manipule du texte, on doit souvent répondre à des questions comme :
- Cette lettre est-elle en majuscule ou en minuscule ?
- Ce caractère est-il un espace ?
- Ce symbole est-il un chiffre ?
Les fonctions présentes dans l'en-tête cctype sont là pour ça. Pour tester si un char donné est un chiffre, par exemple, on utilisera la fonction
isdigit(). Comme dans l'exemple suivant :
Code : C++ - La fonction isdigit() 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | #include <iostream>
#include <cctype>
using namespace std;
int main()
{
cout << "Entrez un caractere : ";
char symbole;
cin >> symbole;
if(isdigit(symbole))
cout << "C'est un chiffre." << endl;
else
cout << "Ce n'est pas un chiffre." << endl;
return 0;
}
|
Comme vous le voyez, c'est vraiment très simple à utiliser. Le tableau suivant présente les fonctions les plus utilisées de cet en-tête. Vous trouverez la liste complète dans votre documentation favorite.
| Nom de la fonction | Description |
|---|
| isalpha() |
Teste si le caractère est une lettre. |
| isdigit() |
Teste si le caractère est un chiffre. |
| islower() |
Teste si le caractère est une minuscule. |
| isupper() |
Teste si le caractère est une majuscule. |
| isspace() |
Teste si le caractère est un espace ou un retour à la ligne. |
En plus de cela, il y a deux fonctions
tolower() et
toupper() qui convertissent une majuscule en minuscule et inversement.
On peut ainsi aisément transformer un texte en majuscule :
Code : C++ - Conversion d'une chaîne en majuscule 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | #include <iostream>
#include <cctype>
#include <string>
using namespace std;
int main()
{
cout << "Entrez une phrase : " << endl;
string phrase;
getline(cin, phrase);
//On parcourt la chaîne pour la convertir en majuscule
for(int i(0); i<phrase.size(); ++i)
{
phrase[i] = toupper(phrase[i]);
}
cout << "Votre phrase en majuscule est : "<< phrase << endl;
return 0;
}
|
A nouveau, rien de bien sorcier. Je vous laisse vous amuser un peu avec ces fonctions. Essayez par exemple de réaliser un programme qui remplace tous les espaces d'une
string par le symbole #. Je suis sûr que c'est dans vos cordes.
L'en-tête ctime
Comme son nom l'indique, ce fichier d'en-tête contient plusieurs fonctions liées à la gestion du temps. La plupart sont assez bizarres à utiliser et donc peu utilisées. De toute façon, la plupart des autres bibliothèques, comme Qt, proposent des classes pour gérer les heures, les jours et les dates de manière plus aisée.
Personnellement, la seule fonction de
ctime que j'utilise est la fonction
time(). Elle renvoie le nombre de secondes qui se sont écoulées depuis le 1
er janvier 1970.

C'est ce qu'on appelle l'
heure UNIX.
Code : C++ - L'heure UNIX | #include <iostream>
#include <ctime>
using namespace std;
int main()
{
int secondes = time(0);
cout << "Il s'est ecoule " << secondes << " secondes depuis le 01/01/1970." << endl;
return 0;
}
|
La fonction attend en argument un pointeur sur une variable dans laquelle stocker le résultat. Mais bizarrement, elle renvoie aussi ce résultat comme valeur de retour. L'argument est donc en quelque sorte inutile. On fournit généralement un pointeur ne pointant sur rien à la fonction. D'où le 0 passé en argument.
Ce qui donne :
Code : Console | Il s'est ecoule 1302471754 secondes depuis le 01/01/1970. |
Ce qui fait beaucoup de secondes !
Euh... A quoi ça sert ?
Il y a principalement trois raisons d'utiliser cette fonction :
- La première utilisation est bien sûr de calculer la date. Avec un petit peu d'arithmétique on retrouve facilement la date et l'heure actuelle. Mais comme je vous l'ai dit, la plupart des bibliothèques proposent des outils plus simples pour ça.
- Deuxièmement, on peut l'utiliser pour calculer le temps que met le programme pour s'exécuter. On appelle la fonction time() en début de programme puis une deuxième fois à la fin. Le temps passé dans le programme sera simplement la différence entre les deux valeurs obtenues !
- Le dernier cas d'utilisation de cette fonction vous l'avez déjà vu ! On l'utilise pour générer des nombres aléatoires. Nous allons voir comment dans la suite.
L'en-tête cstdlib
Voici à nouveau une vieille connaissance. Souvenez-vous, dans le
premier TP, je vous avais présenté un moyen de choisir un nombre au hasard. Il fallait utiliser les fonctions
srand() et
rand().
C'est certainement l'en-tête le plus utile en C. Il contient toutes les briques de base et je crois qu'il n'y a pas un seul programme de C qui n'inclue pas
stdlib.h (l'équivalent "C" de ce fichier). Par contre, en C++, ben... il ne sert quasiment à rien. Mise à part la génération de nombres aléatoires, tout a été remplacé par de nouvelles fonctionnalités en C++.
Revoyons quand même en vitesse comment générer des nombres aléatoires. La fonction
rand() renvoie un nombre au hasard entre 0 et
RAND_MAX (un très grand nombre, généralement plus grand que

). Si l'on souhaite obtenir un nombre au hasard entre 0 et 10, on utilise l'opérateur modulo (
%).
Code : C++ | nb = rand() % 10; //nb prendra une valeur au hasard entre 0 et 9 compris.
|
Jusque-là, rien de bien compliqué. Le problème est qu'un ordinateur ne sait pas générer un nombre au hasard. Tout ce qu'il sait faire c'est créer des suites de nombre qui
ont l'air aléatoires. Il faut donc spécifier un début pour la séquence. Et c'est là qu'intervient la fonction
srand(). Elle permet de spécifier le premier terme de la suite.
Il ne faut appeler qu'une seule et unique fois la fonction srand() par programme !
Le problème est que si l'on donne chaque fois le même premier terme à l'ordinateur, il va nous générer à chaque fois la même séquence ! Il faut donc lui donner quelque chose de différent à chaque exécution du programme. Et qu'est-ce qui change à chaque fois que l'on exécute un programme ?

La date et l'heure bien sûr !
La bonne solution est donc d'utiliser le résultat de la fonction
time() comme premier terme de la série.
Code : C++ - Générer des nombres au hasard 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | #include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
srand(time(0)); //On initialise la suite de nombres aléatoires
for(int i(0); i<10; ++i)
cout << rand() % 10 << endl; //On génère des nombres au hasard
return 0;
}
|
Libre à vous ensuite d'utiliser ces nombres pour mélanger des lettres comme dans le TP ou pour créer un jeu de casino. Le principe de base est toujours le même.
Les autres en-têtes
Mis à part
cassert dont nous parlerons plus tard, le reste des 15 en-têtes du C ne sont que très rarement utilisés en C++. Je ne vous en dirai donc pas plus dans ce cours.
Bon, assez travaillé avec les reliques du C ! Pour l'instant, je ne vous ai pas présenté de grandes révolutions pour vos programmes comme je vous l'avais promis. Ne le dites pas trop fort si vous rencontrez des amateurs de C, mais c'est parce qu'on n'a pas encore utilisé la puissance du C++. Attachez vos ceintures, la suite du voyage va secouer.