| 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 |