Exercice Delphi
Manipulation des Listes - Opérations avancés
Unit - Screenshot
- Download -
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
lbA: TListBox;
lbB: TListBox;
btnReset: TButton;
Label1: TLabel;
Label2: TLabel;
btn1: TButton;
btn2: TButton;
lblHint: TLabel;
btn3: TButton;
btn4: TButton;
btn5: TButton;
btn6: TButton;
btn7: TButton;
btn8: TButton;
btn9: TButton;
procedure btnResetClick(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btn4Click(Sender: TObject);
procedure btn5Click(Sender: TObject);
procedure btn6Click(Sender: TObject);
procedure btn9Click(Sender: TObject);
procedure btn7Click(Sender: TObject);
procedure btn8Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure Remplir(lbListe:TListBox);
var I:integer;
begin
for I:=1 to random(5)+6 do lbListe.Items.Add(inttostr(random(100)))
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
remplir(lbA);
end;
procedure TForm1.btnResetClick(Sender: TObject);
begin
randomize;
lbA.Clear;
lbB.Clear;
Remplir(lbA);
end;
procedure TForm1.btn1Click(Sender: TObject);
// Copier la Liste A vers B
var i : integer;
begin
// lbB.Items := lbA.Items;
// ou bien
for i := 0 to lbA.Items.Count-1 do
lbB.Items.Add(lbA.Items[i]);
end;
procedure TForm1.btn2Click(Sender: TObject);
// Déplacer les nombres pairs de A vers B
var i : integer;
begin
(* i:=0;
while i<lbA.Items.Count do
if (StrToInt(lbA.Items[i]) mod 2 = 0) then
begin
lbB.Items.Add(lbA.Items[i]);
lbA.Items.Delete(i);
end
else
i := i + 1; *)
// ou bien :
for i:=lbA.Items.Count-1 downto 0 do
if (StrToInt(lbA.Items[i]) mod 2 =0) then
begin
lbB.Items.Insert(0,lbA.Items[i]);
lbA.Items.Delete(i);
end;
end;
procedure TForm1.btn3Click(Sender: TObject);
// Déplacer la liste A (non triée) vers B
// de manière à ce que la liste B soit triée
var i,j, IdxMax : integer;
begin
for i:=1 to lbA.Items.Count do
begin
IdxMax := 0;
for j:=0 to lbA.Items.Count-1 do
if StrToInt(lbA.Items[j])<StrToInt(lbA.Items[IdxMax]) then
IdxMax := j;
lbB.Items.Add(lbA.Items[IdxMax]);
lbA.Items.delete(IdxMax);
end;
end;
procedure TForm1.btn4Click(Sender: TObject);
// Ecrire dans B les facteurs de l'élément sélectionné de A
// les facteurs de 20 sont 2,2,5
var I,N:integer;
begin
if lbA.ItemIndex=-1 then exit;
N := StrToInt(lbA.Items[lbA.ItemIndex]);
lbB.Items.Clear;
I := 2;
while I<=N do
if N mod I = 0 then
begin
lbB.Items.Add(IntToStr(I));
N := N div I;
end
else
I := I + 1;
end;
procedure tri_sel(lb:TListBox);
// Tri par sélection de la liste lb
var Mix:integer; // index du minimum
i,j : integer;
begin
for i:=0 to lb.Items.Count-1 do
begin
Mix := I;
for j:=I to lb.Items.Count-1 do
if StrToInt(lb.Items[j])<StrToInt(lb.Items[Mix]) then
Mix := j;
lb.Items.Insert(I,lb.Items[Mix]);
lb.Items.delete(Mix+1);
end;
end;
procedure TForm1.btn5Click(Sender: TObject);
begin
tri_sel(lbA);
end;
procedure tri_classic(lb:TListBox);
// Tri classique de la liste lb
var i,j : integer;
// S : string;
begin
for i:=lb.Items.Count-2 downto 0 do
begin
for j:=0 to I do
if StrToInt(lb.Items[j])>StrToInt(lb.Items[j+1]) then
begin
// S := lb.Items[J];
// lb.Items[J] := lb.Items[J+1];
// lb.Items[J+1] := S;
// ou bien
lb.Items.Insert(J,lb.Items[J+1]);
lb.Items.delete(J+2);
end;
end;
end;
procedure TForm1.btn6Click(Sender: TObject);
begin
tri_classic(lbA);
end;
procedure TForm1.btn7Click(Sender: TObject);
// Ecrire dans B les diviseurs de l'élément sélectionné de A
// les diviseurs de 20 sont 2,4,5,10
var I,N:integer;
begin
if lbA.ItemIndex=-1 then exit;
N := StrToInt(lbA.Items[lbA.ItemIndex]);
lbB.Items.Clear;
for I:=2 to N-1 do
if N mod I = 0 then
lbB.Items.Add(IntToStr(I));
end;
procedure TForm1.btn8Click(Sender: TObject);
// inverser la liste A
var I:integer;
begin
for I:=0 to lbA.Items.Count-1 do
begin
lbA.Items.Insert(I,lbA.Items[lbA.Items.Count-1]);
lbA.Items.Delete(lbA.Items.Count-1);
end;
end;
procedure tri_double(lbA,lbB:TListBox);
// Tri classique des liste lbA et lbB
// les éléments des listes sont liées entre eux
var i,j : integer;
// S : string;
begin
for i:=lbA.Items.Count-2 downto 0 do
begin
for j:=0 to I do
if (lbA.Items[j]>lbA.Items[j+1]) or
(lbA.Items[j]=lbA.Items[j+1]) and
(lbB.Items[j]>lbB.Items[j+1]) then
begin
lbA.Items.Insert(J,lbA.Items[J+1]);
lbA.Items.delete(J+2);
lbB.Items.Insert(J,lbB.Items[J+1]);
lbB.Items.delete(J+2);
end;
end;
end;
procedure TForm1.btn9Click(Sender: TObject);
// Tri de deux listes qui sont liées entre elles
// Les données viennent d'un fichier "noms.txt" contenant noms et prénoms (séparés par des espaces)
// Après lecture, les données sont d'abord réparties dans les deux listes.
var I,P:integer;
S : string;
begin
lbA.Items.LoadFromFile('C:\temp\noms.txt');
for I:=0 to lbA.Items.COunt-1 do
begin
S := lbA.Items[I];
P := pos(' ',S);
lbB.Items.Add(copy(S,P+1,255));
delete(S,P-1,255);
lbA.Items[I] := S;
end;
tri_double(lbA,lbB);
end;
end.
exlistes2.zip
..