Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- const int MIN_SIZE = 2;
- const int MAX_SIZE = 10;
- const int MIN_VALUE = -1000;
- const int MAX_VALUE = 1000;
- void outputOfTaskInfo() {
- std::cout << "Данная программа \"переворачивает\" действительную квадратную матрицу порядка 2*n,где 2*n задано. \n"
- << "Диапазон ввода значений размера матрицы(2 * n) : " << MIN_SIZE << "..." << MAX_SIZE << ". \n"
- << "Диапазон ввода значений элементов подматриц: " << MIN_VALUE << "..." << MAX_VALUE << ". \n";
- }
- int getVerificationOfChoice() {
- int choice;
- bool isIncorrect;
- do {
- isIncorrect = false;
- std::cin >> choice;
- if (std::cin.fail())
- {
- std::cin.clear();
- while (std::cin.get() != '\n');
- isIncorrect = true;
- std::cout << "Проверьте корректность ввода данных! \n";
- }
- if (!isIncorrect && std::cin.get() != '\n')
- {
- std::cin.clear();
- while (std::cin.get() != '\n');
- std::cout << "Проверьте корректность ввода данных! \n";
- isIncorrect = true;
- }
- if (isIncorrect || (choice != 0 && choice != 1))
- {
- isIncorrect = true;
- std::cout << "Для выбора введите 0 или 1! \n";
- }
- } while (isIncorrect);
- return choice;
- }
- std::string inputPathToFile() {
- std::string path;
- bool isIncorrect;
- std::cout << "Укажите путь к файлу: ";
- do
- {
- isIncorrect = false;
- std::cin >> path;
- std::ifstream file(path);
- if (!file.is_open())
- {
- std::cout << "По указанному пути файл не найден! Укажите правильный путь: ";
- isIncorrect = true;
- }
- } while (isIncorrect);
- return path;
- }
- int readSizeFromConsole() {
- int size;
- bool isIncorrect;
- std::cout << "Введите значение размера матрицы: ";
- do
- {
- isIncorrect = false;
- std::cin >> size;
- if (std::cin.fail())
- {
- isIncorrect = true;
- std::cout << "Проверьте корректность ввода данных! \n";
- std::cin.clear();
- while (std::cin.get() != '\n');
- }
- if (!isIncorrect && (size < MIN_SIZE || size >> MAX_SIZE))
- {
- isIncorrect = true;
- std::cout << "Введите число от " << MIN_SIZE << " до " << MAX_SIZE << "! \n";
- }
- } while (isIncorrect);
- return size;
- }
- int readSizeFromFile(const std::string path) {
- int size;
- std::string sizeInp;
- bool isIncorrect = true;
- std::ifstream fin(path);
- std::cout << "Происходит чтение размеров матрицы... \n";
- fin >> sizeInp;
- try
- {
- size = atoi(sizeInp.c_str());
- }
- catch (...)
- {
- isIncorrect = false;
- std::cout << "Ошибка при считывании размера из файла!Введите размер с консоли! \n";
- size = readSizeFromConsole();
- }
- if (!isIncorrect && (size < MIN_SIZE || size > MAX_SIZE))
- {
- std::cout << "Введите значение от " << MIN_SIZE << " до " << MAX_SIZE << "! \n";
- size = readSizeFromConsole();
- }
- if (!isIncorrect && (size % 2 != 0))
- {
- std::cout << "Значение размера матрицы должно быть кратно 2! Введите значение с консоли! \n";
- size = readSizeFromConsole();
- }
- fin.close();
- return size;
- }
- int readSize(const int choice, const std::string path) {
- int size = -1;
- if (choice == 0)
- size = readSizeFromConsole();
- if (choice == 1)
- size = readSizeFromFile(path);
- return size;
- }
- void outputSize(const int choice, std::string path, const int size) {
- std::ofstream fout(path);
- bool isIncorrect;
- if (choice == 0)
- std::cout << "Размер матрицы равен " << size << ". \n";
- if (choice == 1)
- {
- std::cout << "Вывод значения раземера в файл... \n";
- do
- {
- isIncorrect = false;
- std::ofstream fout(path);
- try
- {
- fout << size << "\n";
- }
- catch (...)
- {
- std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
- isIncorrect = true;
- path = inputPathToFile();
- }
- fout.close();
- } while (isIncorrect);
- std::cout << "Данные успешно записаны в файл! \n";
- }
- }
- int** fillMatrixFromConsole(const int size) {
- int** matrix = new int* [size];
- bool isIncorrect;
- for (int i = 0; i < size; i++)
- matrix[i] = new int[size];
- for (int i = 0; i < size; i++)
- {
- for (int j = 0; j < size; j++)
- {
- std::cout << "Введите значение элемента " << i + 1 << "-ой строки " << j + 1 << "-го столбца матрицы: ";
- do
- {
- isIncorrect = false;
- std::cin >> matrix[i][j];
- if (std::cin.fail())
- {
- isIncorrect = true;
- std::cout << "Проверьте корректность ввода данных! \n";
- std::cin.clear();
- while (std::cin.get() != '\n');
- }
- if (!isIncorrect && (matrix[i][j] < MIN_VALUE || matrix[i][j] >> MAX_VALUE))
- {
- isIncorrect = true;
- std::cout << "Введите число от " << MIN_VALUE << " до " << MAX_VALUE << "! \n";
- }
- } while (isIncorrect);
- }
- }
- return matrix;
- }
- int** fillMatrixFromFile(const int size, const std::string path) {
- int** matrix = new int* [size];
- int count = 0;
- for (int i = 0; i < size; i++)
- matrix[i] = new int[size];
- bool isIncorrect;
- std::string matrixInp;
- std::ifstream fin(path);
- std::cout << "Чтение матрицы... \n";
- fin >> matrixInp;
- while (!fin.eof())
- {
- std::string symbol;
- fin >> symbol;
- count++;
- }
- if (count > size * size)
- {
- std::cout << "Ошибка при чтении матрицы! Введите матрицу с консоли! \n";
- matrix = fillMatrixFromConsole(size);
- }
- else
- {
- fin.close();
- fin.open(path);
- fin >> matrixInp;
- for (int i = 0; i < size; i++)
- {
- for (int j = 0; j < size; j++)
- {
- do
- {
- isIncorrect = false;
- try
- {
- fin >> matrix[i][j];
- }
- catch (...)
- {
- std::cout << "Ошибка при чтении матрицы! Введите матрицу с консоли! \n";
- isIncorrect = true;
- matrix = fillMatrixFromConsole(size);
- }
- if (!isIncorrect && (matrix[i][j] < MIN_VALUE || matrix[i][j] > MAX_VALUE))
- {
- std::cout << "Ошибка при чтении матрицы! Введите матрицу с консоли! \n";
- isIncorrect = true;
- matrix = fillMatrixFromConsole(size);
- }
- } while (isIncorrect);
- }
- }
- }
- fin.close();
- return matrix;
- }
- int** fillMatrix(const int choice, const std::string path, const int size) {
- int** matrix = new int* [size];
- for (int i = 0; i < size; i++)
- matrix[i] = new int[size];
- if (choice == 0)
- matrix = fillMatrixFromConsole(size);
- if (choice == 1)
- matrix = fillMatrixFromFile(size, path);
- return matrix;
- }
- void outputMatrix(const int choice, std::string path, int** matrix, const int size) {
- bool isIncorrect;
- std::ofstream fout;
- if (choice == 0)
- {
- std::cout << "Вывод начальной матрицы: \n";
- for (int i = 0; i < size; i++)
- {
- for (int j = 0; j < size; j++)
- std::cout << matrix[i][j] << "\t";
- std::cout << "\n";
- }
- std::cout << "\n";
- }
- if (choice == 1)
- {
- std::cout << "Вывод начальной матрицы в файл... \n";
- fout.open(path, std::ios::app);
- fout << "\n";
- do
- {
- isIncorrect = false;
- try
- {
- for (int i = 0; i < size; i++)
- {
- for (int j = 0; j < size; j++)
- fout << matrix[i][j] << "\t";
- fout << "\n";
- }
- fout << "\n";
- }
- catch (...)
- {
- std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
- isIncorrect = true;
- path = inputPathToFile();
- }
- } while (isIncorrect);
- fout.close();
- std::cout << "Данные успешно записаны в файл! \n";
- }
- }
- int** createNewMatrix(const int size, int** matrix) {
- int submatrixSize;
- submatrixSize = size / 2;
- //создания массивов
- int** newMatrix = new int* [size];
- for (int i = 0; i < size; i++)
- newMatrix[i] = new int[size];
- int** submatrix1 = new int* [submatrixSize];
- for (int i = 0; i < submatrixSize; i++)
- submatrix1[i] = new int[submatrixSize];
- int** submatrix2 = new int* [submatrixSize];
- for (int i = 0; i < submatrixSize; i++)
- submatrix2[i] = new int[submatrixSize];
- int** submatrix3 = new int* [submatrixSize];
- for (int i = 0; i < submatrixSize; i++)
- submatrix3[i] = new int[submatrixSize];
- int** submatrix4 = new int* [submatrixSize];
- for (int i = 0; i < submatrixSize; i++)
- submatrix4[i] = new int[submatrixSize];
- //создание подматриц
- for (int i = 0; i < submatrixSize; i++)
- for (int j = 0; j < submatrixSize; j++)
- submatrix1[i][j] = matrix[i][j];
- for (int i = 0; i < submatrixSize; i++)
- for (int j = 0; j < submatrixSize; j++)
- submatrix2[i][j] = matrix[i][j + submatrixSize - 1];
- for (int i = 0; i < submatrixSize; i++)
- for (int j = 0; j < submatrixSize; j++)
- submatrix3[i][j] = matrix[i + submatrixSize][j];
- for (int i = 0; i < submatrixSize; i++)
- for (int j = 0; j < submatrixSize; j++)
- submatrix4[i][j] = matrix[i + submatrixSize][j + submatrixSize];
- //создание новой матрицы
- for (int i = 0; i < submatrixSize; i++)
- for (int j = 0; j < submatrixSize; j++)
- newMatrix[i + submatrixSize][j] = submatrix1[i][j];
- for (int i = 0; i < submatrixSize; i++)
- for (int j = 0; j < submatrixSize; j++)
- newMatrix[i + submatrixSize][j + submatrixSize] = submatrix2[i][j];
- for (int i = 0; i < submatrixSize; i++)
- for (int j = 0; j < submatrixSize; j++)
- newMatrix[i][j + submatrixSize] = submatrix3[i][j];
- for (int i = 0; i < submatrixSize; i++)
- for (int j = 0; j < submatrixSize; j++)
- newMatrix[i][j] = submatrix4[i][j];
- return newMatrix;
- }
- void outputNewMatrix(const int choice, std::string path, int** matrix, const int size) {
- bool isIncorrect;
- std::ofstream fout;
- if (choice == 0)
- {
- std::cout << "Вывод новой матрицы: \n";
- for (int i = 0; i < size; i++)
- {
- for (int j = 0; j < size; j++)
- std::cout << matrix[i][j] << "\t";
- std::cout << "\n";
- }
- std::cout << "\n";
- }
- if (choice == 1)
- {
- std::cout << "Вывод начальной матрицы в файл... \n";
- fout.open(path, std::ios::app);
- fout << "\n";
- do
- {
- isIncorrect = false;
- try
- {
- for (int i = 0; i < size; i++)
- {
- for (int j = 0; j < size; j++)
- fout << matrix[i][j] << "\t";
- fout << "\n";
- }
- fout << "\n";
- }
- catch (...)
- {
- std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
- isIncorrect = true;
- path = inputPathToFile();
- }
- } while (isIncorrect);
- fout.close();
- std::cout << "Данные успешно записаны в файл! \n";
- }
- }
- void processUserInput(int &choiceForInput, int &size, std::string &pathToIn) {
- std::cout << "Вы желаете ввести данные с консоли(0) или взять данные из файла(1)? \n";
- choiceForInput = getVerificationOfChoice();
- if (choiceForInput == 1)
- pathToIn = inputPathToFile();
- size = readSize(choiceForInput, pathToIn);
- }
- void processUserOutput(int &choiceForOutput, int &size, std::string &pathToOut, int** &matrix, int** &newMatrix) {
- std::cout << "Вы желаете получить результат в консоли(0) или в файле(1)? \n";
- choiceForOutput = getVerificationOfChoice();
- if (choiceForOutput == 1)
- pathToOut = inputPathToFile();
- outputSize(choiceForOutput, pathToOut, size);
- outputMatrix(choiceForOutput, pathToOut, matrix, size);
- outputNewMatrix(choiceForOutput, pathToOut, newMatrix, size);
- }
- int main() {
- setlocale(LC_ALL, "Rus");
- int choiceForInput, choiceForOutput, size;
- std::string pathToIn, pathToOut;
- outputOfTaskInfo();
- processUserInput(choiceForInput, size, pathToIn);
- int** matrix = new int* [size];
- for (int i = 0; i < size; i++)
- matrix[i] = new int[size];
- matrix = fillMatrix(choiceForInput, pathToIn, size);
- int** newMatrix = new int* [size];
- for (int i = 0; i < size; i++)
- newMatrix[i] = new int[size];
- newMatrix = createNewMatrix(size, matrix);
- processUserOutput(choiceForOutput, size, pathToOut, matrix, newMatrix);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement