Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <experimental/filesystem>
- #include <fstream>
- #include <sstream>
- #include <iomanip>
- #include <windows.h>
- using namespace std;
- string getInputType()
- {
- string ret;
- bool isIncorrect;
- string inputLine;
- isIncorrect = true;
- do
- {
- cout << "Выберите способ задания матрицы файл/консоль (ф/к)";
- getline(cin, inputLine);
- if (inputLine[0] == 'Ф' || inputLine[0] == 'ф')
- {
- ret = "File";
- isIncorrect = false;
- }
- else if (inputLine[0] == 'К' || inputLine[0] == 'к')
- {
- ret = "Console";
- isIncorrect = false;
- }
- } while (isIncorrect);
- return ret;
- }
- int getMatrixItem(int i, int j)
- {
- int ret;
- bool isIncorrect;
- string inputLine;
- do
- {
- cout << "Введите значение элемента матрицы [" << i << "," << j << "] ";
- getline(cin, inputLine);
- isIncorrect = false;
- try
- {
- ret = stoi(inputLine);
- }
- catch (...)
- {
- isIncorrect = true;
- cout << "Значение матрицы должно быть числом\n";
- }
- } while (isIncorrect);
- return ret;
- }
- int ** getMatrixFromConsole(int size)
- {
- int **ret = new int*[size];
- for (int i = 0; i < size; i++)
- {
- ret[i] = new int[size * sizeof(int)];
- for (int j = 0; j < size; j++)
- ret[i][j] = getMatrixItem(i, j);
- }
- return ret;
- }
- bool isFileCorrect(string path, int size)
- {
- int iSize, jSize, num;
- bool isCorrect;
- string inputline;
- fstream matrixFile(path, std::ios_base::in);
- iSize = 0;
- jSize = 0;
- isCorrect = true;
- while (!matrixFile.eof() && isCorrect)
- {
- getline(matrixFile, inputline);
- stringstream strstream;
- strstream << inputline;
- while (!strstream.eof() && jSize <= size)
- {
- strstream >> num;
- jSize++;
- }
- if (inputline != "")
- {
- iSize++;
- if (jSize != size)
- {
- isCorrect = false;
- }
- }
- jSize = 0;
- }
- if (iSize != size)
- {
- isCorrect = false;
- }
- return isCorrect;
- }
- string getMatrixFilePath(int matrixSize)
- {
- string ret;
- bool isIncorrect = true;
- do
- {
- cout << "Введите абсолютный путь к файлу ";
- cin >> ret;
- if (!std::experimental::filesystem::exists(ret))
- {
- cout << "Файл не найден\n";
- }
- else
- {
- if (isFileCorrect(ret, matrixSize))
- {
- isIncorrect = false;
- }
- else
- {
- cout << "Данные в файле некорректны\n";
- }
- }
- } while (isIncorrect);
- return ret;
- }
- int** getMatrixFromFile(int size)
- {
- int **ret = new int*[size];
- string filePath;
- string inputline;
- for (int i = 0; i < size; i++)
- {
- ret[i] = new int[size];
- }
- filePath = getMatrixFilePath(size);
- fstream matrixFile(filePath, std::ios_base::in);
- for (int i = 0; i < size; i++)
- {
- getline(matrixFile, inputline);
- stringstream strStream;
- strStream << inputline;
- for (int j = 0; j < size; j++)
- {
- strStream >> ret[i][j];
- }
- }
- return ret;
- }
- int getMatrixSize()
- {
- int ret = 0;
- bool isIncorrect;
- string inputLine;
- do
- {
- cout << "Введите размер матрицы ";
- isIncorrect = false;
- getline(cin, inputLine);
- try
- {
- ret = stoi(inputLine);
- }
- catch (...)
- {
- isIncorrect = true;
- cout << "Размер матрицы должен быть числом\n";
- }
- if ((((ret < 2) || (ret > 10000)) || (ret % 2 == 1)) && !isIncorrect)
- {
- cout << "Размер матрицы должен быть кратен двум и принадлежать промежутку от 2 до 10000\n";
- isIncorrect = true;
- }
- } while (isIncorrect);
- return ret;
- }
- int ** getMatrix(int &size)
- {
- string inputType;
- size = getMatrixSize();
- int **retMatrix = new int*[size];
- inputType = getInputType();
- if (inputType == "Console")
- {
- retMatrix = getMatrixFromConsole(size);
- }
- else if (inputType == "File")
- {
- retMatrix = getMatrixFromFile(size);
- }
- return retMatrix;
- }
- string getOutputDirectory()
- {
- string ret;
- bool isIncorrect;
- isIncorrect = true;
- do
- {
- cout << "Введите директорию, в которую хотите сохранить матрицу\n";
- cin >> ret;
- if (std::experimental::filesystem::exists(ret))
- {
- isIncorrect = false;
- }
- else
- {
- cout << "Такой директории не существует.Попробуйте ещё раз\n";
- }
- } while (isIncorrect);
- return ret;
- }
- void printMatrix(int **matrixToPrint, int size)
- {
- for (int i = 0; i < size; i++)
- {
- for (int j = 0; j < size; j++)
- {
- printf("%6i", matrixToPrint[i][j]);
- }
- cout << "\n";
- }
- cout << "\n";
- }
- void printMatrixToFile(int **matrixToPrint, int size)
- {
- string path;
- path = getOutputDirectory();
- ofstream myfile;
- myfile.open(path + "\output.txt");
- for (int i = 0; i < size; i++)
- {
- for (int j = 0; j < size; j++)
- {
- myfile << setw(6) << matrixToPrint[i][j];
- }
- myfile << "\n";
- }
- myfile.close();
- cout << "Матрица сохранена по указанному пути";
- }
- int ** getMatrixPart(int** matrix, int startI, int startJ, int size)
- {
- int **ret = new int*[size];
- for (int i = 0; i < size; i++)
- {
- ret[i] = new int[sizeof(int)*size];
- }
- for (int i = 0; i < size; i++)
- for (int j = 0; j < size; j++)
- ret[i][j] = matrix[i + startI][j + startJ];
- return ret;
- }
- int ** insertMatrix(int** mainMatrix, int** toInsert, int startI, int startJ, int size)
- {
- for (int i = 0; i < size; i++)
- {
- for (int j = 0; j < size; j++)
- {
- mainMatrix[startI + i][startJ + j] = toInsert[i][j];
- }
- }
- return mainMatrix;
- }
- void swap(int** &toSwap, int size)
- {
- int **matrix1;
- int **matrix2;
- int **matrix3;
- int **matrix4;
- int halfSize;
- halfSize = size / 2;
- matrix1 = getMatrixPart(toSwap, 0, 0, halfSize);
- matrix2 = getMatrixPart(toSwap, 0, halfSize, halfSize);
- matrix3 = getMatrixPart(toSwap, halfSize, 0, halfSize);
- matrix4 = getMatrixPart(toSwap, halfSize, halfSize, halfSize);
- insertMatrix(toSwap, matrix1, halfSize, halfSize, halfSize);
- insertMatrix(toSwap, matrix2, halfSize, 0, halfSize);
- insertMatrix(toSwap, matrix3, 0, 0, halfSize);
- insertMatrix(toSwap, matrix4, 0, halfSize, halfSize);
- }
- int main()
- {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- int size = 0;
- int **matrix = getMatrix(size);
- printMatrix(matrix, size);
- swap(matrix, size);
- printMatrix(matrix, size);
- printMatrixToFile(matrix, size);
- }
Add Comment
Please, Sign In to add comment