media.c

Download: media.c
The MIT License (MIT)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* 
   Autor: Ismael Felipe Ferreira dos Santos
          Instituto de Fisica,
          Universidade Federal de Alagoas
   E-mail: ismaellxd@gmail.com
   Copyright © 2019 MIT LICENCE
   GIT: https://ismaeldamiao.blogspot.com/fisicacomputacional
   Objetivo: Calcular a Media de dados de outros programas...
   Escrito em: 16 de novembro de 2019
*/
#include<stdio.h>
#include<stdlib.h>

#define TRUE 1
#define FALSE 0

/* Alterar a seguinte linha implica que alteracoes devem ser feitas
nas linhas 63, 64, 73 e 74*/
int const QuantidadeColunas = 4, MAX = 1000;

int main(){
   int QuantidadeArquivos, i, j, fim = FALSE;
   char NomeArquivoNomes[100], NomeResultado[100], command[2][100], 
      NomeArquivoMedia[MAX][100], ch;
   double soma[QuantidadeColunas], c[MAX][QuantidadeColunas];
   FILE *ArquivoNomes, *resultado, *ArquivoMedia[MAX];

   /* Cria um arquivo contendo os nomes de todos os arquivos de onde vamos tirar
   a media */
   printf("Qual o padrao do nome dos arquivo para fazer a media (*)? ");
   scanf("%s", command[1]);

   sprintf(NomeArquivoNomes, "%s.txt", command[1]);
   sprintf(command[0], "ls %s >> %s", command[1], NomeArquivoNomes);
   system(command[0]);
   ArquivoNomes = fopen(NomeArquivoNomes, "r");

   /* Conta quantas linhas tem no arquivo, ou seja, quantos arquivos tem para
   tirar a media */
   for(;(ch=fgetc(ArquivoNomes)) != EOF;) if(ch == '\n') ++QuantidadeArquivos;

   fclose(ArquivoNomes);
   ArquivoNomes = fopen(NomeArquivoNomes, "r");

   /* Salva o nome de todos os arquivos para tirar a media */
   for(i = 0; i < QuantidadeArquivos; ++i){
      fscanf(ArquivoNomes, "%s", NomeArquivoMedia[i]);
   }
   fclose(ArquivoNomes);

   /* Abre todos os arquivos para tirar a media */
   for(i = 0; i < QuantidadeArquivos; ++i)
      ArquivoMedia[i] = fopen(NomeArquivoMedia[i], "r");

   sprintf(NomeResultado, "%s.dat", command[1]);
   resultado = fopen(NomeResultado, "w");

   for(;;){
      for(j = 0; j < QuantidadeColunas; ++j) soma[j] = 0;
      /* Guarda no vetor soma a soma, coluna a coluna, da n-esima linha de cada
      um dos arquivos */
      for(i = 0; i < QuantidadeArquivos; ++i){
         if((fscanf(ArquivoMedia[i], "%lf %lf %lf %lf", 
            &c[i][0], &c[i][1], &c[i][2], &c[i][3])) != EOF){
            for(j = 0; j < QuantidadeColunas; ++j) soma[j] += c[i][j];
         }else{
            fim = TRUE; 
            break;
         }
      }
      if(fim) break;
      for(j = 0; j < QuantidadeColunas; ++j) soma[j] /= QuantidadeArquivos;
      fprintf(resultado, "%18.8g %18.8g %18.8g %18.8g\n", 
         soma[0], soma[1], soma[2], soma[3]);
   }
   printf("Pronto!\n");
   return 0;
}