Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Generación de Código Alfanúmerico Automatico (https://www.clubdelphi.com/foros/showthread.php?t=53205)

luxus 13-02-2008 22:32:39

Generación de Código Alfanúmerico Automatico
 
Hola Amigos,

Vamos a ver si me explico para no liarnos y a ver si me podeis echar una mano.

Tengo que implmentar un pequeño programa para que un codigo alfanumérico de 14 dígitos se autoincremente de forma automática. Es decir, si el código es LX345J8ON9913 el siguiente codigo sea LX345J8ON9914 y así sucesivamente. ¿Sabeis si hay un programa con prestaciones similares y donde puedo descargarlos? ¿Alguna sugerencia para su implementación?

Gracias y un saludo a todos.

ixMike 13-02-2008 22:54:07

Bueno, depende de cómo funcione ese código alfanumérico. El ejemplo que has puesto se entiende, pero, ¿y si el código es 1234567890AAA9? ¿Qué pasaría? ¿Se convertiría en 1234567890AAB0? ¿O en 1234567890AAAA? Dinos, cómo funciona con las letras, por favor. Gracias.


Salu2.

P.D.: También sería bueno saber si tienen una cierta estructura (tantas letras, tantos números en ciertas posiciones) o si es completamente mezclado.

luxus 13-02-2008 23:07:58

Hola ixMike,

Gracias por tu ayuda. Con respecto a tus dudas, del ejemplo que te mostré el siguiente codigo generado será el primero de los ejemplos.

En cuanto a la estructura, no hay ninguna secuencia determinada, solamente es una combinación de numeros y letras mezclados.

Gracias nuevamente por tu ayuda.

ixMike 13-02-2008 23:14:10

Pero sigo sin saber, ¿después del 9 va un 0, un 1 o una A? ¿y después de una Z? ¿Va un 0, un 1 o una A?

luxus 13-02-2008 23:20:46

Hola ixMike,

En respuesta a tu pregunta, después de un 9 irá un 0, incrementándo el número o letra del lado izquierdo. Por ejemplo, si tenemos 1234567890AAA9 el siguiente será 1234567890AAB0.

Si llegamos al caso de la combinación 1234567890AAZ9 el siguiente sería 1234567890ABA0, y así sucesivamente.

Espero que ahora me haya explicado mejor.

Gracias y un saludo

ixMike 13-02-2008 23:48:23

ok, ya se entiende :)

Prueba con algo así:

Código Delphi [-]
var //variables globales
  codigo: array[1..14] of char;
//nota: así podrás usar la variable como un string.

procedure Incrementar(pos: integer);
begin
if (codigo[pos] in ['0'..'8']) or (codigo[pos] in ['A'..'Y']) then codigo[pos]:=Ord(codigo[pos]+1) else
if codigo[pos]='9' then
  begin
  codigo[pos]:='0';
  incrementar(pos-1);
  end
else if codigo[pos]='Z' then
  begin
  codigo[pos]:='A';
  incrementar(pos-1);
  end;
end;


Nótese que tú sólo tendrás que llamar a la función con el parámetro 14 (el último caracter). Lo del parámetro es para la recursividad, y así optimizar el código.

Espero que te sirva.



Salu2. :)


Edito: tenía un "bug" donde la fución Ord. Solucionado (gracias Delphius por probarlo).

AzidRain 14-02-2008 03:05:43

Me parece que esta mal como lo están planteando....y si el código termina en letra???

Me parece podría definirse un número de base 24, es decir la secuencia posibles valores para cualquier dígito vendría dada por:

01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ

pero aqui tenemos las siguientes variantes:

despues de 0 sigue A y despues de Z sigue 0
despues de Z sigue A y despues de 0 sigue 1

tendrías que escoger cuales van a ser las reglas a aplicar ya que como puedes ver solo es posible aplicar 2 a la vez

ixMike 14-02-2008 13:55:31

Yo creo que tal cual está planteado las letras son independientes de los números. Y así lo he planteado yo en mi código.

En otras palabras: las letras son siempre letras y los números siempre números.

Así, a A9 sigue B0 y a 3Z sigue 4A.

Al menos así lo he entendido, según la explicación.


Salu2.

PeterPunk 14-02-2008 13:58:30

Por curiosidad, ¿qué sigue a Z9?, ¿A0, AA0, 1A0? ¿otra distinta?

ixMike 14-02-2008 14:12:07

Cita:

Empezado por PeterPunk (Mensaje 265813)
Por curiosidad, ¿qué sigue a Z9?, ¿A0, AA0, 1A0? ¿otra distinta?

yo diría que:

-como el código es de 14 dígitos, a 00000000000000Z9 sigue 000000000001A0.
-como el que has puesto es de sólo dos, pues un reset a A0 o se añade otro dígito, 1A0, o también AA0, ya que el dígito anterior no estaba...

de todas formas, en un código de 14 iniciado previamente de alguna forma no se creará tanta confución (claro, a no ser que sea 9Z9Z9Z9Z9Z9Z9Z :D:D)

Delphius 14-02-2008 14:26:21

Disculpen que meta más leña al fuego... pero hay que preguntarlo ahora:
¿Se contempla la Ñ?

Esto lo digo porque muchas veces cuando hablan de letras, y más cuando involucra al abecedario entero, se olvidan que el castellaño tiene una letra más.:(

Saludos,

ixMike 14-02-2008 15:05:31

Cita:

Empezado por Delphius (Mensaje 265818)
Disculpen que meta más leña al fuego... pero hay que preguntarlo ahora:
¿Se contempla la Ñ?

Esto lo digo porque muchas veces cuando hablan de letras, y más cuando involucra al abecedario entero, se olvidan que el castellaño tiene una letra más.:(

Saludos,

Mi código no comptempla la Ñ :(

Delphius 14-02-2008 15:26:03

Cita:

Empezado por PeterPunk (Mensaje 265813)
Por curiosidad, ¿qué sigue a Z9?, ¿A0, AA0, 1A0? ¿otra distinta?

Cita:

Empezado por ixMike (Mensaje 265816)
yo diría que:

-como el código es de 14 dígitos, a 00000000000000Z9 sigue 000000000001A0.
-como el que has puesto es de sólo dos, pues un reset a A0 o se añade otro dígito, 1A0, o también AA0, ya que el dígito anterior no estaba...

de todas formas, en un código de 14 iniciado previamente de alguna forma no se creará tanta confución (claro, a no ser que sea 9Z9Z9Z9Z9Z9Z9Z :D:D)

A ver... no estamos liando. Y es normal que suceda porque no esta bien aclarada la regla.

1. Leer caracter N-ésimo:
2. Evaluar caracter:
2.1. Si es numero:
2.1.1. incrementar valor según módulo 10.
2.1.2. Si caracter es ahora 9:
2.1.3. Volver a paso 1 siendo el caracter (N-1)-ésimo.
2.2. Si es letra:
2.2.1. incrementar valor caracter.
2.2.2. Si caracter es ahora Z:
2.2.3. Volver a paso 1 siendo el caracter (N-1)-ésimo.

¿Voy bien?
Ahora mi pregunta es ¿que hacer cuando se llega al final de la cadena y si el valor es 9 o Z?

De cualquier modo... no está bien dicho la cosa.

Cita:

Empezado por ixMike (Mensaje 265830)
Mi código no comptempla la Ñ :(

Cita:

Empezado por AzidRain (Mensaje 265727)

01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ

Pues precisamente a eso me refiero. Tanto tu como Azid no han contemplado la Ñ. ¿La usamos?

luxus, debes definir concretamente como son las reglas para que el algoritmo funcione como debe.

Saludos,

Lepe 14-02-2008 16:01:52

Cita:

Empezado por Delphius (Mensaje 265818)
Disculpen que meta más leña al fuego... pero hay que preguntarlo ahora:
¿Se contempla la Ñ?

Si queremos que sea portable, no se debe contemplar, muy a pesar de cervantes :p:p

AzidRain 15-02-2008 04:59:21

Ya se me van a quemar vivo pero para mi (y para muchos) la Ñ no es letra, como tampoco lo es "Ch" y "Ll".

Delphius 15-02-2008 05:07:20

Cita:

Empezado por AzidRain (Mensaje 266087)
Ya se me van a quemar vivo pero para mi (y para muchos) la Ñ no es letra, como tampoco lo es "Ch" y "Ll".

Tal vez no se la use mucho... pero para mi tiene uso. Es una letra... si figura en el diccionario... pues ¡aceptarla!

En fin, no me hagas caso.... hoy he estado un poco cabrón:D
Es muy cierto que la Ñ se la pasan de largo, y es por ese motivo que yo la incluyo.
Pero aqui, para "práctica" podemos obviarla. Vale.

Quería preguntarte... como lo estás entendiendo a esto?
Pues mo me hice lio:o

EDITO:
¿ Y luxus va a dar presencia, o explicar mejor el asunto? Porque hace 4 horas estuvo presente y si al menos hubiera dicho una mínima explicación hubiera sido mejor. Porque al modo en lo veo, pareciera que le estamos haciendo la tarea.

Saludos

Lepe 15-02-2008 10:31:06

Cita:

Empezado por Delphius (Mensaje 266088)
pareciera que le estamos haciendo la tarea.

No es que pareciera... es que lo es :D

ixMike 15-02-2008 14:14:29

uy, uy.. discusión lingüística... ¡me apunto! :D

Bueno, lo primero, es que uno no puede decir "esto me parece... esto no me parece...". Hay definiciones para cada cosa. Entre esas cosas, la de letra.

Si leéis el enlace (primera acepción) ya queda indiscutible que la ñ es una letra. Pero, ¿qué pasa con "ch" y "ll"? Según la segunda acepción, tradicionalmente también son letras. Pero claro, tradicionalmente... ¿y ahora? Desde luego, tienen su propia pronunciación, pero claro, requieren de más de un signo gráfico para representarlas, es decir, más de una letra. Che y elle son cada una un fonema con dos letras. ¿Por qué no?

Ya se prodía mirar más allá, con esto del Unicode y los CodePoint, pero a fin de cuentas, eso no son más que "artimañas" para simplificar (informáticamente hablando) las cosas.


Y para no desvirtualizar el hilo... ¡luxus, ¿dónde c0~@ te has metido?! Que nos tienes en intríngulis. ¿Metemos la eñe o no? ¿Los números se mezclan con las letras o no?...



Salu2.

Delphius 15-02-2008 18:35:34

Bueno... creo que no hace falta nombrar lo que sabemos... si luxus no pone de su parte... pues... no creo que le encontremos solución, por ahora yo voy a seguir adivinando:

NOTA: comienzo a contar de derecha a izquierda. Doy por supuesto que los carateres son dependientes exclusivamente del anterior. Y que debe incrementar su valor independiente de si es un número o una letra.

1. ¿Que sucede cuando el primer caracter es un 9?
1.1. Se convertiría en un 0 (cero). bien... y ¿ahora?
1.2. ...el caracter a su izquierda debe "incrementarse". Perfecto, y si es ¿9?

2. ¿Que sucede cuando el primer caracter es Z?
2.1. Se convertiría en A. ¿y ahora?
2.2. ... el caracter a su izquierda debe "incrementarse". Perfecto, y si es ¿Z?

Estas dos situaciones, me llevan a:

3. ¿Que sucede cuando el último caracter es un 9?
3.1. Lo incrementamos. Perfecto... se obtuvo un 0 (cero). ¿Que hacemos?
3.1.1. Reemplazamos ese cero por A, dando inicio a las letras. O bien,
3.1.2. No hacemos nada.

4. ¿Que sucede cuando el último caracter es Z?
4.1. Lo incrementamos. Perfecto... se obtuvo A. ¿Que hacemos?
4.1.1. No hacemos nada.

A lo que voy es que la regla, necesariamente debe ser posicional y no sólo del caracter. Voy a pedir que luxus defina concretamente como vienen las reglas. ¡Que hable! ¿O es que este hilo deberá quedar sin solución?

Saludos,

eduarcol 15-02-2008 20:56:09

a ver si entendi lo que explicas, necesitas recursividad, algo como esto:

declara unas variables globales:

Código Delphi [-]
nLista: array[1..14] of integer;
    procedure Incrementar(cCadena: String);
    procedure Aumentar(nIndice:Integer);

luego este es el codigo, le pasa la cadena como parametro al procedimiento incrementar y te devolvera una cadena incrementada segun la regla de la A-Z y 0-9

Código SQL [-]
procedure TForm1.Incrementar(cCadena: String);
var
   nCaracter: String;
   nIdx: Integer;
begin
   //Carga el vector de enteros
   for nIdx := 1 to 14 do
   begin
      nCaracter := Copy(cCadena, nIdx, 1);
      nLista[nIdx] := Ord(nCaracter[1]);
   end;

   //Recorre el vector aumentando las cifras
   Aumentar(14);

   //Arma de nuevo la cadena
   cCadena := '';
   for nIdx := 1 to 14 do
   begin
      nCaracter := Char(nLista[nIdx]);
      cCadena := cCadena + nCaracter;
   end;

end;

procedure TForm1.Aumentar(nIndice: Integer);
begin
   //si llego al principio se sale
   if nIndice <= 0 then
      Exit;
   //Aumenta un caracter en la posicion deseada
   nLista[nIndice] := nLista[nIndice] + 1;
   //Si es 91 quiere decir que viene de la Z, lo devuelve al 65 = A, incrementa el anterior
   if nLista[nIndice] = 91 then
   begin
      nLista[nIndice] := 65;
      Aumentar(nIndice - 1);
   end
   //Si es 58 quiere decir que viene del 9, lo devuelve al 48 = 0, incrementa el anterior
   else if nLista[nIndice] = 58 then
   begin
      nLista[nIndice] := 48;
      Aumentar(nIndice - 1);
   end;
end;


La franja horaria es GMT +2. Ahora son las 02:26:07.

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