Advertisement
daniil_mironoff

Lab 3 :: for Andrey with Love (Red Heart)

Apr 27th, 2019
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.09 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. //#include "stdafx.h"
  4.  
  5. using namespace std;
  6.  
  7. // Класс Матрица
  8. class Matrix {
  9.     protected:
  10.         int sizeX; // Размер матрицы по горизонтале                         Этот код
  11.         int sizeY; // Размер матрицы по вертикали                           был написан под
  12.         int ** values; // Значения матрицы                                  Монеточку (рукалицо)
  13.         int size_maxVal = 5; // Кол-во цифр макс. возможного значения
  14.  
  15.     public:
  16.         // Возвращает размер числа
  17.         int return_size_num(int num) {
  18.             if (num == 0) {
  19.                 return 1;
  20.             }
  21.  
  22.             int size_num = 0;
  23.             while(num) {
  24.                 num /= 10;
  25.                 size_num++;
  26.             }
  27.  
  28.             return size_num;
  29.         }
  30.  
  31.         // Выводит матрицу
  32.         void printValues() {
  33.             cout << "Матрица:" << endl;
  34.             for (int i = 0; sizeY > i; i++) {
  35.                 for (int j = 0; sizeX > j; j++) {
  36.                     int size_num = return_size_num(values[i][j]);
  37.  
  38.                     // Затычка для красоты матрицы (заполнение ннезначащих нулей)
  39.                     for(int i = 0; size_maxVal - size_num > i; i++) {
  40.                         cout << "0";
  41.                     }
  42.  
  43.                     cout << values[i][j] << " ";
  44.                 }
  45.  
  46.                 cout << endl;
  47.             }
  48.  
  49.         }
  50.  
  51.         // Выводит Решение задачи
  52.         void algorithm() {
  53.             int * arr_sum = new int[sizeY];
  54.             bool flag = 0;
  55.             int range_start; // Значение интервала ОТ (включительно)
  56.             int range_finish; // Значения интервала ДО (включительно)
  57.  
  58.             // Ввод значений интервала
  59.             cout << "Введите интервал суммы строк ОТ:";
  60.             cin >> range_start;
  61.             cout << "Введите интервал суммы строк ДО:";
  62.             cin >> range_finish;
  63.  
  64.             // Нахождение сумм строк
  65.             // Если найдется хоть одна: начнется вывода
  66.             // аких строк (все в одном цикле)
  67.             for (int i = 0; i < sizeY; i++) {
  68.                 int sum = 0;
  69.                 for (int j = 0; j < sizeX; j++) {
  70.                     sum += values[i][j];
  71.                 }
  72.  
  73.                 arr_sum[i] = sum;
  74.  
  75.                 if (sum > range_finish || range_start > sum) {
  76.                     if (flag == 0) {
  77.                         cout << "Строки, сумма которых не попала на заданный отрезок:";
  78.                     }
  79.  
  80.                     cout << " " << i + 1;
  81.  
  82.                     flag = 1;
  83.                 }
  84.             }
  85.            
  86.             // Если таких все суммы строк в интервале
  87.             if (flag == 0) {
  88.                 int max = 0;
  89.                 int max_id = 0;
  90.                 for (int i = 0; i < sizeY; i++) {
  91.                     if (arr_sum[i] > max) {
  92.                         max_id = i;
  93.                         max = arr_sum[i];
  94.                     }
  95.                 }
  96.  
  97.                 cout << "Номер строки с наибольшей суммой элементов: " << max_id + 1;
  98.             }
  99.  
  100.             cout << endl;
  101.         }
  102.  
  103. };
  104.  
  105.  
  106. // Класс Рандомная - Матрица
  107. class MatrixRandom : public Matrix {
  108.     public:
  109.         // Конструктор
  110.         MatrixRandom(int X = 5, int Y = 5, int maxVal = 32767, int minVal = 0) {
  111.             sizeX = X;
  112.             sizeY = Y;
  113.             size_maxVal = return_size_num(maxVal);
  114.             maxVal -= (minVal - 1);
  115.  
  116.             values = new int * [sizeY];
  117.  
  118.             for (int i = 0; sizeY > i; i++) {
  119.                 values[i] = new int [sizeX];
  120.  
  121.                 for (int j = 0; sizeX > j; j++) {
  122.                     values[i][j] = (rand() % maxVal) + minVal;
  123.                 }
  124.             }
  125.         }
  126. };
  127.  
  128. // Класс Кольцевая - Матрица
  129. // (Данная матрица - квадратная)
  130. // Пример:
  131. // 0 0 0 0 0
  132. // 0 1 1 1 0
  133. // 0 1 2 1 0
  134. // 0 1 1 1 0
  135. // 0 0 0 0 0
  136. class MatrixСircles : public Matrix {
  137.     public:
  138.         // Конструктор
  139.         MatrixСircles(int size = 8) {
  140.             sizeX = size;
  141.             sizeY = size;
  142.             size_maxVal = 1;
  143.             int count = 0;
  144.             values = new int * [sizeY];
  145.  
  146.             // Заполнение первой половины матрицы
  147.             for (int y = 0; (sizeY / 2 + (sizeY % 2)) > y; y++) {
  148.                 values[y] = new int [sizeX];
  149.                
  150.                 for (int x = 0; sizeX > x; x++) {
  151.                     values[y][x] = count % 10;
  152.  
  153.                     // Левые бока колец
  154.                     if (x < y) {
  155.                         count++;
  156.                     }
  157.  
  158.                     // Правые бока колец
  159.                     if (size - y - 2 < x) {
  160.                         count--;
  161.                     }
  162.                 }
  163.  
  164.                 count = 0;
  165.                 cout << endl;
  166.             }
  167.            
  168.             // Отзеркаливание
  169.             for (int y = 0; sizeY / 2 > y; y++) {
  170.                 values[(sizeY / 2 + (sizeY % 2)) + y] = new int [sizeX];
  171.  
  172.                 for (int x = 0; sizeX > x; x++) {
  173.                     values[sizeY / 2 + (sizeY % 2) + y][x] = values[sizeY / 2 - y - 1][x];
  174.                 }
  175.  
  176.                 count = 0;
  177.                 cout << endl;
  178.             }
  179.  
  180.  
  181.             size_maxVal = 1;
  182.  
  183.         }
  184. };
  185.  
  186. int main() {
  187.     srand(time(NULL));
  188.     setlocale(LC_ALL, "Russian");
  189.  
  190.     MatrixСircles objA(5);
  191.     objA.printValues();
  192.  
  193.     return 0;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement