« Programmation C++/Les structures/Exercices » : différence entre les versions

Contenu supprimé Contenu ajouté
→‎EXERCICE 3 : ortho
ortho + mise en forme
Ligne 4 :
=== Présentation ===
Nous avons utilisé pour l'instant des types de base : ils contiennent des éléments de type int, char, double ou bool. Dans ce chapitre nous allons définir de nouveaux types qui vont permettre de représenter des entités plus complexes. Par exemple, on pourra définir un type point qui contiendra une abscisse et une ordonnée. Nous allons donc apprendre à créer et à utiliser des types structurés.<br/>
Nous verrons ensuite comment, à partir de ces types, nous pouvons créer des fonctions permettant de manipuler ces nouveaux types. L'association de ces types et de ces fonctions sera appelée module, chacun sera défini par un fichier headerd'en-tête <tt>.h</tt> et un fichier source <tt>.cpp</tt>. Nous verrons à cette occasion la compilation séparée. Notre programme ne sera plus constitué d'un seul fichier mais d'un ensemble de fichiers qui pourra éventuellement être très important.
Nous étudierons finalement un type de structure très usuel : les listes. Dans ce chapitre, notre représentation des listes sera très sommaire mais sera l'occasion de découvrir une méthodologie de programmation en découpant notre programme en différents modules qui seront dans une certaine mesure indépendants. Cette méthodologie nous permettra de concevoir des programmes de taille plus importante.
 
Ligne 63 :
</source>
**'''Explications'''
**Dans cet exemple, nous définissontdéfinissons une structure point composée de 2 réels x et y.
**Dans la fonction main, on définit 3 points a,b et c.
**On fixe les coordonnées du point a à (3.2,6.4).
Ligne 163 :
 
=== Décomposition d'un programme en plusieurs fichiers ===
Nos programmes vont désormais être découpés en plusieurs fichiers : certains seront des fichiers headersd'en-tête et porteront l'extension <tt>.h</tt>. D'autres comporteront du code et porteront l'extension <tt>.cpp</tt>. <br/>
Chaque programme sera constitué de modules : chaque module sera défini par un fichier <tt>.h</tt> et un fichier <tt>.cpp</tt>. Chaque module aura une fonctionnalité bien définie. Il comportera en général la définition d'une structure et des fonctions permettant de manipuler ces structures. <br/>
Cette approche nous permet d'améliorer petit à petit notre méthodologie de programmation. <br/>
 
Ligne 179 :
- #include "point.h" <br/>
- les fonctions manipulant des points. <br/>
*On a ainsi créé un module réutilisable permettant de manipuler des points. Lorsque le programme principal voudra utiliser notre module point, il faudra rajouter <tt>#include"point.h"</tt>.
*Sur des petits programmes cette structuration semble être une perte de temps. En fait cela permet de gagner du temps de débogage et cette méthodologie devient indispensable dès que l'application devient conséquente.
 
=== Le programme principal ===
Notre programme est désormais constitué de 3 fichiers : <br/>
*Les fichiers <tt>point.h</tt> et <tt>point.cpp</tt> qui définissent un module point.
*Le fichier main.cpp qui contient la fonction main. Ce fichier utilise le module point et commence donc par <tt>#include "point.h"</tt>.
 
=== Les fichiers headerd'en-tête ===
Un programme peut être constitué d'un grand nombre de modules : par exemple imaginons qu'un programme soit constitué de 4 modules A, B, C et D. <br/>
On suppose que B et C utilisent les notions définies dans A : ils commencent donc tous les deux par <tt>#include"A.h"</tt>. <br/>
On suppose que le module D utilise les notions définies dans B et dans C. D commence donc par <tt>#include"B.h"</tt> et <tt>#include"C.h"</tt>. <br/>
Le module A sera donc défini 2 fois dans le module D une fois lors de l'inclusion de <tt>B.h</tt> et une deuxième fois lors de l'inclusion de <tt>C.h</tt>. Le compilateur refusera de compiler notre programme ! <br/>
 
=== Fichier headerd'en-tête : la solution ===
Le fichier .h d'un module A commencera par <tt>#ifndef A_H</tt> et se terminera par <tt>#endif</tt>. <br/>
La directive de compilation <tt>#ifndef</tt> permet d'inclure le code situé entre le <tt>#ifndef</tt> et <tt>#endif</tt> uniquement si la macro <tt>A_H</tt> n'est pas déjà définie. <br/>
 
Juste après <tt>#ifndef A_H</tt>, on va justement définir la macro <tt>A_H</tt> en écrivant <tt>#define A_H</tt>. <br/>
Ainsi la première fois qu'on inclura A.h, la macro A_H ne sera pas définie, on inclura donc le code correspondant et on définira la macro A_H. <br/>
LaAinsi deuxièmela première fois qu'on voudra inclureinclura <tt>A.h</tt>, la macro <tt>A_H</tt> étantne sera pas définie, on inclura donc le code ducorrespondant fichieret A.hon nedéfinira serala pasmacro inclus<tt>A_H</tt>. <br/>
La deuxième fois qu'on voudra inclure <tt>A.h</tt>, la macro <tt>A_H</tt> étant définie, le code du fichier <tt>A.h</tt> ne sera pas inclus. <br/>
Grâce à cette méthode, les définitions contenues dans les fichiers <tt>.h</tt> ne seront inclues qu'une seule fois. <br/>
 
=== Exemple 3 : programmation modulaire ===
Ligne 274 ⟶ 275 :
*'''Explications'''
**Le fichier point.h va contenir :
***l'utilisation des directives <tt>#ifndef</tt>, <tt>#define</tt> et <tt>#endif</tt> pour éviter l'inclusion multiple des fichiers <tt>.h</tt>.
***la définition de la structure point
***les entêtes des fonctions manipulant des points.
**Le fichier <tt>point.cpp</tt> commence par <tt>#include "point.h"</tt>. Comme il utilise <tt>cin</tt> et <tt>cout</tt>, il contient aussi <tt>#include<&lt;iostream&gt;</tt>. Comme il utilise la fonction <tt>sqrt</tt>, il contient aussi <tt>#include<cmath></tt>. Il contient également les 4 fonctions du module.
**Le fichier <tt>main.cpp</tt> contient notre fonction <tt>main()</tt> qui est identique à celle de l'exemple 2.
 
=== Structuration de notre programme et de notre réflexion ===
*Au lieu d'avoir un seul grand fichier contenant le main et toutes les fonctions , il y a plusieurs petits fichiers .
*Lorsqu'on écrit le fichier <tt>point.h</tt>, on réfléchit à la spécification de chaque fonction : QUE fait notre fonction ?
*Lorsqu'on écrit le fichier <tt>point.cpp</tt>, on réfléchit à comment on implémente ces spécifications : COMMENT REALISERRÉALISER cette fonctionnalité ?
*Lorsqu'on écrit notre fichierfonction <tt>main</tt>, on réfléchit à l'utilisation des fonctions de <tt>point.h</tt> en vue de résoudre notre programme : COMMENT UTILISER ces fonctions ?
 
=== Gérer une liste d'employés ===