askazy Posted March 24, 2014 Report Share Posted March 24, 2014 Bom eu acabei clicando em resolvido no outro tópico por engano, em relação a um outro que fiz, então por isso estou criando esse. O objetivo do programa é contar quantas palavras com 5 ou menos letras são digitadas, antes que se digite "#" O exercício tem algumas restrições: -A leitura é feita caractere a caractere, não pode usar string. -O que delimita uma palavra da outra é um espaço em branco - O espaço em branco não conta como palavra, nem #. Exemplo de entrada: e u n a o s e i # Saida: O numero de palavras com 5 ou menos letras eh 3. #include <stdio.h> int main(){ int cont=0,cont2=0; /*cont serve para contar as letras, cont2 conta as palavras que tem menos de 5 letras*/ char letra; do{ letra=getchar(); if (letra!= ' ') /*se letra e diferente de espaço em branco incrementa contador de letras*/ cont++; else{ if (cont>0 && cont <=5) /*se a palavra tem entre 1 ou 5 letras entao incrementa cont2 que é palavras*/ cont2++; else cont=0; } }while (letra!='#'); printf ("O numero de palavras com 5 ou menos letras eh %d\n",cont2); return 0; } Acredito que o problema possa estar nos espaços em branco, porque nao sei como é a leitura deles. Link to comment Share on other sites More sharing options...
polska Posted March 25, 2014 Report Share Posted March 25, 2014 (edited) if (cont>0 && cont <=5) /*se a palavra tem entre 1 ou 5 letras entao incrementa cont2 que é palavras*/ cont2++; else cont=0; Pensa melhor neste passo .. Apenas estás a 'reiniciar' o cont se a palavra for maior que 5 letras, mas nada te garante que a seguir não vais ter que voltar a contar as letras de uma nova palavra. Edited March 25, 2014 by polska 1 Report Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás. Link to comment Share on other sites More sharing options...
askazy Posted March 25, 2014 Author Report Share Posted March 25, 2014 Não consegui entender muito bem o que você falou, mas a minha idéia é: 1) Contar letras até aparecer um espaço em branco 2) Se aparecer um espaço em branco verificar se o numero de letras esta dentro do esperado, se estiver cont2++ uma palavra, senao 0 o cont e começa dinovo. Um problema que percebi é que se caso eu digite aleluia#, vai imprimir 0 mais na verdade tem uma palavra. Link to comment Share on other sites More sharing options...
askazy Posted March 25, 2014 Author Report Share Posted March 25, 2014 alguém me da uma sugestão? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 25, 2014 Report Share Posted March 25, 2014 alguém me da uma sugestão? pega numa folha de papel, e escreve por extenso todos os passos necessários (em português falado) para resolver o problema. não esqueças ou suponhas que está subjacente algum ponto, escreve tudo, mesmo tudo o que é necessário. depois disso, volta a ler o que escreveste e e fizer sentido, compara com o teu código. nota : a conversão de um texto bem escrito é praticamente directo para código IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Rui Carlos Posted March 26, 2014 Report Share Posted March 26, 2014 [...] se estiver cont2++ uma palavra, senao 0 o cont e começa dinovo. Como o polska já referiu, este passo está errado (e não me refiro aos erros de português). Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
oxyzero Posted March 26, 2014 Report Share Posted March 26, 2014 Um problema que percebi é que se caso eu digite aleluia#, vai imprimir 0 mais na verdade tem uma palavra. Se fizeres o input de aleluia#, ele tem obrigatoriamente de dar o output de 0 palavras contadas pois "aleluia" tem 7 caracteres, e o teu programa só conta palavras que tenham entre 1 e 5 caracteres. Além disso, já te indicaram exatamente onde reside o problema. É algo que está-te a passar ao lado pois estás completamente agarrado ao teu código, experimenta fazer o que o @HappyHippyHippo recomendou, vai-te ajudar muito. 😉 Link to comment Share on other sites More sharing options...
askazy Posted March 26, 2014 Author Report Share Posted March 26, 2014 (edited) gostaria de uma indicação de livro de linguagem C, nada muito aprofundado(faço estatística) ou até mesmo vídeo aulas. Edited March 26, 2014 by askazy Link to comment Share on other sites More sharing options...
thoga31 Posted March 26, 2014 Report Share Posted March 26, 2014 (edited) gostaria de uma indicação de livro de linguagem C, nada muito aprofundado(faço estatística) ou até mesmo vídeo aulas. Já criaste um tópico acerca do assunto, não vale a pena espalhar a mesma pergunta em vários locais. Não vais obter resposta mais rapidamente com isso. Mais, perguntar de repente por um livro após as sugestões dadas, a meu ver, não fica nada bem - parece que estás a dizer "mais vale um livro que os vossos conselhos". Se não entendeste os conselhos ou ainda ficaste com dúvidas, pergunta. O pessoal vai arranjar maneira de te ajudar de várias formas possíveis até entenderes, desde que mantenhas o interesse em ser ajudado e em resolver o problema. Edited March 26, 2014 by thoga31 Knowledge is free! Link to comment Share on other sites More sharing options...
askazy Posted March 26, 2014 Author Report Share Posted March 26, 2014 de modo algum estou a desmerecer a ajuda que foi me dada no tópico, apenas perguntei do livro pois tenho muitos outros assuntos ainda a estudar.Hoje a noite tentarei novamente resolver o problema. Link to comment Share on other sites More sharing options...
askazy Posted March 26, 2014 Author Report Share Posted March 26, 2014 (edited) acho que agora eu consegui, pelo menos o que testei funcionou. #include <stdio.h> int main(){ int cont=0,cont2=0; /*cont serve para contar as letras, cont2 conta as palavras que tem menos de 5 letras*/ char letra; do{ letra=getchar(); if (letra != '#' && letra != ' ') cont++; else{ if (cont>0 && cont<=5) cont2++; cont=0; } }while (letra!='#'); printf ("O numero de palavras com 5 ou menos letras eh %d\n",cont2); return 0; } Edited March 26, 2014 by thoga31 GeSHi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 26, 2014 Report Share Posted March 26, 2014 acho que agora eu consegui, pelo menos o que testei funcionou. ainda não ... testa este código com a pequena alteração que fiz para ver o que se passa: #include <stdio.h> int main(){ int cont = 0, cont2 = 0; char letra; do { letra=getchar(); if (letra != '#' && letra != ' ') { cont++; printf("%d >> %c|\n", cont, letra); } else { if (cont>0 && cont<=5) cont2++; cont=0; } } while (letra!='#'); printf ("O numero de palavras com 5 ou menos letras eh %d\n", cont2); return 0; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
askazy Posted March 26, 2014 Author Report Share Posted March 26, 2014 (edited) Não sei se entendi direito, mas parece que ta contando 2x é isso que se quis dize? Tem algo a ver com dar "enter"? Edited March 26, 2014 by askazy Link to comment Share on other sites More sharing options...
askazy Posted March 27, 2014 Author Report Share Posted March 27, 2014 (edited) Tive que fazer uma pesquisa no google sobre os comandos de leitura scanf,getchar e getch para descobrir que fica contando o enter, fico indignado com essas listas da faculdade onde pedem exercícios com conteúdo que não é apresentado em sala. #include <stdio.h> int main(){ int cont = 0, cont2 = 0; char letra; do { letra=getchar(); fflush(stdin); if (letra != '#' && letra != ' ' && letra !='\n') { cont++; } else { if (cont>0 && cont<=5) cont2++; cont=0; } } while (letra!='#'); printf ("O numero de palavras com 5 ou menos letras eh %d\n", cont2); return 0; } Funciona? Como eu faço para excluir o enter da leitura se eu quiser usar o scanf por exemplo? Sempre que eu usar o getchar eu tenho que limpar o buffer pra não contar o enter? Edited March 27, 2014 by thoga31 GeSHi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 27, 2014 Report Share Posted March 27, 2014 Funciona? está melhor, mas agora sempre que chega a um '\n' ele vai assumir que chegou ao fim de uma palavra ... Como eu faço para excluir o enter da leitura se eu quiser usar o scanf por exemplo? scanf serve para ler dados formatados (com um formato bem específico/esperado), e como um utilizador só escreve o que é pedido 90% das vez, as outras 10% irá dar bronca. o que tens da fazer é supor as percentagens inversas : os dados só irão ser inseridos 10% dos casos, logo irão vem sempre errados. se mesmo assim pretendes usar scanf directamente para ler dados do teclado tens algumas soluções: scanf("%d[^\n]\n", &valor); // lê um valor inteiro : %d // descarta todos os valores até encontrar um \n : [^\n] // ler o \n que ainda se encontra no buffer de leitura Sempre que eu usar o getchar eu tenho que limpar o buffer pra não contar o enter? depende dos dados que estás a ler, neste caso sim, tens de retirar ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
askazy Posted March 28, 2014 Author Report Share Posted March 28, 2014 está melhor, significa que funciona ou tem problemas? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 28, 2014 Report Share Posted March 28, 2014 está melhor, significa que funciona ou tem problemas? está melhor, mas agora sempre que chega a um '\n' ele vai assumir que chegou ao fim de uma palavra ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Rui Carlos Posted March 28, 2014 Report Share Posted March 28, 2014 está melhor, mas agora sempre que chega a um '\n' ele vai assumir que chegou ao fim de uma palavra ... Por acaso o enunciado não é lá muito claro quanto a isto. Ainda assim, e tendo em conta que fala em "espaço em branco" (e não apenas "espaço"), eu recomendaria usar a função isspace para definir os separadores. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
askazy Posted March 28, 2014 Author Report Share Posted March 28, 2014 Ah vou desistir de fazer essa,o enunciado está muito confuso, e pelo que vejo pra resolver tenho que aplica conceitos que não aprendi. Link to comment Share on other sites More sharing options...
Rui Carlos Posted March 28, 2014 Report Share Posted March 28, 2014 Não há razão para desistir. A solução que tens parece-me aceitável tendo em conta o enunciado. A questão é mesmo como deve ficar o if (letra != '#' && letra != ' ' && letra !='\n'). E aqui o enunciado não é claro sobre quais os caracteres que devem ser testados. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now