Advertisement
Vernon_Roche

Задание 3 С++ (Лабораторная работа 2)

Oct 14th, 2023 (edited)
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.44 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <fstream>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. int chooseWay(const int);
  9. void inputMatrix(double**&, int&, const int);
  10. void inputFromConsole(double**&, int&);
  11. void showMatrix(double**, const int);
  12. string inputFileName(const int);
  13. bool inputFromFile(ifstream&, double**&, int&);
  14. void outputMatrix(double**, const int n, const int);
  15. void outputInFile(ofstream&, double**, const int);
  16. double** transposeMatrix(double**, const int);
  17.  
  18. const int INPUT = 1, OUTPUT = 2;
  19.  
  20. int main()
  21. {
  22.     system("chcp 1251 > nul");
  23.     double** matrix;
  24.     int choice, n;
  25.     cout << "Программа транспонирует заданную квадратную матрицу порядка n.\n";
  26.     choice = chooseWay(INPUT);
  27.     inputMatrix(matrix, n, choice);
  28.     matrix = transposeMatrix(matrix, n);
  29.     choice = chooseWay(OUTPUT);
  30.     outputMatrix(matrix, n, choice);
  31. }
  32.  
  33. int chooseWay(const int IorOput)
  34. {
  35.     int choice;
  36.     bool isNotCorrect;
  37.     switch (IorOput) {
  38.         case INPUT:
  39.             cout << "Выберите вариант ввода:\n";
  40.             cout << "1.Данные вводятся из текстового файла.\n";
  41.             cout << "2.Данные вводятся через консоль.\n";
  42.             break;
  43.         default:
  44.             cout << "Выберите вариант вывода:\n";
  45.             cout << "1.Данные выводятся в текстовый файл.\n";
  46.             cout << "2.Данные выводятся в консоль.\n";
  47.     }
  48.     do {
  49.         cin >> choice;
  50.         if (cin.fail() || cin.get() != '\n') {
  51.             isNotCorrect = true;
  52.             cout << "Ошибка ввода. Выберите вариант 1 или 2." << '\n';
  53.             cin.clear();
  54.             while (cin.get() != '\n');
  55.         }
  56.         else if ((choice < 1) || (choice > 2)) {
  57.             cout << "Ошибка ввода. Выберите вариант 1 или 2." << '\n';
  58.             isNotCorrect = true;
  59.         }
  60.         else
  61.             isNotCorrect = false;
  62.     } while (isNotCorrect);
  63.     return choice;
  64. }
  65.  
  66. void inputMatrix(double**& matrix, int& n, const int choice)
  67. {
  68.     switch (choice) {
  69.     case 1: {
  70.         string fileName;
  71.         ifstream in;
  72.         bool isNotCorrect;
  73.         do {
  74.             fileName = inputFileName(INPUT);
  75.             in.open(fileName);
  76.             isNotCorrect = inputFromFile(in, matrix, n);
  77.             if (!isNotCorrect && !in.eof()) {
  78.                 isNotCorrect = true;
  79.                 cout << "В файле присутствуют лишние данные! Повторите ввод имени файла:\n";
  80.             }
  81.             in.close();
  82.         } while (isNotCorrect);
  83.         break;
  84.     }
  85.     default:
  86.         inputFromConsole(matrix, n);
  87.     }
  88. }
  89.  
  90. void inputFromConsole(double**& matrix, int& n)
  91. {
  92.     bool isNotCorrect;
  93.     cout << "Введите порядок матрицы:\n";
  94.     do {
  95.         cin >> n;
  96.         if (cin.fail() || cin.get() != '\n') {
  97.             isNotCorrect = true;
  98.             cout << "Ошибка ввода. Введите натуральное число в диапазоне [1; 20 000]" << '\n';
  99.             cin.clear();
  100.             while (cin.get() != '\n');
  101.         }
  102.         else if ((n < 1) || (n > 20000)) {
  103.             cout << "Ошибка ввода. Введите натуральное число в диапазоне [1; 20 000]" << '\n';
  104.             isNotCorrect = true;
  105.         }
  106.         else
  107.             isNotCorrect = false;
  108.     } while (isNotCorrect);
  109.     matrix = new double* [n];
  110.     for (int i = 0; i < n; i++) {
  111.         matrix[i] = new double[n];
  112.     }
  113.     cout << "Введите элементы матрицы (построчно):\n";
  114.     for (int i = 0; i < n; i++)
  115.         for (int j = 0; j < n; j++)
  116.             do {
  117.                 isNotCorrect = false;
  118.                 cin >> matrix[i][j];
  119.                 if (cin.fail() || cin.get() != '\n') {
  120.                     isNotCorrect = true;
  121.                     cout << "Ошибка ввода! Введите действительное число:" << '\n';
  122.                     cin.clear();
  123.                     while (cin.get() != '\n');
  124.                 }
  125.             } while (isNotCorrect);
  126. }
  127.  
  128. void showMatrix(double** matrix, const int n)
  129. {
  130.     for (int i = 0; i < n; i++) {
  131.         for (int j = 0; j < n; j++)
  132.             cout << matrix[i][j] << ' ';
  133.         cout << '\n';
  134.     }
  135. }
  136.  
  137. string inputFileName(const int inOrOut)
  138. {
  139.     string fileName;
  140.     switch (inOrOut) {
  141.         case INPUT: {
  142.             cout << "Введите имя файла, из которого будут вводиться данные (все входные величины в файле должны быть разделены пробелами, сначала идет порядок матрицы, затем ее элементы):\n";
  143.             ifstream in;
  144.             do {
  145.                 getline(cin, fileName);
  146.                 in.open(fileName);
  147.                 if (in.is_open()) {
  148.                     in.close();
  149.                     return fileName;
  150.                 }
  151.                 else
  152.                     cout << "Невозможно открыть файл с таким именем! Повторите ввод имени файла:\n";
  153.             } while (true);
  154.             break;
  155.         }
  156.         default: {
  157.             cout << "Введите имя файла, в который будут выводиться полученные данные:\n";
  158.             ofstream out;
  159.             do {
  160.                 getline(cin, fileName);
  161.                 out.open(fileName);
  162.                 if (out.is_open()) {
  163.                     out.close();
  164.                     return fileName;
  165.                 }
  166.                 else
  167.                     cout << "Невозможно открыть файл с таким именем! Повторите ввод имени файла:\n";
  168.             } while (true);
  169.         }
  170.     }
  171. }
  172. bool inputFromFile(ifstream& in, double**& matrix, int& n)
  173. {
  174.     bool isNotCorrect;
  175.     isNotCorrect = false;
  176.     in >> n;
  177.     if (in.fail()) {
  178.         isNotCorrect = true;
  179.         cout << "В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени." << '\n';
  180.         in.clear();
  181.     }
  182.     else if ((n < 1) || (n > 20000)) {
  183.         isNotCorrect = true;
  184.         cout << "Порядок матрицы вне допустимого диапазона! Измените содержание файла и повторите ввод его имени." << '\n';
  185.     }
  186.     else {
  187.         matrix = new double*[n];
  188.         for (int i = 0; i < n; i++) {
  189.             matrix[i] = new double[n];
  190.         }
  191.         for (int i = 0; i < n; i++) {
  192.             for (int j = 0; j < n; j++) {
  193.                 in >> matrix[i][j];
  194.                 if (in.fail()) {
  195.                     cout << "В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени." << '\n';
  196.                     in.clear();
  197.                     return true;
  198.                 }
  199.             }
  200.         }
  201.     }
  202.     return isNotCorrect;
  203. }
  204.  
  205. void outputMatrix(double** matrix, const int n, const int choice)
  206. {
  207.     switch (choice) {
  208.         case 1: {
  209.             string fileName;
  210.             ofstream out;
  211.             fileName = inputFileName(OUTPUT);
  212.             out.open(fileName);
  213.             outputInFile(out, matrix, n);
  214.             out.close();
  215.             cout << "Искомые данные выведены в файл " << fileName;
  216.             break;
  217.         }
  218.         default:
  219.             cout << "Искомая матрица:\n";
  220.             showMatrix(matrix, n);
  221.     }
  222. }
  223.  
  224. void outputInFile(ofstream& out, double** matrix, const int n)
  225. {
  226.     for (int i = 0; i < n; i++) {
  227.         for (int j = 0; j < n; j++)
  228.             out << matrix[i][j] << ' ';
  229.         out << '\n';
  230.     }
  231.  
  232. }
  233.  
  234. double** transposeMatrix(double** matrix, const int n)
  235. {
  236.     double **trMatrix;
  237.     trMatrix = new double* [n];
  238.     for (int i = 0; i < n; i++) {
  239.         trMatrix[i] = new double[n];
  240.     }
  241.     for (int i = 0; i < n; i++)
  242.         for (int j = 0; j < n; j++)
  243.             trMatrix[j][i] = matrix[i][j];
  244.     return trMatrix;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement