Les classes : Besoin d'aide

Résolu
plusweb Messages postés 13 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 23 novembre 2005 - 11 nov. 2005 à 23:51
plusweb Messages postés 13 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 23 novembre 2005 - 18 nov. 2005 à 20:22
Bonjour ,


J’ai besoin de votre aide par rapport aux classes …


Etudiant, c’est ma deuxème année de programation. Après avoir lu de nombreux cours sur internet sur ce sujet je m’en remet à vous pour m’aider à comprendre…


Voici mon énoncé :


I Définir une classe TTableau d’entiers


a) Pour un tableau sans taille à 3colonnes


b) Écrire un constructeur donnant une taille au tableau


c) Écrire un constructeur donnant une taille et remplissant le tableau avec des valeurs aléatoires inférieures à une valeur données


II Dériver une classe de TTableau


a) Où l’on ajoutera une méthode de tri suivant une colonne précisée


b) Où l’on ajoutera les méthodes min, max, somme, moyenne


c) Où l’on ajoutera une méthode d’affichage







J’ai quand meme déjà cherché et voici mon ébauche pour le début de l’exercice :





//const


//taille = 10;





type


Ttableau =class


private


taille :integer;


Ttaille : array[1..3,1..taille] of integer;


public


constructor create(newtaille : integer);





end;








implementation





{$R *.dfm}





procedure faire;


Constructor Ttableau.Create(newtaille : Integer);


taille := newtaille;


End;





Je sais déjà très bien que je m’y prend très mal pour déclarer la taille,mais je comprend pas ceux qu’on attend de moi, la seule réponse de mon professeur est de me reporter aux cours dont voici le lien :





Hésitez pas à me donner votre avis sur ce cours car à moi il ne m’aide en rien.Problème de ma part ?








Voilà merci à tous ceux qui voudront bien prendre 2 minutes pour m’aider à comprendre et faire ces exercices.





N’hésitez pas à me laisser des explications sur les constructors,destructors et autres…





Merci d’avance !!!

10 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
14 nov. 2005 à 16:48
Salut,
Au fait, il me semble qu'il serai plus simple de le faire avec un array.
Voila une implémentation possible (pour moi, c'est la meilleure masi bon...):
<hr size= "2" width="100%"> interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs;

type
{ Un type qui sert de tableau à trois colonnes. }
TTableau = array of array[0..2] of Integer;
TIntList = class (TObject)
private
{ La déclaraito ndu tableau. }
FTableau: TTableau;
{ Le nombre de lignes dans le tableau.~}
FTailleTableau: Integer;
{ Getter et Setter de la propriété Tableau[]. }
function GetCase(Index, Colonne: Integer): Integer;
procedure SetCase(Index, Colonne: Integer; const Value: Integer);
public
{ Constucteurs. }
constructor Create(TailleInitiale: Integer); overload;
constructor Create(TailleInitiale, ValeurMaximum: Integer); overload;
{ Destructeur. }
destructor Destroy; override;
{ Procédure d'affichage. }
procedure Afficher(Liste: TStrings);
{ Propriété du tableau. }
property Tableau[Index, Colonne: Integer]: Integer read GetCase write
SetCase; default;
{ Propriété: taille du tableau. }
property TailleTableau: Integer read FTailleTableau;
end;

implementation

{
*********************************** TIntList ***********************************
}
constructor TIntList.Create(TailleInitiale: Integer);
begin
inherited Create;
FTailleTableau : = TailleInitiale;
{ Redimentionnement du tableau. }
SetLength(FTableau, TailleInitiale);
end;

constructor TIntList.Create(TailleInitiale, ValeurMaximum: Integer);
var
i, j: Integer;
begin
{ Création de l'onjet: appel de l'autre constructeur. }
Create(TailleInitiale);
{ Remplissage avec des valeurs aléatoires. }
Randomize;
for i := 0 to TailleTableau -1 do
for j : = 0 to 2 do
FTableau[j, i] := Random(ValeurMaximum);
end ;

destructor TIntList.Destroy;
begin
{ Libération du tableau. }
Finalize(FTableau);
inherited Destroy;
end;

procedure TIntList.Afficher(Liste: TStrings);
var
i: Integer;
begin
Liste.BeginUpdate;
try
Liste.Clear;
for i : = 0 to FTailleTableau -1 do
Liste.Add(Format('%d - %d - %d',
[FTableau[i, 0], FTableau[i, 1], FTableau[i, 2]]));
finally
Liste.EndUpdate;
end; // try.
end;

function TIntList.GetCase(Index, Colonne: Integer): Integer;
begin
{ Vérification d'étendue: test du N° de colonne. } if (Colonne >0) and (Colonne < 3) then
begin
{ OK ? Alors test du N° de ligne. }
if (Index >= 0) and (Index < FTailleTableau) then
{ Si c'est bon, on renvoie le resultat. }
Result : = FTableau[Index, Colonne]
else
{ Ici, on gère le cas de la ligne non valide. }
raise Exception.CreateFmt('Index de ligne invalide (%d sur %d)',
[Index, FTailleTableau]);
end
else
{ Ici, on gère le cas de la colonne non valide. }
raise Exception.CreateFmt('Index de colonne invalide (%d sur 2)',
[Colonne]);
end;

procedure TIntList.SetCase(Index, Colonne: Integer; const Value: Integer);
begin
{ Vérification d'étendue: test du N° de colonne. } if (Colonne >0) and (Colonne < 3) then
begin
{ OK ? Alors test du N° de ligne. }
if (Index >= 0) and (Index < FTailleTableau) then
{ Si c'est bon, on attribue la valeur. }
FTableau[Index, Colonne] : = Value
else
{ Ici, on gère le cas de la ligne non valide. }
raise Exception.CreateFmt('Index de ligne invalide (%d sur %d)',
[Index, FTailleTableau]);
end
else
{ Ici, on gère le cas de la colonne non valide. }
raise Exception.CreateFmt('Index de colonne invalide (%d sur 2)',
[Colonne]);
end;
<hr size="2" width="100%">@ ++
Florent

Si tu ne te plantes pas ......
tu ne poussera jamais
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
14 nov. 2005 à 21:40
Poses toutes les questions que tu veux.
Car c'est en développant des classes que l'on découvre des concepts (compliqués ??) auquels on aurait pas pensé auparavant.
Et il servent quasiment tout le temps.

En gros, faut bien les comprendre.

Voila une liste (non exhaustive) des "subtilités" auqeulles on ne penses pas et qui te poses peut-être des problèmes:
- La déclaration de TTableau.
- l'histoire du getter et du setter.
- La propriété tableau (ici: Tableau[Index, Colonne: Integer]: Integer read GetCase write SetCase; default;
- Les exceptions.

C'est déjà pas mal.
Donc, si tu as des quesitons, vas-y n'hésites pas!!

++ Florent

Si tu ne te plantes pas ......
tu ne poussera jamais
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
18 nov. 2005 à 18:45
Youpi, tu y est arrivé !
Par contre, ce serai bien de valider les réponses qui t'ont permi de résoudre le problème.

Le getter et le setter servent à renvoyer ou a affecter les éléments du tableau en effectuant une vérification d'étendue.

Ta version est un peu bof bof je dirais: tous tes membres sont "public" (visibles à l'extérieur de la classe).
Si je modifie FTaillleTableau dans une procédure qui utilise ta classe, tout plance.
Et c'est lé qu'interviennent les propriétés: en la mettant en read-only, c'est à dire sans donner de membre où écrire (ou pas de setter), tu empeche l'utilisateur d'acceder à ta variable FTailleTableau. A condition qu'elle soit déclaré dnas "private" ou "protected"

Si tu ne te plantes pas ......
tu ne poussera jamais
3
plusweb Messages postés 13 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 23 novembre 2005
12 nov. 2005 à 00:01
Sorry voilà le lien du cours : http://www.sm.u-bordeaux2.fr/~yonel/Licence%203/COURS%20PROGRAMMATION%20OBJET%202005-2006.pdf

Désolé aussi pour la mise en page du post précédent, c pas très clair du coup :
Re voici mon ébauche modifié :

//const


//taille = 10;





type


Ttableau =class


private


taille :integer;


Ttaille : array[1..3,1..taille] of integer;


public


constructor create(newtaille : integer);


end;





implementation





{$R *.dfm}





Constructor Ttableau.Create(newtaille : Integer);
Begin


Self.taille := newtaille;
End;


End;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
12 nov. 2005 à 11:15
Salut,
Je te proposerai un truc comme cela:
- Un tableau d'entiers à trois colonnes est au fait un tableau de tableau à trois colonnes: array of array[0..2] of Integer
- Pour donner une taille au tableau, il faut appeler SetLength(Tableau, Taille);
- Pour déclarer deux constructeurs, tu peux utiliser la dirctive "overload":
constructor Create(const Taille: Integer); overload;
constructor Create(const Taille, MaxValue: Integer) overload;
- Pour obtenir des valeurs aléatoires, tu peux utiliser la fonction Random(Range: Integer) qui te renvoie un nombre X tel que 0 <= X < Range. Tu doit préceder tes appels à Random() par UN SEUL appel à Randomize().
- Pour faire dériver ta classe, tu la définit ainsi : TDerivedClasse = classe(TTableau) {....} end;
- Noublie pas de définir un destructeur destructor Destroy; override; dans lequel tu vides le tableau pour libérer la mémoire, procédure Finalize()
- /!\: Ne pas confondre la directive "overload" avec la directive "override"

Je ne te donnes pas de code maintenant car il est important que tu trouves cela par toi-même.
Cependant, si tu as d'autres questions ... n'hésites-pas !

@ ++ Florent

Si tu ne te plantes pas ......
tu ne poussera jamais
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
12 nov. 2005 à 11:21
Concernant le cours que tu cites, je trouve cela un peu prétentieux de prétendre expliquer la programmation objet en seulement 24 pages. Cependant, il est juste mais je te l'accorde, il ne t'aidera pas beaucoup.

Je te renverrai ici : http://fbeaulieu.developpez.com/guide/10-objets-1.html
ou plus généralement, vers ce site très bien fait: http://fbeaulieu.developpez.com/guide/
0
plusweb Messages postés 13 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 23 novembre 2005
14 nov. 2005 à 11:43
Merci pour vos réponses...
Florent voilà ceux que j'ai réussi à faire avec bcp d'acharnement :
Bien sur ca ne marche pas ... en fait je n'arrive pas à trouver mon erreur...le problème est au niveau de ma liste je pense car quand je fais ma procedure affiche ,dans mon stringrid ca ne m' affiche que la dernière valeur de ma liste...
est ce que c bien list.add(..) qui permet d'ajouter à la liste...
Par contre florent je n'ai pas trouver comment faire avec un array...pourrais -tu m'aider..?un exemple ...?
Voici mon code :

PS : j'ai rajouter des memo our esayer de trouver mon erreur...

type
Ttableau =class(Tobject)
nbcolonne :integer;
taille : integer;
list : Tlist;
min : integer;
S : Tstringgrid;
m:Tmemo;
procedure tri (w : integer);
procedure Affichage;
constructor create(A,B,C : integer;D : Tstringgrid;Me:Tmemo);


end;



Tvaleur = class(Tobject)
n : integer;
end;



var tableau : Ttableau;


implementation


{$R *.dfm}



Constructor Ttableau.Create(A,B,C : Integer;D : Tstringgrid;me:Tmemo);
var i : integer;
nb : Tvaleur;
y:integer;
Begin
inherited create;
nbcolonne := A;
y:=1;
taille := B;
list := tlist.create;
min := C;
nb := Tvaleur.Create;
s := D;
m:=me;
list.Clear;
nb.n := 0;
for i := 1 to taille do begin
nb.n := random(c)+1;
m.Lines.Append(inttostr(nb.n));
list.Add(nb);
y:=y+1;
nb:=list.items[list.count-1];


m.lines.Append(inttostr(nb.n));
end;
End;


function trinombre(a,b : pointer) : integer;
var c,d : Tvaleur;
begin
c := Tvaleur.create;
d := Tvaleur.Create;
c:= a;
d:= b;
if c.n < d.n then result:=1;
if c.n > d.n then result := -1;
if c.n = d.n then result := 0;
end;



procedure Ttableau.tri (w :integer);
var i : integer;
list2 : Tlist;
nb : Tvaleur;
begin
list2 := tlist.Create;
nb := Tvaleur.Create;
for i:=0 to (round(taille/3)-1) do begin
nb := list.items[w-1+3*i];
list2.add(nb);
end;


list2.sort(trinombre);


for i:= 0 to round(taille/3)-1 do begin
nb := list2.items[i];
list.items[w-1+3*i] := nb;
end;
end;


procedure TTableau.Affichage;
var i,j,y : integer;
nb : tvaleur;
begin
nb := Tvaleur.Create;
y:=0;
for i:= 1 to 3 do begin
for j:= 1 to round(taille/3) do begin
nb := tableau.list.items[y];
y:=y+1;
S.cells[i,j]:= inttostr(nb.n);


end;
end;
end;



procedure TForm1.Button1Click(Sender: TObject);


begin
tableau := Ttableau.create(3,strtoint(edit1.Text),21,SG,Memo1);
tableau.affichage;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
var nb:Tvaleur;
var i:integer;
begin
nb:=Tvaleur.Create;
for i:=0 to tableau.list.Count-1 do begin
nb:=tableau.list.items[i];
memo2.Lines.Append(inttostr(nb.n));
end;
end;
end.

Voilà et merci d'avance à qui pourra m'aider...BYE
0
plusweb Messages postés 13 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 23 novembre 2005
14 nov. 2005 à 20:23
ouh là...
Merci bien !!!
Je d"cortique tout çà..car il y a beaucoup chose qui ne parle pas...
Encore merci
0
plusweb Messages postés 13 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 23 novembre 2005
16 nov. 2005 à 16:16
Voilà, j'ai enfin réussi grace à ta precieuse aide florent...
par contre je ne me suis pas servi du getter et du setter , pourrais tu m'expliquer à quoi ca sert exactement...Je n'ai pas compris ni l'utilisation, ni la finalitée...

De plus pourrais tu me donner ton avis sur mon source..
D'avance merci ..
++ loic

unit Unit1;


interface


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls, Buttons;


type
TForm1 = class(TForm)
SG: TStringGrid;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
Edit3: TEdit;
RadioGroup1: TRadioGroup;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
RadioButton4: TRadioButton;
Label3: TLabel;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);


private
{ Déclarations privées }
public
{ Déclarations publiques }
end;


type
ttableau = array of array[0..2] of integer;


tintliste = class (Tobject)
ftableau : Ttableau;
Ftailletableau : integer;
S : TStringGrid;
constructor create(tailleinitial : integer);overload;
constructor create (tailleinitial,valeurmaximum : integer; d : Tstringgrid);overload;
procedure afficher;
procedure tricolonne(d : TstringGrid;c : integer);
function maxcolonne(d : TStringGrid; c :integer):string;
end;


var
Form1: TForm1;
tableau : tintliste;


implementation


{$R *.dfm}


constructor Tintliste.create(Tailleinitial : integer);
begin
inherited create;
Ftailletableau := tailleinitial;
setlength (Ftableau, Tailleinitial)
end;


Constructor Tintliste.create(tailleinitial,valeurmaximum : integer; D : TstringGrid);
var
i,j : integer;
begin
create(Tailleinitial);
s := d;
Randomize;
for i:= 0 to FTailletableau-1 do
for j:=0 to 2 do
Ftableau[j,i] := Random(Valeurmaximum+1);
end;


procedure tintliste.afficher;
var
i,j:integer;
begin
S.rowcount := FtailleTableau;
For i:=0 to FtailleTableau-1 do
for j:=0 to 2 do
S.cells[j,i] := inttostr(Ftableau[j,i]);
end;


procedure Tintliste.tricolonne (d : TstringGrid;c : integer);
var temp : array [0..2] of string;
i,j,ct : integer;
begin
ct := c;
if ct > 2 then Showmessage('Valeur hors Champ ( 0,1 ou 2 possible )')
else begin
for i:=0 to FtailleTableau-1 do
for j:=0 to FTailleTableau-1 do
if strtoint(s.cells[ct,j]) > strtoint(S.Cells[ct,i]) then begin
temp[0] :=S.cells[0,i];
temp[1] := S.Cells[1,i];
temp[2] := S.Cells[2,i];
S.Cells[0,i] := S.cells[0,j];
S.Cells[1,i] := S.cells[1,j];
S.Cells[2,i] := S.cells[2,j];
S.Cells[0,j] := temp[0];
S.Cells[1,j] := temp[1];
S.Cells[2,j] := temp[2];
end;
end;
end;


function Tintliste.maxcolonne(d : TStringGrid; c :integer):string;
var
i,ct : integer;
temp : string;
begin
ct := c ;
temp := '0';
for i:=0 to FtailleTableau-1 do
if strtoint(s.cells[ct,i]) > strtoint(temp) then begin
temp := S.cells[ct,i];
end;
result :=temp;
end;


procedure TForm1.Button1Click(Sender: TObject);


begin
label3.caption := '';
Radiobutton1.Checked := false;
Radiobutton2.Checked := false;
Radiobutton3.Checked := false;
Radiobutton4.Checked := false;
button2.Enabled := true;
button3.Enabled := true;
tableau := tintliste.create(strtoint(Edit1.text),strtoint(edit2.text),SG);
tableau.afficher;
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
tableau.tricolonne(SG,strtoint(edit3.text));
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
label3.Caption := '';
button3.enabled := false;
button2.Enabled := false;
end;



procedure TForm1.Button3Click(Sender: TObject);
begin
if radiobutton1.Checked = true then label3.Caption := tableau.maxcolonne(SG,0);
if radiobutton2.Checked = true then label3.Caption := tableau.maxcolonne(SG,1);
if radiobutton3.Checked = true then label3.Caption := tableau.maxcolonne(SG,2);
end;


end.
0
plusweb Messages postés 13 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 23 novembre 2005
18 nov. 2005 à 20:22
OK merci bien pour tes conseils...
JE valide ta dernière réponse...
@ ++ et encore merci

loic
0
Rejoignez-nous