TP 1
TP 1
TP 1
Préambule
Qu’est-ce que le C++ ?
Le C++ est un langage très populaire qui allie puissance et rapidité. Voici quelques qualités du
C++ que nous découvrirons au cours de ces TP :
• Il est très répandu. C’est un des langages de programmation les plus utilisés interna-
tionalement dans l’industrie et la recherche. Il y a donc beaucoup de documentation sur
Internet et on peut facilement trouver de l’aide sur les forums.
• Il est très rapide (en temps de calcul) et est donc utilisé pour les applications qui ont
besoin de performance (jeux vidéo, outils financiers, simulations numériques ...)
• Il est portable, c’est-à-dire qu’un même code source peut être transformé rapidement
en exécutable sous Windows, Mac OS et Linux.
• Il existe de nombreuses bibliothèques pour le C++, nous en verrons quelques unes dans
ces TP. Les bibliothèques sont des extensions pour le langage car de base, le C++ ne
fournit que des outils bas-niveau mais en le combinant avec de bonnes bibliothèques, on
peut créer des programmes très puissants.
• Il est multi-paradigmes, c’est-à-dire qu’on peut programmer de différentes façons en
C++. La plus célèbre est la : Programmation Orientée Objet (POO). Cette tech-
nique permet de simplifier l’organisation du code dans les programmes et de rendre faci-
lement certains morceaux de codes réutilisables. Plusieurs TP y seront consacrés.
Quelques conseils
Bien lire la console quand vous avez des erreurs à la compilation. En effet le compilateur
vous donne de nombreuses informations pour vous aider à corriger la syntaxe de votre code. Un
exemple :
main.cc:20:35: error: expected ’;’ after expression
cout << "Hello world!" << endl
^
;
1 error generated.
Le compilateur nous informe que l’erreur est dans le fichier « main.cc » à la ligne 20 et à la
colonne 35. Ensuite il nous informe qu’il attend un « ; » à la fin de la ligne :
cout << "Hello world!" << endl
N’hésitez pas à commenter votre code, cela facilitera la recherche d’erreurs. Pour insérer un
commentaire en C++ sur une ligne :
// Ceci est un commentaire
Pensez à bien indenter votre code pour faciliter sa lecture. Avec Atom (éditeur qui est conseillé),
vous pouvez faire :
Edit > Lines > Auto Indent
Pour ce premier TP, de nombreux programmes vous sont donnés, n’hésitez pas à modifier
et/ou enlever certaines lignes pour voir le rôle de chaque bout de code.
Objectifs
• Faire un premier programme en C++
• Présenter les différents types de données en C++
• Utiliser la librairie iostream pour afficher des messages à l’écran (cout) et interagir avec
l’utilisateur (cin)
• Apprendre les structures de contrôle classiques : boucle for, conditions if et while
• Apprendre à écrire des fonctions
• Passage des arguments (par valeur ou par référence)
2. Retirer le point virgule à la fin de la ligne 20. Compiler de nouveau et étudier la réaction du
compilateur. Rajouter le point virgule.
3. Commenter la ligne 3. Remarquer que les commandes "cout" et "endl" ne sont plus reconnues.
Enlever le commentaire.
4. Commenter la ligne 6. Remarquer que les commandes "cout" et "endl" ne sont plus reconnues.
Cependant le compilateur vous propose à la place :
std::cout
std::endl
string nomFonction("racine");
cout << nomFonction << "(" << a << ") = " << sqrt(a) << endl;
cout << a << "^" << n << " = " << pow(a,n) << endl;
return 0;
}
Remarque importante :
Les 3 bouts de code ci-dessous sont équivalents :
double a(2);
double a = 2.;
double a;
a = 2;
2. Il est bien sûr possible d’additionner, de soustraire (etc ...) avec le C++. Rajouter les lignes
suivantes au code précédent. Tester le bout de code suivant :
double b(2.), c(3.), d(2.1); // (b = 2)
b++; // Ajoute la valeur 1 : cette commande a donné son nom au C++ ! (b = 3)
b += c; // Ajouter la valeur c à b (b = 6)
b -= d; // Retire la valeur d à b (b = 3.9)
cout << "Après de nombreux calculs, b vaut " << b << endl;
int g = e/f;
cout << "La division de " << e << " par " << f << " vaut " << g << "." << endl;
nomFonction c
puissance 3.0
etc …
23
2.1
d age
En C++, il est possible de coller une deuxième étiquette à une case mémoire à l’aide du symbole
"&". On obtient alors un deuxième moyen d’accéder à la même case mémoire. Il s’agit d’une
référence. En rajoutant ces quelques lignes :
int& laVariable(age);
cout << "Vous avez " << laVariable << " ans ! (par référence)" << endl;
nomFonction c
puissance 3.0
etc …
23
2.1
d laVariable age
Bien sûr vous obtenez le même résultat que précédemment. On verra plus tard le rôle de ces
références.
int main()
{
const int nb_essai(10);
srand(time(0));
const int nombre = (rand() % 100);
int proposition(0), est_gagnant(nb_essai+1);
cout << "Le nombre caché est un entier compris entre 0 et 100." << endl;
cout << "Vous avez " << nb_essai << " essais pour le trouver." << endl;
return 0;
}
1. Faire une fonction print_hello qui affiche "Hello world !" et l’appeler dans la fonction main.
2. Faire une fonction fibonacci qui calcule la suite de Fibonacci :
un+1 = un + un−1 .
Si u0 et u1 sont des entiers, un reste un entier pour tout n, le prototype de la fonction sera alors
le suivant :
int nomFonction(int n, int u0, int u1)
{
int un(0);
.
.
.
return un;
}
Pour u0 = u1 = 1, calculer u10 , u30 et u50 . Que se passe t-il ? Essayer avec int64_t au lieu de
int en rajoutant :
#include <stdint.h>
Conclure.
void valeur(int b)
{
b=5;
}
int main()
{
int a=3;
cout << "a avant la fonction valeur " << a << endl;
valeur(a);
cout << "a après la fonction valeur " << a << endl;
return 0;
}
Compiler et exécuter ce code. Que se passe t-il ?
2. Comme vous avez pu le voir, le nombre imprimé est 3, et non 5 ! La fonction valeur a reçu
en argument une copie de a et ne change que la valeur de cette copie. Dans la fonction main,
la valeur de a ne change pas. Il est cependant possible de passer les arguments par référence.
Elles ont été introduites dans l’exercice 2 à la question 4. Pour les utiliser, il suffit de rajouter
le symbole "&" dans le type de l’argument. Tester cette nouvelle fonction :
void reference(int& b)
{
b=5;
}
Cette fois-ci, la console imprime 5 à l’écran car le passage a eu lieu par référence.
Remarque : Une référence n’a de sens que s’il y a une variable en mémoire derrière :
reference(&(3)); //Cela ne compile pas car cela n’a aucun sens.
3. Pour que le code soit plus efficace, on peut aussi passer par référence de gros objets tout en
déclarant que leur valeur ne doit pas être modifiée. Pour le moment la notion d’objet peut vous
sembler lointaine (TP 3) mais par exemple si vous souhaitez envoyer un email avec une photo
de 4Mo, le téléchargement va prendre du temps alors que si vous envoyez l’adresse web de cette
image, c’est beaucoup plus rapide ! Quand il s’agit juste de faire passer cet objet et qu’il ne
doit pas être modifié, on rajoute le mot-clef const devant le type de l’argument. Cela permet au
compilateur de mieux vérifier le code et aide à trouver les bugs. C’est une très bonne habitude
à prendre pour "mieux programmer". Tester pour voir l’erreur que renvoie le compilateur :
void const_reference(const int& b)
{
b=5;
}
1. Écrire une fonction qui permet de calculer y n+1 à partir de y n avec le schéma d’Euler explicite :
et
y 0 (t) = y 2 t
y(0) = −2
Comparer avec les solutions exactes (qui sont bien sur respectivement : y(t) = y 0 exp(t) et
y(t) = 2y 0 /(2 − t2 y 0 )).
4. Vérifier l’ordre de convergence de la méthode d’Euler :
a. Calculer l’erreur entre la solution approchée et la solution exacte au temps final pour ∆t = 0.001
et pour Tf inal = 1. On la note e∆t .
b. Faire de même avec ∆t/2. On la note e∆t/2 .
c. Calculer l’ordre de la méthode par :
ordreConvEuler = log 2 e∆t / e∆t/2 .