Advertisement
Guest User

Untitled

a guest
Apr 5th, 2020
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.63 KB | None | 0 0
  1. #include <string>
  2. #include <iostream>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6. void create_file(string name, int n)
  7. {
  8.     fstream file(name, fstream::out);
  9.  
  10.     for (int i = 0; i < n; i++)
  11.     {
  12.         file << rand() % 100 << " ";
  13.     }
  14.  
  15.     file.close();
  16. }
  17.  
  18. void split(string file_name, int n, int& L, int* a, int* d)// слияние (по лекции)
  19. {
  20.     fstream input(file_name, fstream::in);
  21.     fstream* file = new fstream[n];
  22.     for (int i = 0; i < n - 1; i++)
  23.     {
  24.         file[i].open(to_string(i), fstream::out);
  25.  
  26.         a[i] = 1;
  27.         d[i] = 1;
  28.     }
  29.     a[n - 1] = 0;
  30.     d[n - 1] = 0;
  31.     L = 1;
  32.     int j = 0;
  33.     int x;
  34.     int y;
  35.     input >> x;
  36.     // 2
  37.     while (true)//пока файл не исчерпан
  38.     {
  39.         // выделяем отрезок
  40.         do
  41.         {
  42.             y = x;
  43.             file[j] << y << endl;
  44.         }
  45.         while (input >> x && y < x);
  46.         file[j] << -1 << endl; // ограничивем -1
  47.         d[j]--;
  48.         if (input.eof())//проверка на конец файла
  49.         {
  50.             break;//выход из цикла
  51.         }
  52.         else
  53.         {
  54.             if (d[j] < d[j + 1])
  55.             {
  56.                 j++;
  57.             }
  58.             else if (d[j] == 0) // пересчет уровня и значений в массивах а и d
  59.             {
  60.                 L++;
  61.                 int tmp = a[0];
  62.                 j = 0;
  63.  
  64.                 for (int k = 0; k < n - 1; k++)
  65.                 {
  66.                     d[k] = a[k + 1] - a[k] + tmp;
  67.                     a[k] = a[k + 1] + tmp;
  68.                 }
  69.             }
  70.             else
  71.             {
  72.                 j = 0;
  73.             }
  74.         }
  75.     }
  76.     for (int i = 0; i < n - 1; i++)
  77.     {
  78.         file[i].close();
  79.     }
  80.     input.close();
  81. }
  82.  
  83. void copy_file(string file1_name, string file2_name) //Копирование файла
  84. {
  85.     fstream from(file1_name, fstream::in);// чтенние
  86.     fstream to(file2_name, fstream::out);// запись
  87.  
  88.     int a;
  89.     from >> a;
  90.     while (a != -1) // передаем значения из первого файла во второй
  91.     {
  92.         to << a << " ";
  93.         from >> a;
  94.     }
  95.  
  96.     from.close();
  97.     to.close();
  98. }
  99.  
  100. bool if_ascent(string name)// возрастающий ли файл
  101. {
  102.     fstream file(name, fstream::in);
  103.  
  104.     int a, b;
  105.     file >> b;
  106.     while (file >> a)
  107.     {
  108.         if (b > a)
  109.         {
  110.             file.close();
  111.             return false;
  112.         }
  113.         b = a;
  114.     }
  115.     file.close();
  116.     return true;
  117. }
  118.  
  119. void create_n_file(int n)
  120. {
  121.     for (int i = 0; i < n; i++)
  122.     {
  123.         fstream f(to_string(i), fstream::out);
  124.         f.close();
  125.     }
  126. }
  127.  
  128. int min(int* arr, int n) //поиск индекса минимума в отрезке
  129. {
  130.     int i;
  131.     for (i = 0; arr[i] == -1 && i < n; i++);
  132.     int _min = i;
  133.     for (i++; i < n; i++)
  134.     {
  135.         if (arr[_min] > arr[i] && arr[i] != -1)
  136.         {
  137.             _min = i;
  138.         }
  139.     }
  140.     return _min;
  141. }
  142.  
  143. void merge_file(fstream** file, int n, int* a, int* d)// слияние отрезков
  144. {
  145.     int* s = new int[n - 1]; // отрезки
  146.     for (int i = 0; i < n - 1; i++)
  147.     {
  148.         s[i] = -1;
  149.     }
  150.     int end; // конец возрастающего отрезка
  151.  
  152.     while (a[n - 2] > 0)//пока файл не исчерпается
  153.     {
  154.         end = 0;
  155.         for (int i = 0; i < n - 1; i++)
  156.         {
  157.             if (d[i] > 0)// проверка на фиктивный отрезок
  158.             {
  159.                 end++;
  160.                 a[i]--;
  161.                 d[i]--;
  162.             }
  163.             else
  164.             {
  165.                 *file[i] >> s[i];
  166.             }
  167.         }
  168.         while (end < n - 1)
  169.         {
  170.             int _min = min(s, n - 1);
  171.             *file[n - 1] << s[_min] << " ";
  172.             *file[_min] >> s[_min];
  173.             if (s[_min] == -1)
  174.             {
  175.                 end++;
  176.                 a[_min]--;
  177.             }
  178.         }
  179.         *file[n - 1] << -1 << " ";// ограничиваем -1
  180.     }
  181. }
  182.  
  183. void merge(string file_name, int n, int& L, int* a, int* d)//Слияние (по лекции)
  184. {
  185.     string* name = new string[n];
  186.     fstream** file = new fstream * [n];
  187.  
  188.     for (int i = 0; i < n - 1; i++)// открываем файлы f[0]..f[n-2] на чтение
  189.     {
  190.         name[i] = to_string(i);
  191.         file[i] = new fstream(name[i], fstream::in);
  192.     }
  193.     //открываем файл f[n-1] на запись
  194.     name[n - 1] = to_string(n - 1);
  195.     file[n - 1] = new fstream(name[n - 1], fstream::out);
  196.  
  197.     // 6 пункт
  198.     while (L > 0)// проверка на конец сортировки
  199.     {
  200.         // 7 пункт
  201.         int min = d[0];
  202.         for (int j = 1; j < n - 1; j++)
  203.         {
  204.             if (min > d[j])
  205.                 min = d[j];
  206.         }
  207.  
  208.         if (min > 0)
  209.         {
  210.             int j;
  211.             for ( j = 0; j < n - 1; j++)
  212.             {
  213.                 a[j] -= min;
  214.                 d[j] -= min;
  215.             }
  216.             d[j] = min;
  217.         }
  218.  
  219.         merge_file(file, n, a, d);//слияние отрезков
  220.  
  221.         // 8 пункт
  222.         L--;
  223.  
  224.         file[n - 2]->close();
  225.         file[n - 1]->close();
  226.  
  227.         file[n - 2]->open(name[n - 2], fstream::out);
  228.         file[n - 1]->open(name[n - 1], fstream::in);
  229.  
  230.         //передвигаем указатели на файлы и их имена
  231.         string name_tmp = name[n - 1];
  232.         fstream* file_tmp = file[n - 1];
  233.  
  234.         int a_tmp = a[n - 1];
  235.         int d_tmp = d[n - 1];
  236.  
  237.         for (int i = n - 1; i > 0; i--)
  238.         {
  239.             name[i] = name[i - 1];
  240.             file[i] = file[i - 1];
  241.  
  242.             a[i] = a[i - 1];
  243.             d[i] = d[i - 1];
  244.         }
  245.  
  246.         name[0] = name_tmp;
  247.         file[0] = file_tmp;
  248.  
  249.         a[0] = a_tmp;
  250.         d[0] = d_tmp;
  251.     }
  252.  
  253.     for (int i = 0; i < n - 1; i++)
  254.     {
  255.         file[i]->close();
  256.  
  257.         delete file[i];
  258.     }
  259.  
  260.     delete[] file;
  261.  
  262.     copy_file(name[0], file_name); //переносим значения из f[0] в результирующий файл
  263. }
  264.  
  265. void main()
  266. {
  267.     int n,L;
  268.  
  269.     cout << "n = ";
  270.     cin >> n;
  271.     int* a = new int[n];
  272.     int* d = new int[n];
  273.  
  274.     create_file("StartFile.txt", n); // Создаем исходный файл
  275.     create_n_file(n); // Создаем n файлов
  276.     split("StartFile.txt", n, L, a, d); // Этап 1 разбиение
  277.     merge("ResFile.txt", n, L, a, d);// Этап 2 слияние
  278.  
  279.    
  280.     if (if_ascent("ResFile.txt")) // Проверка на возрастающую последовательность
  281.     {
  282.         cout << "Correct" << endl;
  283.     }
  284.     else
  285.     {
  286.         cout << "Incorrect" << endl;
  287.     }
  288.     delete[] d;
  289.     delete[] a;
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement