Bisus

Untitled

Oct 25th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.49 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. int f(char *name1, char *name2);
  4. double machine_epsilon(void);
  5.  
  6. double machine_epsilon(void)
  7. {
  8.     double eps = 1;
  9.  
  10.     while( (1 + eps/2)>1)
  11.         eps /= 2;
  12.  
  13.     return eps;
  14. }
  15.  
  16. /* Ф-ия, получающая имена двух файлов содержащих последовательности вещественных чисел a[i] и b[i],
  17.  * возвращающая:
  18.  * -2, если не удалось считать элемент из какого-то файла;
  19.  * -1, если не удалось открыть какой-то файл;
  20.  *  0, если какой-то элемент второй последовательности(кроме первого и последнего) не равен сумме
  21.  *  двух соседних из первого файла: b[i]!=(a[i - 1] + a[i + 1])/2 (*);
  22.  *  1 в противном случае;
  23.  *  2, если невозможно проверить условие (*) (т.е. для какого-то b[i] нет a[i + 1])
  24.  * */
  25. int f(char *name1, char *name2)
  26. {
  27.     FILE *a_file, *b_file;
  28.     double a1, a2, a3, b1, b2, eps = machine_epsilon();
  29.  
  30.     if( ( !(a_file = fopen(name1, "r") )) || ( !(b_file = fopen(name2, "r")) ) )
  31.         return -1;
  32.  
  33.     if(fscanf(b_file, "%lf%lf", &b1, &b2)!=2)
  34.     {
  35.         if(feof(b_file))
  36.         {
  37.             fclose(a_file);
  38.             fclose(b_file);
  39.             return 1;
  40.         }
  41.         fclose(a_file);
  42.         fclose(b_file);
  43.         return -2;
  44.     }
  45.     if(feof(b_file))
  46.     {
  47.         fclose(a_file);
  48.         fclose(b_file);
  49.         return 1;
  50.     }
  51.  
  52.     if(fscanf(a_file, "%lf%lf", &a1, &a2)!=2)
  53.     {
  54.         if(feof(a_file))
  55.         {
  56.             fclose(a_file);
  57.             fclose(b_file);
  58.             return 2;
  59.         }
  60.         fclose(a_file);
  61.         fclose(b_file);
  62.         return -2;
  63.     }
  64.     if(feof(a_file))
  65.     {
  66.         fclose(a_file);
  67.         fclose(b_file);
  68.         return 2;
  69.     }
  70.  
  71.     b1 = b2;
  72.     while(fscanf(b_file, "%lf", &b2)==1)
  73.     {
  74.         if(fscanf(a_file, "%lf", &a3)!=1)
  75.         {
  76.             if(feof(a_file))
  77.             {
  78.                 fclose(a_file);
  79.                 fclose(b_file);
  80.                 return 2;
  81.             }
  82.             fclose(a_file);
  83.             fclose(b_file);
  84.             return -2;
  85.         }
  86.  
  87.         if( fabs(b1 - (a1 + a3)/2)>eps )
  88.         {
  89.             fclose(a_file);
  90.             fclose(b_file);
  91.             return 0;
  92.         }
  93.  
  94.         b1 = b2;
  95.         a1 = a2;
  96.         a2 = a3;
  97.     }
  98.  
  99.     if(!feof(b_file))
  100.     {
  101.         fclose(a_file);
  102.         fclose(b_file);
  103.         return -2;
  104.     }
  105.  
  106.     fclose(a_file);
  107.     fclose(b_file);
  108.     return 1;
  109. }
  110.  
  111. int main(void)
  112. {
  113.     char name1[256], name2[256];
  114.  
  115.     printf("Write filenames(name1, name2):\n");
  116.     scanf("%s%s", name1, name2);
  117.  
  118.     printf("f(%s, %s) returned %d\n", name1, name2, f(name1, name2));
  119.  
  120.     return 0;
  121. }
Add Comment
Please, Sign In to add comment