Advertisement
Kentoo

Barinov #3

Feb 14th, 2018
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.62 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include "windows.h"
  4. #include <string>
  5. #include <fstream>
  6. #include <iomanip>
  7. #include <sstream>
  8.  
  9. #define outputWidth 10
  10.  
  11. using namespace std;
  12.  
  13. void menuOutput() {
  14.     cout << "1. Создать файл с исходными данными" << endl
  15.         << "2. Загрузить исходные данные" << endl
  16.         << "3. Вывести исходные данные" << endl
  17.         << "4. Обработать данные" << endl
  18.         << "5. Завершить работу с программой" << endl;
  19. }
  20.  
  21. double** createMatrix(unsigned int rows, unsigned int columns) {
  22.     double** newMatrix = new(std::nothrow) double*[rows];
  23.  
  24.     if (newMatrix == nullptr)
  25.         return nullptr;
  26.  
  27.     for (unsigned int i = 0; i < rows; i++) {
  28.         newMatrix[i] = new double[columns];
  29.         if (newMatrix[i] == nullptr || newMatrix == nullptr)
  30.             return nullptr;
  31.     }
  32.  
  33.     return newMatrix;
  34. }
  35.  
  36. double** createFile(unsigned int &n, unsigned int &m) {
  37.     system("cls");
  38.  
  39.     string s;
  40.     double a;
  41.  
  42.     while (true) {
  43.         cin.clear();
  44.         cin.ignore(255, '\n');
  45.         cout << "Введите количество строк матрицы" << endl;
  46.         cin >> s;
  47.         try {
  48.             n = stoi(s);
  49.             a = stod(s);
  50.             if (a == n)
  51.                 break;
  52.             cout << "Неверное значение" << endl << endl;
  53.         }
  54.         catch (exception e) {
  55.             cout << "Неверное значение" << endl << endl;
  56.         }
  57.     }
  58.     while (true) {
  59.         cin.clear();
  60.         cin.ignore(255, '\n');
  61.         cout << "Введите количество столбцов матрицы" << endl;
  62.         cin >> s;
  63.         try {
  64.             m = stoi(s);
  65.             a = stod(s);
  66.             if (a == m)
  67.                 break;
  68.             cout << "Неверное значение" << endl << endl;
  69.         }
  70.         catch (exception e) {
  71.             cout << "Неверное значение" << endl << endl;
  72.         }
  73.     }
  74.     a = 0;
  75.  
  76.     double** matr = createMatrix(n, m);
  77.  
  78.     if (matr == nullptr)
  79.         return nullptr;
  80.  
  81.     cout << endl;
  82.     bool failed = false;
  83.     for (unsigned int i = 0; i < n; i++) {
  84.         for (unsigned int j = 0; j < m; j++) {
  85.             cout << "Введите значение " << j << " элемента " << i << " строки матрицы: ";
  86.             cin >> s;
  87.             try {
  88.                 if (s.at(0) == '.')
  89.                     s = '0' + s;
  90.                 a = stod(s);
  91.             }
  92.             catch (exception e) {
  93.                 failed = true;
  94.             }
  95.             while (failed) {
  96.                 cout << "Введите корректное значение " << j << " элемента " << i << " строки матрицы: ";
  97.                 cin >> s;
  98.                 try {
  99.                     if (s.at(0) == '.')
  100.                         s = '0' + s;
  101.                     a = stod(s);
  102.                     failed = false;
  103.                 }
  104.                 catch (exception e) {
  105.                     failed = true;
  106.                 }
  107.             }
  108.             matr[i][j] = a;
  109.         }
  110.         cout << endl;
  111.     }
  112.  
  113.     char c;
  114.     string FNAME;
  115.     ofstream fout;
  116.  
  117.     while (!fout.is_open()) {
  118.         cout << endl << "Введите имя файла : ";
  119.         cin >> FNAME;
  120.         fout.open(FNAME, ios::_Nocreate);
  121.         if (fout.is_open()) {
  122.             cout << "Обнаружен файл с таким именем, разрешить перезаписать? (y - да, n - нет)" << endl;
  123.             cin >> c;
  124.  
  125.             while (c != 'y' && c != 'Y' && c != 'у' && c != 'У' && c != 'n' && c != 'N') {
  126.                 cout << "Введен неправильный ответ, попробуйте еще раз" << endl;
  127.                 cin >> c;
  128.             }
  129.  
  130.             switch (c) {
  131.             case 'y':
  132.             case 'Y':
  133.             case 'у':
  134.             case 'У':
  135.                 fout.close();
  136.                 fout.open(FNAME, ios::trunc);
  137.                 break;
  138.             case 'n':
  139.             case 'N':
  140.                 fout.close();
  141.                 break;
  142.             default:
  143.                 break;
  144.             }
  145.         }
  146.         else {
  147.             fout.close();
  148.             fout.open(FNAME);
  149.         }
  150.     }
  151.     for (unsigned int i = 0; i < n; i++) {
  152.         for (unsigned int j = 0; j < m; j++)
  153.             fout << matr[i][j] << ' ';
  154.         fout << endl;
  155.     }
  156.     fout.close();
  157.     return matr;
  158. }
  159.  
  160. double** loadFile(unsigned int &n, unsigned int &m) {
  161.     system("cls");
  162.     unsigned int temp = m;
  163.     n = 0;
  164.     m = 0;
  165.  
  166.     string FNAME, s;
  167.     stringstream buf, res;
  168.     ifstream fin;
  169.  
  170.     double a;
  171.  
  172.     while (!fin.is_open()) {
  173.         cout << "Введите имя файла: ";
  174.         cin >> FNAME;
  175.         fin.open(FNAME);
  176.     }
  177.     bool broken = false;
  178.     while (!fin.eof() && !broken) {
  179.         getline(fin, s);
  180.  
  181.         while (s.find("  ") != s.npos)
  182.             s.replace(s.find("  "), 2, " ");
  183.  
  184.         while (s.find(",") != s.npos)
  185.             s.replace(s.find(","), 1, ".");
  186.  
  187.         if (s.size() > 0) {
  188.             buf.str(string());
  189.             buf.clear();
  190.  
  191.             buf << s;
  192.             m = 0;
  193.             n = 0;
  194.             while (buf >> s) {
  195.                 try {
  196.                     a = stod(s);
  197.                     m++;
  198.                 }
  199.                 catch (exception e) {
  200.                     if (strcmp(e.what(), "invalid stod argument") == 0)
  201.                         cout << "Обнаружен недопустимый символ при вводе значения из " << n << " строки и " << m << " столбца" << endl
  202.                         << "Недопустимый ввод -> " << s << endl;
  203.                     if (strcmp(e.what(), "stod argument out of range") == 0)
  204.                         cout << "Обнаружено переполнение типа при вводе значения из " << n << " строки и " << m << " столбца" << endl;
  205.                     broken = true;
  206.                     break;
  207.                 }
  208.                 buf.ignore();
  209.                 if (!isdigit((unsigned char)s.at(s.size() - 1))) {
  210.                     cout << "Обнаружен недопустимый символ при вводе значения из " << n << " строки и " << m << " столбца" << endl
  211.                         << "Недопустимый ввод -> " << s << endl;
  212.                     broken = true;
  213.                     break;
  214.                 }
  215.                 n++;
  216.                 res << a << ' ';
  217.             }
  218.             if (temp == 0)
  219.                 temp = m;
  220.             if (m != temp) {
  221.                 cout << "Неверное количество значений в " << n << " строке" << endl;
  222.                 broken = true;
  223.             }
  224.         }
  225.     }
  226.     fin.close();
  227.     if (!broken) {
  228.         double** matr = createMatrix(n, m);
  229.  
  230.         if (matr == nullptr)
  231.             return nullptr;
  232.  
  233.         unsigned int i = 0;
  234.         for (unsigned int i = 0; i < n; i++)
  235.             for (unsigned int j = 0; j < m; j++) {
  236.                 res >> a;
  237.                 if (!res.fail()) {
  238.                     matr[i][j] = a;
  239.                 }
  240.                 else {
  241.                     for (unsigned int i = 0; i < n; i++)
  242.                         delete[] matr[i];
  243.                     delete[] matr;
  244.                     return nullptr;
  245.                 }
  246.             }
  247.         return matr;
  248.     }
  249.     return nullptr;
  250. }
  251.  
  252. void printMatrix(double** matr, unsigned int rows, unsigned int columns) {
  253.     cout.precision(3);
  254.     for (unsigned int i = 0; i < rows; i++) {
  255.         for (unsigned int j = 0; j < columns; j++)
  256.             cout << setw(outputWidth) << matr[i][j] << " ";
  257.         cout << endl;
  258.     }
  259.     cout << endl;
  260. }
  261.  
  262. void createAndPrintMatrix(double** f, unsigned int rows, unsigned int columns) {
  263.     double max = f[0][0];
  264.     unsigned int mi = 0, mj = 0;
  265.     for (unsigned int i = 0; i < rows; i++)
  266.         for (unsigned int j = 0; j < columns; j++)
  267.             if (f[i][j] > max) {
  268.                 max = f[i][j];
  269.                 mi = i;
  270.                 mj = j;
  271.             }
  272.     if (mi == mj) {
  273.         double** y = createMatrix(rows, columns);
  274.         if (y == nullptr)
  275.             cout << "Ошибка выделения памяти" << endl;
  276.         else {
  277.             for (unsigned int i = 0; i < rows; i++)
  278.                 for (unsigned int j = 0; j < columns; j++)
  279.                     if (i == 0 || j == 0)
  280.                         y[i][j] = max;
  281.                     else
  282.                         y[i][j] = f[i][j];
  283.             cout << endl << "Исходная матрица" << endl;
  284.             printMatrix(f, rows, columns);
  285.             cout << endl << "Полученная матрица" << endl;
  286.             printMatrix(y, rows, columns);
  287.         }
  288.     }
  289.     else {
  290.         cout << endl << "Найденный максимальный элемент лежит не на главной диагонали" << endl;
  291.     }
  292. }
  293.  
  294. int main() {
  295.     SetConsoleCP(1251);
  296.     SetConsoleOutputCP(1251);
  297.  
  298.     double** matr = nullptr;
  299.     unsigned int n = 0, m = 0;
  300.     char c;
  301.  
  302.     while (true) {
  303.         system("cls");
  304.         menuOutput();
  305.         cin >> c;
  306.         switch (c) {
  307.         case '1':
  308.             matr = createFile(n, m);
  309.             break;
  310.         case '2':
  311.             matr = loadFile(n, m);
  312.             break;
  313.         case '3':
  314.             if (n > 0 && m > 0) {
  315.                 system("cls");
  316.                 cout << "Исходная матрица" << endl;
  317.                 printMatrix(matr, n, m);
  318.             }
  319.             break;
  320.         case '4':
  321.             if (matr != nullptr) {
  322.                 system("cls");
  323.                 createAndPrintMatrix(matr, n, m);
  324.             }
  325.             break;
  326.         case '5':
  327.             return 0;
  328.             break;
  329.         default:
  330.             break;
  331.         }
  332.  
  333.         if (matr == nullptr && n > 0) {
  334.             cout << "Повреждены значения в файле или проблемы с памятью" << endl;
  335.             break;
  336.         }
  337.  
  338.         if (c == '1' || c == '2' || c == '3' || c == '4' || c == '5')
  339.             cout << endl << "Готово" << endl << endl;
  340.         else
  341.             cout << endl << "Введен неправильный ответ, попробуйте еще раз" << endl << endl;
  342.  
  343.         if (c == '2') {
  344.             cout << "Загруженная матрица" << endl;
  345.             printMatrix(matr, n, m);
  346.             cout << endl;
  347.         }
  348.  
  349.         system("pause");
  350.     }
  351.     for (unsigned int i = 0; i < n; i++) {
  352.         try {
  353.             delete[] matr[i];
  354.         }
  355.         catch (exception e) {
  356.         }
  357.     }
  358.     delete[] matr;
  359.     system("pause");
  360.     return 0;
  361. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement