Advertisement
Paszta

Gauss to cwel

Jan 3rd, 2020
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include<time.h>
  4. #include <fstream>
  5. #include <assert.h>
  6. #include <string>
  7. #include <cmath>
  8. using namespace std;
  9. class Gauss
  10. {
  11.     vector<vector<double>> A;
  12.     vector<vector<double>> kopia_A;
  13.     int rozmiar;
  14.     vector<double> B;
  15.     vector<double> kopia_B;
  16.     vector<double> X;
  17.     vector<double> pozycja;
  18. public:
  19.     Gauss()
  20.     {
  21.         ifstream source_file;
  22.         source_file.open("tescior.csv");
  23.         assert (source_file.is_open());
  24.         source_file >> rozmiar;
  25.         cout << rozmiar << endl;
  26.         for(int j=0;j<rozmiar;j++)
  27.         {
  28.             B.push_back(0);
  29.             X.push_back(0);
  30.             pozycja.push_back(j);
  31.         }
  32.         for (int i = 0 ; i < rozmiar ; i++)
  33.             A.push_back(B);
  34.         char semicolumn;
  35.         for (unsigned i = 0; i < rozmiar+1; i++)
  36.             source_file >> semicolumn;
  37.         for (unsigned i = 0; i < rozmiar; i++)
  38.         {
  39.             for (unsigned j = 0; j < rozmiar; j++)
  40.             {
  41.                 source_file >> A[i][j];
  42.                 source_file >> semicolumn;
  43.             }
  44.             source_file >> semicolumn;
  45.             source_file >> B[i];
  46.         }
  47.         source_file.close();
  48.         kopia_A = A;
  49.         kopia_B = B;
  50.     }
  51.     void przywroc()
  52.     {
  53.         A = kopia_A;
  54.         B = kopia_B;
  55.     }
  56.     void menu()
  57.     {
  58.         char wybor;
  59.         while(wybor!='0')
  60.         {
  61.             cout << "WYBIERZ OPCJE:\n1. Eliminacja bez wyboru\n2. Eliminacja z wyborem w kolumnie\n3. Eliminacja z wyborem w wierszu\n4. Eliminacja z wyborem pelnym\n0. Zamknij program\n";
  62.             cin >> wybor;
  63.             switch(wybor)
  64.             {
  65.                 case '1':
  66.                 {
  67.                     this->eliminacja();
  68.                     this->wyswietl();
  69.                     this->wyznaczanie_niewiadomych();
  70.                     this->wyswietl_niewiadome();
  71.                     this->przywroc();
  72.                     break;
  73.                 }
  74.                 case '2':
  75.                 {
  76.                     this->eliminacja_z_kolumnami();
  77.                     this->wyswietl();
  78.                     this->wyznaczanie_niewiadomych();
  79.                     this->wyswietl_niewiadome();
  80.                     this->przywroc();
  81.                     break;
  82.                 }
  83.                 case '3':
  84.                 {
  85.                     this->eliminacja_z_wierszami();
  86.                     this->wyswietl();
  87.                     this->wyznaczanie_niewiadomych();
  88.                     this->wyswietl_niewiadome();
  89.                     this->przywroc();
  90.                     break;
  91.                 }
  92.                 case '4':
  93.                 {
  94.                     this->eliminacja_pelna();
  95.                     this->wyswietl();
  96.                     this->wyznaczanie_niewiadomych();
  97.                     this->wyswietl_niewiadome();
  98.                     this->przywroc();
  99.                     break;
  100.                 }
  101.                 case '0':
  102.                     cout << "Zamykam.\n";
  103.                     break;
  104.                 default:
  105.                     cout << "Wybrano nieznana opcje.\n";
  106.         }
  107.     }
  108.     }
  109.     void eliminacja()
  110.     {
  111.         double p;
  112.         for(int i =0; i < rozmiar; i++)
  113.             for (int w = i+1; w < rozmiar; w++)
  114.             {
  115.                 p = A[w][i] / A[i][i];
  116.                 B[w] = B[w] - B[i]*p;
  117.                 for(int k = i; k < rozmiar; k++)
  118.                 {
  119.                     A[w][k] = A[w][k] - A[i][k]*p;
  120.                 }
  121.             }
  122.  
  123.     }
  124.     void eliminacja_z_kolumnami()
  125.     {
  126.         double p;
  127.         for(int i =0; i < rozmiar; i++)
  128.         {
  129.             double maximum = fabs(A[i][i]);
  130.             int index=i;
  131.             for(int l = i+1; l < rozmiar; l++)
  132.             {
  133.                 if(maximum < fabs(A[l][i]))
  134.                 {
  135.                     maximum = fabs(A[l][i]);
  136.                     index = l;
  137.                 }
  138.             }
  139.             A[index].swap(A[i]);
  140.             swap(B[index],B[i]);
  141.             for (int w = i+1; w < rozmiar; w++)
  142.             {
  143.                 p = A[w][i] / A[i][i];
  144.                 B[w] = B[w] - B[i]*p;
  145.                 for(int k = i; k < rozmiar; k++)
  146.                 {
  147.                     A[w][k] = A[w][k] - A[i][k]*p;
  148.                 }
  149.             }
  150.         }
  151.     }
  152.     void eliminacja_z_wierszami()
  153.     {
  154.         double p;
  155.         for(int i =0; i < rozmiar; i++)
  156.         {
  157.             double maximum = fabs(A[i][i]);
  158.             int index=i;
  159.             for(int l = i+1; l < rozmiar; l++)
  160.             {
  161.                 if(maximum < fabs(A[i][l]))
  162.                 {
  163.                     maximum = fabs(A[i][l]);
  164.                     index = l;
  165.                 }
  166.             }
  167.             for(int l = 0; l < rozmiar; l++)
  168.             {
  169.                 swap(A[l][index], A[l][i]);
  170.             }
  171.             swap(pozycja[index], pozycja[i]);
  172.             for (int w = i+1; w < rozmiar; w++)
  173.             {
  174.                 p = A[w][i] / A[i][i];
  175.                 B[w] = B[w] - B[i]*p;
  176.                 for(int k = i; k < rozmiar; k++)
  177.                 {
  178.                     A[w][k] = A[w][k] - A[i][k]*p;
  179.                 }
  180.             }
  181.         }
  182.     }
  183.     void eliminacja_pelna()
  184.     {
  185.         double p;
  186.         for(int i =0; i < rozmiar; i++)
  187.         {
  188.             double maximum = fabs(A[i][i]);
  189.             int index_wierszy=i;
  190.             int index_kolumn=i;
  191.             for(int l = i; l < rozmiar; l++)
  192.                 for(int k = 0; k < rozmiar; k++)
  193.                 {
  194.                     if(maximum < fabs(A[l][k]))
  195.                     {
  196.                         maximum = fabs(A[l][k]);
  197.                         index_wierszy = l;
  198.                         index_kolumn = k;
  199.                     }
  200.                 }
  201.             for(int l = 0; l < rozmiar; l++)
  202.             {
  203.                 swap(A[l][index_kolumn], A[l][i]);
  204.             }
  205.             swap(pozycja[index_kolumn], pozycja[i]);
  206.             A[index_wierszy].swap(A[i]);
  207.             swap(B[index_wierszy],B[i]);
  208.             for (int w = i+1; w < rozmiar; w++)
  209.             {
  210.                 p = A[w][i] / A[i][i];
  211.                 B[w] = B[w] - B[i]*p;
  212.                 for(int k = i; k < rozmiar; k++)
  213.                 {
  214.                     A[w][k] = A[w][k] - A[i][k]*p;
  215.                 }
  216.             }
  217.         }
  218.     }
  219.     void wyznaczanie_niewiadomych()
  220.     {
  221.         for(int i = rozmiar-1; i >= 0; i--)
  222.         {
  223.             if(i == rozmiar-1) X[i] = B[i] / A[i][i];
  224.             else
  225.             {
  226.                 double temp = B[i];
  227.                 for(int j = rozmiar-1; j > i; j--) temp -= X[j]*A[i][j];
  228.                 X[i] = temp / A[i][i];
  229.             }
  230.         }
  231.     }
  232.     void wyswietl()
  233.     {
  234.         for(int i=0; i<rozmiar; i++)
  235.         {
  236.             for(int j=0; j<rozmiar; j++)
  237.                 cout << A[i][j] << "\t";
  238.             cout << B[i] << "\t";
  239.             cout << pozycja[i] << "\t";
  240.             cout << endl;
  241.         }
  242.         cout << endl;
  243.     }
  244.     void wyswietl_niewiadome()
  245.     {
  246.  
  247.         for(int i=0; i<rozmiar; i++)
  248.             for(int j=0; j<rozmiar; j++)
  249.             {
  250.                 if(i == pozycja[j])
  251.                 {
  252.                     swap(pozycja[j],pozycja[i]);
  253.                     swap(X[j],X[i]);
  254.                     break;
  255.                 }
  256.             }
  257.         for(int i=0; i<rozmiar; i++)
  258.         {
  259.  
  260.             cout << X[i] << "\t";
  261.         }
  262.         cout << endl;
  263.     }
  264.  
  265. };
  266.  
  267. int main()
  268. {
  269.  
  270.     Gauss m1;
  271.     m1.wyswietl();
  272.     m1.menu();
  273.     return 0;
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement