programmation objet, questions d'examen (de l'aide SVP)
Le
stephane
Ok c'est la dernière fois que vous verrez ces lignes de code c'est promis
Je suis en train de préparer un exa et j'avais déjà soumis 1 ou 2 X des
questions concernant l'épreuve de l'année passée d'où provient ce code
justement (ce forum de news m'a déjà sauvé la vie une fois)
J'aimerais juste savoir si la surcharge de l'operateur+ et son utilisation
dans le bloc try est correct.
Je vous serais très reconnaissant d'y jeter un oeil!
(si jamais les 2 questions sont en bas du post)
//voici la surcharge de l'opérateur +
Thoraire Thoraire::operator+(const Thoraire& hor)const throw
(TenseignantError,Toverflow)
{
if(hor.m_nomEnseignant != m_nomEnseignant)
throw TenseignantError();
for(int i=0;i<hor.m_nbCases;i++)
{
if(m_nbCases>CcasesMax)
throw Toverflow();
m_cases[m_nbCases] = hor.m_cases[i];
m_nbCases++;
}
return *this;
}
//et son utilisation dans le main
Thoraire horaireSemestre1("Lambert");
Thoraire horaireSemestre2("Lambert");
Thoraire horaireAnnuel("Lambert");
try{
horaireAnnuel = horaireSemestre1 + horaireSemestre2;
}
catch (Toverflow){
cout<<"depassement de capacity de l'horaire"<<endl;
}
catch(TenseignantError){
cout<<"le nom de l'enseignant ne correspond pas"<<endl;
}
Voici le code et les questions de l'examen
/--
# ifndef CASE_H
# define CASE_H
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std ;
const int Clundi = 1 ;
const int Cmardi = 2 ;
const int Cmercredi = 3 ;
const int Cjeudi = 4 ;
const int Cvendredi = 5 ;
const int Csamedi = 6 ;
const int Cdimanche = 7 ;
class Tcase{
public :
Tcase (int numSemaine, int numJour, double heureDebut, double duree,
char matiere[], char classe[]= " ", char salle[]= " ") ;
int getNumSemaine() const ;
double getDuree() const ;
void printLn() const ;
private :
//attributs obligatoires
int m_numSemaine ; //1..53
int m_numJour ; //1..7
double m_heureDebut ; //13h30 = 13.5
double m_duree ; //2h45 = 2.75
char m_matiere[10] ; //p ex. prog7
//attributs optionnels
char m_classe[10] ; //p. ex. 3IG-EE
char m_salle[10] ; //p. ex A46A
}
#endif
# ifndef HORAIRE_H
# define HORAIRE_H
# include <iostream>
# include <cstring>
using namespace std ;
#include « case.h »
class TenseignantError{} ; // l'enseignant ne correspond pas
class Toverflow{} ; //dépassement de capacité
//Nombre maximum de cases horaires pour un enseignant
const int CcasesMax = 1000 ;
class Thoraire{
public :
//crée un horaire vide
Thoraire (const char nomEnseignant[]) ;
//ajout d'une case horaire
void ajouteCase (Tcase* caseHor) throw (Toverflow) ;
//calcule de la charge horaire totale
double chargeHoraire() const ;
//retourne un extrait de l'horaire
//ne contient que les cases de la semaines spécifiée
//retourne un horaire vide si la semaine n'existe pas
Thoraire horaireHebdomadaire (int numSem) const ;
/*
Crée un nouvel horaire résultat de la fusion de deux horaires
Lève une exception de la classe TenseignantError si les horaires
N'ont pas le même nom d'enseignant
Lève une exception de la classe Toverflow si la fusion entraîne
Un dépassement de capacité (> CcasesMax) */
Thoraire operator+ (const Thoraire & hor) const throw (TenseignantError,
Toverflow) ;
Void printLn() ;
Private :
Char m_nomEnseignant [30] ; // obligatoire
Tcase* m_cases[CcasesMax] ;
Int m_nbCases ;
} ;
#endif
les questions sont:
Problème 3 (10pt)
Ecrivez le code de la surcharge de l'opérateur + de la classe Thoraire
Problème 4 (10pt)
Complétez le code du programme principal ci-dessous pour calculer l'horaire
annuel (résultat de la fusion des horaires du 1er semestre et 2ème semestre.
Votre code doit traiter les exceptions levées par l'opération de fusion. Le
traitement de l'exception sera le simple envoi d'un message sur la console.
Merci bcp pour votre temps!
Je suis en train de préparer un exa et j'avais déjà soumis 1 ou 2 X des
questions concernant l'épreuve de l'année passée d'où provient ce code
justement (ce forum de news m'a déjà sauvé la vie une fois)
J'aimerais juste savoir si la surcharge de l'operateur+ et son utilisation
dans le bloc try est correct.
Je vous serais très reconnaissant d'y jeter un oeil!
(si jamais les 2 questions sont en bas du post)
//voici la surcharge de l'opérateur +
Thoraire Thoraire::operator+(const Thoraire& hor)const throw
(TenseignantError,Toverflow)
{
if(hor.m_nomEnseignant != m_nomEnseignant)
throw TenseignantError();
for(int i=0;i<hor.m_nbCases;i++)
{
if(m_nbCases>CcasesMax)
throw Toverflow();
m_cases[m_nbCases] = hor.m_cases[i];
m_nbCases++;
}
return *this;
}
//et son utilisation dans le main
Thoraire horaireSemestre1("Lambert");
Thoraire horaireSemestre2("Lambert");
Thoraire horaireAnnuel("Lambert");
try{
horaireAnnuel = horaireSemestre1 + horaireSemestre2;
}
catch (Toverflow){
cout<<"depassement de capacity de l'horaire"<<endl;
}
catch(TenseignantError){
cout<<"le nom de l'enseignant ne correspond pas"<<endl;
}
Voici le code et les questions de l'examen
/--
# ifndef CASE_H
# define CASE_H
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std ;
const int Clundi = 1 ;
const int Cmardi = 2 ;
const int Cmercredi = 3 ;
const int Cjeudi = 4 ;
const int Cvendredi = 5 ;
const int Csamedi = 6 ;
const int Cdimanche = 7 ;
class Tcase{
public :
Tcase (int numSemaine, int numJour, double heureDebut, double duree,
char matiere[], char classe[]= " ", char salle[]= " ") ;
int getNumSemaine() const ;
double getDuree() const ;
void printLn() const ;
private :
//attributs obligatoires
int m_numSemaine ; //1..53
int m_numJour ; //1..7
double m_heureDebut ; //13h30 = 13.5
double m_duree ; //2h45 = 2.75
char m_matiere[10] ; //p ex. prog7
//attributs optionnels
char m_classe[10] ; //p. ex. 3IG-EE
char m_salle[10] ; //p. ex A46A
}
#endif
# ifndef HORAIRE_H
# define HORAIRE_H
# include <iostream>
# include <cstring>
using namespace std ;
#include « case.h »
class TenseignantError{} ; // l'enseignant ne correspond pas
class Toverflow{} ; //dépassement de capacité
//Nombre maximum de cases horaires pour un enseignant
const int CcasesMax = 1000 ;
class Thoraire{
public :
//crée un horaire vide
Thoraire (const char nomEnseignant[]) ;
//ajout d'une case horaire
void ajouteCase (Tcase* caseHor) throw (Toverflow) ;
//calcule de la charge horaire totale
double chargeHoraire() const ;
//retourne un extrait de l'horaire
//ne contient que les cases de la semaines spécifiée
//retourne un horaire vide si la semaine n'existe pas
Thoraire horaireHebdomadaire (int numSem) const ;
/*
Crée un nouvel horaire résultat de la fusion de deux horaires
Lève une exception de la classe TenseignantError si les horaires
N'ont pas le même nom d'enseignant
Lève une exception de la classe Toverflow si la fusion entraîne
Un dépassement de capacité (> CcasesMax) */
Thoraire operator+ (const Thoraire & hor) const throw (TenseignantError,
Toverflow) ;
Void printLn() ;
Private :
Char m_nomEnseignant [30] ; // obligatoire
Tcase* m_cases[CcasesMax] ;
Int m_nbCases ;
} ;
#endif
les questions sont:
Problème 3 (10pt)
Ecrivez le code de la surcharge de l'opérateur + de la classe Thoraire
Problème 4 (10pt)
Complétez le code du programme principal ci-dessous pour calculer l'horaire
annuel (résultat de la fusion des horaires du 1er semestre et 2ème semestre.
Votre code doit traiter les exceptions levées par l'opération de fusion. Le
traitement de l'exception sera le simple envoi d'un message sur la console.
Merci bcp pour votre temps!

Poser une question


L'algo me semble OK (concaténation de vecteurs) mais j'ai 3 remarques :
(1) ce code ne compile pas car il tente de modifier un objet dans une de
ses méthodes const (ce qui est logique car quand on écrit
horaireSemestre1 + horaireSemestre2, on ne veut pas que horaireSemestre1
soit modifié).
La solution dans un tel cas c'est de créer un 3ème objet Thoraire
résultat dans l'operator+.
(2) le test d'arrêt "m_nbCases>CcasesMax" me semble erroné (quand
m_nbCases vaut CcasesMax, m_cases[m_nbCases] va au delà de la capacité
du tableau)
(3) La levée de Toverflow *dans* la boucle fait que le tableau a déja
été partiellement modifié quand l'exception est levée alors que l'on
aurait pu vouloir conserver l'objet dans son état d'origine en cas d'erreur.
NB : cette remarque n'a que peu d'intérêt dans le cas présent car il ne
faut de toutes façons pas modifier l'objet
Cela me semble correct.
Pour info, les exceptions sont généralement rattrapées par référence et
non pas par copie.
Par simple curiosité, de quel examen s'agit-il ?
d'informatique de gestion en Suisse. Il y en a 9 en tous et celui-ci c'est
le 7ème, intitulé "encapsulation".
"Olivier Azeau" dans le message de news: sbfQd.23939$