Enseignement > Programmation orientée objet > Delphi > Sujets d'examens et corrigés > Controle 2003 POO IUP1  

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