Advertisement
ksyshshot

Untitled

Nov 3rd, 2022
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.95 KB | Source Code | 0 0
  1. #include <fstream>
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5.  
  6. void writeTask()
  7. {
  8.     cout << "Данная программа находит седловую точку квадратной матрицы\n";
  9. }
  10.  
  11. string fileInputPath(bool isFileForRead)
  12. {
  13.     bool isNotCorrect;
  14.     string path;
  15.     fstream file;
  16.     if (isFileForRead)
  17.     {
  18.         cout << "Введите путь к файлу для чтения: ";
  19.     }
  20.     else
  21.     {
  22.         cout << "Введите путь к файлу для записи: ";
  23.     }
  24.     do
  25.     {
  26.         isNotCorrect = false;
  27.         cin >> path;
  28.         file.open(path);
  29.         if (!file.is_open())
  30.         {
  31.             cout << "Файл не найден. Повторите попытку...\n";
  32.             isNotCorrect = true;
  33.         }
  34.     } while (isNotCorrect);
  35.     file.close();
  36.     return path;
  37. }
  38.  
  39. int fileInputMatrixOrder(string path)
  40. {
  41.     fstream file;
  42.     const int MAX_ORDER = 10;
  43.     const int MIN_ORDER = 2;
  44.     bool isFileForRead = true;
  45.     bool isNotCorrect;
  46.     int matrixOrder;
  47.     do
  48.     {
  49.         isNotCorrect = false;
  50.         file.open(path);
  51.         if (!file.is_open()) {
  52.             cout << "Не удалось открыть файл. ";
  53.             isNotCorrect = true;
  54.         }
  55.         if (!isNotCorrect)
  56.         {
  57.             file >> matrixOrder;
  58.             if (file.fail())
  59.             {
  60.                 file.clear();
  61.                 while (file.get() != '\n');
  62.                 cout << "Некорректно введённый порядок матрицы. ";
  63.                 isNotCorrect = true;
  64.             }
  65.             if ((!isNotCorrect) && ((matrixOrder < MIN_ORDER) || (matrixOrder > MAX_ORDER)))
  66.             {
  67.                 cout << "Порядок матрицы неверного диапазона! ";
  68.                 isNotCorrect = true;
  69.             }
  70.             if (!isNotCorrect)
  71.             {
  72.                 cout << "Повторите попытку...\n";
  73.                 path = fileInputPath(isFileForRead);
  74.             }
  75.         }
  76.     } while (isNotCorrect);
  77.     file.close();
  78.     return matrixOrder;
  79. }
  80.  
  81. int** fileMatrixInput(string path, int order)
  82. {
  83.     ifstream file;
  84.     bool isNotCorrect;
  85.     bool isFileForRead = true;
  86.     int** matrix = new int* [order];
  87.     do
  88.     {
  89.         isNotCorrect = false;
  90.         file.open(path);
  91.         file.get() != '\n';
  92.         int i = 0;
  93.         while ((!isNotCorrect) && (i < order))
  94.         {
  95.             int j = 0;
  96.             while ((!isNotCorrect) && (j < order))
  97.             {
  98.                 file >> matrix[i][j];
  99.                 if (file.fail())
  100.                 {
  101.                     cout << "Ошибка! Найдено некорректное значение элемента матрицы\n";
  102.                     isNotCorrect = true;
  103.                     i--;
  104.                 }
  105.                 j++;
  106.             }
  107.             i++;
  108.         }
  109.         if (isNotCorrect)
  110.         {
  111.             cout << "Проверьте правильность введённых данных и повторите попытку...\n";
  112.             path = fileInputPath(isFileForRead);
  113.         }
  114.     } while (isNotCorrect);
  115.     file.close();
  116.     return matrix;
  117. }
  118.  
  119. int consoleInputMatrixOrder()
  120. {
  121.     const int MIN_ORDER = 2;
  122.     const int MAX_ORDER = 10;
  123.     bool isNotCorrect;
  124.     int order;
  125.     do
  126.     {
  127.         isNotCorrect = false;
  128.         cout << "Введите порядок квадратной матрицы\n";
  129.         cin >> order;
  130.         if (cin.fail())
  131.         {
  132.             cin.clear();
  133.             while (cin.get() != '\n');
  134.             cout << "Ошибка ввода! Повторите попытку...\n";
  135.             isNotCorrect = true;
  136.         }
  137.         if ((!isNotCorrect) && (cin.get() != '\n'))
  138.         {
  139.             cin.clear();
  140.             cout << "Ошибка ввода! Повторите попытку...\n";
  141.             isNotCorrect = true;
  142.         }
  143.         if ((!isNotCorrect) && ((order < MIN_ORDER) || (order > MAX_ORDER)))
  144.         {
  145.             cout << "Ошибка ввода! Проверьте, входит ли введённое значение в допустимый диапазон и повторите попытку...\n";
  146.             isNotCorrect = true;
  147.         }
  148.     } while (isNotCorrect);
  149.     return order;
  150. }
  151.  
  152. int** consoleMatrixCreation(int order)
  153. {
  154.     const int MIN_ELEMENT = -2147483648;
  155.     const int MAX_ELEMENT = 2147483647;
  156.     bool isNotCorrect;
  157.     int** matrix = new int* [order];
  158.     for (int i = 0; i < order; i++)
  159.     {
  160.         for (int j = 0; j < order; j++)
  161.         {
  162.             do
  163.             {
  164.                 isNotCorrect = false;
  165.                 cout << "Введите " << j + 1 << " элемент " << i + 1 << " строки\n";
  166.                 cin >> matrix[i][j];
  167.                 if (cin.fail())
  168.                 {
  169.                     cin.clear();
  170.                     while (cin.get() != '\n');
  171.                     cout << "Ошибка ввода! Повторите попытку...";
  172.                     isNotCorrect = true;
  173.                 }
  174.                 if ((!isNotCorrect) && (cin.get() != '\n'))
  175.                 {
  176.                     cin.clear();
  177.                     cout << "Ошибка ввода! Повторите попытку...\n";
  178.                     isNotCorrect = true;
  179.                 }
  180.                 if ((!isNotCorrect) && ((order < MIN_ELEMENT) || (order > MAX_ELEMENT)))
  181.                 {
  182.                     cout << "Ошибка ввода! Введено число неверного диапазона\n";
  183.                     isNotCorrect = true;
  184.                 }
  185.             } while (isNotCorrect);
  186.         }
  187.     }
  188.     return matrix;
  189. }
  190.  
  191. void consoleMatrixOutput(int** matrix, int order)
  192. {
  193.     cout << "Исходная матрица:\n";
  194.     for (int i = 0; i < order; i++)
  195.     {
  196.         for (int j = 0; j < order; j++)
  197.         {
  198.             cout << matrix[i][j] << " ";
  199.         }
  200.         cout << endl;
  201.     }
  202. }
  203.  
  204. int* smallestElementsInLine(int** matrix, int order)
  205. {
  206.     int min;
  207.     int* minIndexes = new int[order];
  208.     for (int i = 0; i < order; i++)
  209.     {
  210.         min = matrix[i][0];
  211.         minIndexes[i] = 0;
  212.         for (int j = 0; j < order; j++)
  213.         {
  214.             if (matrix[i][j] <= min)
  215.             {
  216.                 min = matrix[i][j];
  217.                 minIndexes[i] = j;
  218.             }
  219.         }
  220.     }
  221.     return minIndexes;
  222. }
  223.  
  224. int* largestElementsInColumn(int** matrix, int order)
  225. {
  226.     int max;
  227.     int* maxIndexes = new int[order];
  228.     for (int j = 0; j < order; j++)
  229.     {
  230.         max = matrix[0][j];
  231.         maxIndexes[j] = 0;
  232.         for (int i = 0; i < order; i++)
  233.         {
  234.             if (matrix[i][j] >= max)
  235.             {
  236.                 max = matrix[i][j];
  237.                 maxIndexes[j] = i;
  238.             }
  239.         }
  240.     }
  241.     return maxIndexes;
  242. }
  243.  
  244. void findingMatrixSaddlePoints(int** matrix, bool isConsoleAnswer, int& order)
  245. {
  246.     fstream file;
  247.     string path;
  248.     int* maxElemIndexes = smallestElementsInLine(matrix, order);
  249.     int* minElemIndexes = largestElementsInColumn(matrix, order);
  250.     int saddlePoint;
  251.     bool isSaddlePoint;
  252.     bool isNotCorrect;
  253.     for (int i = 0; i < order; i++)
  254.     {
  255.         for (int j = 0; j < order; j++)
  256.         {
  257.             if ((minElemIndexes[i] == j) && (maxElemIndexes[j] == i))
  258.             {
  259.                 saddlePoint = matrix[i][j];
  260.                 isSaddlePoint = true;
  261.             }
  262.         }
  263.     }
  264.     if (isConsoleAnswer)
  265.     {
  266.         if (isSaddlePoint)
  267.         {
  268.             cout << "Седловая точка матрицы: " << saddlePoint;
  269.         }
  270.         else
  271.         {
  272.             cout << "Седловой точки нет";
  273.         }
  274.     }
  275.     else
  276.     {
  277.         bool isFileForRead = false;
  278.         do
  279.         {
  280.             isNotCorrect = false;
  281.             path = fileInputPath(isFileForRead);
  282.             file.open(path);
  283.             if (!file.is_open())
  284.             {
  285.                 cout << "Не удалось открыть файл. Повторите попытку...\n";
  286.                 isNotCorrect = true;
  287.             }
  288.             if (!isNotCorrect)
  289.             {
  290.                 if (isSaddlePoint)
  291.                 {
  292.                     file << "Седловая точка матрицы: " << saddlePoint;
  293.                 }
  294.                 else
  295.                 {
  296.                     file << "Седловой точки нет";
  297.                 }
  298.             }
  299.         } while (isNotCorrect);
  300.         file.close();
  301.     }
  302. }
  303.  
  304. int** fileChoice()
  305. {
  306.     bool isFileForRead = true;
  307.     string path = fileInputPath(isFileForRead);
  308.     int order = fileInputMatrixOrder(path);
  309.     int** matrix = new int* [order];
  310.     matrix = fileMatrixInput(path, order);
  311.     return matrix;
  312. }
  313.  
  314. int** consoleChoice()
  315. {
  316.     int order = consoleInputMatrixOrder();
  317.     int** matrix = new int* [order];
  318.     matrix = consoleMatrixCreation(order);
  319.     consoleMatrixOutput(matrix, order);
  320.     return matrix;
  321. }
  322.  
  323. int chooseOutputMethod()
  324. {
  325.     bool isNotCorrect;
  326.     int choice;
  327.     do
  328.     {
  329.         isNotCorrect = false;
  330.         cin >> choice;
  331.         if (cin.fail())
  332.         {
  333.             cin.clear();
  334.             while (cin.get() != '\n');
  335.             cout << "Число введено некорректно. Повторите попытку...\n";
  336.             isNotCorrect = true;
  337.         }
  338.         if ((!isNotCorrect) && (cin.get() != '\n'))
  339.         {
  340.             cin.clear();
  341.             cout << "Число введено некорректно. Повторите попытку...\n";
  342.             isNotCorrect = true;
  343.         }
  344.         if ((!isNotCorrect) && (choice != 1) && (choice != 2))
  345.         {
  346.             cout << "Введите либо 1, либо 2. Ваш выбор: \n";
  347.             isNotCorrect = true;
  348.         }
  349.     } while (isNotCorrect);
  350.     return choice;
  351. }
  352.  
  353. void solution()
  354. {
  355.     int order = 0;
  356.     int** matrix = nullptr;
  357.     bool isConsoleAnswer = false;
  358.     cout << "Введите число, чтобы выбрать способ решения задания: 1 - через консоль, 2 - через файл\n";
  359.     int choice = chooseOutputMethod();
  360.     if (choice == 1)
  361.     {
  362.         isConsoleAnswer = true;
  363.         matrix = consoleChoice();
  364.         findingMatrixSaddlePoints(matrix, isConsoleAnswer, order);
  365.     }
  366.     else
  367.     {
  368.         matrix = fileChoice();
  369.         cout << "Введите число, чтобы выбрать способ вывода решения задания: 1 - через консоль, 2 - через файл\n";
  370.         choice = chooseOutputMethod();
  371.         if (choice == 1)
  372.         {
  373.             isConsoleAnswer = true;
  374.             findingMatrixSaddlePoints(matrix, isConsoleAnswer, order);
  375.         }
  376.         else
  377.         {
  378.             findingMatrixSaddlePoints(matrix, isConsoleAnswer, order);
  379.         }
  380.     }
  381. }
  382.  
  383. int main()
  384. {
  385.     setlocale(LC_ALL, "Rus");
  386.     writeTask();
  387.     solution();
  388. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement