Advertisement
anticlown

laba.2.3.Gay_ss(C++)

Nov 6th, 2022 (edited)
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.63 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. const int MIN_SIZE = 2;
  6. const int MAX_SIZE = 10;
  7. const int MIN_VALUE = -1000;
  8. const int MAX_VALUE = 1000;
  9.  
  10. void outputOfTaskInfo() {
  11.   std::cout << "Данная программа выполняет «прямой ход» в решении СЛАУ методом Гаусса. \n"
  12.     << "Диапазон ввода значений количества уравнений в системе: " << MIN_SIZE << "..." << MAX_SIZE << ". \n"
  13.     << "Диапазон ввода значений коэффициентов при переменных: " << MIN_VALUE << "..." << MAX_VALUE << ". \n";
  14. }
  15.  
  16. int getVerificationOfChoice() {
  17.   int choice;
  18.   bool isIncorrect;
  19.  
  20.   do {
  21.     isIncorrect = false;
  22.     std::cin >> choice;
  23.  
  24.     if (std::cin.fail())
  25.     {
  26.       std::cin.clear();
  27.       while (std::cin.get() != '\n');
  28.       isIncorrect = true;
  29.       std::cout << "Проверьте корректность ввода данных! \n";
  30.     }
  31.  
  32.     if (!isIncorrect && std::cin.get() != '\n')
  33.     {
  34.       std::cin.clear();
  35.       while (std::cin.get() != '\n');
  36.  
  37.       std::cout << "Проверьте корректность ввода данных! \n";
  38.       isIncorrect = true;
  39.     }
  40.  
  41.     if (isIncorrect || (choice != 0 && choice != 1))
  42.     {
  43.       isIncorrect = true;
  44.       std::cout << "Для выбора введите 0 или 1! \n";
  45.     }
  46.   } while (isIncorrect);
  47.  
  48.   return choice;
  49. }
  50.  
  51. std::string inputPathToFile() {
  52.   std::string path;
  53.   bool isIncorrect;
  54.  
  55.   std::cout << "Укажите путь к файлу: ";
  56.  
  57.   do
  58.   {
  59.     isIncorrect = false;
  60.     std::cin >> path;
  61.     std::ifstream file(path);
  62.  
  63.     if (!file.is_open())
  64.     {
  65.       std::cout << "По указанному пути файл не найден! Укажите правильный путь: ";
  66.       isIncorrect = true;
  67.     }
  68.   } while (isIncorrect);
  69.  
  70.   return path;
  71. }
  72.  
  73. int readSizeFromConsole() {
  74.   int size;
  75.   bool isIncorrect;
  76.  
  77.   std::cout << "Введите значение количества уравнений системы: ";
  78.  
  79.   do
  80.   {
  81.     isIncorrect = false;
  82.     std::cin >> size;
  83.     if (std::cin.fail())
  84.     {
  85.       isIncorrect = true;
  86.       std::cout << "Проверьте корректность ввода данных! \n";
  87.       std::cin.clear();
  88.       while (std::cin.get() != '\n');
  89.     }
  90.     if (!isIncorrect && (size < MIN_SIZE || size >> MAX_SIZE))
  91.     {
  92.       isIncorrect = true;
  93.       std::cout << "Введите число от " << MIN_SIZE << " до " << MAX_SIZE << "! \n";
  94.     }
  95.   } while (isIncorrect);
  96.  
  97.   return size;
  98. }
  99.  
  100. int readSizeFromFile(const std::string path) {
  101.   int size;
  102.   std::string sizeInp;
  103.   bool isIncorrect = true;
  104.   std::ifstream fin(path);
  105.  
  106.   std::cout << "Происходит чтение количества уравнений системы... \n";
  107.   fin >> sizeInp;
  108.  
  109.   try
  110.   {
  111.     size = atoi(sizeInp.c_str());
  112.   }
  113.   catch (...)
  114.   {
  115.     isIncorrect = false;
  116.     std::cout << "Ошибка при чтении данных! Введите количество уравнений с консоли! \n";
  117.     size = readSizeFromConsole();
  118.   }
  119.  
  120.   if (!isIncorrect && (size < MIN_SIZE || size > MAX_SIZE))
  121.   {
  122.     std::cout << "Введите значение от " << MIN_SIZE << " до " << MAX_SIZE << "! \n";
  123.     size = readSizeFromConsole();
  124.   }
  125.  
  126.   fin.close();
  127.  
  128.   return size;
  129. }
  130.  
  131. int readSize(const int choice, const std::string path) {
  132.   int size = -1;
  133.  
  134.   if (choice == 0)
  135.     size = readSizeFromConsole();
  136.   if (choice == 1)
  137.     size = readSizeFromFile(path);
  138.  
  139.   return size;
  140. }
  141.  
  142. void outputSize(const int choice, std::string path, const int size) {
  143.   std::ofstream fout(path);
  144.   bool isIncorrect;
  145.  
  146.   if (choice == 0)
  147.     std::cout << "Количество уравнений в системе равно: " << size << ". \n";
  148.   if (choice == 1)
  149.   {
  150.     std::cout << "Вывод количества уравнений в файл... \n";
  151.  
  152.     do
  153.     {
  154.       isIncorrect = false;
  155.       std::ofstream fout(path);
  156.  
  157.       try
  158.       {
  159.         fout << size << "\n";
  160.       }
  161.       catch (...)
  162.       {
  163.         std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  164.         isIncorrect = true;
  165.         path = inputPathToFile();
  166.       }
  167.  
  168.       fout.close();
  169.     } while (isIncorrect);
  170.  
  171.     std::cout << "Данные успешно записаны в файл! \n";
  172.   }
  173. }
  174.  
  175. float** fillMatrixFromConsole(const int size) {
  176.   float** matrix = new float* [size];
  177.   bool isIncorrect;
  178.   int finalPos = size + 1;
  179.  
  180.   for (int i = 0; i < size; i++)
  181.     matrix[i] = new float[size + 1];
  182.  
  183.   for (int i = 0; i < size; i++)
  184.   {
  185.     for (int j = 0; j < finalPos; j++)
  186.     {
  187.       std::cout << "Введите значение коэфф-та в " << i + 1 << "-ом уравнении при " << j + 1 << "-ой позиции: ";
  188.  
  189.       do
  190.       {
  191.         isIncorrect = false;
  192.         std::cin >> matrix[i][j];
  193.  
  194.         if (std::cin.fail())
  195.         {
  196.           isIncorrect = true;
  197.           std::cout << "Проверьте корректность ввода данных! \n";
  198.           std::cin.clear();
  199.           while (std::cin.get() != '\n');
  200.         }
  201.  
  202.         if (!isIncorrect && (matrix[i][j] < MIN_VALUE || matrix[i][j] > MAX_VALUE))
  203.         {
  204.           isIncorrect = true;
  205.           std::cout << "Введите число от " << MIN_VALUE << " до " << MAX_VALUE << "! \n";
  206.         }
  207.       } while (isIncorrect);
  208.     }
  209.   }
  210.  
  211.   return matrix;
  212. }
  213.  
  214. float** fillMatrixFromFile(const int size, const std::string path) {
  215.   float** matrix = new float* [size];
  216.   int count = 0;
  217.   int finalPos = size + 1;
  218.  
  219.   for (int i = 0; i < size; i++)
  220.     matrix[i] = new float[size + 1];
  221.  
  222.   bool isIncorrect;
  223.   std::string matrixInp;
  224.   std::ifstream fin(path);
  225.  
  226.   std::cout << "Происходит чтение системы уравнений... \n";
  227.   fin >> matrixInp;
  228.  
  229.   while (!fin.eof())
  230.   {
  231.     std::string symbol;
  232.     fin >> symbol;
  233.     count++;
  234.   }
  235.  
  236.   if (count > size * (size + 2))
  237.   {
  238.     std::cout << "Ошибка при чтении системы! Введите систему с консоли! \n";
  239.     matrix = fillMatrixFromConsole(size);
  240.   }
  241.   else
  242.   {
  243.     fin.close();
  244.     fin.open(path);
  245.     fin >> matrixInp;
  246.  
  247.     for (int i = 0; i < size; i++)
  248.     {
  249.       for (int j = 0; j < finalPos; j++)
  250.       {
  251.         do
  252.         {
  253.           isIncorrect = false;
  254.  
  255.           try
  256.           {
  257.             fin >> matrix[i][j];
  258.           }
  259.           catch (...)
  260.           {
  261.             std::cout << "Ошибка при чтении системы! Введите систему с консоли! \n";
  262.             isIncorrect = true;
  263.             matrix = fillMatrixFromConsole(size);
  264.           }
  265.  
  266.           if (!isIncorrect && (matrix[i][j] < MIN_VALUE || matrix[i][j] > MAX_VALUE))
  267.           {
  268.             std::cout << "Ошибка при чтении системы! Введите систему с консоли! \n";
  269.             isIncorrect = true;
  270.             matrix = fillMatrixFromConsole(size);
  271.           }
  272.         } while (isIncorrect);
  273.       }
  274.     }
  275.   }
  276.  
  277.   fin.close();
  278.  
  279.   return matrix;
  280. }
  281.  
  282. float** fillMatrix(const int choice, const std::string path, const int size) {
  283.   float** matrix = new float* [size];
  284.  
  285.   for (int i = 0; i < size; i++)
  286.     matrix[i] = new float[size + 1];
  287.  
  288.   if (choice == 0)
  289.     matrix = fillMatrixFromConsole(size);
  290.   if (choice == 1)
  291.     matrix = fillMatrixFromFile(size, path);
  292.  
  293.   return matrix;
  294. }
  295.  
  296. void outputMatrix(const int choice, std::string path, float** matrix, const int size) {
  297.   bool isIncorrect;
  298.   std::ofstream fout;
  299.  
  300.   if (choice == 0)
  301.   {
  302.     std::cout << "Вывод начальной системы уравнений: \n";
  303.     for (int i = 0; i < size; i++)
  304.     {
  305.       std::cout << "|";
  306.       for (int j = 0; j < size; j++)
  307.         std::cout << " " << matrix[i][j] << " \t";
  308.       std::cout << "|  " << matrix[i][size] << "; \n";
  309.     }
  310.  
  311.     std::cout << "\n";
  312.   }
  313.  
  314.   if (choice == 1)
  315.   {
  316.     std::cout << "Вывод начальной системы уравнений в файл... \n";
  317.  
  318.     fout.open(path, std::ios::app);
  319.     fout << "\n";
  320.  
  321.     do
  322.     {
  323.       isIncorrect = false;
  324.  
  325.       try
  326.       {
  327.         std::cout << "Вывод начальной системы уравнений: \n";
  328.         for (int i = 0; i < size; i++)
  329.         {
  330.           fout << "|";
  331.           for (int j = 0; j < size; j++)
  332.             fout << " " << matrix[i][j] << " \t";
  333.           fout << "|  " << matrix[i][size] << "; \n";
  334.         }
  335.  
  336.         fout << "\n";
  337.       }
  338.       catch (...)
  339.       {
  340.         std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  341.         isIncorrect = true;
  342.         path = inputPathToFile();
  343.       }
  344.     } while (isIncorrect);
  345.  
  346.     fout.close();
  347.     std::cout << "Данные успешно записаны в файл! \n";
  348.   }
  349. }
  350.  
  351. float** findTriangleMatrix(const int size, float** matrix) {
  352.   float** triangleMatrix = new float* [size];
  353.   for (int i = 0; i < size; i++)
  354.     triangleMatrix[i] = new float[size + 1];
  355.  
  356.   int columns = size + 1;
  357.  
  358.   for (int i = 0; i < size; i++)
  359.   {
  360.     for (int j = 0; j < columns; j++)
  361.       triangleMatrix[i][j] = matrix[i][j];
  362.   }
  363.  
  364.   for (int i = 0; i < size; i++)
  365.   {
  366.     int startPosJ = i + 1;
  367.  
  368.     for (int j = startPosJ; j < size; j++)
  369.     {
  370.       float temp = triangleMatrix[j][i] / triangleMatrix[i][i];
  371.  
  372.       for (int k = i; k < size; k++)
  373.         triangleMatrix[j][k] = triangleMatrix[j][k] - temp * triangleMatrix[i][k];
  374.  
  375.       triangleMatrix[j][size] = triangleMatrix[j][size] - temp * triangleMatrix[i][size];
  376.     }
  377.   }
  378.  
  379.   return triangleMatrix;
  380. }
  381.  
  382. void outputTriangleMatrix(const int choice, std::string path, float** matrix, const int size) {
  383.   bool isIncorrect;
  384.   std::ofstream fout;
  385.  
  386.   if (choice == 0)
  387.   {
  388.     std::cout << "Вывод преобразованной системы: \n";
  389.  
  390.     for (int i = 0; i < size; i++)
  391.     {
  392.       std::cout << "|";
  393.       for (int j = 0; j < size; j++)
  394.         std::cout << " " << matrix[i][j] << " ";
  395.       std::cout << "|  " << matrix[i][size] << "; \n";
  396.     }
  397.  
  398.     std::cout << "\n";
  399.   }
  400.  
  401.   if (choice == 1) {
  402.     std::cout << "Вывод начальной матрицы в файл... \n";
  403.  
  404.     fout.open(path, std::ios::app);
  405.     fout << "\n";
  406.  
  407.  
  408.     do
  409.     {
  410.       isIncorrect = false;
  411.  
  412.       try
  413.       {
  414.         for (int i = 0; i < size; i++)
  415.         {
  416.           fout << "|";
  417.           for (int j = 0; j < size; j++)
  418.             fout << " " << matrix[i][j] << " ";
  419.           fout << "|  " << matrix[i][size] << "; \n";
  420.         }
  421.  
  422.         fout << "\n";
  423.       }
  424.       catch (...)
  425.       {
  426.         std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  427.         isIncorrect = true;
  428.         path = inputPathToFile();
  429.       }
  430.     } while (isIncorrect);
  431.  
  432.     fout.close();
  433.     std::cout << "Данные успешно записаны в файл! \n";
  434.   }
  435. }
  436.  
  437. float* findRoots(const int size, float** triangleMatrix) {
  438.   float* ansArr = new float[size];
  439.  
  440.   float temp;
  441.   int pos = size - 1;
  442.   int k = 1;
  443.   float dividend = 0;
  444.  
  445.   for (int i = 0; i < size; i++)
  446.   {
  447.     if (triangleMatrix[pos][pos] != 0)
  448.     {
  449.       dividend = triangleMatrix[pos][pos + k];
  450.  
  451.       for (int j = 0; j < i; j++)
  452.         dividend = dividend - triangleMatrix[pos][pos + i - j] * ansArr[j];
  453.  
  454.       temp = dividend / triangleMatrix[pos][pos];
  455.     }
  456.     else
  457.       temp = 0;
  458.  
  459.     ansArr[i] = temp;
  460.     k++;
  461.     pos--;
  462.   }
  463.  
  464.   return ansArr;
  465. }
  466.  
  467. void outputAnsArr(const int choice, std::string path, float* ansArr, const int size) {
  468.   bool isIncorrect;
  469.   std::ofstream fout;
  470.  
  471.   if (choice == 0)
  472.   {
  473.     std::cout << "Вывод полученных корней: \n";
  474.  
  475.     for (int i = 0; i < size; i++)
  476.       std::cout << "Значение " << i + 1 << "-ой переменной равно: " << ansArr[i] << ". \n";
  477.   }
  478.  
  479.   if (choice == 1) {
  480.     std::cout << "Вывод полученных корней в файл... \n";
  481.  
  482.     fout.open(path, std::ios::app);
  483.     fout << "\n";
  484.  
  485.     do
  486.     {
  487.       isIncorrect = false;
  488.  
  489.       try
  490.       {
  491.         for (int i = 0; i < size; i++)
  492.           fout << "Значение " << i + 1 << "-ой переменной равно: " << ansArr[i] << ". \n";
  493.       }
  494.       catch (...)
  495.       {
  496.         std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  497.         isIncorrect = true;
  498.         path = inputPathToFile();
  499.       }
  500.     } while (isIncorrect);
  501.  
  502.     fout.close();
  503.     std::cout << "Данные успешно записаны в файл! \n";
  504.   }
  505. }
  506.  
  507. void processUserInput(int& choiceForInput, int& size, std::string& pathToIn) {
  508.   std::cout << "Вы желаете ввести данные с консоли(0) или взять данные из файла(1)? \n";
  509.   choiceForInput = getVerificationOfChoice();
  510.   if (choiceForInput == 1)
  511.     pathToIn = inputPathToFile();
  512.  
  513.   size = readSize(choiceForInput, pathToIn);
  514. }
  515.  
  516. void processUserOutput(int& choiceForOutput, std::string& pathToOut, int& size, float**& matrix, float**& triangleMatrix, float*& ansArr) {
  517.   std::cout << "Вы желаете получить результат в консоли(0) или в файле(1)? \n";
  518.   choiceForOutput = getVerificationOfChoice();
  519.   if (choiceForOutput == 1)
  520.     pathToOut = inputPathToFile();
  521.  
  522.   outputSize(choiceForOutput, pathToOut, size);
  523.   outputMatrix(choiceForOutput, pathToOut, matrix, size);
  524.   outputTriangleMatrix(choiceForOutput, pathToOut, triangleMatrix, size);
  525.   outputAnsArr(choiceForOutput, pathToOut, ansArr, size);
  526. }
  527.  
  528. int main() {
  529.   setlocale(LC_ALL, "Rus");
  530.   int choiceForInput, choiceForOutput, size;
  531.   std::string pathToIn, pathToOut;
  532.  
  533.   outputOfTaskInfo();
  534.   processUserInput(choiceForInput, size, pathToIn);
  535.  
  536.   float** matrix = new float* [size];
  537.   for (int i = 0; i < size; i++)
  538.     matrix[i] = new float[size];
  539.  
  540.   matrix = fillMatrix(choiceForInput, pathToIn, size);
  541.  
  542.   float** triangleMatrix = new float* [size];
  543.   for (int i = 0; i < size; i++)
  544.     triangleMatrix[i] = new float[size];
  545.  
  546.   triangleMatrix = findTriangleMatrix(size, matrix);
  547.  
  548.   float* ansArr = new float[size];
  549.  
  550.   ansArr = findRoots(size, triangleMatrix);
  551.  
  552.   processUserOutput(choiceForOutput, pathToOut, size, matrix, triangleMatrix, ansArr);
  553.  
  554.   return 0;
  555. }
  556.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement