Exercices corrigés C++ – Programmation Orientée Objet | Partie 5
Avec des exercices corrigés en C++, vous pratiquerez divers concepts du langage C++. Vous commencerez par des exercices C++ de base à des exercices plus avancés. La solution est fournie pour chaque exercice. Vous devez essayer de résoudre chaque problème par vous-même avant de vérifier la solution. Si vous avez des questions concernant chaque problème, nous vous encourageons à les poster sur notre forum.
Exercice 1:
Écrire un programme C++ pour créer une classe appelée « Cours » avec des attributs pour le nom du cours, l’instructeur et le nombre des étoiles. Créer une classe fille « CoursEnLigne » qui ajoute des attributs pour la plate-forme et la durée. Implémentez des méthodes pour afficher les détails du cours et vérifier si le cours est éligible pour un certificat en fonction de sa durée.
Diagrame de classe:

#include <iostream> #include <string> using namespace std; // Définir la classe Cours class Cours { private: // Attributs pour le nom du cours, l'instructeur et le nombre des // étoiles string nomCours; string instructeur; int etoiles; public: // Constructeur pour initialiser l'objet Cours Cours(string nomCours, string instructeur, int etoiles) { this->nomCours = nomCours; this->instructeur = instructeur; this->etoiles = etoiles; } // Méthode pour afficher les détails du cours void afficher() { cout << "Nom du cours: " << nomCours << endl; cout << "Instructeur: " << instructeur << endl; cout << "Etoiles: " << etoiles << endl; } // Méthode pour récupérer le nom du cours string getNomCours() { return nomCours; } // Méthode pour récupérer l'instructeur string getInstructeur() { return instructeur; } // Méthode pour récupérer le nombre des étoiles int getEtoiles() { return etoiles; } }; // Définir la classe fille CoursEnLigne qui hérite de la classe Cours class CoursEnLigne : public Cours { private: // Attributs supplémentaires: la plate-forme et la durée string platforme; int d; // durée en heures public: // Constructeur pour initialiser l'objet CoursEnLigne CoursEnLigne(string nomCours, string instructeur, int etoiles, string platforme, int d) : Cours(nomCours, instructeur, etoiles) { this->platforme = platforme; this->d = d; } // Méthode pour afficher les détails du cours, y compris la // plate-forme et la durée void afficher() { // Appeler la méthode de la classe mère pour afficher les // détails communs Cours::afficher(); cout << "Platforme: " << platforme << endl; cout << "Durée: " << d << " heures" << endl; } // Méthode pour vérifier si le cours est éligible pour un // certificat en fonction de sa durée bool estEligiblePourCertificat() { // Supposons qu'un cours soit éligible pour un certificat si // sa durée est d'au moins 12 heures return d >= 12; } // Méthode pour récupérer la plate-forme string getPlatform() { return platforme; } }; // Définir la fonction main int main() { // Créer un objet Cours Cours c1("Biologie", "Dr. Alex Leon", 3); c1.afficher(); cout << endl; // Créer un objet CoursEnLigne CoursEnLigne c2("Science", "Prof. Ali Farok", 5, "Coursera", 24); c2.afficher(); cout << "Eligible pour un certificat: " << (c2.estEligiblePourCertificat() ? "Oui" : "Non") << endl; return 0; }
Sortie:
Nom du cours: Biologie Instructeur: Dr. Alex Leon Etoiles: 3 Nom du cours: Science Instructeur: Prof. Ali Farok Etoiles: 5 Platforme: Coursera Durée: 24 heures Eligible pour un certificat: true
Exercice 2:
Écrivez un programme C++ pour créer une classe appelée « ProduitElectronique » avec des attributs pour l'ID, le nom et le prix du produit. Implémentez des méthodes pour appliquer une remise et calculer le prix final. Créez une classe fille « Refrigerateur » qui ajoute un attribut de période de garantie et une méthode pour étendre la garantie.
Diagrame de classe:

#include <iostream> #include <string> using namespace std; // Définir la classe ProduitElectronique class ProduitElectronique { private: // Attributs pour l'ID, le nom et le prix du produit string produitID; string nom; double prix; public: // Constructeur pour initialiser l'objet ProduitElectronique ProduitElectronique(string produitID, string nom, double prix) { this->produitID = produitID; this->nom = nom; this->prix = prix; } // Méthode pour appliquer une réduction au prix du produit void appliquerRemise(double pourcentageRemise) { // Calculer le montant de la remise double montantRemise = prix * pourcentageRemise / 100; // Soustraire le montant de la remise du prix initial prix -= montantRemise; } // Méthode de calcul du prix final après remise double getPrixFinal() { // Retourner le prix actuel qui peut avoir été réduit return prix; } // Méthode pour récupérer l'ID du produit string getProduitID() { return produitID; } // Méthode pour récupérer le nom du produit string getNom() { return nom; } // Méthode pour récupérer le prix du produit double getPrix() { return prix; } }; // Définir la classe fille Refrigerateur qui hérite de ProduitElectronique class Refrigerateur : public ProduitElectronique { private: // Attribut supplémentaire pour la période de garantie int periodeGarantie; // en mois public: // Constructeur pour initialiser l'objet Refrigerateur Refrigerateur(string produitID, string nom, double prix, int periodeGarantie) : ProduitElectronique(produitID, nom, prix) { //Appeler le // constructeur de la classe mère this->periodeGarantie = periodeGarantie; } // Méthode pour prolonger la période de garantie void prolongerGarantie(int additionalMonths) { // Ajouter les mois supplémentaires à la période de garantie // actuelle periodeGarantie += additionalMonths; } // Méthode pour récupérer la période de garantie int getPeriodeGarantie() { return periodeGarantie; } // Surcharger la méthode d'affichage pour inclure la période de // garantie void appliquerRemise(double pourcentageRemise) { // Appeler la méthode de la classe mère pour appliquer la // remise ProduitElectronique::appliquerRemise(pourcentageRemise); // Afficher un message indiquant que la réduction a été // appliquée cout << "Remise appliquée au réfrigérateur: " << getNom() << endl; } }; // Définir la fonction main int main() { // Créer un objet ProduitElectronique ProduitElectronique p("P123", "Lave-vaisselle", 500.00); // Appliquer une remise et afficher le prix final p.appliquerRemise(15); cout << "ID du produit: " << p.getProduitID() << endl; cout << "Nom: " << p.getNom() << endl; cout << "Prix après réduction: " << p.getPrixFinal() << " €" << endl; cout << endl; // Créer un objet Refrigerateur Refrigerateur r("P789", "Réfrigérateur Samsung", 900.00, 12); // Appliquer une réduction et afficher le prix final r.appliquerRemise(15); cout << "ID du produit: " << r.getProduitID() << endl; cout << "Nom: " << r.getNom() << endl; cout << "Prix après réduction: " << r.getPrixFinal() << " €" << endl; // Afficher la période de garantie cout << "Période de garantie: " << r.getPeriodeGarantie() << " mois" << endl; // Prolonger la période de garantie et afficher la nouvelle // période de garantie r.prolongerGarantie(12); cout << "Période de garantie après prolongation: " << r.getPeriodeGarantie() << " mois" << endl; return 0; }
Sortie:
ID du produit: P123 Nom: Lave-vaisselle Prix après réduction: 425.0 € Remise appliquée au refrigérateur: Réfrigérateur Samsung ID du produit: P789 Nom: Réfrigérateur Samsung Prix après réduction: 765.0 € Période de garantie: 12 mois Période de garantie après prolongation: 24 mois
Exercice 3:
Écrire un programme C++ pour créer une classe appelée « Batiment » avec des attributs pour l'adresse, le nombre d'étages et la surface totale. Créez des sous-classes « BatimentResidentiel » et « BatimentCommercial » qui ajoutent des attributs spécifiques tels que le nombre d'appartements pour les bâtiments résidentiels et l'espace de bureau pour les bâtiments commerciaux. Implémentez une méthode pour calculer le loyer total pour chaque sous-classe.
Diagrame de classe:

#include <iostream> #include <string> using namespace std; // Définir la classe Batiment class Batiment { protected: // Attributs de la classe Batiment string adresse; int nombreDetages; double surfaceTotale; public: // Constructeur pour la classe Batiment Batiment(string adresse, int nombreDetages, double surfaceTotale) { this->adresse = adresse; this->nombreDetages = nombreDetages; this->surfaceTotale = surfaceTotale; } // Méthode pour afficher des informations sur le bâtiment virtual void afficher() { cout << "Adresse: " << adresse << endl; cout << "Nombre d'étages: " << nombreDetages << endl; cout << "Surface totale: " << surfaceTotale << " mètres" << endl; } }; // Définir la classe BatimentResidentiel qui hérite de Batiment class BatimentResidentiel : public Batiment { private: // Attributs supplémentaires pour BatimentResidentiel int nombreDappartements; double loyerParAppartement; public: // Constructeur de la classe BatimentResidentiel BatimentResidentiel(string adresse, int nombreDetages, double surfaceTotale, int nombreDappartements, double loyerParAppartement) : Batiment(adresse, nombreDetages, surfaceTotale) { //Appeler // le constructeur de la classe mère this->nombreDappartements = nombreDappartements; this->loyerParAppartement = loyerParAppartement; } // Méthode pour calculer le loyer total d'un bâtiment résidentiel double calculateTotalRent() { return nombreDappartements * loyerParAppartement; } // Surcharger la méthode afficher pour inclure des détails // supplémentaires // Utiliser override pour indiquer qu'on surcharge une méthode // virtuelle void afficher() override { // Appeler la méthode de la classe mère Batiment::afficher(); cout << "Nombre d'appartements: " << nombreDappartements << endl; cout << "Loyer par appartement: " << loyerParAppartement << " €" << endl; cout << "Total des loyers: " << calculateTotalRent() << " €" << endl; } }; // Définir la classe BatimentCommercial qui hérite de Batiment class BatimentCommercial : public Batiment { private: // Attribut supplémentaire pour BatimentCommercial double espaceBureau; // en mètres carrés double loyerParMetreCarre; public: // Constructeur de la classe BatimentCommercial BatimentCommercial(string adresse, int nombreDetages, double surfaceTotale, double espaceBureau, double loyerParMetreCarre) : Batiment(adresse, nombreDetages, surfaceTotale) { //Appeler // le constructeur de la classe mère this->espaceBureau = espaceBureau; this->loyerParMetreCarre = loyerParMetreCarre; } // Méthode pour calculer le loyer total d'un bâtiment commercial double calculateTotalRent() { return espaceBureau * loyerParMetreCarre; } // Surcharger la méthode afficher pour inclure des détails // supplémentaires // Utiliser override pour indiquer qu'on surcharge une méthode // virtuelle void afficher() override { // Appeler la méthode de la classe mère Batiment::afficher(); cout << "Espace de bureau: " << espaceBureau << " mètres" << endl; cout << "Loyer par mètre carré: " << loyerParMetreCarre << " €" << endl; cout << "Total des loyers: " << calculateTotalRent() << " €" << endl; } }; // Définir la fonction main int main() { // Créer une instance de BatimentResidentiel BatimentResidentiel r("Rue 30, Quartier Saindenis", 15, 23000.0, 30, 1500.0); // Créer une instance de BatimentCommercial BatimentCommercial c("Rue 11, Quartier Laurence", 20, 5000.0, 4000.0, 25.0); // Afficher des informations sur le bâtiment résidentiel cout << "Info sur le bâtiment résidentiel:" << endl; r.afficher(); // Afficher des informations sur le bâtiment commercial cout << "\nInfo sur le bâtiment commercial:" << endl; c.afficher(); return 0; }
Sortie:
Info sur le bâtiment résidentiel: Adresse: Rue 30, Quartier Saindenis Nombre d'étages: 15 Surface totale: 23000.0 mètres Nombre d'appartements: 30 Loyer par appartement: 1500.0 € Total des loyers: 45000.0 € Info sur le bâtiment commercial: Adresse: Rue 11, Quartier Laurence Nombre d'étages: 20 Surface totale: 5000.0 mètres Espace de bureau: 4000.0 mètres Loyer par mètre carré: 25.0 € Total des loyers: 100000.0 €
Exercice 4:
Écrire un programme C++ pour créer une classe appelée « Evenement » avec des attributs pour le nom de l'événement, la date et le lieu. Créer des sous-classes « Seminaire » et « PerformancesMusicales » qui ajoutent des attributs spécifiques tels que le nombre de conférenciers pour les séminaires et la liste des artistes pour les concerts. Implémenter des méthodes pour afficher les détails de l'événement et vérifier s'il y a des conflits dans le planning de l'événement.
Diagrame de classe:

#include <iostream> #include <string> #include <ctime> // Pour la gestion des dates using namespace std; // Définir la classe Evenement class Evenement { public: // Déclarer les attributs: nomEvenement, date et lieu. string nomEvenement; // Utiliser time_t pour représenter la date time_t date; string lieu; // Constructeur: Initialiser les attributs nomEvenement, date et // lieu Evenement(string nomEvenement, time_t date, string lieu) { this->nomEvenement = nomEvenement; this->date = date; this->lieu = lieu; } // Afficher le nom, la date et le lieu de l'événement void afficher() { cout << "Nom de l'événement: " << nomEvenement << endl; // ctime pour convertir time_t en chaîne cout << "Date: " << ctime(&date); cout << "Lieu: " << lieu << endl; } // Vérifie si l'événement en cours entre en conflit avec un autre // événement bool checkConflit(Evenement e) { return (this->date == e.date) && (this->lieu == e.lieu); } }; // Définir la classe Séminaire qui hérite Evenement class Seminaire : public Evenement { public: // Déclarer l'attribut supplémentaire pour le nombre de // conférenciers spécifique à la classe Seminaire int nombreDeConf; // Constructeur Seminaire(string nomEvenement, time_t date, string lieu, int nombreDeConf) : Evenement(nomEvenement, date, lieu), nombreDeConf(nombreDeConf) {} // Surcharger la méthode afficher void afficher() { // Appeler la méthode de la classe mère Evenement::afficher(); cout << "Nombre de conférenciers: " << nombreDeConf << endl; } }; // Définir la classe PerformancesMusicales qui hérite Evenement class PerformancesMusicales : public Evenement { public: // Déclarer l'attribut supplémentaire pour la liste des artistes string artistes[10]; // Limité à 10 artistes int nombreArtistes; // Constructeur PerformancesMusicales(string nomEvenement, time_t date, string lieu, string artistes[], int nombreArtistes) : Evenement(nomEvenement, date, lieu), nombreArtistes(nombreArtistes) { for (int i = 0; i < nombreArtistes; i++) { // Copier les artistes dans le tableau this->artistes[i] = artistes[i]; } } // Surcharger la méthode afficher void afficher() { // Appeler la méthode de la classe mère Evenement::afficher(); cout << "Artistes: "; for (int i = 0; i < nombreArtistes; i++) { cout << artistes[i]; if (i < nombreArtistes - 1) { // Ajouter une virgule entre les artistes cout << ", "; } } cout << endl; } }; // Définir la fonction Main int main() { // Créer une date pour les tests time_t date = time(0); // Date actuelle // Créer une instance de Seminaire Seminaire seminar("La journée d'étude", date, "Centre de congrès", 4); // Tableau d'artistes string artistes[] = {"Groupe A", "Groupe B"}; // Créer une instance de PerformancesMusicales PerformancesMusicales performance("Teintes harmonieuses", date, "Centre de congrès", artistes, 2); // Afficher les détails du séminaire cout << "Les détails du séminaire:" << endl; seminar.afficher(); // Afficher les détails de la performance musicale cout << "\nLes détails de la performance musicale:" << endl; performance.afficher(); // Vérifier s'il y a des conflits d'horaire if (seminar.checkConflit(performance)) { cout << "\nConflit détecté : Les deux événements sont programmés à la même heure et au même endroit." << endl; } else { cout << "\nPas de conflit : Les événements sont programmés à des moments ou dans des lieux différents." << endl; } return 0; }
Sortie:
Les détails du séminaire: Nom de l'événement: La journée d'étude Date: Sun Sep 29 18:17:37 GMT 2024 Lieu: Centre de congrès Nombre de conférenciers: 4 Les détails de la performance musicale: Nom de l'événement: Teintes harmonieuses Date: Sun Sep 29 18:17:37 GMT 2024 Lieu: Centre de congrès Artistes: Groupe A, Groupe B Conflit détecté : Les deux événements sont programmés à la même heure et au même endroit.
Exercice 5:
Écrivez un programme C++ pour créer une classe appelée « CommandeClient » avec des attributs pour l'ID de la commande, le client et la date de la commande. Créez une sous-classe « CommandeEnLigne » qui ajoute des attributs pour l'adresse de livraison et le numéro de suivi. Implémentez des méthodes pour calculer le délai de livraison en fonction de l'adresse et mettre à jour le statut de la livraison.
Diagrame de classe:

#include <iostream> #include <string> #include <ctime> // Pour gérer les dates #include <iomanip> // Pour formater les dates using namespace std; // Définir la classe CommandeClient class CommandeClient { private: // Attributs pour l'ID de la commande, le client et la date de la // commande string IdCommande; string client; // Utiliser time_t pour représenter la date time_t DateCommande; public: // Constructeur pour initialiser l'objet CommandeClient CommandeClient(string IdCommande, string client, time_t DateCommande) { this->IdCommande = IdCommande; this->client = client; this->DateCommande = DateCommande; } // Méthode pour récupérer l'ID de la commande string getIdCommande() { return IdCommande; } // Méthode pour récupérer le client string getClient() { return client; } // Méthode pour récupérer la date de la commande time_t getDateCommande() { return DateCommande; } // Méthode pour afficher les détails de la commande virtual void afficher() { // Déclaration comme virtuelle cout << "ID de la commande: " << IdCommande << endl; cout << "Client: " << client << endl; // Formatage de la date cout << "Date de la commande: " << put_time(localtime(&DateCommande), "%Y-%m-%d") << endl; } }; // Définir la sous-classe CommandeEnLigne qui hérite de CommandeClient class CommandeEnLigne : public CommandeClient { private: // Attributs spécifiques pour l'adresse de livraison et le numéro // de suivi string adresseLivraison; string numSuivi; public: // Constructeur pour initialiser l'objet CommandeEnLigne CommandeEnLigne(string IdCommande, string client, time_t DateCommande, string adresseLivraison, string numSuivi) : CommandeClient(IdCommande, client, DateCommande) { //Appeler // le constructeur de la classe mère this->adresseLivraison = adresseLivraison; this->numSuivi = numSuivi; } // Méthode pour récupérer l'adresse de livraison string getAdresseLivraison() { return adresseLivraison; } // Méthode pour récupérer le numéro de suivi string getNumSuivi() { return numSuivi; } // Méthode pour calculer le délai de livraison en fonction de // l'adresse int calculerDelaiLivraison() { // En supposant que le délai de livraison est basé sur la // longueur de la chaîne d'adresse return adresseLivraison.length() % 10 + 1; } // Méthode de mise à jour de l'état de suivi void actualiserEtatSuivi(string newEtat) { // Afficher l'état de suivi mis à jour cout << "Numéro de suivi: " << numSuivi << " - État: " << newEtat << endl; } // Surcharger la méthode afficher pour inclure des détails // supplémentaires // Utilisation de override maintenant que la méthode de base est // virtuelle void afficher() override { // Appeler la méthode de la classe mère pour afficher les // détails communs CommandeClient::afficher(); // Afficher des détails supplémentaires pour la commande // en ligne cout << "Adresse de livraison: " << adresseLivraison << endl; cout << "Numéro de suivi: " << numSuivi << endl; } }; // Définir la fonction main int main() { // Créer un objet CommandeClient // Obtenir la date et l'heure actuelles time_t now = time(0); CommandeClient c1("C123", "Alex Leo", now); // Afficher les détails de la commande c1.afficher(); cout << endl; // Créer un objet CommandeEnLigne CommandeEnLigne c2("C789", "Ali Boura", now, "Rue 30, Quartier Saindenis", "Ref129"); // Afficher les détails de la commande en ligne c2.afficher(); // Calculer et afficher le délai de livraison int t = c2.calculerDelaiLivraison(); cout << "Délai de livraison estimé: " << t << " jours" << endl; // Mettre à jour et afficher l'état de la commande c2.actualiserEtatSuivi("En cours de route"); return 0; }
Sortie:
ID de la commande: C123 Client: Alex Leo Date de la commande: 2024-09-29 ID de la commande: c789 Client: Ali Boura Date de la commande: 2024-09-29 Adresse de livraison: Rue 30, Quartier Saindenis Numéro de suivi: Ref129 Délai de livraison estimé: 7 jours Numéro de suivi: Ref129 - Etat: En cours de route
Éditeur de code C++: Testez votre code en ligne!
Exercices corrigés C++ - Programmation Orientée Objet | Partie 2
Exercices corrigés C++ - Programmation Orientée Objet | Partie 3
Exercices corrigés C++ - Programmation Orientée Objet | Partie 4
Exercices corrigés C++ - Programmation Orientée Objet | Partie 5
Exercices corrigés C++ - Programmation Orientée Objet | Partie 6

- Exercice C++ Corrigé pour Débutant | Partie 1
- Exercice C++ Corrigé pour Débutant | Partie 2
- Exercice C++ Corrigé pour Débutant | Partie 3
- Exercice C++ Corrigé pour Débutant | Partie 4
- Exercice C++ Corrigé pour Débutant | Partie 5
- Exercice C++ Corrigé pour Débutant | Partie 6
- Exercice C++ Corrigé pour Débutant | Partie 7
- Exercice C++ Corrigé pour Débutant | Partie 8
- Exercice C++ Corrigé pour Débutant | Partie 9
- Exercice C++ Corrigé pour Débutant | Partie 10
- Exercices corrigés C++ – Programmation Orientée Objet | Partie 1
- Exercices corrigés C++ – Programmation Orientée Objet | Partie 2
- Exercices corrigés C++ – Programmation Orientée Objet | Partie 3
- Exercices corrigés C++ – Programmation Orientée Objet | Partie 4
- Exercices corrigés C++ – Programmation Orientée Objet | Partie 5
- Exercices corrigés C++ – Programmation Orientée Objet | Partie 6
- Exercices corrigés C++ les classes et l’héritage – Partie 1
- Exercices corrigés C++ les classes et l’héritage – Partie 2
- Exercice C++ Corrigé – Partie 1