INF 2005 Programmation orientée objet avec C++



Documents pareils
Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Introduction à l héritage en C++

Claude Delannoy. 3 e édition C++

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

INFO-F-105 Language de programmation I Séance VI

Programmer en JAVA. par Tama

Les structures. Chapitre 3

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours 1: Java et les objets

COMPARAISONDESLANGAGESC, C++, JAVA ET

Le langage C++ (partie I)

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Cours d initiation à la programmation en C++ Johann Cuenin

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Programmation C++ (débutant)/instructions for, while et do...while

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

et Programmation Objet

Programmation en C/C++

LE LANGAGE C++ ENAC 1997 A. DANCEL

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Solutions du chapitre 4

ETUDE DE CAS en UML : GESTION DES COMMANDES DE PIECES FABRIQUEES PAR LA SOCIETE C

Programmation avec des objets : Cours 7. Menu du jour

TP, première séquence d exercices.

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

STAGE IREM 0- Premiers pas en Python

Introduction au langage C

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Cours d Algorithmique et de Langage C v 3.0

IUT ANNECY Département Mesures Physiques Cours d informatique Initiation au langage C

Programme Compte bancaire (code)

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Les structures de données. Rajae El Ouazzani


INF 321 : mémento de la syntaxe de Java

Premiers Pas en Programmation Objet : les Classes et les Objets

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Chapitre 10. Les interfaces Comparable et Comparator 1

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

C++ : PROGRAMMATION-OBJET

INITIATION A LA PROGRAMMATION

Java Licence Professionnelle CISII,

Langage Java. Classe de première SI

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Avertissement : Ce cours suppose la connaissance et la maîtrise du langage C CONTENU DU COURS BIBLIOGRAPHIE

Plan Pédagogique du cours

Bases de programmation. Cours 5. Structurer les données

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Introduction à l algorithmique et à la programmation M1102 CM n 3

Chapitre 1 : La gestion dynamique de la mémoire

Le langage C. Séance n 4

TD3: tableaux avancées, première classe et chaînes

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Informatique III: Programmation en C++

Travaux Dirigés n 1 : chaînes de caractères

as Architecture des Systèmes d Information

Initiation. àl algorithmique et à la programmation. en C

I. Introduction aux fonctions : les fonctions standards

INITIATION AU LANGAGE JAVA

alg - Classes, instances, objets [oo] Exercices résolus

Initiation à la programmation en Python

C++ - Classes, instances, objets [oo] Exercices résolus

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Programmation Objet Java Correction

Un ordonnanceur stupide

TP : Gestion d une image au format PGM

RMI le langage Java XII-1 JMF

Création d objet imbriqué sous PowerShell.

Compression de Données - Algorithme de Huffman Document de Conception

Exercices INF5171 : série #3 (Automne 2012)

Algorithmique et Programmation, IMA

1.6- Génération de nombres aléatoires

Programmation en Java IUT GEII (MC-II1) 1

Corrigé des TD 1 à 5

TD/TP PAC - Programmation n 3

Introduction à C++ et à wxwidgets

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Une introduction à Java

Chap III : Les tableaux

Arbres binaires de recherche

Transcription:

INF 2005 Programmation orientée objet avec C++ Module 4 - Solutions 1. #include <time.h> using namespace std; class Temps public: Temps(); void setheure(int h) heure = (h >= 0 && h < 24)? h : 0; void setminute(int m) minute = (m >= 0 && m < 60)? m : 0; void setsecond(int s) second = (s >= 0 && s < 60)? s : 0; int getheure(void) return heure; int getminute(void) return minute; int getsecond(void) return second; void AfficherStandard(void); private: int heure; int minute; int second; ; // définition des fonctions membres de la classe Temps Temps::Temps() long int tempstotal; // Temps en secondes // depuis 1970 int AnneeCourante = 1994-1970; // Temps écoulé jusqu à // l année courante double anneetotale; // Année courante double jourtotal; // Nombre de jours écoulés //depuis le début de l année double jour; // Jour courant long double facteur; // Facteur de conversion int DecalageHoraire = 7; // Le temps retourné par // la classe Temps() est Version du 6 janvier 2015 1

// donnée par le nombre // de secondes écoulées // depuis 1/1/70 GMT. Selon //la zone, on doit décaler le //temps d un certain nombre // horaire est de 7 heures. tempstotal = time(null); facteur = (60.0 * 60.0 * 24.0 * 365.0); // Nombre total de // secondes dans 1 an. anneetotale = tempstotal / facteur - AnneeCourante; jourtotal = 365 * anneetotale; // Les années bissextiles sont // ignorées. jour = jourtotal - (int) jourtotal; setheure(jour * 24 + DecalageHoraire); setminute((jour * 24 - (int)(jour * 24)) * 60); setsecond((minute * 60 - (int)(minute * 60)) * 60); void Temps::AfficherStandard() cout << ((heure % 12 == 0)? 12 : heure % 12) << ":" << (minute < 10? "0" : "") << minute << ":" << (second < 10? "0" : "") << second << (heure < 12? " AM" : " PM"); // Programme principal main() Temps t; t.afficherstandard(); return 0; 2. using namespace std; class Rationnel public: Rationnel(int = 0, int = 1); // Constructeur par défaut Rationnel addition(const Rationnel &); Rationnel soustraction(const Rationnel &); Rationnel multiplication(const Rationnel &); Version du 6 janvier 2015 2

; Rationnel division(rationnel &); void AfficherRationnel(void); void AfficherRationnelVirgule(void); private: int numerateur; int denominateur; void simplification(void); // Fonction utilitaire (définie // comme membre privé) ///#endif // Définition des fonctions membres Rationnel::Rationnel(int n, int d) numerateur = n; denominateur = d; Rationnel Rationnel::addition(const Rationnel &a) Rationnel t; t.numerateur = a.numerateur * denominateur + a.denominateur * numerateur; t.denominateur = a.denominateur * denominateur; t.simplification(); return t; Rationnel Rationnel::soustraction(const Rationnel &s) Rationnel t; t.numerateur = s.denominateur * numerateur - denominateur * s.numerateur; t.denominateur = s.denominateur * denominateur; t.simplification(); Rationnel Rationnel::multiplication(const Rationnel &m) Rationnel t; t.numerateur = m.numerateur * numerateur; t.denominateur = m.denominateur * denominateur; t.simplification(); return t; Rationnel Rationnel::division(Rationnel &v) Version du 6 janvier 2015 3

Rationnel t; t.numerateur = v.denominateur * numerateur; t.denominateur = denominateur * v.numerateur; t.simplification(); return t; void Rationnel::AfficherRationnel(void) if (denominateur == 0) cout << "\nerreur DE DIVISION PAR ZÉRO!!!" << endl; else if (numerateur == 0) cout << 0; else cout << numerateur << "/" << denominateur; void Rationnel::AfficherRationnelVirgule(void) cout << (float) numerateur / denominateur; void Rationnel::simplification(void) int superieur = numerateur > denominateur? numerateur : denominateur; int pgdc = 0; // Plus grand diviseur commun for (int boucle = 2; boucle <= superieur; boucle++) if (numerateur % boucle == 0 && denominateur % boucle == 0) pgdc = boucle; if (pgdc!= 0) numerateur /= pgdc; denominateur /= pgdc; // Programme principal main() Rationnel c(1,3), d(7,8), x; c.afficherrationnel(); Version du 6 janvier 2015 4

cout << " + "; d.afficherrationnel(); x = c.addition(d); cout << " = "; x.afficherrationnel(); cout << endl; x.afficherrationnel(); cout << " = "; x.afficherrationnelvirgule(); cout << endl << endl; c.afficherrationnel(); cout << " - "; d.afficherrationnel(); x = c.soustraction(d); cout << " = "; x.afficherrationnel(); cout << endl; x.afficherrationnel(); cout << " = "; x.afficherrationnelvirgule(); cout << endl << endl; c.afficherrationnel(); cout << " x "; d.afficherrationnel(); x = c.multiplication(d); cout << " = "; x.afficherrationnel(); cout << endl; x.afficherrationnel(); cout << " = "; x.afficherrationnelvirgule(); cout << endl << endl; c.afficherrationnel(); cout << " / "; d.afficherrationnel(); x = c.division(d); cout << " = "; x.afficherrationnel(); cout << endl; x.afficherrationnel(); cout << " = "; x.afficherrationnelvirgule(); cout << endl; return 0; Version du 6 janvier 2015 5

3. #include <iomanip> #include <string.h> using namespace std; class Reference public: char titre[256]; char auteur[64]; float prix; char type_argent[4]; Reference(const char *btitre, const char *bauteur, const char *bediteur, float bprix, const char *bdevise); void afficher_titre(void) cout << titre << '\n'; float donner_prix(void) return(prix); void afficher_livre(void) afficher_titre(); afficher_editeur(); void affecter_editeur(const char *nom) strcpy(editeur, nom); private: char editeur[256]; void afficher_editeur(void) cout << editeur << '\n'; ; Reference::Reference(const char *btitre, const char *bauteur, const char *bediteur, float bprix, const char *bdevise) strcpy(titre, btitre); strcpy(auteur, bauteur); strcpy(editeur, bediteur); prix = bprix; strcpy(type_argent, bdevise); int main(void) Reference astuces("j'aime programmer en C/C++", "Jacques et Rénald", "TELE-UNIVERSITE", 19, "$$"); Reference genial("programmation objet", "Samuel Pierre", "TELE- UNIVERSITE",19, "$$"); astuces.afficher_livre(); genial.afficher_livre(); Version du 6 janvier 2015 6

4. using namespace std; class objet public: objet(void); void afficher_objet(void); private: int valeur1; int valeur2; int valeur3; ; objet::objet(void) : valeur1(50), valeur2(500), valeur3(5000) ; // Constructeur. void objet::afficher_objet(void) cout << "Valeur 1 contient : " << valeur1 << endl; cout << "Valeur 2 contient : " << valeur2 << endl; cout << "Valeur 3 contient : " << valeur3 << endl; int main(void) objet nombres; nombres.afficher_objet(); 5. // Fichier M4_Ex5.h ///#ifndef M4_Ex5_H ///#define M4_Ex5_H #include <iomanip> using namespace std; class CompteEpargne public: CompteEpargne(double b) Balance= b >= 0? b : 0; void CalculerIntMensuel(void); static void CalculerIntMensuel(double); void AfficherBalance(void); private: double Balance; static double TauxIntAn; Version du 6 janvier 2015 7

; ///#endif // Fichier Ch5_Ex5.cpp // Définition des fonctions membres ///#include "Ch5_Ex5.h" /// ///#include <iomanip> // Initialisation des membres statiques double CompteEpargne::TauxIntAn = 0.0; void CompteEpargne::CalculerIntMensuel(void) Balance+= Balance* (TauxIntAn / 12.0); void CompteEpargne::CalculerIntMensuel(double i) TauxIntAn = (i >= 0 && i <= 1.0)? i :.03; void CompteEpargne::AfficherBalance(void) cout.setf(ios::fixed ios::showpoint); cout << '$' << setprecision(2) << Balance; // Programme principal de Ch5_Ex5.cpp /// ///#include <iomanip> ///using namespace std; ///#include " Ch5_Ex5.h" main() CompteEpargne epargne1(2000.0), epargne2(3000.0); CompteEpargne::CalculerIntMensuel(.03); cout << endl << "Affichage des balances mensuelles pour un an à un taux de 3 %" << endl << "Balance: Compte 1 "; epargne1.afficherbalance(); cout << "\tcompte 2"; epargne2.afficherbalance(); for (int mois = 1; mois <= 12; mois++) epargne1.calculerintmensuel(); epargne2.calculerintmensuel(); cout << endl << "Mois" << setw(3) << mois << ": Compte 1 "; epargne1.afficherbalance(); cout << "\tcompte 2 "; epargne2.afficherbalance(); CompteEpargne::CalculerIntMensuel(.04); epargne1.calculerintmensuel(); epargne2.calculerintmensuel(); cout << endl << "Après avoir fixé le taux d intérêt à 4 %" << endl << "Balances: Compte 1 "; epargne1.afficherbalance(); cout << "\tcompte 2 "; epargne2.afficherbalance(); return 0; 6. // Fichier M4_Ex6.H ///#ifndef M4_Ex6.H ///#define M4_Ex6.H #include <iomanip> Version du 6 janvier 2015 8

using namespace std; class Polynome public: Polynome(); Polynome operator+(const Polynome&) const; Polynome operator-(const Polynome&) const; Polynome operator*(const Polynome&); Polynome& operator+=(const Polynome&); Polynome& operator-=(const Polynome&); Polynome& operator*=(const Polynome&); void entrertermes(void); void AfficherPolynome(void) const; private: int exposants[100]; int coefficients[100]; void CombinerPolynome(Polynome&); // Combiner les termes communs. ; ///#endif // Fichier M4_Ex6.cpp // Définition des fonctions membres ///#include <iomanip.h> ///#include "Ch4_Ex3.h" Polynome::Polynome() for (int t = 0; t < 100; t++) coefficients[t] = 0; exposants[t] = 0; void Polynome::AfficherPolynome(void) const int debut, zero = 0; if (coefficients[0]) // Affichage de la constante cout << coefficients[0]; debut = 1; zero = 1; // Le polynôme contient au moins un terme. else if (coefficients[1]) cout << coefficients[1] << 'x'; // Le terme constant du polymôme // n existe pas. if ((exposants[1]!= 0) && (exposants[1]!= 1)) cout << '^' << exposants[1]; zero = 1; // Le polynôme contient au moins un terme. debut = 2; // Affichage des termes restants du polynôme for (int x = debut; x < 100; x++) if (coefficients[x]!= 0) cout << setiosflags(ios::showpos) << coefficients[x] << resetiosflags(ios::showpos) << 'x'; if ((exposants[x]!= 0) && (exposants[x]!= 1)) cout << '^' << exposants[x]; Version du 6 janvier 2015 9

zero = 1; // Le polynôme contient au moins un terme. if (zero == 0) // Le polynôme ne contient aucun terme. cout << '0'; cout << endl; Polynome Polynome::operator+(const Polynome& r) const Polynome temp; int s; int x; int exposantexiste; // Traiter l élément dont l exposant est nul. temp.coefficients[0] = coefficients[0] + r.coefficients[0]; // Mettre les coefficients et exposants des polynômes // dans des variables temporaires. for ( s = 1; (s < 100) && (r.exposants[s]!= 0); s++) temp.coefficients[s] = r.coefficients[s]; temp.exposants[s] = r.exposants[s]; for ( x = 1; x < 100; x++) exposantexiste = 0; // En supposant que l exposant n existe pas. for (int t = 1; (t < 100) && (exposantexiste == 0); t++) if (exposants[x] == temp.exposants[t]) temp.coefficients[t] += coefficients[x]; exposantexiste = 1; // Exposant trouvé. // Si l exposant n existe pas, l insérer dans temp. if (exposantexiste == 0) temp.exposants[s] = exposants[x]; temp.coefficients[s] += coefficients[x]; ++s; return temp; Polynome &Polynome::operator+=(const Polynome &r) *this = *this + r; return *this; Polynome Polynome::operator-(const Polynome& r) const Polynome temp; int exposantexiste; int s, x; // Traiter l élément dont l exposant est nul. temp.coefficients[0] = coefficients[0] - r.coefficients[0]; // Mettre les coefficients et exposants des polynômes // dans des variables temporaires. Version du 6 janvier 2015 10

for ( s = 1; (s < 100) && (exposants[s]!= 0); s++) temp.coefficients[s] = coefficients[s]; temp.exposants[s] = exposants[s]; for ( x = 1; x < 100; x++) exposantexiste = 0; // En supposant que l exposant n existe pas. for (int t = 1; (t < 100) && (exposantexiste == 0); t++) if (r.exposants[x] == temp.exposants[t]) temp.coefficients[t] -= r.coefficients[x]; exposantexiste = 1; // Exposant trouvé. // Si l exposant n existe pas, l insérer dans temp. if (exposantexiste == 0) temp.exposants[s] = r.exposants[x]; temp.coefficients[s] -= r.coefficients[x]; ++s; return temp; Polynome &Polynome::operator-=(const Polynome& r) *this = *this - r; return *this; Polynome Polynome::operator*(const Polynome& r) Polynome temp; int s = 1; for (int x = 0; (x < 100) && (x == 0 coefficients[x]!= 0); x++) for (int y = 0; (y < 100) && (y == 0 r.coefficients[y]!= 0); y++) if (coefficients[x] * r.coefficients[y]) if ((exposants[x] == 0) && (r.exposants[y] == 0)) temp.coefficients[0] += coefficients[x] * r.coefficients[y]; else temp.coefficients[s] = coefficients[x] * r.coefficients[y]; temp.exposants[s] = exposants[x] + r.exposants[y]; ++s; CombinerPolynome(temp); // Combiner les termes communs. return temp; void Polynome::CombinerPolynome(Polynome& w) Polynome temp = w; int exp,x; for (x = 0; x < 100; x++) w.coefficients[x] = 0; w.exposants[x] = 0; for (x = 1; x < 100; x++) exp = temp.exposants[x]; for (int y = x + 1; y < 100; y++) if (exp == temp.exposants[y]) temp.coefficients[x] += temp.coefficients[y]; Version du 6 janvier 2015 11

temp.exposants[y] = 0; temp.coefficients[y] = 0; w = temp; Polynome &Polynome::operator*=(const Polynome& r) *this = *this * r; return *this; void Polynome::entrerTermes(void) int trouve = 0, nombredetermes, c, e; int terme; cout << endl << "Entrer le nombre de termes du polynôme : "; cin >> nombredetermes; for (int n = 1; n <= nombredetermes; n++) cout << endl << "Entrer le coefficient : "; cin >> c; cout << "Entrer l exposant : "; cin >> e; if (c!= 0) // L élément d exposant nul correspond au premier élément. if (e == 0) coefficients[0] += c; continue; for (terme = 1; (terme < 100) && (coefficients[terme]!= 0); terme++) if (e == exposants[terme]) coefficients[terme] += c; exposants[terme] = e; trouve = 1; // Exposant existant est mis à jour. if (trouve == 0) // Ajouter des termes. coefficients[terme] += c; exposants[terme] = e; // Programme principal ///#include "Ch4_Ex3.h" main() Polynome a, b, c, t; a.entrertermes(); b.entrertermes(); cout << "Le premier polynôme est : " << endl; a.afficherpolynome(); cout << "Le second polynôme est : " << endl; b.afficherpolynome(); cout << endl << "L addition des polynômes aboutit au résultat : " << endl; c = a + b; c.afficherpolynome(); Version du 6 janvier 2015 12

cout<<endl<< "L opérateur += appliqué aux polynômes conduit au résultat : " << endl; t = a; // Sauvegarder la valeur de a. a += b; a.afficherpolynome(); cout << endl << "La soustraction des polynômes aboutit au résultat : " << endl; a = t; // Réinitialiser a à sa valeur originale. c = a - b; c.afficherpolynome(); cout << endl << "L opérateur -= appliqué aux polynômes conduit au résultat : " << endl; a -= b; a.afficherpolynome(); cout << endl << "La multiplication des polynômes aboutit au résultat : " << endl; a = t; // Réinitialiser a à sa valeur originale. c = a * b; c.afficherpolynome(); cout<<endl<< "L opérateur *= appliqué aux polynômes conduit au résultat : " << endl; a *= b; a.afficherpolynome(); cout << endl; return 0; 7. #include <string.h> using namespace std; class Emission public: char titre[64]; char premier_role[64]; char second_role[64]; void afficher_emission(void); void initialisation(const char *titre_emission, const char *premier, const char *second); ; void Emission::afficher_Emission(void) cout << "Titre de l émission : " << titre << endl; cout << "Acteurs : " << premier_role << " et " << second_role << endl Version du 6 janvier 2015 13

<< endl; void Emission::initialisation(const char *titre_emission, const char *premier, const char *second) strcpy(titre, titre_emission); strcpy(premier_role, premier); strcpy(second_role, second); main() Emission Omerta, Petite_Vie; Omerta.initialisation("Omerta", "Romano Orzani", "Pierre Gauthier"); Petite_Vie.initialisation("Petite_Vie", "Marc Messier", "Marc Labrèche"); Omerta.afficher_Emission(); 8. using namespace std; class simple int ami1, ami2; public: friend int somme(simple x); void init_ab(int i, int j); ; void simple::init_ab(int i, int j) ami1 = i; ami2 = j; int somme(simple objet) // Parce que somme est une amie de simple, elle peut accéder // directement à ami1 et ami2. return objet.ami1 + objet.ami2; int main(void) simple entier; Version du 6 janvier 2015 14

cout << "La somme des nombres 777 et 999 vaut :" << endl; entier.init_ab(777,999); cout << somme(entier) << endl; 9. using namespace std; class conversion protected: double val1; double val2; public: conversion(double i) val1 = i; double recuperer_conversion(void) return val2; double recuperer_init(void) return val1; virtual void calculer(void) = 0; ; // Litres en gallons class Nombre_litre : public conversion public: Nombre_litre(double i) : conversion(i) void calculer(void) val2 = val1 / 3.7854; ; // Fahrenheit en Celsius class Temperature_Fahrenheit : public conversion public: Temperature_Fahrenheit (double i) : conversion(i) void calculer(void) val2 = (val1-32) / 1.8; ; int main(void) conversion *p; // Pointeur sur classe de base Nombre_litre lgob(40); Temperature_Fahrenheit fcob(75); p = &lgob; // Convertit litres en gallons. cout << p->recuperer_init() << " litres "; p->calculer(); cout << p->recuperer_conversion() << " gallons." << endl; p = &fcob; // Convertit Fahrenheit en Celsius. cout << p->recuperer_init() << " o Fahrenheit equivaut a "; p->calculer(); cout << p->recuperer_conversion() << " o Celsius." << endl; Version du 6 janvier 2015 15

10. #include <cstddef> // pour la définition de NULL using namespace std ; // ************* classes exceptions ************* class exc_liste ; class exc_affec : public exc_liste ; class exc_copie : public exc_liste ; // ************* classe mere ************* class ParentMere public : virtual void affiche () = 0 ; // fonction virtuelle pure ; // ************* classe liste ************* struct element // structure d'un element de liste element * suivant ; // pointeur sur l'element suivant ParentMere * contenu ; // pointeur sur un objet quelconque ; class liste element * debut ; // pointeur sur premier élément element * courant ; // pointeur sur élément courant public : liste () // constructeur debut = NULL ; courant = debut ; ~liste () ; // destructeur void ajoute (ParentMere *) ; // ajoute un élément void premier () // positionne sur premier élément courant = debut ; ParentMere * prochain () // fournit l adresse de l'élément // courant (0 si fin) // et positionne sur prochain // élément (rien si fin) ParentMere * adsuiv = NULL ; if (courant!= NULL) adsuiv = courant -> contenu ; courant = courant -> suivant ; return adsuiv ; void affiche_liste () ; // affiche tous les éléments // de la liste int fini () return (courant == NULL) ; liste & operator = (liste & l) throw exc_affec() ; liste (liste &) throw exc_copie() ; ; liste::~liste () element * suiv ; courant = debut ; Version du 6 janvier 2015 16

while (courant!= NULL ) suiv = courant->suivant ; delete courant ; courant = suiv ; void liste::ajoute (ParentMere * chose) element * adel = new element ; adel->suivant = debut ; adel->contenu = chose ; debut = adel ; void liste::affiche_liste () ParentMere * ptr ; premier() ; while (! fini() ) ptr = (ParentMere *) prochain() ; ptr->affiche () ; // ************* classe point ************* class point : public ParentMere int x, y ; public : point (int abs=0, int ord=0) x=abs ; y=ord ; void affiche () cout << "Point de coordonnees : " << x << " " << y << "\n" ; ; // ************* classe complexe ************* class complexe : public ParentMere double reel, imag ; public : complexe (double r=0, double i=0) reel=r ; imag=i ; void affiche () cout << "Complexe : " << reel << " + " << imag << "i\n" ; ; // ************* programme d essai ************* main() try liste l1 ; point a(2,3), b(5,9) ; complexe x(4.5,2.7), y(2.35,4.86) ; l1.ajoute (&a) ; l1.ajoute (&x) ; l1.affiche_liste () ; cout << "--------\n" ; l1.ajoute (&y) ; l1.ajoute (&b) ; l1.affiche_liste () ; liste l2 ; l2 = l1 ; // provoque une exception exc_affec ; catch (exc_liste) cout << "tentative de copie ou d affectation de liste" ; Version du 6 janvier 2015 17

11. using namespace std ; /* declaration (et définition) de la classe pile_entier */ /* ici, toutes les fonctions membres sont "inline" */ const int Max = 20 ; class pile_entier int dim ; // nombre maximal d'entiers de la pile int * adr ; // adresse emplacement des dim entiers int nelem ; // nombre d'entiers actuellement empiles public : pile_entier (int n = Max) // constructeur(s) adr = new int [dim=n] ; nelem = 0 ; ~pile_entier () // destructeur delete adr ; void empile (int p) if (nelem < dim) adr[nelem++] = p ; int depile () if (nelem > 0) return adr[--nelem] ; else return 0 ; // faute de mieux! int pleine () return (nelem == dim) ; int vide () return (nelem == 0 ) ; ; /* programme d'essai de la classe pile_entier */ main() int i ; /* exemples d'utilisation de piles automatiques */ pile_entier a(3), // une pile de 3 entiers b ; // une pile de 20 entiers (par défaut) cout << "a pleine? " << a.pleine () << "\n" ; cout << "a vide? " << a.vide () << "\n" ; a.empile (3) ; a.empile (9) ; a.empile (11) ; cout << "Contenu de a : " ; for (i=0 ; i<3 ; i++) cout << a.depile () << " " ; cout << "\n" ; for (i=0 ; i<30 ; i++) b.empile (10*i) ; cout << "Contenu de b : " ; for (i=0 ; i<30 ; i++) if (! b.vide() ) cout << b.depile () << " " ; cout << "\n" ; /* exemple d'utilisation d'une pile dynamique */ Version du 6 janvier 2015 18

pile_entier * adp = new pile_entier (5) ; // pointeur sur une pile de 5 entiers cout << "pile dynamique vide? " << adp->vide () << "\n" ; for (i=0 ; i<10 ; i++) adp->empile (10*i) ; cout << "Contenu de la pile dynamique : " ; for (i=0 ; i<10 ; i++) if (! adp->vide() ) cout << adp->depile () << " " ; Version du 6 janvier 2015 19