Advertisement
Vladislav8653

laba_3_5_c++

Dec 8th, 2022 (edited)
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. using namespace std;
  5. ifstream fin;
  6. ofstream fout;
  7.  
  8. int inputData()
  9. {
  10.     int n = 0;
  11.     bool isIncorrect;;
  12.     do {
  13.         cin >> n;
  14.         isIncorrect = false;
  15.         if (cin.fail()) {
  16.             cout << "Please, enter an integer number:" << endl;
  17.             isIncorrect = true;
  18.             cin.clear();
  19.             while (cin.get() != '\n');
  20.         }
  21.     } while (isIncorrect);
  22.     return n;
  23. }
  24.  
  25. bool choose()
  26. {
  27.     int inputNumber;
  28.     bool isIncorrect;
  29.     const int MIN_NUM = 0;
  30.     const int MAX_NUM = 1;
  31.     do {
  32.         inputNumber = inputData();
  33.         isIncorrect = false;
  34.         if (cin.fail()) {
  35.             isIncorrect = true;
  36.             cout << "Please, enter a number." << endl;
  37.             cin.clear();
  38.             while (cin.get() != '\n');
  39.         }
  40.         if (!isIncorrect && (inputNumber < MIN_NUM || inputNumber > MAX_NUM)) {
  41.             cout << "You are out of input range!" << endl;
  42.             isIncorrect = true;
  43.         }
  44.     } while (isIncorrect);
  45.     if (inputNumber == 1)
  46.         return true;
  47.     else
  48.         return false;
  49. }
  50.  
  51. int readCountRoots()
  52. {
  53.     bool isIncorrect;
  54.     int tmpCountRoots = 0;
  55.     const int MIN_SIZE = 2;
  56.     do {
  57.         tmpCountRoots = inputData();
  58.         isIncorrect = false;
  59.         if (tmpCountRoots < MIN_SIZE) {
  60.             cout << "Please, enter a number > 2:" << endl;
  61.             isIncorrect = true;
  62.             cin.clear();
  63.             while (cin.get() != '\n');
  64.         }
  65.     } while (isIncorrect);
  66.     return tmpCountRoots;
  67. }
  68.  
  69. double** inputTriangularMatrixConsole(int tmpCountRoots)
  70. {
  71.     double** arrOfMatrixElements = new double* [tmpCountRoots];
  72.     for (int i = 0; i < tmpCountRoots; i++)
  73.     {
  74.         arrOfMatrixElements[i] = new double[tmpCountRoots];
  75.     }
  76.     for (int i = 0; i < tmpCountRoots; i++)
  77.         for (int j = 0; j < tmpCountRoots; j++)
  78.             arrOfMatrixElements[i][j] = 0;
  79.  
  80.     for (int i = 0; i < tmpCountRoots; i++)
  81.     {
  82.         for (int j = 0; j < tmpCountRoots; j++)
  83.         {
  84.             if (j - i > -1)
  85.             {
  86.                 cout << "a[" << i + 1 << "," << j + 1 << "] = ";
  87.                 arrOfMatrixElements[i][j] = inputData();
  88.             }
  89.         }
  90.     }
  91.     return arrOfMatrixElements;
  92. }
  93.  
  94. double* inputFreeMembersConsole(int tmpCountRoots)
  95. {
  96.     double* arrOfFreeMembers = new double[tmpCountRoots];
  97.     for (int i = 0; i < tmpCountRoots; i++)
  98.     {
  99.         cout << "b[" << i + 1 << "] = ";
  100.         arrOfFreeMembers[i] = inputData();
  101.     }
  102.     return arrOfFreeMembers;
  103. }
  104.  
  105. double** randomizeOtherElements(int tmpCountRoots, double** arrOfMatrixElements)
  106. {
  107.     int q = 0;
  108.     double max = arrOfMatrixElements[0][0];
  109.     double min = arrOfMatrixElements[0][0];
  110.     for (int i = 0; i < tmpCountRoots; i++) {
  111.         for (int j = 0; j < tmpCountRoots; j++) {
  112.             if (arrOfMatrixElements[i][j] > max)
  113.                 max = arrOfMatrixElements[i][j];
  114.             if (arrOfMatrixElements[i][j] < min)
  115.                 min = arrOfMatrixElements[i][j];
  116.         }
  117.     }
  118.     int diff = max - min;
  119.     double** arrOfMatrixElementsRandom = new double* [tmpCountRoots];
  120.     for (int i = 0; i < tmpCountRoots; i++)
  121.         arrOfMatrixElementsRandom[i] = new double[tmpCountRoots];
  122.     for (int i = 0; i < tmpCountRoots; i++)
  123.         for (int j = 0; j < tmpCountRoots; j++)
  124.             arrOfMatrixElementsRandom[i][j] = 0;
  125.     for (int i = 0; i < tmpCountRoots; i++) {
  126.         for (int j = 0; j < tmpCountRoots; j++) {
  127.             if (j - i < 0) {
  128.                 q =  min + rand() % diff;
  129.                 arrOfMatrixElementsRandom[i][j] = q;
  130.                
  131.             }
  132.         }
  133.     }
  134.     return arrOfMatrixElementsRandom;
  135. }
  136. double** createMatrix(double** arrOfMatrixElements, int tmpCountRoots, double** arrOfMatrixElementsRandom, double* arrOfFreeMembers)
  137. {
  138.     double** matrix = new double* [tmpCountRoots];
  139.     for (int i = 0; i < tmpCountRoots; i++)
  140.         matrix[i] = new double[tmpCountRoots + 1];
  141.     for (int i = 0; i < tmpCountRoots; i++) {
  142.         for (int j = 0; j < tmpCountRoots; j++) {
  143.             if (j - i < 0)
  144.                 matrix[i][j] = arrOfMatrixElementsRandom[i][j];
  145.             if (j - i > -1)
  146.                 matrix[i][j] = arrOfMatrixElements[i][j];
  147.         }
  148.     }
  149.     for (int i = 0; i < tmpCountRoots; i++) {
  150.         matrix[i][tmpCountRoots] = arrOfFreeMembers[i];
  151.     }
  152.     return matrix;
  153. }
  154. void writeMatrixInC(double** matrix, int tmpCountRoots)
  155. {
  156.     int lastNum = tmpCountRoots + 1;
  157.     cout << "Your virgin matrix:" << endl;
  158.     for (int i = 0; i < tmpCountRoots; i++) {
  159.         for (int j = 0; j < lastNum; j++) {
  160.             cout << matrix[i][j] << " ";
  161.         }
  162.         cout << endl;
  163.     }
  164. }
  165. void moveStrings(double** matrix, int firstRow, int secondRow, int tmpCountRoots)
  166. {
  167.     int lastNum = tmpCountRoots + 1;
  168.     double r;
  169.     if ((firstRow < lastNum) && (secondRow < lastNum)) {
  170.         for (int j = 0; j < lastNum; j++) {
  171.             r = matrix[secondRow][j];
  172.             matrix[secondRow][j] = matrix[firstRow][j];
  173.             matrix[firstRow][j] = r;
  174.         }
  175.     }
  176. }
  177.  
  178. double** newMatrix(double** matrix, int tmpCountRoots)
  179. {
  180.     int tmpI, lastNum1, lastNum2;
  181.     double k;
  182.     lastNum1 = tmpCountRoots - 1;
  183.     lastNum2 = tmpCountRoots + 1;
  184.     for (int j = 0; j < tmpCountRoots; j++) {
  185.         if ((matrix[j][j] == 0) && (j < lastNum1)) {
  186.             tmpI = j + 1;
  187.             do {
  188.                 if (matrix[tmpI][j] != 0) {
  189.                     moveStrings(matrix, j, tmpI, tmpCountRoots);
  190.                 }
  191.             } while ((matrix[j][j] == 0));
  192.         }
  193.         for (int i = (j + 1); i < tmpCountRoots; i++) {
  194.             k = matrix[i][j] / matrix[j][j];
  195.             for (int m = j; m < lastNum2; m++) {
  196.                 matrix[i][m] = matrix[i][m] - k * matrix[j][m];
  197.             }
  198.         }
  199.     }
  200.     return matrix;
  201. }
  202.  
  203. double* findRoots(double** matrix, int tmpCountRoots)
  204. {
  205.     double* tmpRoots = new double[tmpCountRoots];
  206.     double sum;
  207.     for (int i = tmpCountRoots - 1; i > -1; i--) {
  208.         sum = 0;
  209.         for (int j = i + 1; j < tmpCountRoots; j++) {
  210.             sum = sum + tmpRoots[j] * matrix[i][j];
  211.         }
  212.         if (matrix[i][i] == 0) {
  213.             tmpRoots[i] = 0;
  214.         }
  215.         else {
  216.             tmpRoots[i] = (matrix[i][tmpCountRoots] - sum) /
  217.                 matrix[i][i];
  218.         }
  219.     }
  220.     return tmpRoots;
  221. }
  222.  
  223. double* gaussM(double** matrix, int tmpCountRoots)
  224. {
  225.     writeMatrixInC(matrix, tmpCountRoots);
  226.     newMatrix(matrix, tmpCountRoots);
  227.     return findRoots(matrix, tmpCountRoots);
  228. }
  229.  
  230. void outputsystemRoots(double* roots, int tmpCountRoots)
  231. {
  232.     for (int i = 0; i < tmpCountRoots; i++)
  233.         cout << "x[" << i + 1 << "] = " << roots[i] << " " << endl;
  234. }
  235.  
  236. string inputFilePath()
  237. {
  238.     const int EXTENSION_SIZE = 4;
  239.     string path;
  240.     string ext;
  241.     bool isIncorrect;
  242.     do {
  243.         isIncorrect = false;
  244.         cout << "Input path to file: " << endl;
  245.         cin >> path;
  246.         fin.open(path);
  247.         if (path.size() > EXTENSION_SIZE) {
  248.             ext = path.substr(path.size() - EXTENSION_SIZE, EXTENSION_SIZE);
  249.         }
  250.         else {
  251.             cout << "Incorrect file name." << endl;
  252.             isIncorrect = true;
  253.         } if (!isIncorrect && ext != ".txt") {
  254.             cout << "Must have .txt!" << endl;
  255.             isIncorrect = true;
  256.         }
  257.         else if (!isIncorrect && !fin.is_open()) {
  258.             cout << "Wrong way to file." << endl;
  259.             isIncorrect = true;
  260.         }
  261.     } while (isIncorrect);
  262.     fin.close();
  263.     return path;
  264. }
  265.  
  266. int inputSizeOfMatrixFromFile(string path)
  267. {
  268.     int num;
  269.     bool isIncorrect;
  270.     const int MIN_ORDER = 2;
  271.     do
  272.     {
  273.         isIncorrect = false;
  274.         fin.open(path);
  275.         fin >> num;
  276.         if (num < MIN_ORDER) {
  277.             isIncorrect = true;
  278.             cout << "Incorrect matrix size. Your matrix size must be from 2 " << endl;
  279.             path = inputFilePath();
  280.         }
  281.     } while (isIncorrect);
  282.     return num;
  283. }
  284. double** inputTriangularMatrixFile(string path, int num)
  285. {
  286.     ifstream fin(path);
  287.     bool isIncorrect = false;
  288.     double** arrOfMatrixElements;
  289.     arrOfMatrixElements = new double* [num];
  290.     for (int i = 0; i < num; i++)
  291.         arrOfMatrixElements[i] = new double[num];
  292.     for (int i = 0; (i < num) && (!isIncorrect); i++) {
  293.         for (int j = 0; (j < num) && (!isIncorrect); j++) {
  294.             if (j - i > -1) {
  295.                 do
  296.                 {
  297.                     isIncorrect = false;
  298.                     try
  299.                     {
  300.                         fin >> arrOfMatrixElements[i][j];
  301.                     }
  302.                     catch (fstream::failure& e)
  303.                     {
  304.                         cout << "Mistake of reading from file." << endl;
  305.                         isIncorrect = true;
  306.                     }
  307.                 } while (isIncorrect);
  308.             }
  309.         }
  310.     }
  311.     return arrOfMatrixElements;
  312. }
  313.  
  314. double* inputFreeMembersFile(string path, int num)
  315. {
  316.     bool isIncorrect = false;
  317.     double* arrOfFreeMembers = new double[num];
  318.  
  319.     for (int i = 0; (i < num) && (!isIncorrect); i++) {
  320.  
  321.         do {
  322.             isIncorrect = false;
  323.             try {
  324.                 fin >> arrOfFreeMembers[i];
  325.             }
  326.             catch (fstream::failure& e) {
  327.                 cout << "Mistake of reading from file. Code of mistake " << e.code() << "\n";
  328.                 isIncorrect = true;
  329.             }
  330.  
  331.         } while (isIncorrect);
  332.     }
  333.     return arrOfFreeMembers;
  334. }
  335.  
  336. void fileOutput(double* arrOfSystemRoots, int num)
  337. {
  338.     string path = inputFilePath();
  339.     fout.open(path);
  340.     for (int i = 0; i < num; i++)
  341.     {
  342.         fout << arrOfSystemRoots[i] << endl;
  343.     }
  344.     cout << "Successful output in file." << endl;
  345.     fout.close();
  346. }
  347.  
  348.  
  349.  
  350.  
  351. int main()
  352. {
  353.     int choice;
  354.     int num = 0;
  355.     double** arrOfMatrixElements;
  356.     double* arrOfFreeMembers;
  357.     double** arrOfMatrixElementsRandom;
  358.     double** matrix;
  359.     double* roots;
  360.     cout << "Gauss method. Input elements above main diagonal and free members." << endl;
  361.     cout << "Type 0 - console input, type 1 - file input." << endl;
  362.     choice = choose();
  363.     if (!choice)
  364.     {
  365.         cout << "Input matrix size:" << endl;
  366.         num = readCountRoots();
  367.         cout << "Input matrix elements: " << endl;
  368.         arrOfMatrixElements = inputTriangularMatrixConsole(num);
  369.         cout << "Input free members: " << endl;
  370.         arrOfFreeMembers = inputFreeMembersConsole(num);
  371.     }
  372.     else
  373.     {
  374.         string path = inputFilePath();
  375.         num = inputSizeOfMatrixFromFile(path);
  376.         arrOfMatrixElements = inputTriangularMatrixFile(path, num);
  377.         arrOfFreeMembers = inputFreeMembersFile(path, num);
  378.     }
  379.  
  380.     arrOfMatrixElementsRandom = randomizeOtherElements(num, arrOfMatrixElements);
  381.     matrix = createMatrix(arrOfMatrixElements, num, arrOfMatrixElementsRandom, arrOfFreeMembers);
  382.     roots = gaussM(matrix, num);
  383.  
  384.     cout << "Type 0 - console output, type 1 - file output." << endl;
  385.     choice = choose();
  386.     if (!choice)
  387.         outputsystemRoots(roots, num);
  388.     else
  389.         fileOutput(roots, num);
  390.     return 0;
  391. }
  392.  
  393.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement