Jump to content
Sign in to follow this  
i307

Contar palavras

Recommended Posts

i307

Preciso de uma funcao segura e eficiente para contar palavras.

Tenho este mas com erros:

int conta_palavra(char frase[])
{
    int i,palavras=0;
    if (frase[0]!='\0')
        palavras=1;
    for (i=0;i<50;i++){
        if (frase[i] == ' ' && frase[i+1]!='\0')
            palavras++;
        if (frase[i] == '.' && frase[i-1]!= ' ')
            palavras++;
    }

    return palavras;


}

Share this post


Link to post
Share on other sites
KiNgPiTo

Algo aqui à pressa:

int conta_palavra(char frase[])
{
        int i=0, j=0;

	while ( frase[i] != '\0' ){
		if ( frase[i] == ' ' ){
			j++;
		}
	i++;
	}

	if ( j != 0 ) // Apenas para corrigir o numero de espaços para o numero de palavras
		j++;

return j; // Se retornar zero, existe uma ou nenhuma palavra... se > 0 é o numero de palavras

}

Não testei mas deve funcionar. Se bem que alguém aparece já aí com uma função com bem menos linhas de código ;)

Share this post


Link to post
Share on other sites
TheDark

É difícil sugerir melhorias sem te dar o código todo (como foi feito no post acima e é algo repudiado até certo ponto cá no fórum, mas que parece difícil de compreender), mas vou tentar explicar o algoritmo que sugiro.

Precisas de uma variável para contar as palavras, e uma flag para saber se te encontras numa palavra ou não.

Começa com um ciclo que percorra toda a string, enquanto não encontrar um caracter == '\0';

    Dentro do ciclo, se o caracter actual não for um espaço ou um ponto, e não te encontrares dentro de uma

    palavra:

        incrementas o número de palavras e afectas a flag com um valor que indique que te encontras dentro

        de uma palavra;

    Caso contrário:

        afectas a flag com um valor que indique que não estás numa palavra.

P.S.: Já agora, o código acima não funciona para strings com múltiplos espaços seguidos, além de outros casos mais específicos (começar e terminar com espaço, contiver só uma palavra sem espaços, etc.).


Desaparecido.

Share this post


Link to post
Share on other sites
i307

tradução de "flag" se faz favor  :cheesygrin:

É assim , o meu código estava já aceitável , mas apresentando problemas para espaços no fim da última palavra e assim.

Eu sinceramente não estou entendendo o que queres dizer.

Share this post


Link to post
Share on other sites
Localhost

Acho que uma solução muito simples seria contar os espaços que a string tem.

Vamos dar este exemplo:

Olá mundo tudo bem

Esta string tem 3 espaços, ou seja, tem 4 palavras.

Esta parece-me pensada por alto uma solução muito simples, até pode ter algum caso especial mas não me estou a lembrar.

Um pseudo código simples seria (não sou muito bom nisso mas):

percorrer string {
  se for espaço incrementa aux
}
return aux + 1

edit: Testa isto e dá um feedback, agora fiquei curioso se esta solução resulta.


here since 2009

Share this post


Link to post
Share on other sites
i307

Acho que uma solução muito simples seria contar os espaços que a string tem.

Vamos dar este exemplo:

Olá mundo tudo bem

Esta string tem 3 espaços, ou seja, tem 4 palavras.

Esta parece-me pensada por alto uma solução muito simples, até pode ter algum caso especial mas não me estou a lembrar.

Um pseudo código simples seria (não sou muito bom nisso mas):

percorrer string {
  se for espaço incrementa aux
}
return aux + 1

edit: Testa isto e dá um feedback, agora fiquei curioso se esta solução resulta.

Isso é +- o código que eu postei no 1º post , mas mais simplificado.

E funciona , eu fiz com um for e a variável está inicializada a 1. O problema é com os espaços no fim da frase , mas como isso também não é uma escrita correcta vou ignorar.

Repara que no meu código também conto com os pontos finais , que normalmente separam palavras também.

Share this post


Link to post
Share on other sites
Localhost

É assim visto que já vi que percebeste a solução para isto vou-te deixar aqui um código mais limpo.

while(str[k]) {
  if(str[k] == ' ' || str[k] == '.') aux++; // incrementa aux se for um ponto ou espaço
  k++;
}
return aux + 1;

Simples, não? Se quiseres também podes começar a percorrer a string de trás para a frente e a pôr um terminador se a posição for um espaço, fazer isto até encontrar um caracter diferente de espaço. Digo isto para retirares os espaços do final da string.


here since 2009

Share this post


Link to post
Share on other sites
i307

É assim visto que já vi que percebeste a solução para isto vou-te deixar aqui um código mais limpo.

while(str[k]) {
  if(str[k] == ' ' || str[k] == '.') aux++; // incrementa aux se for um ponto ou espaço
  k++;
}
return aux + 1;

Simples, não? Se quiseres também podes começar a percorrer a string de trás para a frente e a pôr um terminador se a posição for um espaço, fazer isto até encontrar um caracter diferente de espaço. Digo isto para retirares os espaços do final da string.

sim , assim está mais simples  :D

apesar de eu preferir for em vez de while. Acho mais simples  ;)

Share this post


Link to post
Share on other sites
Localhost

Faz como achares que for mais simples para ti.

Atenção que o meu código tem algumas contra partidas como indicou o TheDark para o código do kingpito que fez basicamente a mesma coisa que eu.

Se a string contiver vários espaços seguidos não te vai retornar o número correcto de palavras.


here since 2009

Share this post


Link to post
Share on other sites
jarsantos

algumas notas:

1 - estão a esquecer-se de verificar as novas linhas

2 - não faz sentido estarem preocupados com o ponto final, depois de um ponto final vem sempre um espaço ou uma nova linha. Se se preocupam com o ponto final teriam que se preocupar com todos os símbolos de pontuação da língua portuguesa (!, ?, :, etc...)

int i = 0;
int flag = 0;

while( string[i] != '\0')
{
    if((string[i] == ' ' || string[i] == '\n') && flag == 0)
    {
        flag++;
        counter++;
    }
    else
        if(flag != 0)
            flag = 0;
}

Share this post


Link to post
Share on other sites
TheDark

Vamos dar este exemplo:

Olá mundo tudo bem

Esta string tem 3 espaços, ou seja, tem 4 palavras.

Então e se for

Olá    mundo  tudo    bem    .

?

É assim visto que já vi que percebeste a solução para isto vou-te deixar aqui um código mais limpo.

while(str[k]) {
  if(str[k] == ' ' || str[k] == '.') aux++; // incrementa aux se for um ponto ou espaço
  k++;
}
return aux + 1;

Então e se for

Ola Mundo.  Espero que    esteja tudo bem. Hoje  acordei cedo .

?

Resta saber quais as garantias que te são dadas:

- a string está sempre bem formatada? Ou seja, não contém espaços nem no início, nem no fim? E os sinais de pontuação são sempre seguidos de espaço? e os espaços entre as palavras são sempre singulares?

- em caso negativo, quais são os sinais de pontuação previstos?

- cada string consiste numa só linha, ou pode estar dividida em várias, como no caso indicado pelo jarsantos?


Desaparecido.

Share this post


Link to post
Share on other sites
Localhost

Atenção que o meu código tem algumas contra partidas como indicou o TheDark para o código do kingpito que fez basicamente a mesma coisa que eu.


here since 2009

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.