Bisus

Untitled

Nov 2nd, 2019
110
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. double machine_epsilon(void);
  5. int read_array(const char *name, double *a, unsigned int n);
  6. void print_array(double *a, unsigned int n);
  7. void f(double *a, unsigned int n, double *b, unsigned int m);
  8.  
  9. double machine_epsilon(void)
  10. {
  11.     double eps = 1;
  12.  
  13.     while( (1 + eps/2)>1 )
  14.         eps /= 2;
  15.  
  16.     return eps;
  17. }
  18.  
  19. /* Ф-ия заменяет каждый элемент массива a на 0, если он совпадает с каким-то элементов в b. */
  20. void f(double *a, unsigned int n, double *b, unsigned int m)
  21. {
  22.     unsigned int i, j;
  23.     double eps = machine_epsilon();
  24.  
  25.     for( i = 0; i<n; i++ )
  26.         for( j = 0; j<m; j++ )
  27.             if( fabs(a[i] - b[j])<eps )
  28.             {
  29.                 a[i] = 0;
  30.                 break;
  31.             }
  32. }
  33.  
  34. void print_array(double *a, unsigned int n)
  35. {
  36.     unsigned int i;
  37.  
  38.     for( i = 0; i<n; i++ )
  39.         printf("array[%u]==%lf\t", i, a[i]);
  40.  
  41.     printf("\n");
  42. }
  43.  
  44. int read_array(const char *name, double *a, unsigned int n)
  45. {
  46.     FILE *input;
  47.     unsigned int i;
  48.  
  49.     if( !(input = fopen(name, "r")) ) return -1;
  50.  
  51.     for( i = 0; i<n; i++ )
  52.     {
  53.         if( fscanf(input, "%lf", a + i)!=1  )
  54.         {
  55.             fclose(input);
  56.             return -2;
  57.         }
  58.     }
  59.  
  60.     fclose(input);
  61.     return 0;
  62. }
  63.  
  64. int main(int argc, const char *argv[])
  65. {
  66.     unsigned int n, m;
  67.     int res;
  68.     double *a, *b;
  69.  
  70.     if( (argc!=5) || (sscanf(argv[1], "%u", &n)!=1) || (sscanf(argv[3], "%u", &m)!=1) )
  71.     {
  72.         fprintf(stderr, "Usage: %s [n] [file1] [m] [file2]\n", argv[0]);
  73.         return -1;
  74.     }
  75.  
  76.     a = (double *)malloc(n*sizeof(double));
  77.     if( !a )
  78.     {
  79.         fprintf(stderr, "Not enough memory!\n");
  80.         return -2;
  81.     }
  82.     b = (double *)malloc(m*sizeof(double));
  83.     if( !b )
  84.     {
  85.         fprintf(stderr, "Not enough memory!\n");
  86.         free(a);
  87.         return -2;
  88.     }
  89.  
  90.     res = read_array(argv[2], a, n);
  91.     if( res<0 )
  92.     {
  93.         free(a);
  94.         free(b);
  95.         switch(res)
  96.         {
  97.         case -1:
  98.             fprintf(stderr, "Can not open %s\n", argv[2]);
  99.             return 0;
  100.         case -2:
  101.             fprintf(stderr, "Can not read %s\n", argv[2]);
  102.             return 0;
  103.         default:
  104.             fprintf(stderr, "Unknown error %d in %s\n", res, argv[2]);
  105.             return 0;
  106.         }
  107.     }
  108.  
  109.     res = read_array(argv[4], b, m);
  110.     if( res<0 )
  111.     {
  112.         free(a);
  113.         free(b);
  114.         switch(res)
  115.         {
  116.         case -1:
  117.             fprintf(stderr, "Can not open %s\n", argv[4]);
  118.             return 0;
  119.         case -2:
  120.             fprintf(stderr, "Can not read %s\n", argv[4]);
  121.             return 0;
  122.         default:
  123.             fprintf(stderr, "Unknown error %d in %s\n", res, argv[4]);
  124.             return 0;
  125.         }
  126.     }
  127.  
  128.     printf("Array a[]:\n");
  129.     print_array(a, n);
  130.     printf("Array b[]:\n");
  131.     print_array(b, m);
  132.  
  133.     f(a, n, b, m);
  134.     printf("\nf(a, n, b, m) completed!\n\n");
  135.  
  136.     printf("Array a[]:\n");
  137.     print_array(a, n);
  138.     printf("Array b[]:\n");
  139.     print_array(b, m);
  140.  
  141.     free(a);
  142.     free(b);
  143.     return 0;
  144. }
RAW Paste Data