Advertisement
Bisus

Untitled

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