Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.08 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <fstream>
  4. #include <sstream>
  5. #include <conio.h>
  6. #include <iomanip>
  7.  
  8.     typedef double elemtype;
  9.  
  10. using namespace std;
  11.  
  12. enum mistakes
  13. {
  14.     no_err, load_matr_err, elem_err, file_err, mem_alloc_err, pryam_err, empty_err
  15. };
  16.  
  17. /*elemtype **loadMatr(string filename, int &str1, int &stlb1, elemtype **&arr, mistakes &err, int &pos, int &el_str, int &el_stlb, istringstream &ii)
  18. {
  19.     ifstream f("D://1//" + filename + ".txt");
  20.     if (!f.is_open())
  21.     {
  22.         f.close();
  23.         err = file_err;
  24.         return NULL;
  25.     }
  26.  
  27.     int stolb = 0;
  28.     int i = 0;
  29.     string istr;
  30.     bool fail = false;
  31.    
  32.     while (!f.eof())
  33.     {
  34.         f >> ws;
  35.         getline(f, istr);
  36.         ii.str(istr);
  37.         while (!ii.eof())
  38.         {
  39.             pos = ii.tellg();
  40.             ii >> i;
  41.             if (ii.fail() || ii.peek() != ' ' && ii.peek() != '\t' && ii.peek() != '\n' && ii.peek() != EOF)
  42.             {
  43.                 f.close();
  44.                 el_str = str1;
  45.                 el_stlb = stolb;
  46.                 err = elem_err;
  47.                 return NULL;
  48.             }
  49.             stolb++;
  50.             ii >> ws;
  51.         }
  52.  
  53.         ii.ignore(255, '\n'); //для getline()
  54.         ii.clear();     // сброс ii.eof()
  55.  
  56.         if (str1 == 0)
  57.             stlb1 = stolb;
  58.  
  59.         if (stlb1 != stolb)
  60.         {
  61.             f.close();
  62.             err = pryam_err;
  63.             return NULL;
  64.         }
  65.  
  66.         stolb = 0;
  67.         str1++;
  68.  
  69.         f >> ws;
  70.     }
  71.    
  72.  
  73.     if (str1 == 1)
  74.     {
  75.         f.close();
  76.         err = empty_err;
  77.         return NULL;
  78.     }
  79.  
  80.     arr = new(nothrow)elemtype*[str1];
  81.     if (!arr)
  82.     {
  83.         f.close();
  84.         err = mem_alloc_err;
  85.         return NULL;
  86.     }
  87.     for (int i = 0; i < str1; i++)
  88.     {
  89.         arr[i] = new(nothrow)elemtype[stlb1];
  90.         if (!arr[i])
  91.         {
  92.             f.close();
  93.             err = mem_alloc_err;
  94.             return NULL;
  95.         }
  96.     }
  97.  
  98.     f.clear();
  99.     f.seekg(0);
  100.  
  101.     for (int i = 0; i < str1; i++)
  102.         for (int j = 0; j < stlb1; j++)
  103.             f >> arr[i][j];
  104.  
  105.     f.close();
  106.  
  107.     return arr;
  108. }*/
  109.  
  110. int load_Matr(ifstream &f, string file_name, int &str, int &stolb, elemtype **&arr, int &pos, int &el_str, int &el_stlb)
  111. {
  112.     f.open("D://1//" + file_name + ".txt");
  113.  
  114.     if (!f.is_open())
  115.     {
  116.         f.close();
  117.         return file_err;
  118.     }
  119.  
  120.     bool cycle = true;
  121.     int i = 0, stlb = 0;
  122.     int k = 0;
  123.     char c = 0;
  124.  
  125.     while (cycle)
  126.     {
  127.         pos = f.tellg();
  128.         f >> i;
  129.         if (f.fail() || f.peek() != ' ' && f.peek() != '\t' && f.peek() != '\n' && f.peek() != EOF)
  130.         {
  131.             el_str = str;
  132.             el_stlb = stlb;
  133.             return elem_err;
  134.         }
  135.         stlb++;
  136.         k++;
  137.         while (c != EOF)
  138.         {
  139.             c = f.get();
  140.             switch (c)
  141.             {
  142.             case ' ': case '\t':
  143.                 break;
  144.             case EOF:
  145.                 cycle = false;
  146.             case '\n':
  147.             {
  148.                 if (stlb)
  149.                 {
  150.                     f >> ws;       
  151.                     str++;
  152.                     stolb = stlb;
  153.                     stlb = 0;
  154.                 }
  155.                 break;
  156.             }
  157.             default:
  158.             {
  159.                 f.unget();
  160.                 c = EOF;
  161.             }
  162.             }
  163.         }
  164.         c = 0;
  165.     }
  166.  
  167.     if (str == 1)
  168.     {
  169.         f.close();
  170.         return empty_err;
  171.     }
  172.  
  173.     if (k != str * stolb)
  174.     {
  175.         f.close();
  176.         return pryam_err;  
  177.     }
  178.  
  179.     arr = new(nothrow)elemtype*[str];
  180.     if (!arr)
  181.     {
  182.         f.close();
  183.         return mem_alloc_err;
  184.     }
  185.     for (int i = 0; i < str; i++)
  186.     {
  187.         arr[i] = new(nothrow)elemtype[stolb];
  188.         if (!arr[i])
  189.         {
  190.             f.close();
  191.             return mem_alloc_err;
  192.         }
  193.     }
  194.  
  195.     f.clear();
  196.     f.seekg(0);
  197.  
  198.     for (int i = 0; i < str; i++)
  199.         for (int j = 0; j < stolb; j++)
  200.             f >> arr[i][j];
  201.  
  202.     f.close();
  203.  
  204.     return no_err;
  205. }
  206.  
  207. int Copy_Matr(elemtype **&arr_copy, elemtype **&arr, int str, int stlb)
  208. {
  209.     arr_copy = new (nothrow) elemtype*[str];
  210.     if (!arr_copy)
  211.     {
  212.         return mem_alloc_err;
  213.     }
  214.     for (int a = 0; a < str; a++)
  215.     {
  216.         arr_copy[a] = new (nothrow) elemtype[stlb];
  217.         if (!arr_copy[a])
  218.         {
  219.             return mem_alloc_err;
  220.         }
  221.     }
  222.  
  223.     for (int i = 0; i < str; i++)
  224.         for (int j = 0; j < stlb; j++)
  225.             arr_copy[i][j] = arr[i][j];
  226.  
  227.     return no_err;
  228. }
  229.  
  230. void cout_Matr(elemtype **&arr, int str, int stlb, int a = 10)
  231. {
  232.     for (int i = 0; i < str; i++)
  233.     {
  234.         for (int j = 0; j < stlb; j++)
  235.             cout << arr[i][j] << setw(a) << left;
  236.         cout << endl;
  237.     }
  238. }
  239.  
  240. elemtype **procc(elemtype **&arr_copy, int str, int stolb)
  241. {
  242.     float sar = 0, max = 0;
  243.  
  244.     cout << "Исходная матрица:" << endl;
  245.  
  246.     cout_Matr(arr_copy, str, stolb);
  247.  
  248.     for (int j = 0; j < stolb; j++)
  249.         max += arr_copy[0][j];
  250.     max /= stolb;
  251.  
  252.     for (int i = 0; i < str; i++)
  253.     {
  254.         for (int j = 0; j < stolb; j++)
  255.         {
  256.             sar += arr_copy[i][j];
  257.         }
  258.         sar /= stolb;
  259.         if (max < sar)
  260.             max = sar;
  261.         sar = 0;
  262.     }
  263.     cout << "Максимальное арифметическое: " << max << endl
  264.         << "Введите номер строки, из которой не нужно вычитать максимальное среднее арифметическое\n";
  265.     int numstr = 0;
  266.  
  267.     do
  268.     {
  269.         cout << "Номер строки: ";
  270.  
  271.         cin >> numstr;
  272.         if (numstr < 0 || numstr > str || numstr == 0 || cin.fail() || cin.peek() != '\n')
  273.         {
  274.             cout << "Вы ввели некорректное значение, возможно оно больше числа самих строк или меньше нуля" << endl;
  275.             cin.clear();
  276.             cin.ignore(255, '\n');
  277.             continue;
  278.         }
  279.         else break;
  280.     } while (true);
  281.  
  282.     numstr--;
  283.  
  284.     for (int i = 0; i < numstr; i++)
  285.         for (int j = 0; j < stolb; j++)
  286.             arr_copy[i][j] -= max;
  287.  
  288.     numstr++;
  289.  
  290.     for (numstr; numstr < str; numstr++)
  291.         for (int j = 0; j < stolb; j++)
  292.             arr_copy[numstr][j] -= max;
  293.  
  294.     return arr_copy;
  295. }
  296.  
  297. void Matr_Del(elemtype **&arr, elemtype **&arr_copy, int str, int stlb)
  298. {
  299.     for (int i = 0; i < str; i++)
  300.     {
  301.         delete[] arr[i];
  302.         delete[] arr_copy[i];
  303.     }
  304.     delete[]arr;
  305.     delete[]arr_copy;
  306. }
  307.  
  308. int main()
  309. {
  310.     setlocale(LC_ALL, "rus");
  311.     system("color 6");
  312.     mistakes error = no_err;
  313.     elemtype **arr = nullptr, **arr_copy = nullptr;
  314.     string fname, el_err, istr;
  315.     istringstream ii1;
  316.     ifstream f;
  317.     int position = 0, str = 0, stolb = 0, str_err = 0, stlb_err = 0;
  318.     cout << "Введите имя файла, из которого хотите загрузить матрицу или завершите программу вводом \"*\"" << endl;
  319.     do
  320.     {
  321.         delete[]arr;
  322.         f.clear();
  323.         str = 0;
  324.         stolb = 0;
  325.         error = no_err;
  326.  
  327.         cout << "Имя файла: ";
  328.        
  329.             getline(cin, fname);
  330.             if (fname == "*")
  331.             {
  332.                 f.close();
  333.                 return 0;
  334.             }
  335.    
  336.         switch (load_Matr(f, fname, str, stolb, arr, position, str_err, stlb_err))
  337.         {
  338.         case file_err:
  339.         {
  340.             cout << "Ошибка открытия файла. Попробуйте выбрать другой файл или завершить программу вводом \"*\"" << endl;
  341.             continue;
  342.         }
  343.         case mem_alloc_err:
  344.         {
  345.             cout << "Ошибка выделения памяти. Попробуйте выбрать другой файл или завершить программу вводом \"*\"" << endl;
  346.             continue;
  347.         }
  348.         case elem_err:
  349.         {
  350.             /*ii1.clear();
  351.             ii1.seekg(position);
  352.             ii1 >> el_err;*/
  353.             f.clear();
  354.             f.seekg(position);
  355.             f >> el_err;
  356.  
  357.             cout << "Ошибка. Найден некорректный элемент.\nНомер строки: " << str_err + 1 << "\nНомер столбца: " << stlb_err + 1 << endl <<
  358.                 "Элемент: " << el_err << "\nПопробуйте выбрать другой файл или завершить программу вводом \"*\"" << endl;
  359.             f.close();
  360.             continue;
  361.         }
  362.         case pryam_err:
  363.         {
  364.             cout << "Ошибка. Матрица не прямоугольная. Попробуйте выбрать другой файл или завершить программу вводом \"*\"" << endl;
  365.             continue;
  366.         }
  367.         case empty_err:
  368.         {
  369.             cout << "Ошибка. Данные файла не являются матрицей. Попробуйте выбрать другой файл или завершить программу вводом \"*\"" << endl;
  370.             continue;
  371.         }
  372.         }
  373.  
  374.     //Copy_Matr(arr_copy, arr, str, stolb);
  375.     if (Copy_Matr(arr_copy, arr, str, stolb) == mem_alloc_err)
  376.     {
  377.         cout << "Ошибка выделения памяти. Попробуйте выбрать другой файл или завершить программу вводом \"*\"" << endl;
  378.         continue;
  379.     }
  380.  
  381.         break;
  382.     } while (true);
  383.  
  384.     procc(arr_copy, str, stolb);
  385.  
  386.     cout << "Измененная матрица:" << endl;
  387.  
  388.     cout_Matr(arr_copy, str, stolb);
  389.     _getch();
  390.  
  391.     Matr_Del(arr, arr_copy, str, stolb);
  392.  
  393.     return 0;
  394. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement