i307 0 Denunciar mensagem Publicado 12 de Abril de 2010 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 6 Denunciar mensagem Publicado 12 de Abril de 2010 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 0 Denunciar mensagem Publicado 12 de Abril de 2010 É 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 0 Denunciar mensagem Publicado 12 de Abril de 2010 tradução de "flag" se faz favor É 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 3 Denunciar mensagem Publicado 12 de Abril de 2010 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 0 Denunciar mensagem Publicado 12 de Abril de 2010 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 3 Denunciar mensagem Publicado 12 de Abril de 2010 É 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 0 Denunciar mensagem Publicado 12 de Abril de 2010 É 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 apesar de eu preferir for em vez de while. Acho mais simples Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Localhost 3 Denunciar mensagem Publicado 12 de Abril de 2010 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
i307 0 Denunciar mensagem Publicado 12 de Abril de 2010 Eu sei. Mas isso como não é uma forma correcta de escrever. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
jarsantos 0 Denunciar mensagem Publicado 13 de Abril de 2010 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 0 Denunciar mensagem Publicado 13 de Abril de 2010 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 3 Denunciar mensagem Publicado 13 de Abril de 2010 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
TheDark 0 Denunciar mensagem Publicado 14 de Abril de 2010 Hehe, saltei esse post 😳 De qualquer forma, fica a informação! Desaparecido. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites