Les objectifs de ce TP sont de s’initier à la programmation orientée objet en C++.
Pour les enseignants, ceci est un "petit" devoir pour Github Classroom. Il montre l'utilisation des tests unitaires en C++, la notation automatique et l'insertion d'un badge pour l'affichage de la note.
C++ est un langage de programmation compilé permettant la programmation sous de multiples paradigmes (comme la programmation procédurale, orientée objet ou générique). Ses bonnes performances, et sa compatibilité avec le C en font un des langages de programmation les plus utilisés dans les applications où la performance est critique.
Créé initialement par Bjarne Stroustrup dans les années 1980, le langage C++ est aujourd'hui normalisé par l'ISO. Sa première normalisation date de 1998 (ISO/CEI 14882:1998), ensuite amendée par l'erratum technique de 2003 (ISO/CEI 14882:2003). Une importante mise à jour a été ratifiée et publiée par l'ISO en septembre 2011 sous le nom de ISO/IEC 14882:2011, ou C++11. Depuis, des mises à jour sont publiées régulièrement : en 2014 (ISO/CEI 14882:2014 ou C++14) puis en 2017 (ISO/CEI 14882:2017 ou C++17). [source : wikipedia.org]
Les changements du langage C++ concernent aussi bien le langage initial que la bibliothèque standard.
Remarque : La bibliothèque standard du C++ (C++ Standard Library) est une bibliothèque de classes et de fonctions standardisées selon la norme ISO pour le langage C++. Elle contient aussi la bibliothèque standard du C. Une des principales briques de la bibliothèque standard du C++ est sans aucun doute la STL (Standard Template Library), à tel point qu'il y a souvent confusion entre les deux.
Dans l'index de popularité des langages TIOBE, le C représente 16,2 % (première place) et le C++ 7,6 % (quatrième place) en novembre 2020.
Lien : www.cplusplus.com
« Hello, world »
Voici l'exemple de Hello world donné dans "The C++ Programming Language, Third Edition" de Bjarne Stroustrup :
#include<iostream>
int main()
{
std::cout << "Hello, new world!\n";
}
On souhaite manipuler des points. Pour cela, nous allons définir le concept Point :
Un point est défini par son abscisse (
x
) et son ordonnée (y
). L’abscisse et l’ordonnée d’un point sont des réels (double
).
On en sait suffisamment pour modéliser une classe Point
:
#ifndef POINT_H
#define POINT_H
class Point
{
private:
double x;
double y;
public:
// TODO Constructeurs
// TODO Destructeur
// TODO Accesseurs et mutateurs
// TODO Services
};
#endif //POINT_H
📝 Lorsqu'on modélise une nouvelle classe, on commence toujours par identifier ses caractéristiques afin de déterminer le nom et le type des ses attributs. C'est seulement ensuite que l'on s'attache à son comportement.
La programmation orientée objet (POO) nous oblige à complèter le squelette de cette classe :
-
La classe
Point
devra disposer de deux constructeurs : un constructeur par défaut qui initialisera les attributsx
ety
à zéro et un constructeur d'initialisation qui recevra en paramètres l’abscisse et l’ordonnée du point à initialiser. -
Tous les attributs de la classe
Point
seront privés par respect du principe d’encapsulation. On veut néanmoins pouvoir connaître son abscisse et son ordonnée, et éventuellement les modifier. Il faudra donc créer les accesseurs et mutateurs correspondants. -
Un point pourra s’afficher. On aura donc une méthode publique
affiche()
qui produira un affichage de ce type :<x,y>
-
On doit aussi pouvoir calculer la distance entre 2 points (
calculeDistance()
) et le milieu de 2 points (determinePointMilieu()
).
📝 Une méthode publique est un service rendu à l'utilisateur de l'objet.
On vous fournit un programme test-point.cpp
où vous devez décommenter progressivement les parties de code source correspondant aux questions posées.
À la fin du TP, vous devez obtenir l’exécution suivante :
$ make test-point
Question 1 : constructeur par défaut
Question 2 : constructeur
Question 3 : accesseurs et mutateurs
L'abscisse de p0 est 0
L'abscisse de p1 est 1
L'abscisse de p1 est 4
L'ordonnée de p0 est 0
L'ordonnée de p1 est 2
L'ordonnée de p1 est 0
L'abscisse de p0 est maintenant 5.5
L'ordonnée de p0 est maintenant 6.5
L'abscisse de p3 est 2
L'ordonnée de p3 est 1
Question 4 : rendre des services
p0 = <5.5,6.5>
p1 = <1,2>
p2 = <4,0>
Question 5 : calcul de la distance entre 2 points
La distance entre p1 et p2 est de 3.6
Question 6 : calcul le point milieu entre 2 points
Le point milieu entre p1 et p2 est <2.5,1>
Solutions pour C++ :
👉 Dans ce TP, on utilisera Catch2 (Tutoriel Catch2).
Tests unitaires pour les questions Q1, Q2, Q3, Q4, Q5 et Q6 :
$ make tests
...
All available test cases:
Q1 : Constructeur par défaut
Q2 : Constructeur d'initialisation
Q3 : Accesseurs et mutateurs
Q4 : Affiche les coordonnées d'un point
Q5 : Calcul de la distance entre 2 points
Q6 : Calcul du point milieu entre 2 points
6 test cases
<0,0>
===============================================================================
All tests passed (12 assertions in 6 test cases)
Test unitaire pour une question Qx :
$ make test-q1
...
===============================================================================
All tests passed (2 assertions in 1 test case)
Il est souvent nécessaire de passer par un "bac à sable".
En informatique, le bac à sable (sandbox) est une zone d'essai permettant d'exécuter des programmes en phase de test ou dans lesquels la confiance est incertaine. C'est notamment très utilisé en sécurité informatique pour sa notion d'isolation.
Il existe de nombreux sites web qui fournissent des EDI (Environnement de Développement Intégré) en ligne pour tester du code ou des services : un espace d'apprentissage séparé. Ils permettent aussi d'échanger des exemples.
Quelques sites :
- C++ shell
- Coding Ground For Developers : https://www.tutorialspoint.com/codingground.htm
- Codecast France IoI
- Visual Studio Code Online : https://vscode.dev/
- Gitpod : https://www.gitpod.io/
- Codeanywhere (Cloud IDE) : https://codeanywhere.com/
Thierry Vaira : thierry(dot)vaira(at)gmail(dot)com