Advertisement
gasaichan

what_am_i_doing_with_my_life

May 15th, 2019
402
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.24 KB | None | 0 0
  1. /*
  2. Исходные данные : массив вещественных чисел.
  3. Найти местоположение максимума и минимума(вернуть из функции два значения),
  4. таким образом, массив будет разделен на 3 части.
  5. В большей по количеству элементов части найти все положительные элементы.
  6. */
  7. #include "pch.h"
  8. #include <iostream>
  9. #include <clocale>
  10. #include <cstdlib>
  11. #include <Windows.h>
  12. #include <ctime>
  13. #include <iomanip>
  14.  
  15. using namespace std;
  16.  
  17. #define ROW 4
  18. #define COLUMN 4
  19.  
  20. /*
  21. Вам наверное интересно, а нахуя так много аргументов у функции? По заданию функция должна вернуть два значения,
  22. но для дальнейшего его выполнения двух будет маловато. Нужно больше промежуточных значений, и они все должны быть
  23. переданы.
  24. */
  25. void findExtremes(double ** arr, double * max, double * min, int * iMin, int * jMin, int * iMax, int * jMax) {
  26.     for (int i = 0; i < ROW; i++) {
  27.         for (int j = 0; j < COLUMN; j++) {
  28.             if (arr[i][j] < *min) {
  29.                 *min = arr[i][j];
  30.                 *iMin = i;
  31.                 *jMin = j;
  32.             }
  33.             if (arr[i][j] > *max) {
  34.                 *max = arr[i][j];
  35.                 *iMax = i;
  36.                 *jMax = j;
  37.             }
  38.         }
  39.     }
  40. }
  41.  
  42. int main() {
  43.     setlocale(LC_ALL, "Russian");
  44.     srand(time(0));
  45.     cout.precision(4);
  46.  
  47.     double ** arr = new double * [ROW];
  48.  
  49.     for (int i = 0; i < ROW; i++) {
  50.         arr[i] = new double[COLUMN];
  51.         for (int j = 0; j < COLUMN; j++) {
  52.             arr[i][j] = rand() % 100 / (double)8;
  53.             cout << arr[i][j] << "\t";
  54.         }
  55.         cout << endl;
  56.     }
  57.     // В этих переменных будут храниться:
  58.     int * iMin = new int(0); // номер строки минимального элемента
  59.     int * jMin = new int(0); // номер столбца минимального элемента
  60.     int * iMax = new int(0); // номер строки максимального элемента
  61.     int * jMax = new int(0); // номер столбца максимального элемента
  62.  
  63.     // Переменные, в которых будут храниться вычисленные значения минимального и максимального
  64.     // элементов массива. Изначально инициализируются первым элементом массива
  65.     double * min = new double(arr[0][0]);
  66.     double * max = new double(arr[0][0]);
  67.  
  68.     findExtremes(arr, max, min, iMin, jMin, iMax, jMax);
  69.  
  70.     cout << "Минимальный элемент находится на " << *iMin + 1 << " строке и " << *jMin + 1 << " столбце." << " Он равен " << *min << endl;
  71.     cout << "Максимальный элемент находится на " << *iMax + 1 << " строке и " << *jMax + 1 << " столбце." << " Он равен " << *max << endl;
  72.  
  73.     // Переведем позиции минимума и максимума в такие позиции, как если бы они находились в одномерном массиве
  74.     int minPos = *iMin * COLUMN + *jMin;
  75.     int maxPos = *iMax * COLUMN + *jMax;
  76.  
  77.     cout << "Максимальный отрезок, получаемый разделением массива минимальным и максимальным элементом: " << endl;
  78.  
  79.     /*
  80.     Да простит меня Кнут
  81.     */
  82.     if (minPos < maxPos) {
  83.         if (minPos > maxPos - minPos) {
  84.             if (minPos > COLUMN * ROW - maxPos) {
  85.                 // Больше всего элементов в отрезке от начала массива
  86.                 // до минимального элемента
  87.                 for (int i = 0; i < *iMin; i++) {
  88.                     for (int j = 0; j < COLUMN; j++) {
  89.                         cout << arr[i][j] << "\t";
  90.                     }
  91.                 }
  92.  
  93.                 for (int j = 0; j <= *jMin; j++) {
  94.                     cout << arr[*iMin][j] << "\t";
  95.                 }
  96.             }
  97.             else {
  98.                 // Больше всего элементов в отрезке от минимального элемента
  99.                 // до максимального элемента
  100.                 for (int i = *iMin; i <= *iMin; i++) {
  101.                     for (int j = *jMin; j < COLUMN; j++) {
  102.                         cout << arr[i][j] << "\t";
  103.                     }
  104.                 }
  105.                 for (int i = *iMin + 1; i < *iMax; i++) {
  106.                     for (int j = 0; j < COLUMN; j++) {
  107.                         cout << arr[i][j] << "\t";
  108.                     }
  109.                 }
  110.                 for (int i = *iMax; i <= *iMax; i++) {
  111.                     for (int j = 0; j <= *jMax; j++) {
  112.                         cout << arr[i][j] << "\t";
  113.                     }
  114.                 }
  115.             }
  116.         }
  117.         else if (maxPos - minPos > COLUMN * ROW - maxPos) {
  118.             // Больше всего элементов в отрезке от минимального элемента
  119.             // до максимального элемента
  120.             for (int i = *iMin; i <= *iMin; i++) {
  121.                 for (int j = *jMin; j < COLUMN; j++) {
  122.                     cout << arr[i][j] << "\t";
  123.                 }
  124.             }
  125.             for (int i = *iMin + 1; i < *iMax; i++) {
  126.                 for (int j = 0; j < COLUMN; j++) {
  127.                     cout << arr[i][j] << "\t";
  128.                 }
  129.             }
  130.             for (int i = *iMax; i <= *iMax; i++) {
  131.                 for (int j = 0; j <= *jMax; j++) {
  132.                     cout << arr[i][j] << "\t";
  133.                 }
  134.             }
  135.         }
  136.         else {
  137.             // Больше всего элементов в отрезке от максимального элемента
  138.             // до конца массива
  139.             for (int j = *jMax; j < COLUMN; j++) {
  140.                 cout << arr[*iMax][j] << "\t";
  141.             }
  142.  
  143.             for (int i = *iMax + 1; i < ROW; i++) {
  144.                 for (int j = 0; j < COLUMN; j++) {
  145.                     cout << arr[i][j] << "\t";
  146.                 }
  147.             }
  148.         }
  149.     }
  150.     else {
  151.         if (maxPos > minPos - maxPos) {
  152.             if (maxPos > COLUMN * ROW - minPos) {
  153.                 // от начала до максимального
  154.                 for (int i = 0; i < *iMax; i++) {
  155.                     for (int j = 0; j < COLUMN; j++) {
  156.                         cout << arr[i][j] << "\t";
  157.                     }
  158.                 }
  159.  
  160.                 for (int j = 0; j <= *jMax; j++) {
  161.                     cout << arr[*iMax][j] << "\t";
  162.                 }
  163.             }
  164.             else {
  165.                 // от максимального до минимального
  166.                 for (int i = *iMax; i <= *iMax; i++) {
  167.                     for (int j = *jMax; j < COLUMN; j++) {
  168.                         cout << arr[i][j] << "\t";
  169.                     }
  170.                 }
  171.                 for (int i = *iMax + 1; i < *iMin; i++) {
  172.                     for (int j = 0; j < COLUMN; j++) {
  173.                         cout << arr[i][j] << "\t";
  174.                     }
  175.                 }
  176.                 for (int i = *iMin; i <= *iMin; i++) {
  177.                     for (int j = 0; j <= *jMin; j++) {
  178.                         cout << arr[i][j] << "\t";
  179.                     }
  180.                 }
  181.             }
  182.         }
  183.         else if (minPos - maxPos > COLUMN * ROW - minPos) {
  184.             // от максимального до минимального
  185.             for (int i = *iMax; i <= *iMax; i++) {
  186.                 for (int j = *jMax; j < COLUMN; j++) {
  187.                     cout << arr[i][j] << "\t";
  188.                 }
  189.             }
  190.             for (int i = *iMax + 1; i < *iMin; i++) {
  191.                 for (int j = 0; j < COLUMN; j++) {
  192.                     cout << arr[i][j] << "\t";
  193.                 }
  194.             }
  195.             for (int i = *iMin; i <= *iMin; i++) {
  196.                 for (int j = 0; j <= *jMin; j++) {
  197.                     cout << arr[i][j] << "\t";
  198.                 }
  199.             }
  200.         }
  201.         else {
  202.             // от минимального до конца
  203.             for (int j = *jMin; j < COLUMN; j++) {
  204.                 cout << arr[*iMin][j] << "\t";
  205.             }
  206.  
  207.             for (int i = *iMin + 1; i < ROW; i++) {
  208.                 for (int j = 0; j < COLUMN; j++) {
  209.                     cout << arr[i][j] << "\t";
  210.                 }
  211.             }
  212.         }
  213.     }
  214.     return 0;
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement