Númreo de letras diferentes numa palavra
Galera...
Alguém aqui já tentou fazer um algoritmo pra contar o número de letras diferentes dentro de uma palavra?
Ex: a palavra casa tem tamanho 4, mas tem 3 letras diferentes.
Infelizmente, isto está além da minha capacidade (por enquanto)...
Abraços
Alguém aqui já tentou fazer um algoritmo pra contar o número de letras diferentes dentro de uma palavra?
Ex: a palavra casa tem tamanho 4, mas tem 3 letras diferentes.
Infelizmente, isto está além da minha capacidade (por enquanto)...
Abraços
Tnaires
Curtidas 0
Respostas
Beppe
30/07/2004
1) Vc precisa manter a contagem de cada caractere que possa aparecer. Ex: array[Char] of Integer;
2) Para cada caractere na string, aumente a sua contagem no array. Ex: Inc(Contagem[S[I]]);
3) O numero de caracteres diferentes é o numero de caracteres com contagem diferente de 0.
2) Para cada caractere na string, aumente a sua contagem no array. Ex: Inc(Contagem[S[I]]);
3) O numero de caracteres diferentes é o numero de caracteres com contagem diferente de 0.
GOSTEI 0
Tnaires
30/07/2004
Valeu Beppe! Suas dicas certamente ajudarão.
E se eu cismasse de fazer de maneira recursiva?
Veja o meu raciocínio: o caso-base é qdo a palavra tem um caractere (a função deve retornar 1), mas vamos deixar isso de lado e assumir q o caso-base é qdo a palavra tem dois caracteres. Então, ficaria assim:
Obrigado
E se eu cismasse de fazer de maneira recursiva?
Veja o meu raciocínio: o caso-base é qdo a palavra tem um caractere (a função deve retornar 1), mas vamos deixar isso de lado e assumir q o caso-base é qdo a palavra tem dois caracteres. Então, ficaria assim:
se tamanho = 2 então inicio se palavra[tamanho] = palavra[tamanho - 1] então retorne 1 senão retorne 2 fim senao Aqui - qual a linha recursiva a se escrever agora?
Obrigado
GOSTEI 0
Beppe
30/07/2004
Recursão adiciona complexida e faz perder a eficiência do processo inerentemente iterativo, Não obstante, é possível fazer desta forma. A rotina recursiva deverá ser uma rotina aninhada, e o array ser local a rotina principal.
A rotina não precisa retornar um valor...o efeito colateral da rotina fica somente no array. Para prosseguir com os demais casos, chame ContaCaracter(Linha, Tamanho - 1)
PS: Tá me cheirando a trabalho de facul...se for azar o seu... :P
A rotina não precisa retornar um valor...o efeito colateral da rotina fica somente no array. Para prosseguir com os demais casos, chame ContaCaracter(Linha, Tamanho - 1)
PS: Tá me cheirando a trabalho de facul...se for azar o seu... :P
GOSTEI 0
Rômulo Barros
30/07/2004
Algoritmo ContaPalavras Declare Auxiliar,Auxiliar2 : numeric[10]; PalavrasExistentes = vetor[1..23] de Caractere; TotalPalavras : Numeric[5]; Metodo QtdLetras(APalavra : Caractere) : Numeric; Inicio Para Auxiliar := 1 To Length(APalavra) Faça Inicio Para Auxiliar2 := 1 To 23 Do Se(Parte(APalavra,1,Auxiliar) = PalavrasExistentes[Auxiliar2])Então Inicio Saia; // Break; Se(Auxiliar2 = 23)Então Inicio TotalPalavras := TotalPalavras + 1; Fim-se Fim-se Fim-para QtdLetras := TotalPalavras; // Resultado Final Fim-metodo Fim-Algoritmo
GOSTEI 0
Tnaires
30/07/2004
:D uheuheuehuehuehuehe
De fato, é trabalho de faculdade. :oops:
Vou explicar a situação com detalhes.
Estou terminando um jogo de forca pra Java, usando a plataforma J2ME. Trata-se de um projeto de final de semestre. Eu guardo o número de acertos do jogador em uma variável chamada nAcertos, e a cada letra inserida pelo celular, eu preciso conferir se o número de acertos é igual ao número de letras diferentes na palavra atual (isso significa q ele ganhou o jogo).
Exemplo: se a palavra atual for casa e ele digitar ´A´, um acerto é cotado. Antes eu tava contando como dois acertos e comparando se nAcertos era igual ao tamanho do string, mas deu problema em outros mecanismos de fluxo de tela do jogo.
Ei, mas valeu as dicas, e abraços.
De fato, é trabalho de faculdade. :oops:
Vou explicar a situação com detalhes.
Estou terminando um jogo de forca pra Java, usando a plataforma J2ME. Trata-se de um projeto de final de semestre. Eu guardo o número de acertos do jogador em uma variável chamada nAcertos, e a cada letra inserida pelo celular, eu preciso conferir se o número de acertos é igual ao número de letras diferentes na palavra atual (isso significa q ele ganhou o jogo).
Exemplo: se a palavra atual for casa e ele digitar ´A´, um acerto é cotado. Antes eu tava contando como dois acertos e comparando se nAcertos era igual ao tamanho do string, mas deu problema em outros mecanismos de fluxo de tela do jogo.
Ei, mas valeu as dicas, e abraços.
GOSTEI 0
Rômulo Barros
30/07/2004
[color=red:c8fcb89d81][b:c8fcb89d81]Complementando:[/b:c8fcb89d81][/color:c8fcb89d81]
:wink: :wink: :wink: :wink:
Var
Form1 : TForm1 ;
Palavra : String ;
Auxiliar ,
Auxiliar2 ,
TotalPalavras : Byte;
PalavraJaExiste : Boolean ;
PalavrasContadas : TStrings ;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Auxiliar := 0 ;
Auxiliar2 := 0 ;
TotalPalavras := 0 ;
Palavra := ´undeclared Identifier´ ;
PalavrasContadas := TStringList.Create() ;
For Auxiliar := 1 To Length(Palavra) Do
Begin
PalavraJaExiste := False;
For Auxiliar2 := 0 To PalavrasContadas.Count -1 Do
Begin
If PalavrasContadas.Count -1 < 0 Then // Se naum existir nenhuma palavra na lista (Auxiliar = 1)
Break;
If(Copy(Palavra,Auxiliar,1) = PalavrasContadas[Auxiliar2])Then
{ A linha abaixo pode substituir a linha a cima, para NÃO diferenciar Minúsculas de Maiúsculas
If(UpperCase(Copy(Palavra,Auxiliar,1)) = UpperCase(PalavrasContadas[Auxiliar2]))Then}
Begin
PalavraJaExiste := True ;
Break ;
End;
End;
If(Not(PalavraJaExiste))Then
Begin
Inc(TotalPalavras) ;
PalavrasContadas.Add(Copy(Palavra,Auxiliar,1)) ;
End;
End;
ShowMessage(IntToStr(TotalPalavras)) ;
FreeAndNil(PalavrasContadas) ;
end;:wink: :wink: :wink: :wink:
GOSTEI 0
Nildo
30/07/2004
Essa rotina abaixo que eu montei vai colcoar em uma string as letras repetidas, e mantendo velocidade. A unica coisa que não é necessário é aquele POS que eu coloquei, você tem que colocar algum esquema igual ao que eu coloquei da Array para manter maior performace. Mas funciona =P
const Palavra = ´parangaricotirimirruaro´; // Chapolin :-) var Letras: array [65..90] of Boolean; // ´A´ a ´Z´ nAux: Integer; // Váriavel de controle. Odeio usar I. Final: String; begin for nAux := Low( Letras ) to High( Letras ) do Letras[ nAux ] := False; for nAux := 1 to Length( Palavra ) do begin if not Letras[ Ord( UpperCase( Palavra )[ nAux ] ) ] then Letras[ Ord( UpperCase( Palavra )[ nAux ] ) ] := True else if Pos( Palavra[ nAux ], Final ) = 0 then Final := Final + Palavra[ nAux ]; end; ShowMessage( ´Palavras: ´ + Palavra + 1310 + ´Letras repetidas: ´ + Final ); end;
GOSTEI 0
Tnaires
30/07/2004
Valeu galera. No final, acabei não usando o algoritmo. Descobri q o erro estava acontecendo pq eu não estava zerando o número de acertos do jogador após a primeira partida.
Vcs podem ter se perguntado: pq ele queria de maneira recursiva? Bom, antes de lançar o tópico, eu havia desistido da maneira iterativa, pois não tava saindo do canto. E faltava apenas a instrução recursiva pra terminar. Entretranto, recursivamente é pior do q iterativamente, devido à capacidade limitada dos dispositivos móveis.
Abraços
Vcs podem ter se perguntado: pq ele queria de maneira recursiva? Bom, antes de lançar o tópico, eu havia desistido da maneira iterativa, pois não tava saindo do canto. E faltava apenas a instrução recursiva pra terminar. Entretranto, recursivamente é pior do q iterativamente, devido à capacidade limitada dos dispositivos móveis.
Abraços
GOSTEI 0
William Keller
30/07/2004
Se voce estiver procurando por letras diferentes, recomendo este site
https://4devs.net.br/letras-diferentes-bonitas-personalizadas/
https://4devs.net.br/letras-diferentes-bonitas-personalizadas/
GOSTEI 0