Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdlib.h>
- #include <fstream>
- #include <string>
- using namespace std;
- int chooseWay(const int);
- void inputMatrix(double**&, int&, const int);
- void inputFromConsole(double**&, int&);
- void showMatrix(double**, const int);
- string inputFileName(const int);
- bool inputFromFile(ifstream&, double**&, int&);
- void outputMatrix(double**, const int n, const int);
- void outputInFile(ofstream&, double**, const int);
- double** transposeMatrix(double**, const int);
- const int INPUT = 1, OUTPUT = 2;
- int main()
- {
- system("chcp 1251 > nul");
- double** matrix;
- int choice, n;
- cout << "Программа транспонирует заданную квадратную матрицу порядка n.\n";
- choice = chooseWay(INPUT);
- inputMatrix(matrix, n, choice);
- matrix = transposeMatrix(matrix, n);
- choice = chooseWay(OUTPUT);
- outputMatrix(matrix, n, choice);
- }
- int chooseWay(const int IorOput)
- {
- int choice;
- bool isNotCorrect;
- switch (IorOput) {
- case INPUT:
- cout << "Выберите вариант ввода:\n";
- cout << "1.Данные вводятся из текстового файла.\n";
- cout << "2.Данные вводятся через консоль.\n";
- break;
- default:
- cout << "Выберите вариант вывода:\n";
- cout << "1.Данные выводятся в текстовый файл.\n";
- cout << "2.Данные выводятся в консоль.\n";
- }
- do {
- cin >> choice;
- if (cin.fail() || cin.get() != '\n') {
- isNotCorrect = true;
- cout << "Ошибка ввода. Выберите вариант 1 или 2." << '\n';
- cin.clear();
- while (cin.get() != '\n');
- }
- else if ((choice < 1) || (choice > 2)) {
- cout << "Ошибка ввода. Выберите вариант 1 или 2." << '\n';
- isNotCorrect = true;
- }
- else
- isNotCorrect = false;
- } while (isNotCorrect);
- return choice;
- }
- void inputMatrix(double**& matrix, int& n, const int choice)
- {
- switch (choice) {
- case 1: {
- string fileName;
- ifstream in;
- bool isNotCorrect;
- do {
- fileName = inputFileName(INPUT);
- in.open(fileName);
- isNotCorrect = inputFromFile(in, matrix, n);
- if (!isNotCorrect && !in.eof()) {
- isNotCorrect = true;
- cout << "В файле присутствуют лишние данные! Повторите ввод имени файла:\n";
- }
- in.close();
- } while (isNotCorrect);
- break;
- }
- default:
- inputFromConsole(matrix, n);
- }
- }
- void inputFromConsole(double**& matrix, int& n)
- {
- bool isNotCorrect;
- cout << "Введите порядок матрицы:\n";
- do {
- cin >> n;
- if (cin.fail() || cin.get() != '\n') {
- isNotCorrect = true;
- cout << "Ошибка ввода. Введите натуральное число в диапазоне [1; 20 000]" << '\n';
- cin.clear();
- while (cin.get() != '\n');
- }
- else if ((n < 1) || (n > 20000)) {
- cout << "Ошибка ввода. Введите натуральное число в диапазоне [1; 20 000]" << '\n';
- isNotCorrect = true;
- }
- else
- isNotCorrect = false;
- } while (isNotCorrect);
- matrix = new double* [n];
- for (int i = 0; i < n; i++) {
- matrix[i] = new double[n];
- }
- cout << "Введите элементы матрицы (построчно):\n";
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++)
- do {
- isNotCorrect = false;
- cin >> matrix[i][j];
- if (cin.fail() || cin.get() != '\n') {
- isNotCorrect = true;
- cout << "Ошибка ввода! Введите действительное число:" << '\n';
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- }
- void showMatrix(double** matrix, const int n)
- {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++)
- cout << matrix[i][j] << ' ';
- cout << '\n';
- }
- }
- string inputFileName(const int inOrOut)
- {
- string fileName;
- switch (inOrOut) {
- case INPUT: {
- cout << "Введите имя файла, из которого будут вводиться данные (все входные величины в файле должны быть разделены пробелами, сначала идет порядок матрицы, затем ее элементы):\n";
- ifstream in;
- do {
- getline(cin, fileName);
- in.open(fileName);
- if (in.is_open()) {
- in.close();
- return fileName;
- }
- else
- cout << "Невозможно открыть файл с таким именем! Повторите ввод имени файла:\n";
- } while (true);
- break;
- }
- default: {
- cout << "Введите имя файла, в который будут выводиться полученные данные:\n";
- ofstream out;
- do {
- getline(cin, fileName);
- out.open(fileName);
- if (out.is_open()) {
- out.close();
- return fileName;
- }
- else
- cout << "Невозможно открыть файл с таким именем! Повторите ввод имени файла:\n";
- } while (true);
- }
- }
- }
- bool inputFromFile(ifstream& in, double**& matrix, int& n)
- {
- bool isNotCorrect;
- isNotCorrect = false;
- in >> n;
- if (in.fail()) {
- isNotCorrect = true;
- cout << "В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени." << '\n';
- in.clear();
- }
- else if ((n < 1) || (n > 20000)) {
- isNotCorrect = true;
- cout << "Порядок матрицы вне допустимого диапазона! Измените содержание файла и повторите ввод его имени." << '\n';
- }
- else {
- matrix = new double*[n];
- for (int i = 0; i < n; i++) {
- matrix[i] = new double[n];
- }
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- in >> matrix[i][j];
- if (in.fail()) {
- cout << "В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени." << '\n';
- in.clear();
- return true;
- }
- }
- }
- }
- return isNotCorrect;
- }
- void outputMatrix(double** matrix, const int n, const int choice)
- {
- switch (choice) {
- case 1: {
- string fileName;
- ofstream out;
- fileName = inputFileName(OUTPUT);
- out.open(fileName);
- outputInFile(out, matrix, n);
- out.close();
- cout << "Искомые данные выведены в файл " << fileName;
- break;
- }
- default:
- cout << "Искомая матрица:\n";
- showMatrix(matrix, n);
- }
- }
- void outputInFile(ofstream& out, double** matrix, const int n)
- {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++)
- out << matrix[i][j] << ' ';
- out << '\n';
- }
- }
- double** transposeMatrix(double** matrix, const int n)
- {
- double **trMatrix;
- trMatrix = new double* [n];
- for (int i = 0; i < n; i++) {
- trMatrix[i] = new double[n];
- }
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++)
- trMatrix[j][i] = matrix[i][j];
- return trMatrix;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement