plusweb
Messages postés13Date d'inscriptionjeudi 13 mars 2003StatutMembreDernière intervention23 novembre 2005
-
11 nov. 2005 à 23:51
plusweb
Messages postés13Date d'inscriptionjeudi 13 mars 2003StatutMembreDernière intervention23 novembre 2005
-
18 nov. 2005 à 20:22
Bonjour ,
Jai besoin de votre aide par rapport aux classes
Etudiant, cest ma deuxème année de programation. Après avoir lu de nombreux cours sur internet sur ce sujet je men remet à vous pour maider à comprendre
Voici mon énoncé :
I Définir une classe TTableau dentiers
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ù lon ajoutera une méthode de tri suivant une colonne précisée
b) Où lon ajoutera les méthodes min, max, somme, moyenne
c) Où lon ajoutera une méthode daffichage
Jai quand meme déjà cherché et voici mon ébauche pour le début de lexercice :
//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 my prend très mal pour déclarer la taille,mais je comprend pas ceux quon 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 maide en rien.Problème de ma part ?
Voilà merci à tous ceux qui voudront bien prendre 2 minutes pour maider à comprendre et faire ces exercices.
Nhésitez pas à me laisser des explications sur les constructors,destructors et autres
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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
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;
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
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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.
plusweb
Messages postés13Date d'inscriptionjeudi 13 mars 2003StatutMembreDernière intervention23 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
plusweb
Messages postés13Date d'inscriptionjeudi 13 mars 2003StatutMembreDernière intervention23 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
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.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;