Subsequencia em Delphi
Olá pessoal, tenho o seguinte exercício:
Considere alguma sequência de elementos (difere de um mero conjunto de elementos por
denir uma ordem entre os seus membros). a) Enumere, ent~ao, todas as subsequ^encias n~aocont
nuas de uma dada sequ^encia. b) Liste todas as permutac~oes do conjunto de elementos
da sequência.
1. Uma subsequência sempre contem algum subconjunto de elementos da sequência, na
mesma ordem.
2. Uma subsequência contínua e aquela em que nenhum elemento esta faltando, entre o
primeiro e o ultimo elemento da subsequência.
3. Exemplo de subsequ^encias n~ao contnuas:
(1,2,3,4) ) [[1, 2, 4], [1, 3, 4], [1, 3], [1, 4], [2, 4]]
4. Exemplo de permutacão:
(1,2,3,4) ) [[1, 2, 3, 4], [2, 1, 3, 4], [2, 3, 1, 4], [2, 3, 4, 1]]
Não estou pedindo resposta, só quero uma ideia para clarear o racicínio. Como posso fazer para montar cada subsequência com os números digitados ? Não sei como poderia fazer com que os números digitados dentrdo TEdit sejam "separados" e dessa forma montar a sequência?
Não tenho experiência em Delphi, comecei a aprende a pouco tempo, mais uma vez, não estou pedindo resposta, só quer uma ideia para o raciocínio. Desde já, agradeço!
Considere alguma sequência de elementos (difere de um mero conjunto de elementos por
denir uma ordem entre os seus membros). a) Enumere, ent~ao, todas as subsequ^encias n~aocont
nuas de uma dada sequ^encia. b) Liste todas as permutac~oes do conjunto de elementos
da sequência.
1. Uma subsequência sempre contem algum subconjunto de elementos da sequência, na
mesma ordem.
2. Uma subsequência contínua e aquela em que nenhum elemento esta faltando, entre o
primeiro e o ultimo elemento da subsequência.
3. Exemplo de subsequ^encias n~ao contnuas:
(1,2,3,4) ) [[1, 2, 4], [1, 3, 4], [1, 3], [1, 4], [2, 4]]
4. Exemplo de permutacão:
(1,2,3,4) ) [[1, 2, 3, 4], [2, 1, 3, 4], [2, 3, 1, 4], [2, 3, 4, 1]]
Não estou pedindo resposta, só quero uma ideia para clarear o racicínio. Como posso fazer para montar cada subsequência com os números digitados ? Não sei como poderia fazer com que os números digitados dentrdo TEdit sejam "separados" e dessa forma montar a sequência?
Não tenho experiência em Delphi, comecei a aprende a pouco tempo, mais uma vez, não estou pedindo resposta, só quer uma ideia para o raciocínio. Desde já, agradeço!
Roberto
Curtidas 0
Respostas
Cauê Nishijima
03/02/2015
Ainda precisa da resposta?
GOSTEI 0
Roberto
03/02/2015
Opa, amigo! Poxa, de uma ajuda sim...não consegui fazer ainda, se puder me dar uma ideia de como posso implementar, agradeço!
GOSTEI 0
Cauê Nishijima
03/02/2015
Antes de te responder, me tira algumas dúvidas...
1 - No primeiro caso de sequencia não continua, não é continua a numeração ou a posição dos números?
Ex.:
Ao invés dos números [1234] do exemplo...se eu digita-se os números [1235], 1235 já seria uma numeração já não continua já que falta o 4?
2 - No exemplo da permutação, a permutação é só com o primeiro número? Pois no seu exemplo ficou faltando algumas permutações:
(1,2,3,4)
[[1, 2, 3, 4]]
[[2, 1, 3, 4], [2, 3, 1, 4], [2, 3, 4, 1]]
[[1, 3, 2, 4], [1, 3, 4, 2]]
[[3, 1, 2, 4], [1, 2, 4, 3]]
[[4, 1, 2, 3], [1, 4, 2, 3]]
1 - No primeiro caso de sequencia não continua, não é continua a numeração ou a posição dos números?
Ex.:
Ao invés dos números [1234] do exemplo...se eu digita-se os números [1235], 1235 já seria uma numeração já não continua já que falta o 4?
2 - No exemplo da permutação, a permutação é só com o primeiro número? Pois no seu exemplo ficou faltando algumas permutações:
(1,2,3,4)
[[1, 2, 3, 4]]
[[2, 1, 3, 4], [2, 3, 1, 4], [2, 3, 4, 1]]
[[1, 3, 2, 4], [1, 3, 4, 2]]
[[3, 1, 2, 4], [1, 2, 4, 3]]
[[4, 1, 2, 3], [1, 4, 2, 3]]
GOSTEI 0
Roberto
03/02/2015
Então, no primeiro caso continua quer dizer que entre o primeiro número e o último nenhum valor falta, no meu caso ela não é contínua, ou seja entre o primeiro e o último número nem todos os valores estão contidos. Nesse caso, eu acho que ela não é contínua na posição.
E no segundo caso, são todas as permutações, no exemplo dado só mostrado com o número 1, mas o certo seria com o resto também. Eu fiz até um código em Pascal para ele permutar, mas o algoritmo não dá todas as permutações. Se você quiser dar uma olhada, segue o código:
E obrigado pela atenção, Cauê!
E no segundo caso, são todas as permutações, no exemplo dado só mostrado com o número 1, mas o certo seria com o resto também. Eu fiz até um código em Pascal para ele permutar, mas o algoritmo não dá todas as permutações. Se você quiser dar uma olhada, segue o código:
pROGRAM LE;
uses crt;
VAR
j,I:INTEGER;
avanca,seq:string;
aux:string[1];
begin
writeln('Digite abaixo a sequencia para trocar');
read(seq);
for i:= 1 to length(seq) do
begin
if seq[i] <> ',' then
avanca:=avanca + seq[i]
end;
for i:=1 to length(avanca) do
begin
for j:=i+1 to length(avanca) do
begin
aux[0]:=avanca[i];
avanca[i]:=avanca[j];
avanca[j]:=aux[0];
writeln(avanca);
end;
end;
readkey;
end.
E obrigado pela atenção, Cauê!
GOSTEI 0
Cauê Nishijima
03/02/2015
Segue resolução:
- Crie um novo projeto, deixei o formulario com o nome padrão Form1
- Adicione um Edit (eu chamei de edtSequencia)
- Adicione 2 ListBox, para receber o resultado da sequencia não continua e da permuta (eu chamei de lstSubSequenciaNaoContinua e de lstPermutacao)
- Adicione 2 Buttons, para efetuar os cálculos da sequencia não continua e da permuta (eu chamei de btnCalcularSubSequenciaNaoContinua e de btnCalcularPermuta
Vamos começar pela Permutação por ser mais simples, segue código do evento onClick do btnCalcularPermuta:
Agora para o calculo da sequencia não continua crie 2 procedures, uma chamada calcularNumeros e outra verificaSeNumeroEntraNaLista
Código do calcularNumeros
Código do verificaSeNumeroEntraNaLista
E finalmente no evento onClick do button btnCalcularSubSequenciaNaoContinua:
Qualquer dúvida, ou se entendi algo erroneamente me avise.
Espero ter ajudado, abraços
Att.Cauê Nishijima
- Crie um novo projeto, deixei o formulario com o nome padrão Form1
- Adicione um Edit (eu chamei de edtSequencia)
- Adicione 2 ListBox, para receber o resultado da sequencia não continua e da permuta (eu chamei de lstSubSequenciaNaoContinua e de lstPermutacao)
- Adicione 2 Buttons, para efetuar os cálculos da sequencia não continua e da permuta (eu chamei de btnCalcularSubSequenciaNaoContinua e de btnCalcularPermuta
Vamos começar pela Permutação por ser mais simples, segue código do evento onClick do btnCalcularPermuta:
procedure TForm1.btnCalcularPermutaClick(Sender: TObject);
var
caracterSelecionado: string;
stringSemCaracterSelecionado: string;
prefixo, sufixo: string;
I: Integer;
begin
caracterSelecionado := Copy(edtSequencia.Text, 1, 1);
stringSemCaracterSelecionado := Copy(edtSequencia.Text, 2,
length(edtSequencia.Text));
for I := 0 to Length(stringSemCaracterSelecionado) do
begin
prefixo := Copy(stringSemCaracterSelecionado,0,I);
sufixo := Copy(stringSemCaracterSelecionado,I+1, length(stringSemCaracterSelecionado));
lstPermutacao.Items.Add(prefixo + caracterSelecionado + sufixo);
end;
end;
Agora para o calculo da sequencia não continua crie 2 procedures, uma chamada calcularNumeros e outra verificaSeNumeroEntraNaLista
Código do calcularNumeros
procedure TForm1.calcularNumeros(numeros: string);
var
tamanho, J, I: Integer;
substring: string;
sequencia: Boolean;
begin
tamanho := length(numeros);
for I := tamanho downto 3 do
begin
for J := 0 to I - 1 do
begin
substring := Copy(numeros, 0, I);
substring := Copy(substring, 0, J) + Copy(substring, J + 2,
length(substring));
verificaSeNumeroEntraNaLista(substring);
if length(substring) >= 3 then
calcularNumeros(substring);
end;
end;
end;
Código do verificaSeNumeroEntraNaLista
procedure TForm1.verificaSeNumeroEntraNaLista(substring: string);
var
numeroAtual, numeroAnterior, I: Integer;
begin
numeroAnterior := StrToInt(Copy(substring, 1, 1));
for I := 2 to length(substring) do
begin
numeroAtual := StrToInt(Copy(substring, I, 1));
if numeroAnterior + 1 <> numeroAtual then
begin
if lstSubSequenciaNaoContinua.Items.IndexOf(substring) < 0 then
lstSubSequenciaNaoContinua.Items.Add(substring);
Break;
end
else
numeroAnterior := numeroAtual;
end;
end;
E finalmente no evento onClick do button btnCalcularSubSequenciaNaoContinua:
procedure TForm1.btnCalcularSubSequenciaNaoContinuaClick(Sender: TObject); begin calcularNumeros(edtSequencia.Text); end;
Qualquer dúvida, ou se entendi algo erroneamente me avise.
Espero ter ajudado, abraços
Att.Cauê Nishijima
GOSTEI 0
Cauê Nishijima
03/02/2015
Vou arrumar o código da permuta e já posto.
GOSTEI 0
Cauê Nishijima
03/02/2015
Arrumando a permuta:
- Crie a seguinte procedure :
E no onClick do btnCalcularPermuta :
Agora acho que esta certo, e vai te ajuda. Abraços!
Att. Cauê Nishijima
- Crie a seguinte procedure :
procedure TForm1.permutar(posicao: integer);
var
I: integer;
prefixo, sufixo, novaString: string;
caracterSelecionado, stringSemCaracterSelecionado: string;
begin
caracterSelecionado := Copy(edtSequencia.Text, posicao, 1);
stringSemCaracterSelecionado := Copy(edtSequencia.Text, 1, posicao - 1) +
Copy(edtSequencia.Text, posicao + 1, Length(edtSequencia.Text));
for I := 0 to Length(stringSemCaracterSelecionado) do
begin
prefixo := Copy(stringSemCaracterSelecionado, 0, I);
sufixo := Copy(stringSemCaracterSelecionado, I + 1,
Length(stringSemCaracterSelecionado));
novaString := prefixo + caracterSelecionado + sufixo;
if lstPermutacao.Items.IndexOf(novaString) < 0 then
lstPermutacao.Items.Add(novaString);
end;
end;
E no onClick do btnCalcularPermuta :
procedure TForm1.btnCalcularPermutaClick(Sender: TObject);
var
I: integer;
begin
for I := 1 to Length(edtSequencia.Text) do
permutar(I);
end;
Agora acho que esta certo, e vai te ajuda. Abraços!
Att. Cauê Nishijima
GOSTEI 0
Roberto
03/02/2015
Poxa, sem palavra para agradecer, Cauê! Muito obrigado tanto pela atenção quando a boa vontade. Eu irei fazer o meu exercício e não copiar do seu, e entender a lógica do programa, vou tentar entender tudo. Obrigado, mais uma vez!
GOSTEI 0
Roberto
03/02/2015
Po amigo, testei ele aqui só que ele imprime somente uma certa quantidade de permutações e de subsequências. No entanto, era preciso que todas fossem mostradas, pode me dar mais uma ajuda? Sem querer te explorar, não precisa fazer tudo não, só me dar uma "luz" do caminho que devo seguir, de qualquer forma eu to tentando aqui também e agradeço a ti por ter me ajudado!
GOSTEI 0
Cauê Nishijima
03/02/2015
E ai Roberto, beleza?
Então eu testei aqui e aparentemente faz todas as permutas e todas as subsequencias, qual seu email pra eu te mandar o fonte do meu
Então eu testei aqui e aparentemente faz todas as permutas e todas as subsequencias, qual seu email pra eu te mandar o fonte do meu
GOSTEI 0
Roberto
03/02/2015
O meu é rfalves94@gmail.com. Obrigado pela atenção! =)
GOSTEI 0
Fabricio
03/02/2015
Caro Cauê,
Boa tarde.
Estou com problemas com o código de permutação. Você poderia mandar o fonte para meu e-mail - fabricioronaldo@globo.com?
Agradeço pela ajuda..
Obrigado.
Boa tarde.
Estou com problemas com o código de permutação. Você poderia mandar o fonte para meu e-mail - fabricioronaldo@globo.com?
Agradeço pela ajuda..
Obrigado.
GOSTEI 0
Priscila
03/02/2015
Prezado Cauê,
Boa tarde.
Também estou com problemas com o código de permutação. Você poderia mandar o fonte para meu e-mail - pricalper@gmail.com?
Agradeço pela ajuda..
Obrigado
Boa tarde.
Também estou com problemas com o código de permutação. Você poderia mandar o fonte para meu e-mail - pricalper@gmail.com?
Agradeço pela ajuda..
Obrigado
GOSTEI 0
Cauê Nishijima
03/02/2015
Olá Priscila te enviei o código por e-mail, mas de qualquer forma subi o arquivo no Google Drive e vou compartilhar o link aqui: Permutação e Subsequência
GOSTEI 0