Advertisement
anticlown

laba.2.4.(C++)

Oct 27th, 2022 (edited)
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.62 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. const int MIN_SIZE = 2;
  6. const int MAX_SIZE = 10;
  7. const int MIN_VALUE = -1000;
  8. const int MAX_VALUE = 1000;
  9.  
  10. void outputOfTaskInfo() {
  11.   std::cout << "Данная программа \"переворачивает\" действительную квадратную матрицу порядка 2*n,где 2*n задано. \n"
  12.             << "Диапазон ввода значений размера матрицы(2 * n) : " << MIN_SIZE << "..." << MAX_SIZE << ". \n"
  13.             << "Диапазон ввода значений элементов подматриц: " << MIN_VALUE << "..." << MAX_VALUE << ". \n";
  14. }
  15.  
  16. int getVerificationOfChoice() {
  17.   int choice;
  18.   bool isIncorrect;
  19.  
  20.   do {
  21.     isIncorrect = false;
  22.     std::cin >> choice;
  23.  
  24.     if (std::cin.fail())
  25.     {
  26.       std::cin.clear();
  27.       while (std::cin.get() != '\n');
  28.       isIncorrect = true;
  29.       std::cout << "Проверьте корректность ввода данных! \n";
  30.     }
  31.  
  32.     if (!isIncorrect && std::cin.get() != '\n')
  33.     {
  34.       std::cin.clear();
  35.       while (std::cin.get() != '\n');
  36.  
  37.       std::cout << "Проверьте корректность ввода данных! \n";
  38.       isIncorrect = true;
  39.     }
  40.  
  41.     if (isIncorrect || (choice != 0 && choice != 1))
  42.     {
  43.       isIncorrect = true;
  44.       std::cout << "Для выбора введите 0 или 1! \n";
  45.     }
  46.   } while (isIncorrect);
  47.  
  48.   return choice;
  49. }
  50.  
  51. std::string inputPathToFile() {
  52.   std::string path;
  53.   bool isIncorrect;
  54.  
  55.   std::cout << "Укажите путь к файлу: ";
  56.  
  57.   do
  58.   {
  59.     isIncorrect = false;
  60.     std::cin >> path;
  61.     std::ifstream file(path);
  62.  
  63.     if (!file.is_open())
  64.     {
  65.       std::cout << "По указанному пути файл не найден! Укажите правильный путь: ";
  66.       isIncorrect = true;
  67.     }
  68.   } while (isIncorrect);
  69.  
  70.   return path;
  71. }
  72.  
  73. int readSizeFromConsole() {
  74.   int size;
  75.   bool isIncorrect;
  76.  
  77.   std::cout << "Введите значение размера матрицы: ";
  78.  
  79.   do
  80.   {
  81.     isIncorrect = false;
  82.     std::cin >> size;
  83.     if (std::cin.fail())
  84.     {
  85.       isIncorrect = true;
  86.       std::cout << "Проверьте корректность ввода данных! \n";
  87.       std::cin.clear();
  88.       while (std::cin.get() != '\n');
  89.     }
  90.     if (!isIncorrect && (size < MIN_SIZE || size >> MAX_SIZE))
  91.     {
  92.       isIncorrect = true;
  93.       std::cout << "Введите число от " << MIN_SIZE << " до " << MAX_SIZE << "! \n";
  94.     }
  95.   } while (isIncorrect);
  96.  
  97.   return size;
  98. }
  99.  
  100. int readSizeFromFile(const std::string path) {
  101.   int size;
  102.   std::string sizeInp;
  103.   bool isIncorrect = true;
  104.   std::ifstream fin(path);
  105.  
  106.   std::cout << "Происходит чтение размеров матрицы... \n";
  107.   fin >> sizeInp;
  108.  
  109.   try
  110.   {
  111.     size = atoi(sizeInp.c_str());
  112.   }
  113.   catch (...)
  114.   {
  115.     isIncorrect = false;
  116.     std::cout << "Ошибка при считывании размера из файла!Введите размер с консоли! \n";
  117.     size = readSizeFromConsole();
  118.   }
  119.  
  120.   if (!isIncorrect && (size < MIN_SIZE || size > MAX_SIZE))
  121.   {
  122.     std::cout << "Введите значение от " << MIN_SIZE << " до " << MAX_SIZE << "! \n";
  123.     size = readSizeFromConsole();
  124.   }
  125.  
  126.   if (!isIncorrect && (size % 2 != 0))
  127.   {
  128.     std::cout << "Значение размера матрицы должно быть кратно 2! Введите значение с консоли! \n";
  129.     size = readSizeFromConsole();
  130.   }
  131.  
  132.   fin.close();
  133.  
  134.   return size;
  135. }
  136.  
  137. int readSize(const int choice, const std::string path) {
  138.   int size = -1;
  139.  
  140.   if (choice == 0)
  141.     size = readSizeFromConsole();
  142.   if (choice == 1)
  143.     size = readSizeFromFile(path);
  144.  
  145.   return size;
  146. }
  147.  
  148. void outputSize(const int choice, std::string path, const int size) {
  149.   std::ofstream fout(path);
  150.   bool isIncorrect;
  151.  
  152.   if (choice == 0)
  153.     std::cout << "Размер матрицы равен " << size << ". \n";
  154.   if (choice == 1)
  155.   {
  156.     std::cout << "Вывод значения раземера в файл... \n";
  157.  
  158.     do
  159.     {
  160.       isIncorrect = false;
  161.       std::ofstream fout(path);
  162.  
  163.       try
  164.       {
  165.         fout << size << "\n";
  166.       }
  167.       catch (...)
  168.       {
  169.         std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  170.         isIncorrect = true;
  171.         path = inputPathToFile();
  172.       }
  173.  
  174.       fout.close();
  175.     } while (isIncorrect);
  176.  
  177.     std::cout << "Данные успешно записаны в файл! \n";
  178.   }
  179. }
  180.  
  181. int** fillMatrixFromConsole(const int size) {
  182.   int** matrix = new int* [size];
  183.   bool isIncorrect;
  184.  
  185.   for (int i = 0; i < size; i++)
  186.     matrix[i] = new int[size];
  187.  
  188.   for (int i = 0; i < size; i++)
  189.   {
  190.     for (int j = 0; j < size; j++)
  191.     {
  192.       std::cout << "Введите значение элемента " << i + 1 << "-ой строки " << j + 1 << "-го столбца матрицы: ";
  193.  
  194.       do
  195.       {
  196.         isIncorrect = false;
  197.         std::cin >> matrix[i][j];
  198.  
  199.         if (std::cin.fail())
  200.         {
  201.           isIncorrect = true;
  202.           std::cout << "Проверьте корректность ввода данных! \n";
  203.           std::cin.clear();
  204.           while (std::cin.get() != '\n');
  205.         }
  206.  
  207.         if (!isIncorrect && (matrix[i][j] < MIN_VALUE || matrix[i][j] >> MAX_VALUE))
  208.         {
  209.           isIncorrect = true;
  210.           std::cout << "Введите число от " << MIN_VALUE << " до " << MAX_VALUE << "! \n";
  211.         }
  212.       } while (isIncorrect);
  213.     }
  214.   }
  215.  
  216.   return matrix;
  217. }
  218.  
  219. int** fillMatrixFromFile(const int size, const std::string path) {
  220.   int** matrix = new int* [size];
  221.   int count = 0;
  222.  
  223.   for (int i = 0; i < size; i++)
  224.     matrix[i] = new int[size];
  225.  
  226.   bool isIncorrect;
  227.   std::string matrixInp;
  228.   std::ifstream fin(path);
  229.  
  230.   std::cout << "Чтение матрицы... \n";
  231.   fin >> matrixInp;
  232.  
  233.   while (!fin.eof())
  234.   {
  235.     std::string symbol;
  236.     fin >> symbol;
  237.     count++;
  238.   }
  239.  
  240.   if (count > size * size)
  241.   {
  242.     std::cout << "Ошибка при чтении матрицы! Введите матрицу с консоли! \n";
  243.     matrix = fillMatrixFromConsole(size);
  244.   }
  245.   else
  246.   {
  247.     fin.close();
  248.     fin.open(path);
  249.     fin >> matrixInp;
  250.  
  251.     for (int i = 0; i < size; i++)
  252.     {
  253.       for (int j = 0; j < size; j++)
  254.       {
  255.         do
  256.         {
  257.           isIncorrect = false;
  258.  
  259.           try
  260.           {
  261.             fin >> matrix[i][j];
  262.           }
  263.           catch (...)
  264.           {
  265.             std::cout << "Ошибка при чтении матрицы! Введите матрицу с консоли! \n";
  266.             isIncorrect = true;
  267.             matrix = fillMatrixFromConsole(size);
  268.           }
  269.  
  270.           if (!isIncorrect && (matrix[i][j] < MIN_VALUE || matrix[i][j] > MAX_VALUE))
  271.           {
  272.             std::cout << "Ошибка при чтении матрицы! Введите матрицу с консоли! \n";
  273.             isIncorrect = true;
  274.             matrix = fillMatrixFromConsole(size);
  275.           }
  276.         } while (isIncorrect);
  277.       }
  278.     }
  279.   }
  280.  
  281.   fin.close();
  282.  
  283.   return matrix;
  284. }
  285.  
  286. int** fillMatrix(const int choice, const std::string path, const int size) {
  287.   int** matrix = new int* [size];
  288.  
  289.   for (int i = 0; i < size; i++)
  290.     matrix[i] = new int[size];
  291.  
  292.   if (choice == 0)
  293.     matrix = fillMatrixFromConsole(size);
  294.   if (choice == 1)
  295.     matrix = fillMatrixFromFile(size, path);
  296.  
  297.   return matrix;
  298. }
  299.  
  300. void outputMatrix(const int choice, std::string path, int** matrix, const int size) {
  301.   bool isIncorrect;
  302.   std::ofstream fout;
  303.  
  304.   if (choice == 0)
  305.   {
  306.     std::cout << "Вывод начальной матрицы: \n";
  307.     for (int i = 0; i < size; i++)
  308.     {
  309.       for (int j = 0; j < size; j++)
  310.         std::cout << matrix[i][j] << "\t";
  311.       std::cout << "\n";
  312.     }  
  313.  
  314.     std::cout << "\n";
  315.   }
  316.  
  317.   if (choice == 1)
  318.   {
  319.     std::cout << "Вывод начальной матрицы в файл... \n";
  320.  
  321.     fout.open(path, std::ios::app);
  322.     fout << "\n";
  323.  
  324.     do
  325.     {
  326.       isIncorrect = false;
  327.  
  328.       try
  329.       {
  330.         for (int i = 0; i < size; i++)
  331.         {
  332.           for (int j = 0; j < size; j++)
  333.             fout << matrix[i][j] << "\t";
  334.           fout << "\n";
  335.         }
  336.  
  337.         fout << "\n";
  338.       }
  339.       catch (...)
  340.       {
  341.         std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  342.         isIncorrect = true;
  343.         path = inputPathToFile();
  344.       }
  345.     } while (isIncorrect);
  346.  
  347.     fout.close();
  348.     std::cout << "Данные успешно записаны в файл! \n";
  349.   }
  350. }
  351.  
  352. int** createNewMatrix(const int size, int** matrix) {
  353.   int submatrixSize;
  354.   submatrixSize = size / 2;
  355.   //создания массивов
  356.   int** newMatrix = new int* [size];
  357.   for (int i = 0; i < size; i++)
  358.     newMatrix[i] = new int[size];
  359.  
  360.   int** submatrix1 = new int* [submatrixSize];
  361.   for (int i = 0; i < submatrixSize; i++)
  362.     submatrix1[i] = new int[submatrixSize];
  363.  
  364.   int** submatrix2 = new int* [submatrixSize];
  365.   for (int i = 0; i < submatrixSize; i++)
  366.     submatrix2[i] = new int[submatrixSize];
  367.  
  368.   int** submatrix3 = new int* [submatrixSize];
  369.   for (int i = 0; i < submatrixSize; i++)
  370.     submatrix3[i] = new int[submatrixSize];
  371.  
  372.   int** submatrix4 = new int* [submatrixSize];
  373.   for (int i = 0; i < submatrixSize; i++)
  374.     submatrix4[i] = new int[submatrixSize];
  375.  
  376.   //создание подматриц
  377.   for (int i = 0; i < submatrixSize; i++)
  378.     for (int j = 0; j < submatrixSize; j++)
  379.       submatrix1[i][j] = matrix[i][j];
  380.  
  381.   for (int i = 0; i < submatrixSize; i++)
  382.     for (int j = 0; j < submatrixSize; j++)
  383.       submatrix2[i][j] = matrix[i][j + submatrixSize - 1];
  384.  
  385.   for (int i = 0; i < submatrixSize; i++)
  386.     for (int j = 0; j < submatrixSize; j++)
  387.       submatrix3[i][j] = matrix[i + submatrixSize][j];
  388.  
  389.   for (int i = 0; i < submatrixSize; i++)
  390.     for (int j = 0; j < submatrixSize; j++)
  391.       submatrix4[i][j] = matrix[i + submatrixSize][j + submatrixSize];
  392.  
  393.   //создание новой матрицы
  394.   for (int i = 0; i < submatrixSize; i++)
  395.     for (int j = 0; j < submatrixSize; j++)
  396.       newMatrix[i + submatrixSize][j] = submatrix1[i][j];
  397.  
  398.   for (int i = 0; i < submatrixSize; i++)
  399.     for (int j = 0; j < submatrixSize; j++)
  400.       newMatrix[i + submatrixSize][j + submatrixSize] = submatrix2[i][j];
  401.  
  402.   for (int i = 0; i < submatrixSize; i++)
  403.     for (int j = 0; j < submatrixSize; j++)
  404.       newMatrix[i][j + submatrixSize] = submatrix3[i][j];
  405.  
  406.   for (int i = 0; i < submatrixSize; i++)
  407.     for (int j = 0; j < submatrixSize; j++)
  408.       newMatrix[i][j] = submatrix4[i][j];
  409.  
  410.   return newMatrix;
  411. }
  412.  
  413. void outputNewMatrix(const int choice, std::string path, int** matrix, const int size) {
  414.   bool isIncorrect;
  415.   std::ofstream fout;
  416.  
  417.   if (choice == 0)
  418.   {
  419.     std::cout << "Вывод новой матрицы: \n";
  420.     for (int i = 0; i < size; i++)
  421.     {
  422.       for (int j = 0; j < size; j++)
  423.         std::cout << matrix[i][j] << "\t";
  424.       std::cout << "\n";
  425.     }
  426.  
  427.     std::cout << "\n";
  428.   }
  429.  
  430.   if (choice == 1)
  431.   {
  432.     std::cout << "Вывод начальной матрицы в файл... \n";
  433.  
  434.     fout.open(path, std::ios::app);
  435.     fout << "\n";
  436.  
  437.     do
  438.     {
  439.       isIncorrect = false;
  440.  
  441.       try
  442.       {
  443.         for (int i = 0; i < size; i++)
  444.         {
  445.           for (int j = 0; j < size; j++)
  446.             fout << matrix[i][j] << "\t";
  447.           fout << "\n";
  448.         }
  449.  
  450.         fout << "\n";
  451.       }
  452.       catch (...)
  453.       {
  454.         std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  455.         isIncorrect = true;
  456.         path = inputPathToFile();
  457.       }
  458.     } while (isIncorrect);
  459.  
  460.     fout.close();
  461.     std::cout << "Данные успешно записаны в файл! \n";
  462.   }
  463. }
  464.  
  465. void processUserInput(int &choiceForInput, int &size, std::string &pathToIn) {
  466.   std::cout << "Вы желаете ввести данные с консоли(0) или взять данные из файла(1)? \n";
  467.   choiceForInput = getVerificationOfChoice();
  468.   if (choiceForInput == 1)
  469.     pathToIn = inputPathToFile();
  470.  
  471.   size = readSize(choiceForInput, pathToIn);
  472. }
  473.  
  474. void processUserOutput(int &choiceForOutput, int &size, std::string &pathToOut, int** &matrix, int** &newMatrix) {
  475.   std::cout << "Вы желаете получить результат в консоли(0) или в файле(1)? \n";
  476.   choiceForOutput = getVerificationOfChoice();
  477.   if (choiceForOutput == 1)
  478.     pathToOut = inputPathToFile();
  479.  
  480.   outputSize(choiceForOutput, pathToOut, size);
  481.   outputMatrix(choiceForOutput, pathToOut, matrix, size);
  482.   outputNewMatrix(choiceForOutput, pathToOut, newMatrix, size);
  483. }
  484. int main() {
  485.   setlocale(LC_ALL, "Rus");
  486.   int choiceForInput, choiceForOutput, size;
  487.   std::string pathToIn, pathToOut;
  488.  
  489.   outputOfTaskInfo();
  490.   processUserInput(choiceForInput, size, pathToIn);
  491.  
  492.   int** matrix = new int* [size];
  493.   for (int i = 0; i < size; i++)
  494.     matrix[i] = new int[size];
  495.  
  496.   matrix = fillMatrix(choiceForInput, pathToIn, size);
  497.  
  498.   int** newMatrix = new int* [size];
  499.   for (int i = 0; i < size; i++)
  500.     newMatrix[i] = new int[size];
  501.  
  502.   newMatrix = createNewMatrix(size, matrix);
  503.  
  504.   processUserOutput(choiceForOutput, size, pathToOut, matrix, newMatrix);
  505.  
  506.   return 0;
  507. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement