Ir ao conteúdo
  • Cadastre-se

Embaralhar Letras


Sleip

Posts recomendados

  • Membro VIP

Olá! Bem vindo(a) ao forum!

Não achei nenhum código pronto então resolvi eu mesmo fazer.. fiz uns testes, parece estar funcionando perfeitamente..

Segue a rotina.

function TForm1.Embaralhar(s:string): string;
var
Palavra:TStringList;
i,a:integer;
begin
Palavra := TStringList.Create;
Randomize;
for i:=1 to Length(s) do
Palavra.Add(s[i]);
for i:= 1 to Length(s) do
begin
a := Random(Palavra.Count);
Result := Result+Palavra.Strings[a];
Palavra.Delete(a);
end;
Palavra.Free;
end;

Você deve chama-la assim:

Embaralhar('sua palavra');

No meu programa, coloquei 2 TEdits e um TButton (e uma TLabel inutil): O primeiro edit para a palavra normal, a segunda edit para a palavra já embaralhada, e o botão para fazer tudo acontecer.

Segue o codigo da UNIT completa:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
function Embaralhar(s:string): string;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.Embaralhar(s:string): string;
var
Palavra:TStringList;
i,a:integer;
begin
Palavra := TStringList.Create;
Randomize;
for i:=1 to Length(s) do
Palavra.Add(s[i]);
for i:= 1 to Length(s) do
begin
a := Random(Palavra.Count);
Result := Result+Palavra.Strings[a];
Palavra.Delete(a);
end;
Palavra.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := Embaralhar(Edit1.text);
end;

end.

Eu não deveria te entregar o código assim, pronto. Mas estou imaginando que você tentou algo (e assim espero!)

Mas aproveito para fazer você ter algum trabalho:

Lembre-se que as letras são pegas aleatoriamente. Isso significa que, se o cara der muita sorte, a palavra 'estudar' pode volta para 'estudar', igual, ou parecida, 'esutdar'..

Deixo para você pensar e tentar inventar uma maneira que isso não ocorra, se precisar de ajuda não hesite em postar, que terei o prazer em ajudar!

Qualquer coisa é só postar.. se quiser que eu explique o código, sinta-se a vontade..

Abraços!

Link para o comentário
Compartilhar em outros sites

Ah, apelação usar a TStringList! :b

Mas ficou muito bom o código, muito curto. Eu já tinha tentado fazer um código assim, mas como eu nunca soube mexer muito bem com StringList, eu acabei não tendo muito sucesso. Se eu não me engano, quando a palavra tinha letras iguais dava problema no meu...

Mas eu não entendi a função Randomize, que vem logo depois que você instancia a stringlist. Eu tirei ela aqui e o programa ainda funcionou legal.

E eu acho que você trocou uma besterinha no código, nada que o fizesse não funcionar. Mas você tá recebendo a variável s como parâmetro e tá trabalhando com o Edit, ao invés de trabalhar com ela, tá ligado?

Ficou bem legal o código.

Link para o comentário
Compartilhar em outros sites

me desculpe eu não te avisado, mas estou fazendo no free pascal

segue o que eu fiz


program teste;

uses crt;

var a:array[1..6] of integer;
palavra:string;
i, i2:integer;
qtd:integer;
mundanca:integer;

begin
clrscr;
randomize;
write('Palavra: ');
readln(palavra);
//aqui começa a randomização
qtd:=length(palavra);
for i:=1 to qtd do
begin
mundanca:=a[i];
a[i]:=random(length(palavra));
for i2:=2 to qtd do
begin
if a[i2]=a[i] then
mundanca:=a[i];
end;
end;

for i:= 1 to qtd do
write(palavra[a[i]]);

readkey;
end.

:eek: ta meio estranho mas ele ate que esta embaralhando... agora não consigo colocar ele para não repetir.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Ah, apelação usar a TStringList! :b

Mas ficou muito bom o código, muito curto. Eu já tinha tentado fazer um código assim, mas como eu nunca soube mexer muito bem com StringList, eu acabei não tendo muito sucesso. Se eu não me engano, quando a palavra tinha letras iguais dava problema no meu...

Quer uma explicação sobre TStringLists ?

Mas eu não entendi a função Randomize, que vem logo depois que você instancia a stringlist. Eu tirei ela aqui e o programa ainda funcionou legal.

Pra falar a verdade eu ja tinha tentado isso (em um outro projeto): Tirar o Randomize;, e funciona! Mas tente o seguinte:

Coloque um botão no formulario (apenas) e no OnClick:

ShowMessage(IntToStr(Random(10)+1));

Tente apertar o botão mais de uma vez.

Agora adicione o Randomize; antes do "ShowMessage", veja a diferenca.

E eu acho que você trocou uma besterinha no código, nada que o fizesse não funcionar. Mas você tá recebendo a variável s como parâmetro e tá trabalhando com o Edit, ao invés de trabalhar com ela, tá ligado?

Você está certo! ^_^

Me desculpem pelo erro. Ja editei la e estou postando aqui o codigo certinho:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
function Embaralhar(s:string): string;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.Embaralhar(s:string): string;
var
Palavra:TStringList;
i,a:integer;
begin
Palavra := TStringList.Create;
Randomize;
for i:=1 to Length(s) do
Palavra.Add(s[i]);
for i:= 1 to Length(s) do
begin
a := Random(Palavra.Count);
Result := Result+Palavra.Strings[a];
Palavra.Delete(a);
end;
Palavra.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := Embaralhar(Edit1.text);
end;

end.

Sleip não conheco muito sobre o pascal em si, mais de delphi (que é ligeiramente diferente).. Não posso instrui-lo com exatidão.. mas tente criar um lugar onde você pode gravar todos os que ja foram, e na hora que ele criar um igual você mande criar de novo (utilizando while)

Qualquer coisa poste e tentarei explicar melhor..

Abraços!

Link para o comentário
Compartilhar em outros sites

Quer uma explicação sobre TStringLists ?

Eu quero :b

Pra falar a verdade eu ja tinha tentado isso (em um outro projeto): Tirar o Randomize;, e funciona! Mas tente o seguinte:

Coloque um botão no formulario (apenas) e no OnClick:

ShowMessage(IntToStr(Random(10)+1));

Tente apertar o botão mais de uma vez.

Agora adicione o Randomize; antes do "ShowMessage", veja a diferenca.

Hmm, vou testar depois. Só num testo agora porque eu to morrendo de sono... vou dormir já já.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Eu quero :b

Err.. pra falar a verdade.. não tem muito o que explicar..

um TStringList se comporta quase igual a um TListBox, podemos trabalhar da mesma maneira..

uma vez declarado a variavel

var

Bla:TStringList;

ela precisa ser criada, chamando o constructor:

Bla := TStringList.Create;

após isso, se comporta de maneira igual a uma ListBox, só que sem os graficos..

Bla.Add('Item'); adiciona

Bla.Items.Count; quantos itens tem

Bla.Strings[x]; acessa o item x

E por ai vai..

Lembrando que é sempre bom depois que não for mais usar dar um Bla.free para libera-la da memoria ^^

Não sou la muito bom explicando, portanto se ainda tiver alguma duvida (como eu imagino que tenha porque minha explicação foi um lixo) separei um site:

http://www.delphibasics.co.uk/RTL.asp?Name=TStringList

Desculpe mas só achei em inglês, se não souber tente utilizar um tradutor online como o do google.

Hmm, vou testar depois. Só num testo agora porque eu to morrendo de sono... vou dormir já já.

Esse povo é viciado, 4h da manha postando no forum :lol:

Abraços!

Link para o comentário
Compartilhar em outros sites

Esse povo é viciado, 4h da manha postando no forum :lol:

Abraços!

UASHiAehaiueh... é falta do que fazer mesmo.

Mas gostei da explicação, eu só usei TStringList no meu último bimestre de fundamentos de programação, pudia até ter aprendido mais, mas vou ver se aprendo agora com o link que você mandou.

E sobre o randomize, eu testei do jeito que você disse e não senti nenhuma diferença... Era pra acontecer o que de diferente entre o código com e o código sem o randomize?

Valeu!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
E sobre o randomize, eu testei do jeito que você disse e não senti nenhuma diferença... Era pra acontecer o que de diferente entre o código com e o código sem o randomize?

Valeu!

Hmm, estranho.

Testei novamente aqui, mudando algumas coisas.. e aparentemente realmente funciona sem o randomize..

mas com um porém

sem o randomize, sempre a primeira vez tem valor inicial

por exemplo

ShowMessage(IntToStr(random(10));

A primeira vez que você usar, vai retornar 0, sempre.

Acho que quando utilizamos o random ele aplica automaticamente um randomize..

Mas pelo motivo de começar sempre pelo valor inicial que é bom usar o randomize..

E eu ja tive casos em que tive que colocar o Randomize em um loop, junto com o random, pois retornava sempre o mesmo valor.. embora tenha testado aqui e não tenha acontecido o mesmo..

Bom, vou pesquisar a respeito disso..

Mas continua sendo bom colocar o randomize, afinal com certeza não foi criada sem motivo :P

Abraços e se eu achar algo posto ou entro em contato por MP!

Link para o comentário
Compartilhar em outros sites

Beleza! Essas funções de random são meio sinistras. Uma aplicação que eu tava fazendo tava vindo sempre com o zero como valor inicial. Mas eu usei uma outra versão do Delphi e já não acontecia isso... é meio esquisito essas coisas. Mas realmente, tenta pensar numa função que faça com que o computador "aja" aleatoriamente... eu não consigo imaginar.

Vou ver se o google tem algumas dessas respostas depois :b

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!