Advertisement
Username77177

Dahl-Programming-Lab11-16

Apr 5th, 2020
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5. void fill_array(double* array, int size_of_array); // Prototype of function, which fill our array
  6. void show_array(double* array, int size_of_array); // Prototype of function, which show our array
  7. void show_array(double* array, int begin, int end); // Overweight for show_array
  8. void show_array(int* array, int begin, int end); // Another overweight for show_array
  9. void show_array(int* array, int size_of_array); // Yet another overweight for show_array
  10. void sort_for_second(int* array, int size); // Prototype of function, which will sort array for second task
  11.  
  12. int main() {
  13.     //Вариант 16
  14.     // Задача 1. Упорядочить в порядке убывания модулей элементы, расположенные между пятым положительным и первым отрицательным
  15.     // значениями массива.
  16.     srand(time(0));
  17.  
  18.     // Variables
  19.     int n, index_A = 0, index_B = n - 1 ;
  20.     /*
  21.      * Default Values:
  22.      * n - amount of cells in array
  23.      * index_A - index for first sorted element in array (Def: First Element)
  24.      * index_B - index for last sorted element in array (Def: Last Element)
  25.      * mid - middle index of array for qsort
  26.      */
  27.      cout << "Please, Enter amount of cells in the array: ";
  28.      cin >> n; // Type amount of cells in our array
  29.      auto *first_array = new double[n]; // New array for Qsort
  30.      fill_array(first_array, n); // Fill our array
  31.      show_array(first_array, n); // Show our array
  32.      int positive = 0; // Amount of positive elements
  33.  
  34.     for (int i = 0; i < n; i++) { // Finding beginning of sorting
  35.         if (first_array[i] > 0)
  36.         {
  37.             ++positive;
  38.         }
  39.         if (positive == 5)
  40.         {
  41.             index_A = i;
  42.             break;
  43.         }
  44.     }
  45.  
  46.     for (int i = n-1; i > 0; i--) {
  47.         // Finding the end of the sorting
  48.         if (first_array[i] < 0)
  49.         {
  50.             index_B = i;
  51.             break;
  52.         }
  53.     }
  54.  
  55.     show_array(first_array,index_A,index_B);
  56.  
  57.  
  58.     if (index_A > index_B)
  59.     {
  60.         swap(index_A,index_B) ; // Swap values of end and beginning, if second greater than first
  61.     }
  62.     //! Creating new array, because old array must be filtrated from index_A to index_B
  63.     int length_of_new_array = index_B - index_A; // Length from values from index_A to index_B
  64.     auto *new_array = new double [length_of_new_array]; // New array with length index_A - index_B
  65.     int index_transform = 0; // Index for translating cells from first array to the new array
  66.     for (int i = index_A; i < index_B; i++)
  67.     { // From old array to new array
  68.         new_array[index_transform] = first_array[i]; //TODO Make normal transt_pointeronation from first array to new array
  69.         index_transform++;
  70.     }
  71.  
  72.     cout << "Showing new array: " << endl;
  73.     show_array(new_array, length_of_new_array);
  74.  
  75.      /*
  76.       * 1. Выбор опорного элемента из массива. (mid)
  77.       * 2. Перераспределение элементов в массиве таким образом, что элементы меньше опорного помещаются перед ним,
  78.       *    а больше или равные — после.
  79.       * 3. Рекурсивное применение первых двух шагов к двум подмассивам слева и справа от опорного элемента.
  80.       *    Рекурсия не применяется к массиву, в котором только один или отсутствуют элементы.
  81.       */
  82.      //qsort
  83.  
  84.      // Second step
  85.     int * left_stack = new int[length_of_new_array], * right_stack = new int[length_of_new_array];
  86.  
  87.     int st_pointer = 1;
  88.     right_stack[st_pointer] = length_of_new_array - 1;
  89.     left_stack[st_pointer] = 0;
  90.  
  91.   while (st_pointer > 0)
  92.   { // Выборка из стека последнего запроса
  93.     int left = left_stack[st_pointer];
  94.     int right = right_stack[st_pointer];
  95.     st_pointer--;
  96.  
  97.     while (left < right)
  98.     {
  99.       int i = left, j = right; // 7
  100.       float middle = new_array[(left + right) / 2];
  101.       while (i < j)
  102.       {
  103.         while (new_array[i] < middle)
  104.         {
  105.           i++;
  106.         }
  107.         while (middle < new_array[j])
  108.         {
  109.           j--;
  110.         }
  111.         if (i <= j)
  112.         {
  113.           float temp = new_array[i];
  114.           new_array[i] = new_array[j];
  115.           new_array[j] = temp;
  116.           i++; j--;
  117.         }
  118.       }
  119.  
  120.       if (i < right)
  121.       {
  122.         st_pointer++;
  123.         left_stack[st_pointer] = i;
  124.         right_stack[st_pointer] = right;
  125.       }
  126.       right = j; // Теперь left и right ограничивают левую часть
  127.     }
  128.   }
  129.   cout << "Showing sorted array: " << endl;
  130.   show_array(new_array,length_of_new_array);
  131.  
  132.     // Задача 2. Дана целочисленная квадратная матрица. Упорядочить по возрастанию элементы в тех строках,
  133.     // которые содержат только кратные двум элементы.
  134.     cout << endl << endl;
  135.     const int cells = 5;
  136.     int array_2[cells][cells];
  137.     cout << "Another array from second task: \n";
  138.     for (int i = 0; i < cells; i++) {
  139.         for (int j = 0; j < cells; j++) {
  140.             array_2[i][j] = rand() % 5 - 2; // [-4;4]
  141.         }
  142.     }
  143.  
  144.     for (int i = 0; i< cells; i++) {
  145.         for (int j = 0; j < cells; j++) {
  146.             cout << array_2[i][j] << " ";
  147.         }
  148.         cout << "\n";
  149.     }
  150.  
  151.     // Filtering
  152.     int divide_by_2;
  153.     for (int j = 0; j < cells; j++) {
  154.         divide_by_2 = 0;
  155.         for (int i = 0; i < cells; i++) {
  156.             if (array_2[j][i] % 2 == 0)
  157.             {
  158.                 ++divide_by_2;
  159.             }
  160.  
  161.             if (divide_by_2 == cells)
  162.             {
  163.                 //Sorting row
  164.                 sort_for_second(array_2[i],cells);
  165.                 cout << "\n Sorted array: \n";
  166.                 show_array(array_2[i],cells);
  167.             }
  168.  
  169.             if (j == cells - 1 && divide_by_2 == 0)
  170.             {
  171.                 cout << "If array doesn't have any string which will be right for our task, we will sort last row\n Sorted array: \n";
  172.                 sort_for_second(array_2[i],cells);
  173.                 show_array(array_2[i],cells);
  174.             }
  175.  
  176.         }
  177.     }
  178.     return 0;
  179. }
  180.  
  181. void fill_array(double* array, int size_of_array)
  182. {
  183.     /* Fill array
  184.      * Arg: array, size of array
  185.      */
  186.     for (int i = 0; i < size_of_array; i++) {
  187.         array[i] = rand() % 21 - 5; // [-5;15]
  188.     }
  189. }
  190. void show_array(double* array, int size_of_array)
  191. {
  192.     /*
  193.      * Show array
  194.      * Arg: array, size of array
  195.      */
  196.     for (int i = 0; i < size_of_array; i++) {
  197.         cout << array[i] << " ";
  198.     }
  199.     cout << endl;
  200. }
  201.  
  202. void show_array(double* array, int begin, int end)
  203. {
  204.     /* Show array from begin to end index
  205.      * Arg: array, size of array, from index, to index
  206.      */
  207.     if (begin > end)
  208.     {
  209.         swap(begin,end);
  210.     }
  211.     for (int i = begin; i < end; i++) {
  212.         cout << array[i] << " ";
  213.     }
  214.     cout << endl;
  215. }
  216.  
  217. void sort_for_second(int* array, int size)
  218. {
  219.     int* left_stack = new int[size], *right_stack = new int[size];
  220.  
  221.     int st_pointer = 1;
  222.     right_stack[st_pointer] = size - 1;
  223.     left_stack[st_pointer] = 0;
  224.  
  225.   while (st_pointer > 0)
  226.   { // Выборка из стека последнего запроса
  227.     int left = left_stack[st_pointer];
  228.     int right = right_stack[st_pointer];
  229.     st_pointer--;
  230.  
  231.     while (left < right)
  232.     {
  233.       int i = left, j = right; // 7
  234.       float middle = array[(left + right) / 2];
  235.       while (i < j)
  236.       {
  237.         while (array[i] < middle)
  238.         {
  239.           i++;
  240.         }
  241.         while (middle < array[j])
  242.         {
  243.           j--;
  244.         }
  245.         if (i <= j)
  246.         {
  247.           float temp = array[i];
  248.           array[i] = array[j];
  249.           array[j] = temp;
  250.           i++; j--;
  251.         }
  252.       }
  253.  
  254.       if (i < right)
  255.       {
  256.         st_pointer++;
  257.         left_stack[st_pointer] = i;
  258.         right_stack[st_pointer] = right;
  259.       }
  260.       right = j; // Теперь left и right ограничивают левую часть
  261.     }
  262.   }
  263. }
  264.  
  265. void show_array(int* array, int begin, int end)
  266. {
  267.     /* Show array from begin to end index
  268.      * Arg: array, size of array, from index, to index
  269.      */
  270.     if (begin > end)
  271.     {
  272.         swap(begin,end);
  273.     }
  274.     for (int i = begin; i < end; i++) {
  275.         cout << array[i] << " ";
  276.     }
  277.     cout << endl;
  278. }
  279.  
  280. void show_array(int* array, int size_of_array)
  281. {
  282.     /*
  283.      * Show array
  284.      * Arg: array, size of array
  285.      */
  286.     for (int i = 0; i < size_of_array; i++) {
  287.         cout << array[i] << " ";
  288.     }
  289.     cout << endl;
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement