PROGRAMMATION ORIENTEE OBJET
Contrôle 3 décembre 2003 Durée 1h30
1ère question (3 points)
Question de cours
Expliquer comment la programmation orientée objet peut favoriser le travail d'équipe.
Illustrer éventuellement votre propos d'exemples concrets
2ème question (7 points)
Algorithmie
Ecrire une fonction EnsembleDesLettres qui donne, sous la forme d'une chaîne, la liste des lettres d'une chaîne de caractères (cette fonction élimine les lettres en double)
Exemples : toto -> to programmation -> progamtin
Ecrire une fonction IntersectionLettres qui donne, sous la forme d'une chaîne de caractères, la liste des lettres communes à 2 chaînes de caractères
Exemple : IntersectionLettres (programmation, ordinateur) -> roatin
3ème question (6 points)
Modélisation objet
On souhaite modéliser la gestion des comptes bancaires d'un établissement financier grâce à la programmation orientée objet.
Un compte bancaire est caractérisé par son numéro, sa date d'ouverture, son solde. Outre la création et la fermeture d'un compte, on peut effectuer des versements et des retraits.
3.1 Ecrire, en pseudo code, en pascal objet ou en java, la déclaration et les méthodes nécessaires à une classe CompteBancaire, permettant les fonctions de création, de consultation de versement et de retrait d'argent.
NB : aucun découvert n'est autorisé.
3.2 Un compte d'épargne est un compte bancaire disposant d'une rémunération mensuelle fixée par un taux d'intérêts. Ecrire le code nécessaire à l'utilisation d'une classe CompteEpargne, ayant notamment une méthode permettant d'ajouter les intérêts au compte d'épargne à chaque fin de mois
4ème question (4 points)
Analyser le programme suivant. Dessiner le diagramme de classes.
Qu'affiche ce programme ?
program Controle2003;
uses SysUtils;
type TPoint = class (TObject)
x,y : double;
end;
TAnimal= class(TObject)
private
date_de_naissance : TDateTime;
public
position : TPoint;
nom : string;
constructor Naissance(nom:string);
destructor Mort;
procedure crier; virtual;
procedure manger(nourriture : TObject); virtual;
end;
TCarnivore= class(TAnimal)
procedure manger(nourriture : TObject); override;
end;
THerbivore= class(TAnimal)
procedure manger(nourriture : TObject); override;
end;
TLion= class(TCarnivore)
procedure crier; override;
end;
TChat= class(TCarnivore)
procedure crier; override;
end;
constructor TAnimal.Naissance(nom:string);
begin
inherited Create;
date_de_naissance:=Now;
position := TPoint.Create();
position.x:=0;position.y:=0;
self.nom:=nom;
end;
destructor TAnimal.Mort;
begin
writeln(nom,' est mort');
position.Free;
end;
procedure TAnimal.crier;
begin
writeln(nom, ' crie');
end;
procedure TAnimal.manger(nourriture : TObject);
begin
writeln(nom, ' mange ',nourriture.className);
nourriture.Free;
end;
procedure TCarnivore.manger(nourriture : TObject);
begin
if nourriture is TAnimal then
begin
writeln(nom,' dévore ',(nourriture as TAnimal).nom);
(nourriture as TAnimal).Mort
end
else writeln(nom,' ne mange pas de ', nourriture.ClassName);
end;
procedure THerbivore.manger(nourriture : TObject);
begin
if not(nourriture is TAnimal) then inherited
else writeln(nom,' ne mange pas de ', nourriture.ClassName);
end;
procedure TLion.crier;
begin
writeln(nom, ' rugit');
end;
procedure TChat.crier;
begin
writeln(nom, ' miaule');
end;
var animal1, animal2 : TAnimal;
lion : TLion;
herbe : TObject;
begin
herbe := TObject.Create;
animal1 := THerbivore.Naissance('Antilope');
animal2 := TChat.Naissance('Felix');
lion := TLion.Naissance('Leo');
animal1.manger(herbe);
animal1.manger(animal2);
writeln(lion.nom,' a faim');
herbe := TObject.Create;
lion.manger(herbe);
lion.manger(animal1);
lion.crier;
animal1 := animal2;
animal1.crier;
lion.Mort;
animal2.Mort;
end.
Correction 2ème question (algorithmie)
program Lettres;
function InString(c:char;s:string):boolean;
var i : integer;
begin
i:=1;
while (i<=length(s)) and (c<>s[i]) do i:=i+1;
InString:=(i<=length(s));
end;
function EnsembleDesLettres(chaine:string):string;
var i : integer;
Ensemble : string;
begin
Ensemble := '';
for i:=1 to length(chaine) do if not InString(chaine[i],Ensemble) then Ensemble:= Ensemble+chaine[i];
EnsembleDesLettres := ensemble;
end;
function IntersectionLettres(chaine1,chaine2:string):string;
var i : integer;
Intersection,ensemble1,ensemble2 : string;
begin
Intersection := '';
ensemble1 := EnsembleDesLettres(chaine1);
ensemble2 := EnsembleDesLettres(chaine2);
for i:=1 to length(ensemble1) do if InString(ensemble1[i],ensemble2) then Intersection := Intersection+ensemble1[i];
IntersectionLettres := Intersection;
end;
begin
writeln(EnsembleDesLettres('programmation'));
writeln(IntersectionLettres('programmation','ordinateur'));
writeln(IntersectionLettres('ordinateur','programmation'));
writeln(IntersectionLettres('ordinateur',''));
end.
Correction 3ème question (modélisation objet)
Type TCompteBancaire = class
private
solde : real;
numero : longint;
date_ouverture : TDateTime;
public
constructor Create(numero:longint);
destructor Free;
function GetSolde : real; // ramène la valeur du solde du compte
function Versement(montant:real):real; //ramène le montant du solde après le versement d'une somme d'argent
function Retrait(montant:real):real; //ramène le montant de ce qui a été retiré
end;
constructor TCompteBancaire.Create(numero:longint);
begin
solde:=0;
self.numero:=numero;
date_ouverture:=date;
end;
function TCompteBancaire.GetSolde:real;
begin
GetSolde:=solde;
end;
function TCompteBancaire.versement(montant:real):real;
begin
if montant>0 then solde :=GetSolde+montant
else writeln('Le montant doit être positif');
versement:=GetSolde;
end;
function TCompteBancaire.retrait(montant:real):real;
begin
if montant<=0 then writeln('Le montant doit être positif')
else if montant>GetSolde then
begin
writeln('Vous n''avez que ',GetSolde,' F sur votre compte. Seule cette somme vous est versée' );
retrait := Getsolde;
solde :=0;
end
else begin
retrait := montant;
solde := solde - montant;
end;
end;
destructor TCompteBancaire.Free;
begin
writeln('Le compte est cloturé. Il vous est restitué ',retrait(GetSolde),' Francs');
end;
Type TCompteEpargne = class(TCompteBancaire)
private
taux : real;
public
constructor Create(numero:longint;taux:real);
function InteretsMensuels:real;
//verse les intérets sur le compte et ramène le solde
end;
constructor TCompteEpargne.Create(numero:longint;taux:real);
begin
inherited Create(numero);
self.taux:=taux
end;
function TCompteEpargne.InteretsMensuels:real;
begin
InteretsMensuels:=versement(GetSolde*taux);
end;
Corrigé 4ème question
Antilope mange TObject
Antilope ne mange pas de TChat
Leo a faim
Leo ne mange pas de TObject
Leo dÚvore Antilope
Antilope est mort
Leo rugit
Felix miaule
Leo est mort
Felix est mort