Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

i307

Contar palavras

Mensagens Recomendadas

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;


}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
i307

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

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.