Advertisement
Guest User

Class16-2

a guest
Sep 18th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.72 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <climits>
  5.  
  6. // Класс Вектор, хранит элементы типа int
  7. class Vector {
  8. private:
  9.     unsigned m_size; // размер вектора
  10.     int* m_start;    // указатель на начало
  11.  
  12. public:
  13.     // Конструктор по-умолчанию, задает размер=0 и m_start равным нулевому указателю
  14.     Vector(): m_size(0), m_start(nullptr) {}
  15.  
  16.     // Конструктор из массива. Принимает указатель на массив и его размер
  17.     Vector(int* array, unsigned size) {
  18.         // Задаем размер
  19.         m_size = size;
  20.  
  21.         // Выделяем память
  22.         m_start = new int[m_size];
  23.  
  24.         // Копируем элементы из массива
  25.         for (int i = 0; i < m_size; ++i)
  26.             m_start[i] = array[i];
  27.     }
  28.  
  29.     // Перегрузка оператора присваивания
  30.     Vector& operator= (const Vector& vec) {
  31.         // Копируем размер вектора
  32.         m_size = vec.m_size;
  33.  
  34.         // Выделяем память под элементы вектора
  35.         int* new_start = new int[m_size];
  36.  
  37.         // Копируем элементы в новую память
  38.         for (int i = 0; i < m_size; ++i)
  39.             new_start[i] = vec.m_start[i];
  40.  
  41.         // Освобождаем старую память под элементы
  42.         delete [] m_start;
  43.         m_start = new_start; // Присваиваем переменной m_start значение нового указателя на элементы
  44.  
  45.         return *this;
  46.     }
  47.  
  48.     // Деструктор
  49.     ~Vector() {
  50.         // Освобождаем память
  51.         delete [] m_start;
  52.     }
  53.  
  54.     // Метод для добавления значения в вектор. Принимает значение и его кол-во (для задания важно именно кол-во значений)
  55.     // По-умолчанию добавляет одно значение
  56.     void add(int value, unsigned count = 1) {
  57.         unsigned new_size = m_size + count; // находим новый размер вектора
  58.  
  59.         int* new_start = new int[count]; // Выделяем новую память под элементы вектора
  60.  
  61.         // Если m_start не нулевой указатель - копируем из него все значения в новую память
  62.         if (m_start) {
  63.             for (int i = 0; i < m_size; ++i)
  64.                 new_start[i] = m_start[i];
  65.         }
  66.  
  67.         // Добавляем значение в конец столько раз, сколько задано в переменной count
  68.         for (int i = m_size; i < new_size; ++i)
  69.             new_start[i] = value;
  70.  
  71.         // Освобождаем память от старых элементов вектора, перезаписываем переменные
  72.         delete [] m_start;
  73.         m_start = new_start;
  74.         m_size = new_size;
  75.     }
  76.  
  77.     // Метод для удаления элементов вектора с конца. Принимает кол-во элементов, которые надо удалить
  78.     void erase(unsigned count) {
  79.         // Если хотим удалить больше чем есть - устанавливаем размер в 0
  80.         if (m_size < count)
  81.             m_size = 0;
  82.         else
  83.             // Если нет - уменьшаем на кол-во элементов, которые надо удалить
  84.             m_size -= count;
  85.     }
  86.  
  87.     // Метод возвращает кол-во элементов в векторе
  88.     unsigned getSize() {
  89.         return m_size;
  90.     }
  91.  
  92.     // Метод возвращает наибольшее значения элемента в векторе. Если вектор пуст, то возвратит самый маленький int
  93.     int findMax() {
  94.         int max = INT_MIN; // Инициализируем переменную max значением самого маленького int
  95.  
  96.         // Находим в цикле наибольшее значение в векторе
  97.         for (int i = 0; i < m_size; ++i) {
  98.             if(max < m_start[i])
  99.                 max = m_start[i];
  100.         }
  101.  
  102.         // Возвращаем его
  103.         return max;
  104.     }
  105.  
  106.     void print() {
  107.         for (int i = 0; i < m_size; ++i)
  108.             std::cout << m_start[i] << "  ";
  109.         std::cout << std::endl;
  110.     }
  111. };
  112.  
  113. // Функция генерирует вектор случайного размера (от 10 до 30) со случайными элементами (от 1 до 1001)
  114. Vector generateRandomVector() {
  115.     unsigned size = rand() % 20 + 10; // Генерируем случайный размер
  116.  
  117.     int* a = new int[size]; // Выделяем память под массив этого размера
  118.  
  119.     // Заполняем массив случайными значениями
  120.     for (int i = 0; i < size; ++i)
  121.         a[i] = rand() % 1000 + 1;
  122.  
  123.     // Инициализируем вектор массивом
  124.     Vector result(a, size);
  125.  
  126.     delete [] a; // Освобождаем память массива
  127.  
  128.     return result; // Возвращаем вектор
  129. }
  130.  
  131. int main() {
  132.     setlocale(LC_CTYPE, "rus");
  133.  
  134.     srand(clock()); // Инициализируем рандом текущим временем (чтобы при каждом запуске программа работала по-разному)
  135.  
  136.     unsigned size = rand() % 20 + 10; // Генерируем случайный размер массива векторов (от 10 до 30)
  137.     Vector* vectors = new Vector[size]; // Выделяем память под массив векторов
  138.  
  139.     // Генерируем случайные вектора в цикле
  140.     for (int i = 0; i < size; ++i)
  141.         vectors[i] = generateRandomVector();
  142.  
  143.     // Выводим на экран
  144.     std::cout << "Сгенерированные вектора: " << std::endl;
  145.     for (int i = 0; i < size; ++i)
  146.         vectors[i].print();
  147.  
  148.     // Находим самое большое значение из всех векторов
  149.     int max = INT_MIN;
  150.     for (int i = 0; i < size; ++i) {
  151.         int imax = vectors[i].findMax();
  152.  
  153.         if (imax > max)
  154.             max = imax;
  155.     }
  156.     std::cout << "Наибольшее значение: " << max << std::endl;
  157.  
  158.     // Находим самый длинный вектор
  159.     int maxlen = vectors[0].getSize();
  160.     int maxlen_index = 0;
  161.  
  162.     for (int i = 1; i < size; ++i) {
  163.         int len = vectors[i].getSize();
  164.         if (len > maxlen) {
  165.             maxlen = len;
  166.             maxlen_index = i;
  167.         }
  168.     }
  169.     std::cout << "\nСамый длинный вектор (" << maxlen << " элементов): " << std::endl;
  170.     vectors[maxlen_index].print();
  171.     std::cout << std::endl;
  172.  
  173.  
  174.     // Выводим первые 3 вектора
  175.     std::cout << "Первые 3 вектора: " << std::endl;
  176.     vectors[0].print();
  177.     vectors[1].print();
  178.     vectors[2].print();
  179.  
  180.     // Укорачиваем 2 вектора, удлиняем 1
  181.     vectors[0].erase(10);
  182.     vectors[1].erase(5);
  183.     vectors[2].add(228, 10);
  184.  
  185.     // Выводим первые 3 вектора
  186.     std::cout << "Первые 3 вектора (сокращаем первый и второй, удлиняем третий)" << std::endl;
  187.     vectors[0].print();
  188.     vectors[1].print();
  189.     vectors[2].print();
  190.  
  191.     return 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement