Bisus

Untitled

Nov 12th, 2019
85
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. int f(FILE *input);
  3.  
  4. /* Ф-ия принимает файл с последовательностью вещественных чисел,
  5.  * возвращает максимальное расстояние между соседними локальными минимумами.
  6.  * Если проблема со входным файлом, то возвращается -1.
  7.  * Если недостаточно данных, то -2.
  8.  * */
  9. int f(FILE *input)
  10. {
  11.     double x1, x2, x3;
  12.     int max = 0, counter;
  13.  
  14.     if(fscanf(input, "%lf", &x1)!=1)
  15.         return -1;// В файле нет последовательности
  16.     if(fscanf(input, "%lf", &x2)!=1)
  17.     {
  18.         if(!feof(input))
  19.             return -1;
  20.         return -2;// В файле один элемент
  21.     }
  22.  
  23.     // Поиск первого локального минимума
  24.     while(fscanf(input, "%lf", &x3)==1)
  25.     {
  26.         if((x1>x2)&&(x3>x2))// x2 - первый локальный минимум
  27.         {
  28.             counter = 0;
  29.             x1 = x2;
  30.             x2 = x3;
  31.             break;
  32.         }
  33.  
  34.         x1 = x2;
  35.         x2 = x3;
  36.     }
  37.     while(fscanf(input, "%lf", &x3)==1)
  38.     {
  39.         if((x1>x2)&&(x3>x2))// x2 - локальный минимум
  40.         {
  41.             if(counter>max) max = counter;
  42.             counter = 0;
  43.         } else// x2 - не локальный минимум
  44.         {
  45.             counter++;
  46.         }
  47.  
  48.         x1 = x2;
  49.         x2 = x3;
  50.     }
  51.  
  52.     if(!feof(input))
  53.         return -1;
  54.     if(max==0)
  55.         return -2;// Нет двух локальных минимумов
  56.  
  57.     return max;
  58. }
  59.  
  60. int main(void)
  61. {
  62.     FILE *input, *output;
  63.     int result;
  64.  
  65.     if(!(input = fopen("input.txt", "r")))
  66.     {
  67.         fprintf(stderr, "Can not open input.txt!\n");
  68.         return 1;
  69.     }
  70.     result = f(input);
  71.     fclose(input);
  72.  
  73.     if(result<=0)
  74.     {
  75.         switch(result)
  76.         {
  77.         case -1:
  78.             fprintf(stderr, "Error with input file!\n");
  79.             return 1;
  80.         case -2:
  81.             fprintf(stderr, "Not enough data!\n");
  82.             return 1;
  83.         default:
  84.             fprintf(stderr, "Unknown error!\n");
  85.             return 1;
  86.         }
  87.     }
  88.  
  89.     if(!(output = fopen("output.txt", "w")))
  90.     {
  91.         fprintf(stderr, "Can not open or create output.txt\n");
  92.         return 1;
  93.     }
  94.     fprintf(output, "%d", result);
  95.     fclose(output);
  96.  
  97.     return 0;
  98. }
RAW Paste Data