Contar vogais de um arquivo [RESOLVIDO]

1. Contar vogais de um arquivo [RESOLVIDO]

Rafael L.
SrKon

(usa Manjaro Linux)

Enviado em 31/03/2021 - 21:01h

Preciso contar a quantidade de vogais de cada palavra de um arquivo. Consigo contar as vogais de uma string, mas não mais de uma. O que tenho até o momento:
#include <stdio.h>
#include <string.h>

int main(void) {

FILE *pointArq;
char vogais[5] = {"aeiou"};
char palavras[20], c;
int qntd = 0, soma = 0;

pointArq = fopen("arquivo.txt", "w+");

if(pointArq)
{
while(palavras[0] != '0')
{
printf("Digite palavras:\n");
scanf("%s", palavras);
qntd++;
fprintf(pointArq, "%s\n", palavras);
}
/*
for(int r = 0; palavras[r] != '\0'; r++)
{
for(int l = 0; vogais[l] != '\0'; l++)
{
if(vogais[r] == palavras[l])
{
soma++;
}
}
}
*/
int tam = strlen(palavras);

for(int palavra = 0; palavra < tam; palavra++)
{
for(int vogal = 0; vogal < 5; vogal++)
{
if(palavras[palavra] == vogais[vogal])
{
soma++;
}
}
}

} else {
printf("Arquivo não encontrado.");
}

printf("qntd = %d\tHá %d vogais", qntd-1, soma);

fclose(pointArq);
return 0;
}



  


2. Re: Contar vogais de um arquivo

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/04/2021 - 06:26h

Salve, prezado.

Normalmente, quando se fala em contar coisas “de um arquivo”, o que se entende é que o conteúdo do arquivo já existe, e você vai examinar tal conteúdo para então fazer a contagem do que quer que seja a partir desse conteúdo preexistente. No seu programa, você faz algo que eu não esperaria encontrar, lendo coisas a partir do terminal, e então coloca o que foi lido dentro do arquivo. Tem certeza de que é isso mesmo o que você quer fazer?

Outro aspecto referente ao enunciado é que ele fala em “vogais de cada palavra”. Isso me dá a impressão de que você deveria medir e reportar os resultados cada vez que terminasse de ler uma palavra, e então dar um reset antes de processar a palavra seguinte. Nesse sentido, o que você disse sobre conseguir contar as vogais de apenas uma palavra está OK, porque é só disso mesmo que você precisa, no meu entendimento. Seu único erro nesse caso é que, se for isso mesmo, você não está zerando o valor de soma cada vez que troca de palavra.

Coisas que eu acho que você pode melhorar:

  • Rever seu programa para ter certeza de se você não deveria ler do arquivo, em vez de ler do terminal.

  • Rever lógica de leitura e separação entre uma palavras. Do modo como você fez, se o usuário digitar, por exemplo, “diz-se”, você considerará essa entrada como uma só palavra, não como duas, que realmente são.

  • Acho que você deveria considerar também tratar vogais maiúsculas (e, se quiser ser purista, também vogais acentuadas). Lembre de que, para o C, 'a' é diferente de 'A'.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


3. Re: Contar vogais de um arquivo [RESOLVIDO]

Cézar Augusto
cizordj

(usa Debian)

Enviado em 03/04/2021 - 14:53h

Por que não usa shell?

grep -e 'A' -e 'E' -e 'I' -e 'O' -e 'U' ARQUIVO | wc -m 



4. Re: Contar vogais de um arquivo [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 03/04/2021 - 16:16h


cizordj escreveu:

Por que não usa shell?

grep -e 'A' -e 'E' -e 'I' -e 'O' -e 'U' ARQUIVO | wc -m 


Acredito que ele esteja estudando C, por isso, por questão prática e de aprendizado, sai melhor fazer em C.
Mas gostei desse comando ai, acredito que tenha como deixar ainda menor, a pergunta é como rsrsrs

____________________________________________
https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!
Capeta (demo) do meu trabalho:
https://github.com/cpusam
"com o bug fix vem a perfeição"


5. Re: Contar vogais de um arquivo [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/04/2021 - 11:44h

SamL escreveu:

cizordj escreveu:

grep -e 'A' -e 'E' -e 'I' -e 'O' -e 'U' ARQUIVO | wc -m 


Acredito que ele esteja estudando C, por isso, por questão prática e de aprendizado, sai melhor fazer em C.
Mas gostei desse comando ai, acredito que tenha como deixar ainda menor, a pergunta é como rsrsrs


O referido comando está completamente errado. Passa longe de fazer o que foi pedido.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


6. Solução

Rafael L.
SrKon

(usa Manjaro Linux)

Enviado em 05/04/2021 - 13:42h


paulo1205 escreveu:

Salve, prezado.

Normalmente, quando se fala em contar coisas “de um arquivo”, o que se entende é que o conteúdo do arquivo já existe, e você vai examinar tal conteúdo para então fazer a contagem do que quer que seja a partir desse conteúdo preexistente. No seu programa, você faz algo que eu não esperaria encontrar, lendo coisas a partir do terminal, e então coloca o que foi lido dentro do arquivo. Tem certeza de que é isso mesmo o que você quer fazer?

Outro aspecto referente ao enunciado é que ele fala em “vogais de cada palavra”. Isso me dá a impressão de que você deveria medir e reportar os resultados cada vez que terminasse de ler uma palavra, e então dar um reset antes de processar a palavra seguinte. Nesse sentido, o que você disse sobre conseguir contar as vogais de apenas uma palavra está OK, porque é só disso mesmo que você precisa, no meu entendimento. Seu único erro nesse caso é que, se for isso mesmo, você não está zerando o valor de soma cada vez que troca de palavra.

Coisas que eu acho que você pode melhorar:

  • Rever seu programa para ter certeza de se você não deveria ler do arquivo, em vez de ler do terminal.

  • Rever lógica de leitura e separação entre uma palavras. Do modo como você fez, se o usuário digitar, por exemplo, “diz-se”, você considerará essa entrada como uma só palavra, não como duas, que realmente são.

  • Acho que você deveria considerar também tratar vogais maiúsculas (e, se quiser ser purista, também vogais acentuadas). Lembre de que, para o C, 'a' é diferente de 'A'.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


Salve, prezado, nós novamente por aqui.

Eu refiz o código e ele funcionou.

Normalmente, quando se fala em contar coisas “de um arquivo”, o que se entende é que o conteúdo do arquivo já existe, e você vai examinar tal conteúdo para então fazer a contagem do que quer que seja a partir desse conteúdo preexistente. No seu programa, você faz algo que eu não esperaria encontrar, lendo coisas a partir do terminal, e então coloca o que foi lido dentro do arquivo. Tem certeza de que é isso mesmo o que você quer fazer?

Esta é uma versão, já fiz uma para ele ler o arquivo. E quando comecei, era isso que queria.

Outro aspecto referente ao enunciado é que ele fala em “vogais de cada palavra”. Isso me dá a impressão de que você deveria medir e reportar os resultados cada vez que terminasse de ler uma palavra, e então dar um reset antes de processar a palavra seguinte. Nesse sentido, o que você disse sobre conseguir contar as vogais de apenas uma palavra está OK, porque é só disso mesmo que você precisa, no meu entendimento. Seu único erro nesse caso é que, se for isso mesmo, você não está zerando o valor de soma cada vez que troca de palavra.

Sendo para contar uma palavra ou todas as palavras, aparecia 0 em ambas.

sobre o segundo ponto, por hora eu quero algo mais simples e que funcione depois acrescento mais. Tentei usar mais que as vogais maiúsculas com char vogais[] = "aeiouAEIOUáéíóúÁÉÍÓÚãÃÕãõÃÕà"; Talvez tenha exagerado.

Segue o código:
//versão I
#include <stdio.h>

int main(void)
{
FILE *pointer;
int soma = 0;
char c;

pointer = fopen("doc.txt", "r");

if(pointer)
{
while((c = getc(pointer)) != EOF)
{
printf("%c", c);
if(c == 'a' ||
c == 'e' ||
c == 'i' ||
c == 'o' ||
c == 'u')
{
soma++;
}
}
} else {
printf("Arquivo não encontrado.");
}
printf("\nHá %d vogais neste arquivo.", soma);

fclose(pointer);

return 0;
}

É simples, mas é o que queria.