#include #include #include typedef long double real; static real minimo = DBL_MAX; static real maximo = -DBL_MAX; static real suma = 0.0; static unsigned long long contador = 0; #if ! defined(__cplusplus) typedef unsigned char bool; #define false 0 #define true 1 #endif static bool mostrar_ayuda = false; static bool forzar_estadisticas = false; static unsigned long long cantidad_archivos = 0; /// @return 0 en caso de exito, algo distinto de 0 en caso de error int procesar_archivo(FILE* archivo, const char* nombre) { real valor = 0.0; int resultado = 0; while ( true ) { while ( ( resultado = fscanf(archivo, "%Lf", &valor) ) > 0 ) { ++contador; if ( valor < minimo ) minimo = valor; if ( valor > maximo ) maximo = valor; suma += valor; } if ( resultado == EOF ) return 0; if ( forzar_estadisticas ) fgetc(archivo); else { fprintf(stderr, "%s: formato de archivo no valido\n", nombre); return 2; } } } /// @return 0 en caso de exito, algo distinto de 0 en caso de error int procesar_nombre_archivo(const char* nombre) { if ( nombre[0] == '-' ) return 0; FILE* archivo = fopen(nombre, "r"); if ( ! archivo ) { fprintf(stderr, "No se pudo abrir %s\n", nombre); return 1; } int resultado = procesar_archivo(archivo, nombre); fclose(archivo); return resultado; } void imprimir_estadisticas() { if ( contador > 0 ) { printf("Conteo: %llu\n", contador); printf("Minimo: %.2Lf\n", minimo); printf("Maximo: %.2Lf\n", maximo); printf("Promedio: %.2Lf\n", suma / contador); } } void procesar_parametros(int argc, char* argv[]) { for ( int i = 1; i < argc; ++i ) { if ( argv[i][0] == '-' ) { if ( strcmp(argv[i], "--help") == 0 ) mostrar_ayuda = true; if ( strcmp(argv[i], "-f") == 0 ) forzar_estadisticas = true; } else ++cantidad_archivos; } } int imprimir_ayuda() { printf("%s", "Uso: estad [-fhi] [ARCHIVOS]\n" "Imprime estadisticas como el promedio y la desviacion estandar a partir de\n" "datos numericos almacenados en ARCHIVOS de texto. Opciones:\n" " -f fuerza a calcular estadisticas en archivos no validos\n" " -h imprime un histograma\n" " -i imprime estadisticas por cada archivo individual\n"); return 0; } int main(int argc, char* argv[]) { procesar_parametros(argc, argv); if ( mostrar_ayuda ) return imprimir_ayuda(); if ( cantidad_archivos == 0 ) procesar_archivo(stdin, "stdin"); else for ( int i = 1; i < argc; ++i ) procesar_nombre_archivo(argv[i]); imprimir_estadisticas(); return 0; }