Ver Mensaje Individual
  #22  
Antiguo 15-02-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.572
Reputación: 27
egostar Va camino a la fama
Cita:
Empezado por eduarcol Ver Mensaje
a ver si entendi lo que explicas, necesitas recursividad, algo como esto:
Bueno, y porque no usar los conceptos de las conversiones Binarias, decimales, octales, hexadecimales, pues nos hacemos de una nueva Base36.

Código Delphi [-]
unit UBase36;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, Math;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Label2: TLabel;
    Edit1: TEdit;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  // Generamos nuestro vector de valores de '0' a 'Z'
  Base36 : Array[0..35] of char = ('0','1','2','3','4','5','6','7','8',
                                   '9','A','B','C','D','E','F','G','H',
                                   'I','J','K','L','M','N','O','P','Q',
                                   'R','S','T','U','V','W','X','Y','Z');

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Suma,Numero: Extended;
  PosCaracter,Indice: Integer;

  function ConvABase36(N:Extended):String;
  var
    Cadena: string;
    Dividendo,Resultado,Residuo: Extended;

  begin
    Cadena := '';
    Dividendo := N;
    REPEAT
      // 1. Se divide el numero entre 36
      Resultado := Dividendo / 36; 
     // 2. Se resta el resultado y parte entera del resultado y se multiplica por 36
      Residuo := (Resultado - Trunc(Resultado)) * 36; 
      // Se agrega el caracter correspondiente al residuo obtenido
      Cadena := Base36[Trunc(Residuo)]+ Cadena;
      Dividendo := Resultado;
    UNTIL Resultado < 36;
    //Se agrega el caracter del último valor (dividendo) a la cadena
    Result := Base36[Trunc(Dividendo)]+Cadena;
  end;

  function ConvADecimal(B36:string):Extended;

    function GetIndex(Value: Char): Integer;
    begin
      Result := Byte(Value) - 48;
      if Result > 9 then Dec(Result, 7);
    end;

  begin
    Indice := 0;
    PosCaracter := length(B36);
    REPEAT
       Suma := Suma + GetIndex(B36[PosCaracter]) * Power(36,Indice);
       Indice := Indice + 1;
       Dec(PosCaracter);
    UNTIL Indice = (length(B36)-1);
    Result := Suma;
  end;

begin
  //Usar solo cadenas de hasta 12 digitos , (por ahora )
  //Estoy usando un signo ~ antes de la cadena por cuestiones de indices 
  Numero := ConvADecimal('~'+Edit1.Text)+1; //Directamente sumo uno al valor decimal
  Label2.Caption := ConvABase36(Numero); //Se convierte el numero a Base36
end;

end.

Ahora, podemos sumar a cualquier cadena que nos coloquen, por ejemplo LX345J8ON99.

Nota: No se porque, pero solo suma correctamente hasta 12 digitos, pues bien, habría que mejorar este código.

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita