Ir ao conteúdo
  • Cadastre-se

Gerar numeros e letras em ordem alfanumerica


Posts recomendados

Ola Amigos do forum, faz um bom tempo que parei de mexer com delphi e agora estou tendo que reapreender, estou tendo dificulade para gerar uma especie de lista com numeros e letras que nao se repitam, de maneira alguma começando dessa maneira:

usando 8 digitos exemplo

AAAAAAAA

AAAAAAAB

AAAAAAAC

assim por diante

AAAAAAA1

AAAAAAA9

AAAAAABA

AAAAAABB

AAAAAABC

AAAAAA1A

AAAAAA9A

AAAAAA1B

que so acabe apos usar todas as combinacoes possiveis dividindo em arquvivos de de 35000 sequencias ou talvez em 3 mb salvando em arquivo txt

os codigos que possuo sao os seguintes:

esse gera codigos aleatorios porém um so de cada vez, gostaria que fosse gerando ate nao ter mais combinacoes possiveis e então parar.

Código:



procedure TForm1.Button2Click(Sender: TObject);

var
i:integer;
const
letras='ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
digitos=8;
begin

for i:=1 to digitos do
Memo1.Text:=memo1.Text+letras[random(length(letras))+1];
end;

esse outro faz gerar ate o numero colocado porém so numeros

Código:


procedure TForm1.Button1Click(Sender: TObject);

var

x: integer;
begin

for x := 0 to Pred(50) do
begin


Memo1.Lines.Add(IntToStr(x));
end;

end;

Esse outro carega arquivo txt, apaga a segunda linha e grava no arquivo txt a alteracao

Código:


procedure TForm1.Button3Click(Sender: TObject);

Var
Lista:TStringList;
i:Integer;
Begin
Lista:=TStringList.Create;
Lista.LoadFromFile('c:\log.txt');

For i:=0 to Lista.Count -1 do begin

if Lista[i]='2' then Lista.Delete(i);

End;
Lista.SaveToFile('c:\log.txt');
Lista.Free;

end;


Como posso juntar esses 3 codigos para gerar letras e numeros e gravar no arquivo conforme sao geradas as sequencias ?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Ola Amigos do forum, faz um bom tempo que parei de mexer com delphi e agora estou tendo que reapreender, estou tendo dificulade para gerar uma especie de lista com numeros e letras que nao se repitam, de maneira alguma começando dessa maneira:

usando 8 digitos exemplo

AAAAAAAA

AAAAAAAB

AAAAAAAC

assim por diante

AAAAAAA1

AAAAAAA9

AAAAAABA

AAAAAABB

AAAAAABC

AAAAAA1A

AAAAAA9A

AAAAAA1B

que so acabe apos usar todas as combinacoes possiveis dividindo em arquvivos de de 35000 sequencias ou talvez em 3 mb salvando em arquivo txt

os codigos que possuo sao os seguintes:

esse gera codigos aleatorios porém um so de cada vez, gostaria que fosse gerando ate nao ter mais combinacoes possiveis e então parar.

Código:



procedure TForm1.Button2Click(Sender: TObject);

var
i:integer;
const
letras='ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
digitos=8;
begin

for i:=1 to digitos do
Memo1.Text:=memo1.Text+letras[random(length(letras))+1];
end;


esse outro faz gerar ate o numero colocado porém so numeros

Código:


procedure TForm1.Button1Click(Sender: TObject);

var

x: integer;
begin

for x := 0 to Pred(50) do
begin


Memo1.Lines.Add(IntToStr(x));
end;

end;


Esse outro carega arquivo txt, apaga a segunda linha e grava no arquivo txt a alteracao

Código:


procedure TForm1.Button3Click(Sender: TObject);

Var
Lista:TStringList;
i:Integer;
Begin
Lista:=TStringList.Create;
Lista.LoadFromFile('c:\log.txt');

For i:=0 to Lista.Count -1 do begin

if Lista[i]='2' then Lista.Delete(i);

End;
Lista.SaveToFile('c:\log.txt');
Lista.Free;

end;



Como posso juntar esses 3 codigos para gerar letras e numeros e gravar no arquivo conforme sao geradas as sequencias ?

Olá,

...agora estou tendo que reapreender, estou tendo dificulade para gerar uma especie de lista com numeros e letras que nao se repitam...

Eu acredito que só bastará ajusta o primeiro com o terceiro...

Eu não programo eu Delphi, mas vou tentar te ajudar.

Abaixo fiz um código em Pascal... não está perfeito, mas funciona!!!

Ai passar para o Delphi fica por tua conta!!! (tente, posso tentar ajudar tambpém)

Se você conseguir colocar "proximaPalavra()" no Delphi, daí é só inserir o retorno dela no arquivo...

Código

Program Gera_Sequencia;

(*
/*
Name : Gera_Sequencia.
Author : Simon Viegas.
Description : Gerador de sequência.
Date : 26/08/09 19:19.
Copyright : Fórum do Clube do Hardware (Pascal/Delphi).
*/
*)

const
(*
REGRAS

1) ambos tem quer ter a mesma quantidade de letras}
2) inicio tem que ser menor que o fim (óbvio)
3) caracteres suportados: A..Z e 1..0.
4)...

*)

palavraInicio = 'AAA';
palavraFim = '000';

{retorna o sucessor da letra}
function sucessor(letra:char):char;
var
temp :char;
begin
case letra of
'A'..'Y' :temp:=succ(letra);
'Z' :temp:='1';
'1'..'8' :temp:=succ(letra);
'9' :temp:='0';
'0' :temp:='A';
else
writeln('Tem algum erro nos caracteres');
writeln('Verifique as constantes palavraInicio e palavraFim');
readln;
halt; {fecha o programa}
end; {fim case}
sucessor:=temp;
end;

{retorna a próxima palavra}
function proximaPalavra(var palavra:string; posicao:byte):string;
var
tamanho :byte;
pos :byte;
begin
tamanho:=length(palavra); {tamanha}
pos:=tamanho-posicao+1;
if (palavra[pos] = '0') then
proximaPalavra(palavra,posicao+1); {chama em recursividade}
palavra[pos] := sucessor(palavra[pos]);
proximaPalavra:=palavra;
end;

var
palavra :string;
Begin
palavra:=palavraInicio;
writeln(palavra);
while palavra <> palavraFim do
writeln(proximaPalavra(palavra,1));
readln;
end.

Fico no aguardo...

Abraços

Link para o comentário
Compartilhar em outros sites

Interessante, estou pensando um outro jeito aqui, e se você usar as letras e os números, como se fossem todos números:Ex de A até Z são 27 e de 0 até 9 são 10 no total serão 36.

Assim você poderia usar A até 9 sendo a posição no array e depois mostrar

Array[1] := 'A'

Array[2] := 'B'

Array[28] := '0'

Iniciaria com uma Var letras:String := 'AAAAAAAA'

Alafanumero:Array[1..36] of String que nas posições serão ocupadas por 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'

Em seguida você cria uma função para sempre ler da direita para a esquerda (fica mais fácil assim pois será usada toda vez para ver se passa ou não para a próxima casa, e pelo que você disse AAAAAAAB)

Depois entra o loop para trocar a var "letras"

while letras <> '99999999' do

Pensando o resto do while aqui mas acho que teria um outro loop dentro do primeiro loop para pecorrer a var "letras".

Link para o comentário
Compartilhar em outros sites

Ola amigos obrigado pelas sugestões algumas ja foram implementadas por mim e outros colegas , vejam o codigo abaixo e nos ajudem a melhorar, implementar.



const
_cst_validchars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

function Tform1.CharInStr( const aChar : Char ) : Integer;
var
i : Integer;
Achou : Boolean;
begin
i:=0;
Achou := False;
while (not Achou ) and (i<length(_cst_validchars)) do begin
inc(i);
Achou := ( aChar = _cst_validchars[i] );
end;

// Se encontrar, tá certo.
// Se não encontrar retornaremos o ultimo caracter valido
// na esperança de sairmos de algum loop.
Result := i;
end;

procedure TForm1.Sequencia( const aTam : Integer; var aSequencia : String; var aUltimo : Boolean );
var
i,k,l : Integer;
begin
while Length(aSequencia)<aTam do
aSequencia := aSequencia + _cst_validchars[1];

aUltimo := False;
l := Length( _cst_validchars );
k := aTam;
i := CharInStr(aSequencia[k]);
// Ainda tem caracteres validos para listar?
if i<l then
// Sim.
aSequencia[k] := _cst_validchars[i+1]
else begin
// Não. temos que retroceder.
// Esse laço vai procurar o caracter na combinação
// que pode ser incrementado.
repeat
dec(k);
i := CharInStr( aSequencia[k] );
until (k=0) or (i<l);
// Encontramos o caracter que pode ser incrementado?
if k>=1 then begin
// Incrementado caracter encontrado
aSequencia[k] := _cst_validchars[i+1];
// Resetando os outros a partir de k
while k<aTam do begin
inc(k);
aSequencia[k] := _cst_validchars[1];
end;
end
else
aUltimo := True;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
S : String;
Ultimo : Boolean;
Lista : TStringList;
begin
Lista:= TStringList.Create;
S:= ''; // Ou um valor qualquer ex: '1234';
Ultimo := False;

// ListBox1.Items.BeginUpdate;
while not Ultimo do begin
Sequencia( 5, S, Ultimo );

// ListBox1.Items.Add( S );
Lista.Add(S)

end;
// ListBox1.Items.EndUpdate;
// Lista.Add(ListBox1.Items.GetText);
Lista.SaveToFile('c:\log.txt');
Lista.Free;
end;



end.

o problema é que com 4 ate 5 carcteres tudo bem, mas com 6 ja falta memoria, por isso estou pensando em uma maneira de gravar direteamente para o arquivo em quanto ele esta criando as sequencias, assim a memoria ficaria livre para ir despejando para o arquivo.

O tamnho seria uns 8 mb eu axxo que da pra caregar tranquilo, tamb deveira ter um nome diferente a medida que ia sendo criado varios arquivos.

Se pudesemos fazer o sistema gerar os carcteres tipo

AAAAAAAA

AAAAAAAB

e nao começarar com

AA

AB

e so então chegar no 8 carcteres acho que iria diminuir o tamnho do arquivo e tamb o tempo de processamento.

não sei se consegui explicar duvidas temo ai.

alguma ideia de como podemos fazer?

Abraço

Link para o comentário
Compartilhar em outros sites

_cst_validchars[1] ele irá pegar a string 'A'??? você pode falar a posição do carctere em uma constante como se fosse um array?

No fim de semana vou bolar o restante do while mas acho que do meu jeito sai do seu jeito ;)

Mas a idea é esquecer que tem ABC..0123 e ir como do 1 ao 36 pois fica mais fácil para entender.

1,1,1,1,1,1,1,1 (usei vírgulas para ficar mais fácil de ver) assim uso o loop para ir aumentando o primeiro 1 até o 37 quando chegar no 37 ele incrementa o proximo número e assim vai, ou seja função de checar o número se é 37 e passar o que é 37 para 1 e mudar o próximo para ele + 1 e depois passar a mesma função com isso ficaria um loop dentro de outro loop sendo o primeiro ele ficará responsável para mudar o primeiro carctere até chegar no 37 e o outro seria uma sequencia de teste para saber se quando chegar no 37 ele muda a proxima casa e se essa casa chegou no 37 e assim por diante ate chegar no 9,9,9,9,9,9,9,9.

Link para o comentário
Compartilhar em outros sites

  • 9 anos depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!