Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <locale>
  4.  
  5. using namespace std;
  6. struct Node //узел в списке для храниения неиспользуемых массивов
  7. {
  8.     double* arr_data;
  9.     int size;
  10.     Node* next;
  11. };
  12. class List
  13. {
  14. private:
  15.     Node* head; //"голова" связанного списка
  16. public:
  17.     List()
  18.     {
  19.         head = NULL;
  20.     }
  21.     //метод, добавляющий новый узел в список
  22.     void addNode(int size, double* pointer)
  23.     {
  24.         Node* nd = new Node;
  25.         nd->arr_data = pointer;
  26.         nd->size = size;
  27.         nd->next = NULL;
  28.         if (head == NULL)
  29.             head = nd;
  30.         else
  31.         {
  32.             Node* current = head;
  33.             while (current->next != NULL)
  34.                 current = current->next;
  35.             current->next = nd;
  36.         }
  37.     }
  38.  
  39.     void print_all_list()//печатает содержимое всех элементов сохранённых масивов
  40.     {
  41.         Node* current = head;
  42.         while (current != NULL)
  43.         {
  44.             for (int i = 0; i < current->size; i++)
  45.             {
  46.                 cout << current->arr_data[i] << endl;
  47.             }
  48.             current = current->next;
  49.         }
  50.     }
  51.  
  52.  
  53.  
  54.  
  55. };
  56.  
  57. class d_array
  58. {
  59.  
  60. private:
  61.     List list;
  62.     double* arr;
  63.     int size;
  64.  
  65. public:
  66.     d_array(int size_ar)
  67.     {
  68.  
  69.         this->size = size_ar;
  70.         if (size < 1)
  71.         {
  72.             cout << "error: the size of array should be more than 0" << endl;
  73.             exit(-1);
  74.         }
  75.         else
  76.         {
  77.             arr = new double[size_ar];
  78.             for (int i = 0; i < size_ar; i++)
  79.             {
  80.                 arr[i] = 0;
  81.             }
  82.             cout << "Первоначальный массив: ";
  83.             print_array();
  84.  
  85.         }
  86.  
  87.     }
  88.     void reallocation(int n_size)//функция изменения размера памяти
  89.     {
  90.  
  91.         if (n_size == size)
  92.         {
  93.             return;
  94.             print_array();
  95.         }
  96.         else if (n_size < size && n_size > 0)
  97.         {
  98.             double* ne_array = new double[n_size];
  99.             for (size_t i = 0; i < n_size; i++)
  100.             {
  101.                 ne_array[i] = arr[i];
  102.             }
  103.             arr = ne_array;
  104.             size = n_size;
  105.             list.addNode(size, arr);
  106.             print_array();
  107.         }
  108.         else if (n_size > size)
  109.         {
  110.             double* new_array = new double[n_size];
  111.             for (size_t i = 0; i < size; i++)
  112.             {
  113.                 new_array[i] = arr[i];
  114.             }
  115.             for (size_t i = size; i < n_size; i++)
  116.             {
  117.                 new_array[i] = 0;
  118.             }
  119.             size = n_size;
  120.             list.addNode(size, arr);
  121.             arr = new_array;
  122.             print_array();
  123.         }
  124.         else if (n_size <= 0)
  125.         {
  126.             cout << "error: the size of array should be more than 0" << endl;
  127.             exit(-1);
  128.         }
  129.  
  130.  
  131.     }
  132.     void push_back(double value)//функция добавления элемента в конец массива
  133.     {
  134.         double* new_array = new double[size + 1];
  135.         for (int i = 0; i < size; i++)
  136.         {
  137.             new_array[i] = arr[i];
  138.         }
  139.         new_array[size] = value;
  140.         list.addNode(size, arr);
  141.         this->arr = new_array;
  142.         this->size++;
  143.         print_array();
  144.     }
  145.  
  146.     void Insert(double value, int index)//функция вставки элемента по индексу
  147.     {
  148.         if (index < size && index >= 0)
  149.         {
  150.             double* new_array = new double[size + 1];
  151.             new_array[size] = value;
  152.             for (int i = 0; i < size; i++)
  153.             {
  154.                 new_array[i] = arr[i];
  155.             }
  156.             size++;
  157.             for (size_t i = size - 1; i >= index + 1; i--)
  158.             {
  159.                 double rem = new_array[i];
  160.                 new_array[i] = new_array[i - 1];
  161.                 new_array[i - 1] = rem;
  162.             }
  163.  
  164.             list.addNode(size, arr);
  165.             arr = new_array;
  166.             size++;
  167.             print_array();
  168.  
  169.         }
  170.         else if (index >= size)
  171.         {
  172.             cout << "warning: Index out of range. The element " << value << " was added at the end of array" << endl;
  173.             push_back(value);
  174.             print_array();
  175.         }
  176.         else if (index < 0)
  177.         {
  178.             cout << "error: Index out of range." << endl;
  179.             exit(-5);
  180.         }
  181.  
  182.     }
  183.  
  184.     double* get_pointer(int index)//функция получения ссылки на эелемент для прямого доступа к значению
  185.     {
  186.         if (index >= 0 && index < size)
  187.         {
  188.             return this->arr + index;
  189.         }
  190.         else
  191.         {
  192.             cout << "error: Index out of range." << endl;
  193.             exit(-5);
  194.         }
  195.  
  196.     }
  197.  
  198.     int get_size()//возвращает колчество элементов
  199.     {
  200.         return size;
  201.     }
  202.  
  203.     void remove(int index)//удалить элемент по индексу
  204.     {
  205.         if (index < size && index >= 0)
  206.         {
  207.             arr[index] = 0;
  208.             for (int i = index; i < size - 1; i++)
  209.             {
  210.                 double rem = arr[i];
  211.                 arr[i] = arr[i + 1];
  212.                 arr[i + 1] = rem;
  213.             }
  214.             size--;
  215.             double* new_array = new double[size];
  216.             for (size_t i = 0; i < size; i++)
  217.             {
  218.                 new_array[i] = arr[i];
  219.             }
  220.             arr = new_array;
  221.             list.addNode(size, arr);
  222.             print_array();
  223.         }
  224.         else
  225.         {
  226.             cout << "error: Index out of range" << endl;
  227.             exit(-2);
  228.         }
  229.  
  230.     }
  231.  
  232. private:
  233.     void q_sort(double* numbers, int left, int right)
  234.     {
  235.  
  236.         double pivot;
  237.         int l_hold = left;
  238.         int r_hold = right;
  239.         pivot = numbers[left];
  240.         while (left < right)
  241.         {
  242.             while ((numbers[right] >= pivot) && (left < right))
  243.                 right--;
  244.             if (left != right)
  245.             {
  246.                 numbers[left] = numbers[right];
  247.                 left++;
  248.             }
  249.             while ((numbers[left] <= pivot) && (left < right))
  250.                 left++;
  251.             if (left != right)
  252.             {
  253.                 numbers[right] = numbers[left];
  254.                 right--;
  255.             }
  256.         }
  257.         numbers[left] = pivot;
  258.         pivot = left;
  259.         left = l_hold;
  260.         right = r_hold;
  261.         if (left < pivot)
  262.             q_sort(numbers, left, pivot - 1);
  263.         if (right > pivot)
  264.             q_sort(numbers, pivot + 1, right);
  265.  
  266.     }
  267.  
  268.     void q_sort_desc(double* numbers, int left, int right)
  269.     {
  270.         double pivot;
  271.         int l_hold = left;
  272.         int r_hold = right;
  273.         pivot = numbers[left];
  274.         while (left < right)
  275.         {
  276.             while ((numbers[right] <= pivot) && (left < right))
  277.                 right--;
  278.             if (left != right)
  279.             {
  280.                 numbers[left] = numbers[right];
  281.                 left++;
  282.             }
  283.             while ((numbers[left] >= pivot) && (left < right))
  284.                 left++;
  285.             if (left != right)
  286.             {
  287.                 numbers[right] = numbers[left];
  288.                 right--;
  289.             }
  290.         }
  291.         numbers[left] = pivot;
  292.         pivot = left;
  293.         left = l_hold;
  294.         right = r_hold;
  295.         if (left < pivot)
  296.             q_sort_desc(numbers, left, pivot - 1);
  297.         if (right > pivot)
  298.             q_sort_desc(numbers, pivot + 1, right);
  299.  
  300.     }
  301.     int b_search(double* arr, double key)
  302.     {
  303.  
  304.         int left = 0, right = size;
  305.         while (left <= right)
  306.         {
  307.  
  308.             int middle = (left + right) / 2;
  309.  
  310.             if (key == arr[middle])
  311.             {
  312.                 return middle;
  313.             }
  314.             else if (key < arr[middle])
  315.             {
  316.  
  317.                 right = middle - 1;
  318.             }
  319.             else
  320.             {
  321.  
  322.                 left = middle + 1;
  323.             }
  324.         }
  325.         return -1;
  326.     }
  327.  
  328. public:
  329.     void sort_ascending()//сортировка по возрасатанию
  330.     {
  331.  
  332.  
  333.         q_sort(arr, 0, size - 1);
  334.         print_array();
  335.  
  336.     }
  337.     void sort_descending()//сортировка по убыванию
  338.     {
  339.         q_sort_desc(arr, 0, size - 1);
  340.         print_array();
  341.     }
  342.  
  343.     int binary_search(int key)//бинарный поиск
  344.     {
  345.         double* b_arr = new double[size];
  346.         for (size_t i = 0; i < size; i++)
  347.         {
  348.             b_arr[i] = arr[i];
  349.         }
  350.         q_sort(b_arr, 0, size);
  351.         int index = b_search(b_arr, key);
  352.         if (index < 0)
  353.         {
  354.             cout << "warning: could not find this element: " << key << endl;
  355.             return -1;
  356.         }
  357.         int index_arr = -1;
  358.         for (size_t i = 0; i < size; i++)
  359.         {
  360.             if (b_arr[index] == arr[i])
  361.             {
  362.                 index_arr = i;
  363.             }
  364.         }
  365.         return index_arr;
  366.     }
  367.  
  368.     ~d_array()
  369.     {
  370.  
  371.     }
  372.     void print_array()
  373.     {
  374.         for (int i = 0; i < size; i++)
  375.         {
  376.             printf("%.2f ", arr[i]);
  377.  
  378.         }
  379.         printf("\n");
  380.     }
  381.  
  382. };
  383.  
  384. int main()
  385. {
  386.     setlocale(0, "Rus");
  387.     cout << "Создание массива размера 26 "<<endl;
  388.     d_array array(26);
  389.     cout << "Изменение размера памяти (9) "<<endl;
  390.     array.reallocation(9);
  391.  
  392.     double ini = 345.00;
  393.     cout << "Вставка элемента 345.00 на места с индексами 0..9 "<<endl;
  394.     for (int i = 0; i < 5; i++)
  395.     {  
  396.         array.Insert(ini, i);
  397.         ini--;
  398.     }
  399.  
  400.     cout.setf(ios::hex);
  401.     cout << "Адрес 15 элемента в памяти: " << uppercase << hex << array.get_pointer(15) << endl;
  402.     cout.setf(ios::dec);
  403.     cout << "Размер массива: " << array.get_size() << endl;
  404.     cout << "Добавление элемента 78 в конец массива" << endl;
  405.     array.push_back(78);
  406.     cout << "Удаление элемента по индексу 5" << endl;
  407.     array.remove(5);
  408.     cout << "Сортировка по возрастанию" << endl;
  409.     array.sort_ascending();
  410.     cout << "Сортировка по убыванию" << endl;
  411.     array.sort_descending();
  412.     cout << "Удаление элемента по индексу 6" << endl;
  413.     array.remove(6);
  414.  
  415.     int element_to_find = 344;
  416.     cout << "Индекс элемента " << element_to_find << " в массиве: " << array.binary_search(element_to_find) << endl;
  417.  
  418. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement