Exercice  Delphi

Manipulation des Listes - Opérations avancés

Unit - Screenshot - Download -

Screenshot

exlistes2

Unit


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.

Download

exlistes2.zip









..