Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <clocale>
- #include <list>
- #include <iterator>
- using namespace std;
- class Matrix
- {
- protected:
- int r, c, s, e;
- int** Matr;
- // Создаём матрицу
- void Create()
- {
- if (r <= 0 || c <= 0)
- return;
- Matr = new int* [r];
- for (int z = 0; z < r; z++)
- Matr[z] = new int[c];
- }
- public:
- // Конструкторы и деструктор
- Matrix() : r(0), c(0), Matr(nullptr) { s, e = 0; }
- ~Matrix()
- {
- for (int z = 0; z < r; z++)
- delete[] Matr[z];
- delete[] Matr;
- }
- // Получаем данные от пользователя и создаем с ними матрицу
- void get_data_and_create()
- {
- cout << "Введите кол-во строк: \n";
- cin >> r;
- cout << "Введите кол-во столбцов: \n";
- cin >> c;
- cout << "Введите начало отрезка: \n";
- cin >> s;
- cout << "Введите конец отрезка: \n";
- cin >> e;
- Create();
- for (int i = 0; i < r; i++) // Указатель i
- {
- for (int j = 0; j < c; j++) // Цикл, заполняющий массив / указатель j
- {
- cout << "Массив [" << i + 1 << "][" << j + 1 << "] = "; // Показываем, какой элемент сейчас вводим
- cin >> Matr[i][j]; // Вводим этот элемент
- }
- }
- }
- int& Element(int i, int j)
- {
- if (i < r && j < c)
- return Matr[i][j];
- else
- cout << "Error: 1";
- }
- };
- class actions : public Matrix
- {
- private:
- int maxrownum, maxrowsum, temprowsum;
- list <int> not_on_section;
- bool all_on_section_so_far;
- public:
- actions()
- {
- maxrownum = 0;
- maxrowsum = 0;
- temprowsum = 0;
- all_on_section_so_far = true;
- }
- // Доп. методы
- //
- // Выводим матрицу на экран
- void Display()
- {
- cout << "\nМатрица:\n\n";
- for (int i = 0; i < r; i++)
- {
- for (int j = 0; j < c; j++)
- {
- cout.width(5);
- cout << Matr[i][j];
- }
- cout << endl;
- }
- }
- // Сумма первой строки и проверка ее суммы на предмет нахождения на отрезке
- // (Сумма первой строки нужна, чтобы знать, от чего искать максимум)
- void FirstRowSum()
- {
- for (int i = 0; i < c; i++)
- maxrowsum += Matr[0][i];
- if (maxrowsum < s || maxrowsum > e)
- {
- all_on_section_so_far = false;
- not_on_section.push_back(1);
- }
- }
- // Минимальная сумма столбца
- void Counting()
- {
- FirstRowSum();
- for (int i = 1; i < r; i++)
- {
- for (int j = 0; j < c; j++)
- temprowsum += Matr[i][j];
- // Ищем максимальную сумму ряда, если до этого не было сумм строк, не попадающих на отрезок
- // (За это отвечает флаг all_on_section_so_far. Если неподходящие строки уже были, то максимальную сумму искать нет смысла)
- if (temprowsum > maxrowsum && s <= temprowsum <= e && all_on_section_so_far == true)
- {
- maxrowsum = temprowsum;
- maxrownum = i;
- }
- // Добавляем не попадающие на отрезок строки в список
- // Список в данном случае удобнее массива, потому что мы заранее не знаем, сколько элементов будет. К тому же удобный и лаконичный вывод
- if (temprowsum < s || temprowsum > e)
- {
- all_on_section_so_far = false;
- not_on_section.push_back(i + 1);
- }
- temprowsum = 0;
- }
- }
- // В зависимости от выполнения условия, указанного в задании, выводим данные
- void result()
- {
- Counting();
- if (all_on_section_so_far == true) cout << "\nВсе суммы строк лежат на отрезке\nМаксимальная сумма строки и ее номер: " << maxrowsum << " " << maxrownum + 1 << endl;
- if (all_on_section_so_far == false)
- {
- cout << "\nКакие-то суммы строк не лежат на отрезке!\nВот номера этих строк: " << endl;
- copy(not_on_section.begin(), not_on_section.end(), ostream_iterator<int>(cout, " "));
- cout << endl;
- }
- }
- };
- int main()
- {
- setlocale(LC_ALL, "russian");
- Matrix M;
- actions AT;
- AT.get_data_and_create();
- AT.Display();
- AT.result();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement