XeBuZer0

Histogram Generator Parser in C

Mar 25th, 2024
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.26 KB | None | 0 0
  1. // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** //
  2. // ** // ** // ** // Código fuente de programa que recibe 1 conjunto de datos // ** // ** // ** //
  3. // ** // ** // ** // a 2 columnas, donde la primer columna es el índice y la  // ** // ** // ** //
  4. // ** // ** // ** // * segunda columna son los datos, generando a partir de * // ** // ** // ** //
  5. // ** // ** // ** // * ambas columnas el histograma respectivo y el análsis * // ** // ** // ** //
  6. // ** // ** // ** // ** // ** // **  estadístico de los datos  ** // ** // ** // ** // ** // ** //
  7. // ** // ** // ** // * Licenciado bajo GNU General Public License (GPL) 3.0 * // ** // ** // ** //
  8. // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** //
  9. // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** //
  10. /* ** // ** // ** // ** // ** //  F v q __ U k r a i N a z i s !  // ** // ** // ** // ** // ** */
  11. /* ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** */
  12. /* ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** // ** */
  13.  
  14. #include <stdio.h>
  15. #include <float.h>
  16. #include <stdlib.h>
  17. #define div 10
  18.  
  19. int countlines(FILE *fp);
  20. float Q_sqrt(float number);
  21. float comparaMax(float x, float y);
  22. float comparaMin(float x, float y);
  23. int clasificador(float min, float sec, float dato);
  24.  
  25. int main(int argc, char *argv[]){
  26.     int *index = NULL,*secciones = NULL,lineas = 0,a = 0, freqAcum=0;
  27.     float *arrDatos = NULL, datoMax = 0.0, datoMin = FLT_MAX, tamSeccion = 0.0, prom = 0.0, desvEst = 0.0, varianza=0.0, ErrorProm=0.0;
  28.     secciones = (int*)calloc(div+1, sizeof(int));
  29.     FILE *archivo = NULL, *salida = NULL, *tabla = NULL;
  30.     archivo = fopen(argv[1], "r+");
  31.     salida = fopen("Histograma.data", "w");
  32.     tabla = fopen("Tabla.csv", "w");
  33.     if (archivo == NULL || salida == NULL || tabla == NULL) {
  34.         perror("Error al abrir archivos");
  35.         exit(-1);
  36.     }
  37.     lineas = countlines(archivo);
  38.     index = (int*)calloc(lineas, sizeof(int));
  39.     arrDatos = (float*)calloc(lineas,sizeof(float));
  40.     printf("Renglones = %i\n",lineas);
  41.     printf("Contenido del archivo de datos:\n");
  42.     for(a = 0; a<lineas; a++){
  43.         fscanf(archivo, "%i,%f", (index+a), (arrDatos+a));
  44.         printf("Dato %i: %4.2f\n", *(index+a),*(arrDatos+a));
  45.         datoMax = comparaMax(datoMax,*(arrDatos+a));
  46.         datoMin = comparaMin(datoMin,*(arrDatos+a));
  47.         prom = prom + arrDatos[a];
  48.     }
  49.     prom = prom/a;
  50.     rewind(archivo);
  51.     tamSeccion = (datoMax - datoMin)/div;
  52.     printf("Dato mínimo: %f\nDato máximo: %f\nTamaño de intervalos: %f\n", datoMin,datoMax,tamSeccion);
  53. /*********************************************************/
  54.     for(a = 0; a <= lineas; a++) desvEst += ((prom - arrDatos[a]) * (prom - arrDatos[a]));
  55.     desvEst = desvEst/a;
  56.     desvEst = Q_sqrt(desvEst); /*Esta línea se separó en 2, esta y la anterior, porque al querer evaluar todo en el argumento, el pinche valor se bugueaba y aparte de salir mal, salía negativo xdddd*/
  57.     rewind(archivo);
  58. /*********************************************************/
  59.     for(a = 0; a<lineas; a++) (secciones[clasificador(datoMin,tamSeccion,arrDatos[a])])++;
  60.     printf("Intervalo Repeticiones Probabilidad Freq-Acum\n");
  61.     fprintf(tabla, "Intervalo,Repeticiones,Probabilidad,Freq Acum\n");
  62.     for(a = 0; a<div; a++) {
  63.         freqAcum=freqAcum+secciones[a];
  64.         printf("%4i:\t\t%i\t%f\t%i\n",a+1,secciones[a],(((float)secciones[a])/100),freqAcum);
  65.         fprintf(salida, "%i %i\n", a+1, secciones[a]);
  66.         fprintf(tabla, "%i, %i, %f, %i\n", a+1, secciones[a], (((float)secciones[a])/100), freqAcum);
  67.     }
  68.     rewind(archivo);
  69. /*********************************************************/
  70.     varianza = Q_sqrt(desvEst);
  71.     ErrorProm = varianza/Q_sqrt(lineas);
  72. /*********************************************************/
  73.     printf("El promedio es: %4fmm\n", prom);
  74.     printf("La Desviación Estándar es: %4f\n", desvEst);
  75.     printf("La varianza (o sigma) es: %4f\n", varianza);
  76.     printf("El error del promedio es: %4f\n", ErrorProm);
  77.     fprintf(tabla, "Promedio,%f\n", prom);
  78.     fprintf(tabla, "Desviación Estándar, %f\n", desvEst);
  79.     fprintf(tabla, "Varianza,%f\n", varianza);
  80.     fprintf(tabla, "Error Promedio,%f\n", ErrorProm);
  81.     fclose(archivo);
  82.     fclose(salida);
  83.     fclose(tabla);
  84.     free(arrDatos);
  85.     free(index);
  86.     free(secciones);
  87.     return 0;
  88. }
  89.  
  90. int countlines(FILE *fp){
  91.     int lines=0;
  92.     while(!feof(fp)) if(fgetc(fp) == '\n') lines++;
  93.     rewind(fp);
  94.     return lines;
  95. }
  96.  
  97. float comparaMax(float x, float y){
  98.     return (x>y)?x:y;
  99. }
  100.  
  101. float comparaMin(float x, float y){
  102.     return (x<y)?x:y;
  103. }
  104.  
  105. int clasificador(float min, float sec, float dato){
  106.     if (min <= dato && dato < (min + sec)) return 0;
  107.     if (min + sec <= dato) return 1 + clasificador(min + sec, sec, dato);
  108.     return -1 /* Dato fuera de rango, no debería ocurrir si los datos son correctos */
  109. }
  110.  
  111. float Q_sqrt(float number){
  112.     long i=0.0;
  113.     float x2=0.0, y=0.0;
  114.     const float threehalfs = 1.5F;
  115.     x2 = number * 0.5F;
  116.     y  = number;
  117.     i  = *(long *)&y;                       // interpret bit pattern as integer
  118.     i  = 0x5f3759df - (i >> 1);             // initial guess for Newton's method
  119.     y  = *(float *)&i;                      // interpret back as float
  120.     y  = y * (threehalfs - (x2 * y * y));   // Newton's method iteration
  121.     return (1/y);
  122. }
  123.  
Add Comment
Please, Sign In to add comment