Fórum Númreo de letras diferentes numa palavra #245186

30/07/2004

0

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


Tnaires

Tnaires

Responder

Posts

30/07/2004

Beppe

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.


Responder

Gostei + 0

30/07/2004

Tnaires

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


Responder

Gostei + 0

30/07/2004

Beppe

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


Responder

Gostei + 0

30/07/2004

Rômulo Barros

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



Responder

Gostei + 0

30/07/2004

Tnaires

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


Responder

Gostei + 0

02/08/2004

Rômulo Barros

[color=red:c8fcb89d81][b:c8fcb89d81]Complementando:[/b:c8fcb89d81][/color:c8fcb89d81]


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:


Responder

Gostei + 0

02/08/2004

Nildo

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;



Responder

Gostei + 0

02/08/2004

Tnaires

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


Responder

Gostei + 0

20/10/2022

William Keller

Se voce estiver procurando por letras diferentes, recomendo este site
https://4devs.net.br/letras-diferentes-bonitas-personalizadas/
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar