Czapek

niby gauss ale nawet cos dziala

Dec 13th, 2019
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <math.h>
  4. #include <iomanip>
  5. using namespace std;
  6. class Gauss
  7. {
  8.     vector<vector<double>> A;
  9.     vector<vector<double>> kopia_A;
  10.     int rozmiar;
  11.     vector<double> B;
  12.     vector<double> kopia_B;
  13.     vector<double> X;
  14.     vector<double> pozycja;
  15. public:
  16.     Gauss()
  17.     {
  18.         char wybor;
  19.         do
  20.         {
  21.         cout << "1. Podaj macierz recznie\n2. Wybierz jedna z macierzy\n0. Zamknij program" << endl;
  22.         cin >> wybor;
  23.         switch(wybor)
  24.         {
  25.             case '1':
  26.             {
  27.                 cout << "Podaj rozmiar macierzy nxn ze wspolczymmikami przy niewiadomych" << endl;
  28.                 cin >> rozmiar;
  29.                 for(int i = 0; i < rozmiar; i++)
  30.                 {
  31.                     pozycja.push_back(i);
  32.                     B.push_back(0);
  33.                     X.push_back(0);
  34.                 }
  35.                 for(int i = 0; i < rozmiar; i++) A.push_back(B);
  36.                 for(int i = 0; i < rozmiar; i++)
  37.                 {
  38.                     for (int j = 0; j < rozmiar; j++)
  39.                     {
  40.                         cout << "Podaj wspolczynnik na pozycji " << i << "x" << j << endl;
  41.                         cin >> A[i][j];
  42.                     }
  43.                     cout << "Podaj wyraz wolny dla wiersza " << i << endl;
  44.                     cin >> B[i];
  45.                 }
  46.                 kopia_A = A;
  47.                 kopia_B = B;
  48.                 this->wyswietl();
  49.                 this->menu();
  50.                 break;
  51.             }
  52.             case '2':
  53.             {
  54.                 this->macierze_wbudowane();
  55.                 this->menu();
  56.                 break;
  57.             }
  58.             case '0':
  59.                 cout << "Zamykam" << endl;
  60.                 break;
  61.             default:
  62.             {
  63.                 cout << "Nieznany identyfikator.";
  64.                 break;
  65.             }
  66.         }
  67.         }
  68.         while(wybor != '0');
  69.     }
  70.         void macierze_wbudowane()
  71.     {
  72.         char wybor;
  73.         cout << "Ktora macierz chcesz wybrac?" << endl;
  74.         cin >> wybor;
  75.         switch(wybor)
  76.         {
  77.             case '1':
  78.             {
  79.                 A =
  80.                 {
  81.                 {2, 3, -4},
  82.                 {1, 2, -2},
  83.                 {4, -2, 5}
  84.                 };
  85.                 B = {9, 7, -5};
  86.                 break;
  87.             }
  88.             case '2':
  89.             {
  90.                 A =
  91.                 {
  92.                 {1, 1, -3, 1},
  93.                 {0, 2, -1, 2},
  94.                 {1.5, 3.5, -3.5, 6.5},
  95.                 {0.5, 1.5, 0, 7.5}
  96.                 };
  97.                 B = {3, 4, 14.5, 15.5};
  98.                 break;
  99.             }
  100.             case '3':
  101.             {
  102.                 A =
  103.                 {
  104.                 {2, -2, -1, 2},
  105.                 {3, 1, -2.5, 5},
  106.                 {2, -2, 3, 1},
  107.                 {2, 4, -2.5, 4}
  108.                 };
  109.                 B = {2, 9, -1, 8};
  110.                 break;
  111.             }
  112.             case '4':
  113.             {
  114.                 A =
  115.                 {
  116.                 {3, 3, -1, -1},
  117.                 {4.5, 6.5, -2.5, 0.5},
  118.                 {3, 5, -1, 4},
  119.                 {3, 3, -0.5, 2.5}
  120.                 };
  121.                 B = {5, 11.5, 7, 4};
  122.                 break;
  123.             }
  124.             case '5':
  125.             {
  126.                 A =
  127.                 {
  128.                 {3, -2, 0, 2},
  129.                 {1.5, -2, -2, 5},
  130.                 {0, -1.5, -7, 6},
  131.                 {3, -3.5, -5, 4}
  132.                 };
  133.                 B = {-14, -15, -8, -16};
  134.                 break;
  135.             }
  136.             case '6':
  137.             {
  138.                 A =
  139.                 {
  140.                 {3, -10.5, 8.5, -5.5},
  141.                 {3.25, 15.75, -15.25, 6.75},
  142.                 {-1.5, 0, 2.5, 1.75},
  143.                 {3, 21, -7, 9}
  144.                 };
  145.                 B = {5, -20, -0.5, -24};
  146.                 break;
  147.             }
  148.             default:
  149.             {
  150.                 cout << "Nieznany identyfikator." << endl;
  151.                 break;
  152.             }
  153.         }
  154.         rozmiar=B.size();
  155.         for(int i = 0; i < rozmiar; i++)
  156.         {
  157.             X.push_back(0);
  158.             pozycja.push_back(i);
  159.         }
  160.         kopia_A = A;
  161.         kopia_B = B;
  162.         this->wyswietl();
  163.     }
  164.     void przywroc()
  165.     {
  166.         A = kopia_A;
  167.         B = kopia_B;
  168.         pozycja.clear();
  169.     }
  170.     void menu()
  171.     {
  172.         char wybor;
  173.         while(wybor!='0')
  174.         {
  175.             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. Wroc do wybierania macierzy\n";
  176.             cin >> wybor;
  177.             switch(wybor)
  178.             {
  179.                 case '1':
  180.                 {
  181.                     bool czy0;
  182.                     czy0 = this->eliminacja_podstawowa();
  183.                     if(czy0 == true)
  184.                     {
  185.                         this->wyswietl();
  186.                         this->wyznaczanie_niewiadomych();
  187.                         this->wyswietl_niewiadome(wybor);
  188.                     }
  189.                     this->przywroc();
  190.                     break;
  191.                 }
  192.                 case '2':
  193.                 {
  194.                     this->eliminacja_z_kolumnami();
  195.                     this->wyswietl();
  196.                     this->wyznaczanie_niewiadomych();
  197.                     this->wyswietl_niewiadome(wybor);
  198.                     this->przywroc();
  199.                     break;
  200.                 }
  201.                 case '3':
  202.                 {
  203.                     this->eliminacja_z_wierszami();
  204.                     this->wyswietl();
  205.                     this->wyznaczanie_niewiadomych();
  206.                     this->wyswietl_niewiadome(wybor);
  207.                     this->przywroc();
  208.                     break;
  209.                 }
  210.                 case '4':
  211.                 {
  212.                     this->eliminacja_pelna();
  213.                     this->wyswietl();
  214.                     this->wyznaczanie_niewiadomych();
  215.                     this->wyswietl_niewiadome(wybor);
  216.                     this->przywroc();
  217.                     break;
  218.                 }
  219.                 case '0':
  220.                     cout << "Wracam do wybierania macierzy.\n";
  221.                     pozycja.clear();
  222.                     break;
  223.                 default:
  224.                     cout << "Wybrano nieznana opcje.\n";
  225.             }
  226.         }
  227.     }
  228.     void eliminacja (int i)
  229.     {
  230.         double p;
  231.         for (int w = i+1; w < rozmiar; w++)
  232.         {
  233.             p = A[w][i] / A[i][i];
  234.             B[w] = B[w] - B[i]*p;
  235.             for(int k = i; k < rozmiar; k++)
  236.             {
  237.                 A[w][k] = A[w][k] - A[i][k]*p;
  238.             }
  239.             this->wyswietl();
  240.         }
  241.     }
  242.     bool eliminacja_podstawowa()
  243.     {
  244.         for(int i =0; i < rozmiar; i++)
  245.         {
  246.             if(A[i][i] == 0){
  247.                 cout << "Jedna z wartosci na przekatnej macierzy jest rowna 0, nie mozna rozwiazac rownania." << endl;
  248.                 return false;
  249.             }
  250.             this->eliminacja(i);
  251.         }
  252.         return true;
  253.     }
  254.     void eliminacja_z_kolumnami()
  255.     {
  256.         for(int i =0; i < rozmiar; i++)
  257.         {
  258.             double maximum = fabs(A[i][i]);
  259.             int index=i;
  260.             for(int l = i+1; l < rozmiar; l++)
  261.             {
  262.                 if(maximum < fabs(A[l][i]))
  263.                 {
  264.                     maximum = fabs(A[l][i]);
  265.                     index = l;
  266.                 }
  267.             }
  268.             A[index].swap(A[i]);
  269.             swap(B[index],B[i]);
  270.             this->eliminacja(i);
  271.         }
  272.     }
  273.     void eliminacja_z_wierszami()
  274.     {
  275.         for(int i =0; i < rozmiar; i++)
  276.         {
  277.             double maximum = fabs(A[i][i]);
  278.             int index=i;
  279.             for(int l = i+1; l < rozmiar; l++)
  280.             {
  281.                 if(maximum < fabs(A[i][l]))
  282.                 {
  283.                     maximum = fabs(A[i][l]);
  284.                     index = l;
  285.                 }
  286.             }
  287.             for(int l = 0; l < rozmiar; l++)
  288.             {
  289.                 swap(A[l][index], A[l][i]);
  290.             }
  291.             swap(pozycja[index], pozycja[i]);
  292.             this->eliminacja(i);
  293.         }
  294.     }
  295.     void eliminacja_pelna()
  296.     {
  297.         for(int i =0; i < rozmiar; i++)
  298.         {
  299.             double maximum = fabs(A[i][i]);
  300.             int index_wierszy=i;
  301.             int index_kolumn=i;
  302.             for(int l = i; l < rozmiar; l++)
  303.                 for(int k = 0; k < rozmiar; k++)
  304.                 {
  305.                     if(maximum < fabs(A[l][k]))
  306.                     {
  307.                         maximum = fabs(A[l][k]);
  308.                         index_wierszy = l;
  309.                         index_kolumn = k;
  310.                     }
  311.                 }
  312.             for(int l = 0; l < rozmiar; l++)
  313.             {
  314.                 swap(A[l][index_kolumn], A[l][i]);
  315.             }
  316.             swap(pozycja[index_kolumn], pozycja[i]);
  317.             A[index_wierszy].swap(A[i]);
  318.             swap(B[index_wierszy],B[i]);
  319.             this->eliminacja(i);
  320.         }
  321.     }
  322.     void wyznaczanie_niewiadomych()
  323.     {
  324.         for(int i = rozmiar-1; i >= 0; i--)
  325.         {
  326.             if(i == rozmiar-1) X[i] = B[i] / A[i][i];
  327.             else
  328.             {
  329.                 double temp = B[i];
  330.                 for(int j = rozmiar-1; j > i; j--) temp -= X[j]*A[i][j];
  331.                 X[i] = temp / A[i][i];
  332.             }
  333.         }
  334.     }
  335.     void wyswietl()
  336.     {
  337.         cout << left << setw(15*rozmiar) << "Macierz A";
  338.         cout << left << setw(15) << "Macierz B";
  339.         cout << left << "Pozycja zmiennych" << endl;
  340.         for(int i=0; i<rozmiar; i++)
  341.         {
  342.             for(int j=0; j<rozmiar; j++) cout << left << setw(15) << A[i][j];
  343.             cout << left << setw(15) << B[i];
  344.             cout << setw(5) << pozycja[i];
  345.             cout << endl;
  346.         }
  347.         cout << endl;
  348.     }
  349.     void wyswietl_niewiadome(char wybor)
  350.     {
  351.         if(wybor == '3' or wybor == '4')
  352.         {
  353.             for(int i=0; i<rozmiar; i++)
  354.                 for(int j=0; j<rozmiar; j++)
  355.                 {
  356.                     if(i == pozycja[j])
  357.                     {
  358.                         swap(pozycja[j],pozycja[i]);
  359.                         swap(X[j],X[i]);
  360.                         break;
  361.                     }
  362.                 }
  363.         }
  364.         cout  << "Rozwiazanie: " << endl;
  365.         for(int i=0; i<rozmiar; i++)
  366.         {
  367.             cout << "x" << i << " = " << X[i] << "\t" << endl;
  368.         }
  369.         cout << endl;
  370.     }
  371. };
  372. int main()
  373. {
  374.     Gauss m1;
  375.     return 0;
  376. }
Add Comment
Please, Sign In to add comment