Download: media-v2.c
The MIT License (MIT)
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | /* 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 Midificacoes: 14 de marco de 2020, para funcionar com qualquer quantidade de colunas. */ /* Bibliotecas -------------------------------------------------------------- */ #include<stdio.h> #include<stdlib.h> /* Definicoes --------------------------------------------------------------- */ #define TRUE 1 #define FALSE 0 #define MAX 1000 /* Funcoes ------------------------------------------------------------------ */ int ContarLinhas(char NArquivo[]); int ContarColunas(char NArquivo[]); int fileExists(char NArquivo[]); /* Funcao principal --------------------------------------------------------- */ int main(){ int QuantidadeArquivos, QuantidadeColunas, arq, col, fim = FALSE; char NomeArquivoNomes[100], NomeResultado[100], command[2][100], NomeArquivoMedia[MAX][100]; double soma[MAX], valor; 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, "tmp.main.txt"); sprintf(NomeResultado, "%s.dat", command[1]); if(fileExists(NomeResultado)) remove(NomeResultado); sprintf(command[0], "ls -1 %s >> %s", command[1], NomeArquivoNomes); system(command[0]); resultado = fopen(NomeResultado, "w"); /* Conta quantas linhas tem no arquivo, ou seja, quantos arquivos tem para tirar a media */ QuantidadeArquivos = ContarLinhas(NomeArquivoNomes); if(QuantidadeArquivos > MAX){ printf("Há demasiados arquivos.\nSaindo...\n"); return 0; } /* Salva o nome de todos os arquivos para tirar a media */ ArquivoNomes = fopen(NomeArquivoNomes, "r"); for(arq = 0; arq < QuantidadeArquivos; ++arq) fscanf(ArquivoNomes, "%s", NomeArquivoMedia[arq]); fclose(ArquivoNomes); remove("tmp.main.txt"); QuantidadeColunas = ContarColunas(NomeArquivoMedia[0]); /* Abre todos os arquivos para tirar a media */ for(arq = 0; arq < QuantidadeArquivos; ++arq) ArquivoMedia[arq] = fopen(NomeArquivoMedia[arq], "r"); for(;;){ for(col = 0; col < QuantidadeColunas; ++col) soma[col] = 0; /* Guarda no vetor soma a soma, coluna a coluna, da n-esima linha de cada um dos arquivos */ for(arq = 0; arq < QuantidadeArquivos; ++arq){ for(col = 0; col < QuantidadeColunas; ++col){ if( fscanf(ArquivoMedia[arq], "%lf", &valor) != EOF){ soma[col] += valor; }else{ fim = TRUE; break; } if(fim) break; } } if(fim) break; for(col = 0; col < QuantidadeColunas; ++col) fprintf(resultado, "%18.8g ", soma[col]/QuantidadeArquivos); fprintf(resultado, "\n"); } printf("Pronto!\n"); return 0; } int ContarLinhas(char NArquivo[]){ char ch; int QuantidadeLinhas = 0; FILE *Arquivo = fopen(NArquivo, "r"); for(;(ch=fgetc(Arquivo)) != EOF;) if(ch == '\n') ++QuantidadeLinhas; fclose(Arquivo); return QuantidadeLinhas; } int ContarColunas(char NArquivo[]){ char ch; int QuantidadeColunas = 0, Contar = TRUE; FILE *Arquivo = fopen(NArquivo, "r"); for( ch=fgetc(Arquivo); ch != '\n'; ch=fgetc(Arquivo)){ if(ch != ' ' && Contar){ ++QuantidadeColunas; Contar = FALSE; } if(ch == ' ') Contar = TRUE; } fclose(Arquivo); return QuantidadeColunas; } int fileExists(char NArquivo[]){ FILE *test = fopen(NArquivo, "r"); if(test){ fclose(test); return 1; /* existe */ }else{ return 0; /* nao existe */ } } |