Ver Mensaje Individual
  #8  
Antiguo 14-05-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
danielmj,

Cita:
Empezado por danielmj
...tengo un problema con un Tlistview...seis columnas...100 filas...cada celda almacena un numero aleatorio del 1 al 49...
...El problema...buscar los 6 numeros que mas se repiten de entre todas las celdas...
Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TModa = record
     Number : Integer;
     Count : Integer;
  end;

const
  Secuencia : Array[0..5] of String = ('primero','segundo', 'tercero', 'cuarto', 'quinto', 'sexto');
  Max = 50; // Número máximo de elementos a generar aleatoriamente
  Rows = 100; // Número máximo de lineas del control TListview

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Genera números aleatorios de 0 a Max-1
procedure TForm1.Button1Click(Sender: TObject);
var
   i : Integer;
begin
   Randomize;
   ListView1.Clear;
   for i := 1 to Rows do
   begin
     with ListView1.Items.Add do
     begin
        SubItems.Add(IntToStr(Random(Max)));
        SubItems.Add(IntToStr(Random(Max)));
        SubItems.Add(IntToStr(Random(Max)));
        SubItems.Add(IntToStr(Random(Max)));
        SubItems.Add(IntToStr(Random(Max)));
        SubItems.Add(IntToStr(Random(Max)));
     end;
   end;
   ListView1.Items.Count
end;

// Muestra los seis primeros números repetidos de una secuencia aleatoria
procedure TForm1.Button2Click(Sender: TObject);
var
   i, j, p : Integer;
   ModaCount : Array[0..Max] of Integer;
   AModa : Array[0..5] of TModa;
   b : Boolean;

begin

   // Cuenta cuantas ocurrencia hay de un número
   // la posición del arreglo corresponde al número generado aleatoriamente
   // El valor del arreglo corresponde a la cantidad de ocurrencias encontradas para ese número
   FillChar(ModaCount,Sizeof(ModaCount),0);
   for i := 0 to ListView1.Items.Count - 1 do
   begin
      for j := 0 to ListView1.Items.Item[i].SubItems.Count - 1 do
      begin
         p := StrToInt(ListView1.Items.Item[i].SubItems.Strings[j]);
         ModaCount[p] := ModaCount[p] + 1;
      end;
   end;

   // Genera un arreglo con los 6 primeros números en orden de repetición
   FillChar(AModa,Sizeof(AModa),-1);
   for i := Low(AModa) to High(AModa) do
      for j := Low(ModaCount) to High(ModaCount) do
      begin
         if AModa[i].Count < ModaCount[j] then
         begin

            for p := 0 to 5 do
               if (AModa[p].Number = j) then
                  b := True;

            if not b then
            begin
               AModa[i].Number := j;
               AModa[i].Count := ModaCount[j];
            end;

            b := False;

         end;
      end;

   // Muestra los primeros números repetidos en secuencia hasta un máximo de 6
   for i:= 0 to 5 do
   begin
      if (AModa[i].Count <> 0) then
         ShowMessage(Format('El %s número es %d con %d ocurrencias',[Secuencia[i],AModa[i].Number,AModa[i].Count]));
   end;

end;

end.
El código anterior genera números aleatorios entre 0 y 49 en un control TListView de 100 filas. Variando los valores de las constantes Max y Rows se puede analizar la salida del código de forma más manejable.

El ejemplo esta disponible en el link: http://terawiki.clubdelphi.com/Delph...om_Numbers.rar

Espero sea útil

Nelson.
Responder Con Cita