Ir ao conteúdo
  • Cadastre-se
jtc-carr

C somar carcteres e numeros a partir de ficheiro

Recommended Posts

Queria  fazer um programa para contar o numero de linhas e palavras usadas via stdin consegui contar as linhas, mas não soma palavras

while( (texto[MAX]=fgetc(textos))!= EOF )
   if(texto[MAX] == '\n')
     linha++;
 printf("Existem %d linhas no arquivo\n", linha);

se digitar:

aaa

bbb

cccc  ccc

xxxxx

 

Deveria devolver Existem 4 linhas e 5 palavras  Alguma ajuda

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode fazer usando fscanf ao invés de fgetc:

#include <stdio.h>
#include <string.h>

int main()
{
    char palavra[200], caractere;
    int npalavras = 0, nlinhas = 1;
    FILE *texto;
    
    texto = fopen("texto.txt", "r");
    
    while ( fscanf(texto, "%199s%c", palavra, &caractere) > 0 ) {
        if ( strlen(palavra) != 0 )
            npalavras++;
        if ( caractere == '\n' )
            nlinhas++;
    }
    
    fclose(texto);
    
    printf("%d linhas e %d palavras.\n", nlinhas, npalavras);

    return 0;
}
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick, daria por favor para traduzir esse:

2 horas atrás, isrnick disse:

"%199s%c"

 

?

 

Creio que será dúvida de outros membros também, rs.

 

adicionado 38 minutos depois

PS:
Para testar e exibir na tela, fiz assim:

#include <stdio.h>
#include <string.h>
#include <locale.h>
int main()
{
    setlocale(LC_ALL, "Portuguese"); //coloquei para aceitar acentos
    char palavra[200], caractere;
    int npalavras = 0, nlinhas = 1;
    FILE *texto;
    
    texto = fopen("texto.txt", "r");
    
    //while ( fscanf(texto, "%199s%c", palavra, &caractere) > 0 ) { //testar sem o 199
    while ( fscanf(texto, "%s%c", palavra, &caractere) > 0 ) {
        printf("%s%c",palavra,caractere);
        if ( strlen(palavra) != 0 ) npalavras++;
        if ( caractere == '\n' )    nlinhas++;
    }
    
    fclose(texto);
    
    printf("\a\n\n%d linhas e %d palavras.\n", nlinhas, npalavras);

    return 0;
}

 

Funcionou:

Capturar.PNG

 

Duas dúvidas:

- para quê esse 199 ali no meio? limite de caracteres?

- porque a caractere precisa do &, e a palavra não precisa? testei o segundo com e sem, ambos deram certo!

 

No aguardo.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 horas atrás, Simon Viegas disse:

@isrnick, daria por favor para traduzir esse:

8 horas atrás, isrnick disse:


"%199s%c"

 

?

 

Estão sendo obtidos 2 parâmetros por essa função fscanf%s obterá uma string sem espaços em branco, e em seguida %c obtém o primeiro caractere após a string (que logicamente será um espaço ' ', tabulação '\t', nova linha '\n', etc).

 

 

4 horas atrás, Simon Viegas disse:

Duas dúvidas:

- para quê esse 199 ali no meio? limite de caracteres?

 

Exatamente, é para limitar os caracteres, pois no programa o vetor de caracteres palavra tem comprimento 200, e se a string lida for mais longa que isso estouraria o limite do vetor, logo por segurança é necessário sempre indicar a quantidade máxima de caracteres lidos pelo %s.

 

Vale notar que strings em C devem sempre conter o caractere nulo '\0' indicando o fim da string, então neste vetor de caracteres podem ser armazenados no máximo 199 caracteres não nulos, e nesse caso extremo a última casa do vetor guardaria o caractere nulo '\0' da string. Por isto a o especificador ficou assim %199s indicando que serão lidos no máximo 199 caracteres não nulos.

 

 

4 horas atrás, Simon Viegas disse:

- porque a caractere precisa do &, e a palavra não precisa? testei o segundo com e sem, ambos deram certo!

 

Não deveria funcionar sem o & no caractere.

 

Quando se usa o nome de uma variável normalmente (ou seja, sem o &) o que é retornado é o valor armazenado na variável, por exemplo ao fazer:

int a = 10;

Se usarmos o nome a subsequentemente no programa obteremos o valor 10 armazenado na variável.

 

Entretanto colocando & antes do nome da variável obteremos o endereço do lugar na memória onde os valores desta variável são guardados.

 

Nesse caso &a obteria um número que indica uma posição da memória (a fim de exemplo digamos que seja 0x00001A01 em hexadecimal), mas em geral não precisamos saber esse valor, basta saber que ao fazer &a será obtido o endereço de memória da variável a.

 

Tendo esse endereço de memória podemos armazená-lo num tipo especial de variável chamado ponteiro, que serve exatamente para isso armazenar endereços de memória, e dizemos que um ponteiro 'aponta' para um endereço de memória, e poderemos usar esse ponteiro para fazer alterações nesse lugar da memória para onde ele aponta, mas esse lugar da memória é onde estão o valores da variável a , logo ao fazermos alterações nesse lugar da memória estaremos alterando o valor da variável a.

 

Então ao usarmos &caractere  estamos passando para a função fscanf o endereço de memória da variável caractere, na função o endereço é armazenado num ponteiro, permitindo que a função faça alterações nesse lugar da memória, assim ela pode guardar o caractere lido do arquivo na variável caractere.

 

Sem o & o que será enviado para a função fscanf é um valor qualquer que está armazenado na variável caractere, e a função não terá como guardar valor algum na variável.

 

 

Já no caso do vetor de caracteres palavra a diferença é que o nome de um vetor já é uma referência (mais especificamente usar o nome palavra como parâmetro já é o mesmo que usar &palavra[0]), logo para um vetor não vai um & antes do nome (daí vemos sendo dito que vetores sempre são passados por referência, logo alterações dentro da função sempre alteram o vetor original fora da função).

  • Curtir 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado, estava-me aqui a falhar isso
E se fosse para contar os caracteres e os números o que deverei acrescentar fiz uma comparação com os10 números mas não a contagem

if (i == '0' || i == '1' || i == 2' || i == '3' || i == '4' || i == '5' || i == 6' || i == '7' || i == '8'|| i == '9' )

 

adicionado 6 minutos depois
adicionado 10 minutos depois
12 horas atrás, isrnick disse:

Pode fazer usando fscanf ao invés de fgetc:


#include <stdio.h>
#include <string.h>

int main()
{
    char palavra[200], caractere;
    int npalavras = 0, nlinhas = 1;
    FILE *texto;
    
    texto = fopen("texto.txt", "r");
    
    while ( fscanf(texto, "%199s%c", palavra, &caractere) > 0 ) {
        if ( strlen(palavra) != 0 )
            npalavras++;
        if ( caractere == '\n' )
            nlinhas++;
    }
    
    fclose(texto);
    
    printf("%d linhas e %d palavras.\n", nlinhas, npalavras);

    return 0;
}

Outra duvida para acrescentar outra soma por exemplo de caracteres especiais, vogais, letra "a" , numeros, como fazer experimentei com acrescentar uma linha if e não deu

adicionado 11 minutos depois

Outra duvida para acrescentar outra soma por exemplo de caracteres especiais, vogais, letra "a" , numeros, como fazer experimentei com acrescentar uma linha if e não deu

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Queria a partir de um ficheiro fazer varias somas do seu conteúdo por exemplo de, vogais, números,consuantes, somo bem as linhas, mas para o restante a função mas não funciona como devia, só contando o que esta na ultima linha, como faço para que some todas as linhas usando a função que tenho feita

soma (char *str, char*vogal, char*consoante)

FILE *f = stdin;
while (fgets (ficheiro, 1000, stdin) != NULL)
{


insiro no stdin:
123456
bcd
fgh
aeiouae
r
Output obtido: 5 linhas 20caracteres 1vogal 0numeros 0consoantes
Output pretendido:5 linhas 40caracteres 7vogal 6numeros 7consoantes

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para facilitar pode usar as funções da biblioteca ctype.h para verificar o tipo de caractere:

 

isalpha() - Checa se o caractere é uma letra.

isdigit() - Checa se o caractere é um dígito numérico.

isalnum() - Checa se o caractere é alfanumérico (digito ou letra).

ispunct() - Checa se o caractere é uma pontuação

isspace() - Checa se o caractere é um espaço em branco (espaço, tabulação, nova linha, ou etc)

isblank() - Checa se o caractere é um espaço ou tabulação.

 

https://en.cppreference.com/w/c/string/byte

 

Só o caso de vogais e consoantes que vai ter que fazer você mesmo, mas aí só precisa checar se for uma letra se ela é uma vogal, pois se não for só pode ser consoante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já fiz as funções o problema agora é que não lê e soma o conteúdo das várias linhas, só mesmo a da ultima linha

 

Com este texto:
                        123457890

                        aeiou

                        bcdfghj

                        qwq

Devia dar 10 números , 10 vogais e 5 consoantes dá-me 0numeros, o consoantes e 3 vogais(qwq)

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 800

void contar (char *str, int *vogal, int *consoante)
{
  *vogal = *consoante = 0;
  while (*str)
    {
      char i = tolower (*str);
      if (i >= 'a' && i <= 'z')
	{
	  if (i == 'a' || i == 'e' || i == 'i' || i == 'o' || i == 'u')
	    {
	      *vogal += 1;
	    }
	  else
	    {
	      *consoante += 1;
	    }
	}
      *str++;
    }
}

int main ()
{
  char texto[MAX];
  int consoante, vogal,numero;
  int cont, letra = 0, linha = 0, soma = 0;

  FILE *f = stdin;
  while (fgets (texto, MAX, stdin) != NULL)
    {
      contar (texto, &consoante, &vogal);
      {
	for (cont = 0; texto[cont]; cont++)
	  {
	    if ((!soma) && (texto[cont]))
	      {
		soma = 1;
		linha++;
	      }
	    if (texto[cont] - ' ')
	      letra++;
	  }
      }
    }
  printf ("%dlinhas %dcaracteres %dvogal %dnumero %d consoantes", linha, letra, vogal,numero, consoante);
}

O código que tenho é este e pretendo somar tudo o que inserir mas só lê a ultima linha, quem puder ajudar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×