OVH Cloud OVH Cloud

programmation objet, questions d'examen (de l'aide SVP)

2 réponses
Avatar
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!

2 réponses

Avatar
Olivier Azeau
stephane wrote:
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;
}


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

//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;
}


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 ?

Avatar
stephane
Merci bcp pour ton temps. En fait c'est un exa d'une école supérieure
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" a écrit
dans le message de news: sbfQd.23939$
stephane wrote:
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;
}


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

//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;
}


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 ?