Advertisement
ksyshshot

Lab.2.3

Nov 7th, 2022 (edited)
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.40 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. void writeTask()
  8. {
  9.     cout << "Данная программа вычисляет норму матрицы.\n";
  10. }
  11.  
  12. int takeMatrixOrderFromConsole()
  13. {
  14.     const int MAX_ORDER = 10;
  15.     const int MIN_ORDER = 2;
  16.     bool isNotCorrect;
  17.     int order;
  18.     do
  19.     {
  20.         isNotCorrect = false;
  21.         cout << "Введите порядок квадратной матрицы: ";
  22.         cin >> order;
  23.         if (cin.fail())
  24.         {
  25.             cin.clear();
  26.             while (cin.get() != '\n');
  27.             isNotCorrect = true;
  28.             cout << "Введено некорректное значение. Повторите попытку...\n";
  29.         }
  30.         if ((!isNotCorrect) && (cin.get() != '\n'))
  31.         {
  32.             cin.clear();
  33.             isNotCorrect = true;
  34.             cout << "Введено некорректное значение. Повторите попытку...\n";
  35.         }
  36.         if ((!isNotCorrect) && ((order < MIN_ORDER) || (order > MAX_ORDER)))
  37.         {
  38.             isNotCorrect = true;
  39.             cout << "Введённое число не входит в допустимый диапазон. Повторите попытку...\n";
  40.         }
  41.     } while (isNotCorrect);
  42.     return order;
  43. }
  44.  
  45. int** creationAllMatrixes(int order)
  46. {
  47.     int** matrix = new int* [order];
  48.     for (int i = 0; i < order; i++)
  49.     {
  50.         matrix[i] = new int[order];
  51.     }
  52.     return matrix;
  53. }
  54.  
  55. int** createMatrixFromConsole(int& order)
  56. {
  57.     const int MIN_ELEMENT = -2147483648;
  58.     const int MAX_ELEMENT = 2147483647;
  59.     order = takeMatrixOrderFromConsole();
  60.     int** matrix = creationAllMatrixes(order);
  61.     bool isNotCorrect;
  62.     for (int i = 0; i < order; i++)
  63.     {
  64.         for (int j = 0; j < order; j++)
  65.         {
  66.             do
  67.             {
  68.                 isNotCorrect = false;
  69.                 cout << "Введите элемент " << (i + 1) << " строки " << (j + 1) << " столбца матрицы: ";
  70.                 cin >> matrix[i][j];
  71.                 if (cin.fail())
  72.                 {
  73.                     cin.clear();
  74.                     while (cin.get() != '\n');
  75.                     isNotCorrect = true;
  76.                     cout << "Введено некорректное значение. Повторите попытку...\n";
  77.                 }
  78.                 if ((!isNotCorrect) && (cin.get() != '\n'))
  79.                 {
  80.                     cin.clear();
  81.                     isNotCorrect = true;
  82.                     cout << "Введено некорректное значение. Повторите попытку...\n";
  83.                 }
  84.                 if ((!isNotCorrect) && ((matrix[i][j] < MIN_ELEMENT) || (matrix[i][j] > MAX_ELEMENT)))
  85.                 {
  86.                     isNotCorrect = true;
  87.                     cout << "Введённое значение не входит в допустимый диапазон.Повторите попытку...\n";
  88.                 }
  89.             } while (isNotCorrect);
  90.         }
  91.     }
  92.     return matrix;
  93. }
  94.  
  95. void outputMatrixInConsole(int** matrix, int order)
  96. {
  97.     for (int i = 0; i < order; i++)
  98.     {
  99.         for (int j = 0; j < order; j++)
  100.         {
  101.             cout << matrix[i][j] << " ";
  102.         }
  103.         cout << endl;
  104.     }
  105. }
  106.  
  107. string takePathToFile()
  108. {
  109.     bool isNotCorrect;
  110.     string path;
  111.     fstream file;
  112.     do
  113.     {
  114.         isNotCorrect = false;
  115.         cout << "Введите путь к файлу: ";
  116.         cin >> path;
  117.         file.open(path);
  118.         if (!file.is_open())
  119.         {
  120.             isNotCorrect = true;
  121.             cout << "Файл не найден. Повторите попытку...\n";
  122.         }
  123.     } while (isNotCorrect);
  124.     file.close();
  125.     return path;
  126. }
  127.  
  128. int** takeMatrixFromFile(int& order)
  129. {
  130.     cout << "Требуется файл для чтения. ";
  131.     string path = takePathToFile();
  132.     const int MIN_ELEMENT = -2147483648;
  133.     const int MAX_ELEMENT = 2147483647;
  134.     const int MAX_ORDER = 10;
  135.     const int MIN_ORDER = 2;
  136.     bool isNotCorrect;
  137.     fstream file;
  138.     int** matrix;
  139.     do
  140.     {
  141.         do
  142.         {
  143.             isNotCorrect = false;
  144.             file.open(path);
  145.             file >> order;
  146.             if (file.fail())
  147.             {
  148.                 file.clear();
  149.                 while (file.get() != '\n');
  150.                 cout << "Некорректно введённый порядок матрицы. ";
  151.                 isNotCorrect = true;
  152.             }
  153.             if ((!isNotCorrect) && ((order < MIN_ORDER) || (order > MAX_ORDER)))
  154.             {
  155.                 cout << "Порядок матрицы неверного диапазона! ";
  156.                 isNotCorrect = true;
  157.             }
  158.             if (isNotCorrect)
  159.             {
  160.                 cout << "Повторите попытку...\n";
  161.                 path = takePathToFile();
  162.                 file.close();
  163.             }
  164.         } while (isNotCorrect);
  165.         matrix = creationAllMatrixes(order);
  166.         int i = 0;
  167.         while ((!isNotCorrect) && (i < order))
  168.         {
  169.             int j = 0;
  170.             while ((!isNotCorrect) && (j < order))
  171.             {
  172.                 file >> matrix[i][j];
  173.                 if (file.fail())
  174.                 {
  175.                     cout << "Ошибка! Найдено некорректное значение элемента матрицы\n";
  176.                     isNotCorrect = true; i--;
  177.                 }
  178.                 j++;
  179.             }
  180.             i++;
  181.         }
  182.         if (isNotCorrect)
  183.         {
  184.             cout << "Проверьте правильность введённых данных и повторите попытку...\n";
  185.             path = takePathToFile();
  186.         }
  187.     } while (isNotCorrect);
  188.     return matrix;
  189. }
  190.  
  191. int* calculateAbsSum(int** matrix, int order)
  192. {
  193.     int* absSums = new int[order];
  194.     for (int i = 0; i < order; i++)
  195.     {
  196.         int sum = 0;
  197.         for (int j = 0; j < order; j++)
  198.         {
  199.             sum += abs(matrix[i][j]);
  200.         }
  201.         absSums[i] = sum;
  202.     }
  203.     return absSums;
  204. }
  205.  
  206. int findMatrixNorm(int** matrix, int order)
  207. {
  208.     int* absSums = calculateAbsSum(matrix, order);
  209.     int norm = absSums[0];
  210.     for (int i = 1; i < order; i++)
  211.     {
  212.         if (absSums[i] > norm)
  213.         {
  214.             norm = absSums[i];
  215.         }
  216.     }
  217.     return norm;
  218. }
  219.  
  220. int chooseInputOutputMethod()
  221. {
  222.     bool isNotCorrect;
  223.     int choice;
  224.     do
  225.     {
  226.         isNotCorrect = false;
  227.         cin >> choice;
  228.         if (cin.fail())
  229.         {
  230.             cin.clear();
  231.             while (cin.get() != '\n');
  232.             cout << "Число введено некорректно. Повторите попытку...\n";
  233.             isNotCorrect = true;
  234.         }
  235.         if ((!isNotCorrect) && (cin.get() != '\n'))
  236.         {
  237.             cin.clear();
  238.             cout << "Число введено некорректно. Повторите попытку...\n";
  239.             isNotCorrect = true;
  240.         }
  241.         if ((!isNotCorrect) && (choice != 1) && (choice != 2))
  242.         {
  243.             cout << "Введите либо 1, либо 2. Ваш выбор: \n";
  244.             isNotCorrect = true;
  245.         }
  246.     } while (isNotCorrect);
  247.     return choice;
  248. }
  249.  
  250. void outputAnswerInFile(int answer)
  251. {
  252.     cout << "Требуется файл для записи. ";
  253.     string path = takePathToFile();
  254.     bool isNotCorrect;
  255.     ofstream file;
  256.     isNotCorrect = false;
  257.     file.open(path);
  258.     file << "Полученная норма матрицы: " << answer;
  259.     file.close();
  260.     cout << "Норма матрицы записана в файл!\n";
  261. }
  262.  
  263. int** getMatrix(int choice, int& order)
  264. {;
  265.     int** matrix;
  266.     if (choice == 1)
  267.     {
  268.         matrix = createMatrixFromConsole(order);
  269.         outputMatrixInConsole(matrix, order);
  270.     }
  271.     else
  272.     {
  273.         matrix = takeMatrixFromFile(order);
  274.     }
  275.     return matrix;
  276. }
  277.  
  278. void outputResult(int choice, int answer)
  279. {
  280.     if (choice == 1)
  281.     {
  282.         cout << "Полученная норма матрицы: " << answer;
  283.     }
  284.     else
  285.     {
  286.         outputAnswerInFile(answer);
  287.     }
  288. }
  289.  
  290. int main()
  291. {
  292.     setlocale(LC_ALL, "Rus");
  293.     writeTask();
  294.     cout << "Выберите способ ввода данных (1 - через консоль, 2 - с помощью файлов): ";
  295.     int choice = chooseInputOutputMethod();
  296.     int order = 0;
  297.     int** matrix = getMatrix(choice, order);
  298.     int answer = findMatrixNorm(matrix, order);
  299.     cout << "Выберите способ вывода данных (1 - через консоль, 2 - с помощью файлов): ";
  300.     choice = chooseInputOutputMethod();
  301.     outputResult(choice, answer);
  302.     return 0;
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement