Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

 
 
Herramientas Buscar en Tema Desplegado
  #8  
Antiguo 09-05-2018
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 13
bucanero Va camino a la fama
Te dejo por aquí otro ejemplo en donde he creado una especie de clase llamada TCOMBINACION con las posibles funciones que necesitas y donde puedes ver su funcionamiento.

Es unidad totalmente independiente y sin enlaces a la parte visual de la aplicación

Código Delphi [-]
unit Combinaciones;

interface

type
  TCombinacion = Int64;
  TCombinacionHelper = record helper for TCombinacion
  private
    function GetNumero(ANum: byte): Boolean;
    function AsString(const value: TCombinacion): string; overload;
    function GetCount: Integer;
  public
    procedure AddNumero(const ANum: byte);                 // Inserta un numero en la combinacion
    procedure aleatorio;                                   // rellena con una combinacion aleatoria
    function AsString: string; overload;                   // devuelve la combinacion como un string
    procedure clear;                                       // vacia la combinacion
    function comparar(const combinacion: TCombinacion): Tcombinacion;
    function obtenerComunes(const combinacion: Tcombinacion): string;

    property Count:Integer read GetCount;                  // Indica cuantos numeros tiene esta combinacion
    // esta propiedad es para comparar si un determinado numero pertenece a la combinación
    property Numero[ANum:byte]:Boolean read GetNumero;
  published
    // añadir tantos metodos load como sea necesarios
    function load(list: array of Byte): boolean; overload; // carga una combinacion determinada
  end;


implementation

uses System.SysUtils;

const
  NumeroMax: Byte = 49;  // 1.. 49
  MaxCount: integer = 5;


{ TCombinacionHelper }
procedure TCombinacionHelper.AddNumero(const ANum: byte);
begin
  Self := self or (int64(1) shl ANum);
end;

procedure TCombinacionHelper.aleatorio;
var
  i: longint;
  value: Byte;
begin
  i := 0;
  clear;
  repeat
    //Genera un numero aleatorio entre 1 y 49
    value := Random(NumeroMax - 1) + 1;
    if not Numero[value] then begin
      //si el numero no esta en la combinacion entonces lo añade
      AddNumero(value);
      Inc(i);
    end;
    //y se repite hasta obtener el maximo de numeros necesarios para la combinacion
  until (i >= MaxCount);
end;

function TCombinacionHelper.AsString: string;
begin
  result := AsString(Self);
end;

procedure TCombinacionHelper.clear;
begin
  Self := 0;
end;

function TCombinacionHelper.comparar(
  const combinacion: TCombinacion): Tcombinacion;
begin
  Result := self and combinacion;
end;

function TCombinacionHelper.GetCount: Integer;
var
  aux: Int64;
begin
  Result := 0;
  aux := self;
  while (aux > 0) do begin
    if (aux and Int64(1)) = 1 then
      Inc(result);
    aux := aux shr 1;
  end;
end;

function TCombinacionHelper.GetNumero(ANum: byte): Boolean;
begin
  Result := ((self and (int64(1) shl ANum)) <> 0);
end;

function TCombinacionHelper.load(list: array of Byte): boolean;
var
  i: LongInt;
begin
  Result := False;
  clear;
  if length(list) = MaxCount then begin
    for i := 0 to High(list) do
      AddNumero(list[i]);
    Result := true;
  end;
end;

function TCombinacionHelper.obtenerComunes(
  const combinacion: Tcombinacion): string;
begin
  Result := Comparar(combinacion).AsString;
end;

function  TCombinacionHelper.AsString(const value: TCombinacion):string;
var
  i:integer;
begin
  result := '';
  for i := 1 to NumeroMax do
    if value.Numero[i] then
      result := result + IntToStr(i) + ' ';
end;

end.

y en la pantalla principal se puede usar de la siguiente manera (solo hay dos botones y un memo):

Código Delphi [-]
uses Combinaciones;

procedure TForm1.Button1Click(Sender: TObject);
var
  Combinacion: TCombinacion;
begin
  //genera una combinacion aleatoria
  Combinacion.aleatorio;
  //combierte la combinacion en un texto
  memo1.lines.add(Combinacion.AsString + #9 + '(' + IntToStr(Combinacion.count) + ')');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  cs1: string;
  Combinacion1, Combinacion2: TCombinacion;
  comunes: TCombinacion;
  i: LongInt;
begin
  //cargar una combinacion predeterminada
  if not Combinacion1.load([1, 5, 8, 13, 33]) then begin
    MessageDlg('La combinacion no es valida!!!', mtError, [mbOK], 0);
    exit;
  end;

  //guarda la combinacion1 en un string;
  cs1 := Combinacion1.AsString;
  //genera un bucle para analizar 100 combinaciones aleatorias
  for i := 1 to 100 do begin
    //generar una combinacion aleatoria
    Combinacion2.aleatorio;
    /// compara una combinacion con otra y obtine los comunes a ambas combinaciones
    comunes := Combinacion2.comparar(Combinacion1);
    /// si el valor es 0 entonces no hay numeros comunes
    if comunes <> 0 then
      memo1.Lines.Add(cs1 + #9 + Combinacion2.AsString + #9 + '(' + IntToStr(comunes.count) + ') ' + comunes.AsString);
  end;
end;
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
sumando valores de un listview danielmj Varios 28 14-11-2014 21:52:30
VALORES FANTASMAS FIREBIRD 2.1 valores Grandes ASAPLTDA Firebird e Interbase 17 02-12-2012 12:09:02
Rellenar con 0.... buitrago Varios 6 17-11-2011 20:02:53
¿Cómo insertar una imágen en un lisbox o un memo? Acuarius3000 Gráficos 3 27-06-2005 08:44:53
arastrar archivos a un lisbox gulder C++ Builder 3 05-05-2005 13:31:50


La franja horaria es GMT +2. Ahora son las 13:35:20.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi