skioe

Лабораторная 2 (СП)

Jun 20th, 2021
957
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <clocale>
  3. #include <list>
  4. #include <iterator>
  5.  
  6. using namespace std;
  7.  
  8.  
  9. class Matrix
  10. {
  11. protected:
  12.  
  13.     int r, c, s, e;
  14.     int** Matr;
  15.  
  16.     // Создаём матрицу
  17.     void Create()
  18.     {
  19.         if (r <= 0 || c <= 0)
  20.             return;
  21.         Matr = new int* [r];
  22.         for (int z = 0; z < r; z++)
  23.             Matr[z] = new int[c];
  24.     }
  25.  
  26. public:
  27.  
  28.     // Конструкторы и деструктор
  29.     Matrix() : r(0), c(0), Matr(nullptr) { s, e = 0; }
  30.  
  31.     ~Matrix()
  32.     {
  33.         for (int z = 0; z < r; z++)
  34.             delete[] Matr[z];
  35.         delete[] Matr;
  36.     }
  37.  
  38.     // Получаем данные от пользователя и создаем с ними матрицу
  39.     void get_data_and_create()
  40.     {
  41.         cout << "Введите кол-во строк: \n";
  42.         cin >> r;
  43.         cout << "Введите кол-во столбцов: \n";
  44.         cin >> c;
  45.         cout << "Введите начало отрезка: \n";
  46.         cin >> s;
  47.         cout << "Введите конец отрезка: \n";
  48.         cin >> e;
  49.  
  50.         Create();
  51.         for (int i = 0; i < r; i++) // Указатель i
  52.         {
  53.             for (int j = 0; j < c; j++) // Цикл, заполняющий массив / указатель j
  54.             {
  55.                 cout << "Массив [" << i + 1 << "][" << j + 1 << "] = "; // Показываем, какой элемент сейчас вводим
  56.                 cin >> Matr[i][j]; // Вводим этот элемент
  57.             }
  58.         }
  59.  
  60.     }
  61.  
  62.     int& Element(int i, int j)
  63.     {
  64.         if (i < r && j < c)
  65.             return Matr[i][j];
  66.         else
  67.             cout << "Error: 1";
  68.     }
  69. };
  70.  
  71. class actions : public Matrix
  72. {
  73. private:
  74.     int maxrownum, maxrowsum, temprowsum;
  75.     list <int> not_on_section;
  76.     bool all_on_section_so_far;
  77.  
  78. public:
  79.     actions()
  80.     {
  81.         maxrownum = 0;
  82.         maxrowsum = 0;
  83.         temprowsum = 0;
  84.         all_on_section_so_far = true;
  85.     }
  86.  
  87.     // Доп. методы
  88.     //
  89.     // Выводим матрицу на экран
  90.     void Display()
  91.     {
  92.         cout << "\nМатрица:\n\n";
  93.  
  94.         for (int i = 0; i < r; i++)
  95.         {
  96.             for (int j = 0; j < c; j++)
  97.             {
  98.                 cout.width(5);
  99.                 cout << Matr[i][j];
  100.             }
  101.             cout << endl;
  102.         }
  103.     }
  104.  
  105.     // Сумма первой строки и проверка ее суммы на предмет нахождения на отрезке
  106.     // (Сумма первой строки нужна, чтобы знать, от чего искать максимум)
  107.     void FirstRowSum()
  108.     {
  109.         for (int i = 0; i < c; i++)
  110.             maxrowsum += Matr[0][i];
  111.  
  112.         if (maxrowsum < s || maxrowsum > e)
  113.         {
  114.             all_on_section_so_far = false;
  115.             not_on_section.push_back(1);
  116.         }
  117.  
  118.     }
  119.  
  120.     // Минимальная сумма столбца
  121.     void Counting()
  122.     {
  123.         FirstRowSum();
  124.         for (int i = 1; i < r; i++)
  125.         {
  126.             for (int j = 0; j < c; j++)
  127.                 temprowsum += Matr[i][j];
  128.  
  129.             // Ищем максимальную сумму ряда, если до этого не было сумм строк, не попадающих на отрезок
  130.             // (За это отвечает флаг all_on_section_so_far. Если неподходящие строки уже были, то максимальную сумму искать нет смысла)
  131.             if (temprowsum > maxrowsum && s <= temprowsum <= e && all_on_section_so_far == true)
  132.             {
  133.                 maxrowsum = temprowsum;
  134.                 maxrownum = i;
  135.             }
  136.             // Добавляем не попадающие на отрезок строки в список
  137.             // Список в данном случае удобнее массива, потому что мы заранее не знаем, сколько элементов будет. К тому же удобный и лаконичный вывод
  138.             if (temprowsum < s || temprowsum > e)
  139.             {
  140.                 all_on_section_so_far = false;
  141.                 not_on_section.push_back(i + 1);
  142.             }
  143.  
  144.             temprowsum = 0;
  145.         }
  146.        
  147.     }
  148.  
  149.     // В зависимости от выполнения условия, указанного в задании, выводим данные
  150.     void result()
  151.     {
  152.         Counting();
  153.         if (all_on_section_so_far == true) cout << "\nВсе суммы строк лежат на отрезке\nМаксимальная сумма строки и ее номер: " << maxrowsum << " " << maxrownum + 1 << endl;
  154.         if (all_on_section_so_far == false)
  155.         {
  156.             cout << "\nКакие-то суммы строк не лежат на отрезке!\nВот номера этих строк: " << endl;
  157.             copy(not_on_section.begin(), not_on_section.end(), ostream_iterator<int>(cout, " "));
  158.             cout << endl;
  159.         }
  160.     }
  161. };
  162.  
  163.  
  164. int main()
  165. {
  166.     setlocale(LC_ALL, "russian");
  167.  
  168.     Matrix M;
  169.     actions AT;
  170.  
  171.     AT.get_data_and_create();
  172.     AT.Display();
  173.     AT.result();
  174.  
  175.     return 0;
  176. }
RAW Paste Data