Cours de C++ Cours de C++ Guillaume Caumon, Février 2007 Guillaume Caumon, Févr
Cours de C++ Cours de C++ Guillaume Caumon, Février 2007 Guillaume Caumon, Février 2007 Introduction Introduction ¿ ¿ la Programmation la Programmation Orient Orient … … e Objet e Objet Le C++ Introduction Introduction Du C au C++ Du C au C++ Les Classes Les Classes Lᾼh…ritage Lᾼh…ritage Programmation g…n…rique Programmation g…n…rique Pourquoi ce cours ? Place importante de la modélisation en Geosciences : Place importante de la modélisation en Geosciences : - validation d’une théorie - validation d’une théorie - prédiction et calculs - prédiction et calculs - évaluation des risques - évaluation des risques Les phénomènes étudiés sont complexes Les phénomènes étudiés sont complexes La programmation orientée-objets peut faire gagner La programmation orientée-objets peut faire gagner beaucoup de temps beaucoup de temps Objectif du cours Connaissance Connaissance Temps Temps - - Comprendre les concepts élémentaires de programmation Comprendre les concepts élémentaires de programmation orientée objet (POO) orientée objet (POO) - - Etre capable de lire et comprendre du code C++ Etre capable de lire et comprendre du code C++ - - Analyser un problème et le décomposer pour mieux le traiter Analyser un problème et le décomposer pour mieux le traiter - - Mettre en oeuvre les concepts de POO en langage C++ Mettre en oeuvre les concepts de POO en langage C++ Agenda • Lundi pm : Du C au C++ • Mardi am : exercices pratiques • Mardi pm : Les classes • Mercredi am : L’héritage • Mercredi pm : quizz et exercices • Jeudi am : exercices • Vendredi am : Bibliothèque std + exercices • Vendredi pm : colle (2h) Bref historique L’algorithmique est une science ancienne (ex: algorithme d’ Euclide pour calculer le PGCD) Mais la programmation une science nouvelle (ou un art nouveau ? [Knuth, the Art of Computer programming]). - Métier à tisser de (1801): ancêtre des cartes perforées (Recencement 1890 - Brevet IBM 1930) - Développement de programmes assembleur à partir des 40’s pgcd(m, n) = pgcd(m − n, n) si m > n pgcd(m, n) = pgcd(m, n − m) si m < n Bref historique Difficultés et erreurs Développement de langages pour rendre le codage plus intuitif: Fortran (1950), ALGOL Aujourd’hui: - langages procéduraux (Pascal, C,…). - langages fonctionnels (ML, CAML, …). - langages orientés-objet (ADA, SmallTalk, Eiffel, C++, Java, …). Qualité d’un Programme ? 1 Validit 1 Validité é Le programme fonctionne Le programme fonctionne 2 Extensibilit 2 Extensibilité é Je peux le faire évoluer Je peux le faire évoluer 3 R 3 Ré éutilisabilit utilisabilité é Je peux utiliser des composantes Je peux utiliser des composantes du programme pour du programme pour d’autres applications d’autres applications Comment s’y prendre ? S Séparer le programme en modules réutilisables éparer le programme en modules réutilisables Par analyse fonctionnelle descendante Par analyse fonctionnelle descendante Par analyse ascendante Par analyse ascendante Unit Unité fonctionelle autonome, é fonctionelle autonome, possédant une interface possédant une interface Independante de son implantation Independante de son implantation (header.h) (impl.cpp) On peut le faire en C… Modules = fonctions (déclaration / implementation) Modules = fonctions (déclaration / implementation) Communication entre modules = appels de fonctions Communication entre modules = appels de fonctions Flexibilité et réutilisation par des pointeurs de fonctions Flexibilité et réutilisation par des pointeurs de fonctions MAIS: MAIS: - - Les données sont globales Les données sont globales - - Comprendre le programme équivaut à comprendre ce Comprendre le programme équivaut à comprendre ce que fait chaque fonction que fait chaque fonction Exemple C / C++ Calcul de distance float hits[3][100] float x,y,z; int i = 0; float dist = 0; … for(i = 0; i < 100; i++ ){ x = hits[i][0]; y = hits[i][1]; z = hits[i][2]; dist = sqrt(x*x + y*y + z* z); } Point points[100]; Point orig(0, 0, 0); … for( i = 0; i < 100; i++ ){ float dist = points[i].distance(origin); } Changer les coordonnées de l’origine ? Changer les coordonnées de l’origine ? Passer en référentiel sphérique ? Passer en référentiel sphérique ? Différences C / C++ Langages compilés Langages compilés Analyse, mise en oeuvre et architecture des programmes Analyse, mise en oeuvre et architecture des programmes Possibilités de vérifications en C++ lors de la compilation Possibilités de vérifications en C++ lors de la compilation C++ offre des nouvelles possibilités C++ offre des nouvelles possibilités La conception par objets Cette m Cette mé éthode privil thode privilégie les données, égie les données, et non les fonctions et non les fonctions Trouver les objets (physiques) Trouver les objets (physiques) Décrire et classer les objets Décrire et classer les objets Implanter ces objets Implanter ces objets Opérations Opérations Liens Liens Caractéristiques communes Caractéristiques communes Pourquoi concevoir des objets ? Un être humain peut facilement comprendre Un être humain peut facilement comprendre simultanément un seul aspect d’un problème simultanément un seul aspect d’un problème “Diviser pour régner” “Diviser pour régner” Associer les données et les fonctionnalités Associer les données et les fonctionnalités Représenter des abstractions Représenter des abstractions Recycler ces abstractions Recycler ces abstractions Un langage orienté objet Permet: Permet: La définition d’objets, avec partie publique et privée La définition d’objets, avec partie publique et privée La modularité (compilation séparée) La modularité (compilation séparée) La réutilisation (mise en facteur des fonctionalités) La réutilisation (mise en facteur des fonctionalités) L’extension des objets (héritage) L’extension des objets (héritage) La lisibilité (distinction interface / implémentation) La lisibilité (distinction interface / implémentation) La définition d’objets abstraits La définition d’objets abstraits Exemple : les listes (code C) typedef struct LIST { typedef struct LIST { NODE* p_first_node_ ; NODE* p_first_node_ ; NODE* p_last_node_ ; NODE* p_last_node_ ; int nb_items_ ; int nb_items_ ; } LIST ; } LIST ; LIST* LIST_Create() ; LIST* LIST_Create() ; void LIST_Destroy void LIST_Destroy BOOLEAN LIST_Owns_Item BOOLEAN LIST_Owns_Item typedef struct NODE { typedef struct NODE { struct NODE* next_ ; struct NODE* next_ ; void* p_item_ ; void* p_item_ ; } NODE ; } NODE ; … … () ; () ; () ; () ; ( LIST* p_list ) ; ( LIST* p_list ) ; ( ( LIST* p_list, PNTR* item LIST* p_list, PNTR* item ) ; ) ; … … Plus explicite… Mais le compilateur C ne peut Plus explicite… Mais le compilateur C ne peut pas vérifier les types pas vérifier les types Exemple : les listes (code C) typedef struct DATA { typedef struct DATA { int index_; int index_; char value_; char value_; } DATA; } DATA; BOOLEAN check_item( LIST* list, DATA* data ) { BOOLEAN check_item( LIST* list, DATA* data ) { BOOLEAN found = LIST_Owns_Item( list, data ); BOOLEAN found = LIST_Owns_Item( list, data ); if( found ) { if( found ) { printf( printf( “Item %d , %c in List”, “Item %d , %c in List”, data->index_, data->value_ data->index_, data->value_ ); ); } } return found; return found; } } Problème: Une fonction par type de donnée… Problème: Une fonction par type de donnée… Exemple : les listes (code C++) class Node { class Node { … … }; }; class List { class List { public : public : List(); List(); ~List(); ~List(); bool owns_item( void* item ) const; bool owns_item( void* item ) const; private : private : Node* first_node_ ; Node* first_node_ ; Node* last_node_ ; Node* last_node_ ; int nb_items_ ; int nb_items_ ; }; }; Exemple : les listes (code C++) class Data { class Data { public : public : Data( int index, char value ); Data( int index, char value ); void print() const; void print() const; private : private : int ind_; int ind_; char val_; char val_; }; }; bool check_item( List* list, Data* data ) { bool check_item( List* list, Data* data ) { bool found = list->owns_item( data ); bool found = list->owns_item( data ); if( found ) { if( found ) { data->print(); data->print(); } } return found; return found; } } Historique Créé par B. Stroustrup (Bell Labs. ) à partir de 1979 Créé par B. Stroustrup (Bell Labs. ) à partir de 1979 (“C with classes”). (“C with classes”). Initialement: code C++ précompilé Initialement: code C++ précompilé → code C → code C Devient public en 1985 sous le nom de C++. Devient public en 1985 sous le nom de C++. La version normalisée (ANSI) paraît en 1996. La version normalisée (ANSI) paraît en 1996. C++ = C + C++ = C + V…rifications de type + stricte V…rifications de type + stricte Surcharge de fonctions Surcharge de fonctions Op…rateurs Op…rateurs R…f…rences R…f…rences Gestion m…moire + facile Gestion m…moire + facile Entr…es/sorties + facile Entr…es/sorties + facile Classes et h…ritage Classes et h…ritage Programmation g…n…rique Programmation g…n…rique Ὴ Ὴ Un langage compilé… Langage = protocole de communication entre Langage = protocole de communication entre le programmeur et le processeur. le programmeur et le processeur. Code C/C++ Code C/C++ Code pr…-process… Code pr…-process… Programme Programme Librairies Librairies Fichier(s) Objet Fichier(s) Objet Le C++ Historique Historique Du C au C++ Du C au C++ Les Classes Les Classes uploads/Philosophie/ c 2 .pdf
Documents similaires










-
28
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Jan 10, 2022
- Catégorie Philosophy / Philo...
- Langue French
- Taille du fichier 0.7662MB