deced

Untitled

Oct 21st, 2020
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.40 KB | None | 0 0
  1. #include <iostream>
  2. #include <experimental/filesystem>
  3. #include <fstream>
  4. #include <sstream>
  5. #include <iomanip>
  6. #include <windows.h>
  7. using namespace std;
  8.  
  9. string getInputType()
  10. {
  11.     string  ret;
  12.     bool isIncorrect;
  13.     string inputLine;
  14.     isIncorrect = true;
  15.     do
  16.     {
  17.         cout << "Выберите способ задания матрицы файл/консоль (ф/к)";
  18.         getline(cin, inputLine);
  19.         if (inputLine[0] == 'Ф' || inputLine[0] == 'ф')
  20.         {
  21.             ret = "File";
  22.             isIncorrect = false;
  23.         }
  24.         else if (inputLine[0] == 'К' || inputLine[0] == 'к')
  25.         {
  26.             ret = "Console";
  27.             isIncorrect = false;
  28.         }
  29.     } while (isIncorrect);
  30.     return ret;
  31. }
  32. int getMatrixItem(int i, int j)
  33. {
  34.     int ret;
  35.     bool isIncorrect;
  36.     string inputLine;
  37.     do
  38.     {
  39.         cout << "Введите значение элемента матрицы [" << i << "," << j << "] ";
  40.         getline(cin, inputLine);
  41.         isIncorrect = false;
  42.         try
  43.         {
  44.             ret = stoi(inputLine);
  45.         }
  46.         catch (...)
  47.         {
  48.             isIncorrect = true;
  49.             cout << "Значение матрицы должно быть числом\n";
  50.         }
  51.     } while (isIncorrect);
  52.     return ret;
  53. }
  54. int ** getMatrixFromConsole(int size)
  55. {
  56.     int **ret = new int*[size];
  57.     for (int i = 0; i < size; i++)
  58.     {
  59.         ret[i] = new int[size * sizeof(int)];
  60.         for (int j = 0; j < size; j++)
  61.             ret[i][j] = getMatrixItem(i, j);
  62.     }
  63.     return ret;
  64. }
  65.  
  66. bool isFileCorrect(string path, int size)
  67. {
  68.     int iSize, jSize, num;
  69.     bool isCorrect;
  70.     string inputline;
  71.     fstream matrixFile(path, std::ios_base::in);
  72.     iSize = 0;
  73.     jSize = 0;
  74.     isCorrect = true;
  75.     while (!matrixFile.eof() && isCorrect)
  76.     {
  77.         getline(matrixFile, inputline);
  78.         stringstream strstream;
  79.         strstream << inputline;
  80.         while (!strstream.eof() && jSize <= size)
  81.         {
  82.             strstream >> num;
  83.             jSize++;
  84.         }
  85.         if (inputline != "")
  86.         {
  87.             iSize++;
  88.             if (jSize != size)
  89.             {
  90.                 isCorrect = false;
  91.             }
  92.         }
  93.         jSize = 0;
  94.     }
  95.     if (iSize != size)
  96.     {
  97.         isCorrect = false;
  98.     }
  99.     return isCorrect;
  100. }
  101.  
  102. string getMatrixFilePath(int matrixSize)
  103. {
  104.     string ret;
  105.     bool isIncorrect = true;
  106.     do
  107.     {
  108.         cout << "Введите абсолютный путь к файлу ";
  109.         cin >> ret;
  110.         if (!std::experimental::filesystem::exists(ret))
  111.         {
  112.             cout << "Файл не найден\n";
  113.         }
  114.         else
  115.         {
  116.             if (isFileCorrect(ret, matrixSize))
  117.             {
  118.                 isIncorrect = false;
  119.             }
  120.             else
  121.             {
  122.                 cout << "Данные в файле некорректны\n";
  123.             }
  124.         }
  125.     } while (isIncorrect);
  126.     return ret;
  127. }
  128.  
  129. int** getMatrixFromFile(int size)
  130. {
  131.     int **ret = new int*[size];
  132.     string filePath;
  133.     string inputline;
  134.     for (int i = 0; i < size; i++)
  135.     {
  136.         ret[i] = new int[size];
  137.     }
  138.     filePath = getMatrixFilePath(size);
  139.     fstream matrixFile(filePath, std::ios_base::in);
  140.     for (int i = 0; i < size; i++)
  141.     {
  142.         getline(matrixFile, inputline);
  143.         stringstream strStream;
  144.         strStream << inputline;
  145.         for (int j = 0; j < size; j++)
  146.         {
  147.             strStream >> ret[i][j];
  148.         }
  149.     }
  150.     return ret;
  151. }
  152. int getMatrixSize()
  153. {
  154.     int ret = 0;
  155.     bool isIncorrect;
  156.     string inputLine;
  157.     do
  158.     {
  159.         cout << "Введите размер матрицы ";
  160.         isIncorrect = false;
  161.         getline(cin, inputLine);
  162.         try
  163.         {
  164.             ret = stoi(inputLine);
  165.         }
  166.         catch (...)
  167.         {
  168.             isIncorrect = true;
  169.             cout << "Размер матрицы должен быть числом\n";
  170.         }
  171.         if ((((ret < 2) || (ret > 10000)) || (ret % 2 == 1)) && !isIncorrect)
  172.         {
  173.             cout << "Размер матрицы должен быть кратен двум и принадлежать промежутку от 2 до 10000\n";
  174.             isIncorrect = true;
  175.         }
  176.     } while (isIncorrect);
  177.     return ret;
  178. }
  179.  
  180. int ** getMatrix(int &size)
  181. {
  182.     string inputType;
  183.     size = getMatrixSize();
  184.     int **retMatrix = new int*[size];
  185.     inputType = getInputType();
  186.     if (inputType == "Console")
  187.     {
  188.         retMatrix = getMatrixFromConsole(size);
  189.     }
  190.     else if (inputType == "File")
  191.     {
  192.         retMatrix = getMatrixFromFile(size);
  193.     }
  194.     return retMatrix;
  195. }
  196.  
  197. string getOutputDirectory()
  198. {
  199.     string ret;
  200.     bool isIncorrect;
  201.     isIncorrect = true;
  202.     do
  203.     {
  204.         cout << "Введите директорию, в которую хотите сохранить матрицу\n";
  205.         cin >> ret;
  206.         if (std::experimental::filesystem::exists(ret))
  207.         {
  208.             isIncorrect = false;
  209.         }
  210.         else
  211.         {
  212.             cout << "Такой директории не существует.Попробуйте ещё раз\n";
  213.         }
  214.  
  215.     } while (isIncorrect);
  216.     return ret;
  217. }
  218.  
  219. void printMatrix(int **matrixToPrint, int size)
  220. {
  221.     for (int i = 0; i < size; i++)
  222.     {
  223.         for (int j = 0; j < size; j++)
  224.         {
  225.             printf("%6i", matrixToPrint[i][j]);
  226.         }
  227.         cout << "\n";
  228.     }
  229.     cout << "\n";
  230.  
  231. }
  232. void printMatrixToFile(int **matrixToPrint, int size)
  233. {
  234.     string path;
  235.     path = getOutputDirectory();
  236.     ofstream myfile;
  237.     myfile.open(path + "\output.txt");
  238.     for (int i = 0; i < size; i++)
  239.     {
  240.         for (int j = 0; j < size; j++)
  241.         {
  242.             myfile << setw(6) << matrixToPrint[i][j];
  243.         }
  244.         myfile << "\n";
  245.     }
  246.     myfile.close();
  247.     cout << "Матрица сохранена по указанному пути";
  248. }
  249. int  ** getMatrixPart(int** matrix, int startI, int startJ, int size)
  250. {
  251.     int **ret = new int*[size];
  252.     for (int i = 0; i < size; i++)
  253.     {
  254.         ret[i] = new int[sizeof(int)*size];
  255.     }
  256.     for (int i = 0; i < size; i++)
  257.         for (int j = 0; j < size; j++)
  258.             ret[i][j] = matrix[i + startI][j + startJ];
  259.     return ret;
  260. }
  261. int ** insertMatrix(int** mainMatrix, int** toInsert, int startI, int startJ, int size)
  262. {
  263.     for (int i = 0; i < size; i++)
  264.     {
  265.         for (int j = 0; j < size; j++)
  266.         {
  267.             mainMatrix[startI + i][startJ + j] = toInsert[i][j];
  268.         }
  269.     }
  270.     return mainMatrix;
  271. }
  272. void swap(int** &toSwap, int size)
  273. {
  274.     int **matrix1;
  275.     int **matrix2;
  276.     int **matrix3;
  277.     int **matrix4;
  278.     int halfSize;
  279.     halfSize = size / 2;
  280.     matrix1 = getMatrixPart(toSwap, 0, 0, halfSize);
  281.     matrix2 = getMatrixPart(toSwap, 0, halfSize, halfSize);
  282.     matrix3 = getMatrixPart(toSwap, halfSize, 0, halfSize);
  283.     matrix4 = getMatrixPart(toSwap, halfSize, halfSize, halfSize);
  284.     insertMatrix(toSwap, matrix1, halfSize, halfSize, halfSize);
  285.     insertMatrix(toSwap, matrix2, halfSize, 0, halfSize);
  286.     insertMatrix(toSwap, matrix3, 0, 0, halfSize);
  287.     insertMatrix(toSwap, matrix4, 0, halfSize, halfSize);
  288. }
  289.  
  290. int main()
  291. {
  292.     SetConsoleCP(1251);
  293.     SetConsoleOutputCP(1251);
  294.     int size = 0;
  295.     int **matrix = getMatrix(size);
  296.     printMatrix(matrix, size);
  297.     swap(matrix, size);
  298.     printMatrix(matrix, size);
  299.     printMatrixToFile(matrix, size);
  300. }
  301.  
Add Comment
Please, Sign In to add comment