Guest User

Gauss_Ty_kurwo

a guest
Jan 2nd, 2020
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cmath>
  4. #include <algorithm>
  5. #define P 1E-12 //przyblizenie 0
  6. using std::cout;
  7. using std::cin;
  8. using std::endl;
  9.  
  10. //tab[ilosc wierszy][ilosc kolumn]
  11.  
  12. class matrix{
  13.     double **main_matrix;
  14.     double *result;
  15.     int size=0;
  16.  
  17.     static bool is_null(double input)
  18.     {
  19.         return fabs(input) < P;
  20.     }
  21.     bool calculate_simply();
  22.     void show_result();
  23.     void swapc(int k1,int k2);
  24.  
  25.  
  26. public:
  27.     matrix(){
  28.         cout <<"Podaj rozmiar macierzy: \n";
  29.         cin >>size;
  30.         if (size<0) {
  31.             cout<<"nieprawidlowa wartosc \n";
  32.             return;
  33.         }
  34.         main_matrix=new double* [size];//kolumny
  35.         result=new double [size];
  36.         for (int i = 0; i <= size ; ++i) {
  37.             main_matrix[i]=new double [size+1]; //wiersze
  38.         }
  39.     }
  40.     void initialize();
  41.     void display();
  42.     void gauss_simply();
  43.     void gauss_max_el();
  44.     void full_gauss();
  45. };
  46.  
  47.  
  48. int main() {
  49.     matrix m1;
  50.     m1.initialize();
  51.     m1.display();
  52.     //m1.gauss_simply(); - dziala
  53.     //m1.gauss_max_el(); //dziala
  54.     m1.full_gauss();
  55.     m1.display();
  56.     //delete &m1;
  57.     return 0;
  58. }
  59.  
  60. void matrix::initialize() {
  61.     for (int i=0; i<size; i++)
  62.     {
  63.         cout<<endl<<"Rownanie "<<i+1<<": "<<endl;
  64.         for (int j=0; j<=size; j++)
  65.         {
  66.             if (j<size)
  67.             {
  68.                 if (j == 0) cout<<"  ";
  69.                 cout<<"x"<<j;
  70.                 cout<<" * ";
  71.                 cin>>main_matrix[i][j];
  72.                 if (j < size-1) cout<<"+ ";
  73.             }
  74.             if (j == size)
  75.             {
  76.                 cout<<"     = ";
  77.                 cin>>main_matrix[i][j];
  78.             }
  79.         }
  80.     }
  81.     for(int i=0; i<size; i++)
  82.     {
  83.         result[i]=i;
  84.     }
  85. }
  86.  
  87. bool matrix::calculate_simply() {
  88.         double m=0;
  89.         for (int i = 0; i < size ; ++i) {
  90.             if(main_matrix[i][i]==0)
  91.                 return false;
  92.             for (int j = i+1; j <=size ; ++j) {
  93.                 m=main_matrix[j][i]/main_matrix[i][i];
  94.                 main_matrix[j][i]=0;
  95.                 for (int k = i+1; k <=size+1 ; ++k) {
  96.                     main_matrix[j][k]-=m*main_matrix[i][k];
  97.                 }
  98.             }
  99.         }
  100.         return true;
  101. }
  102.  
  103. void matrix::gauss_simply() {
  104.     if (!calculate_simply())
  105.     {
  106.         cout << "0 na przekatnej macierzy, macierz osobliwa. koncze program... \n";
  107.     }
  108.     else
  109.     {
  110.         show_result();
  111.     }
  112. }
  113.  
  114. void matrix::show_result() {
  115.     double *results;
  116.     int n=size-1;
  117.     results=new double [n];//liczba wierszy
  118.     cout <<main_matrix[size-1][size]<<endl;
  119.     cout <<main_matrix[size-1][size-1]<<endl;
  120.     if(main_matrix[n][n]!=0)
  121.         results[n]=main_matrix[n][size]/main_matrix[n][n];
  122.     else
  123.         cout<<"Problem jest !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n\n\n\n";
  124.     cout <<"wynik 1: "<<results[n]<<endl;
  125.     for (int i = size-1; i >=0 ; --i) {
  126.         double sum=0.0;
  127.         for (int j = i+1; j <= size ; ++j) {
  128.             sum+=main_matrix[i][j]*results[j];
  129.         }
  130.         if(!is_null(main_matrix[i][i]))
  131.             results[i]=(main_matrix[i][size]-sum)/main_matrix[i][i];
  132.     }
  133.     cout<<endl<<"Rozwiazania"<<endl;
  134.     for (int i=0; i<size; i++)
  135.     {
  136.         cout<<std::setw(11)<<"x"<<result[i];
  137.     }
  138.     //cout<<std::setw(11)<<"b";
  139.     cout <<endl;
  140.     for (int i=0; i<size; i++)
  141.     {
  142.         cout<<std::setw(12)<<results[i];
  143.     }
  144.     delete [] results;
  145. }
  146. void matrix ::gauss_max_el() {
  147.     double temp=0;
  148.     int position=0;
  149.     for (int i = 0; i < size ; ++i) {
  150.         if(fabs(main_matrix[i][0])>=temp) {
  151.             temp = main_matrix[i][0];
  152.             position = i;
  153.         }
  154.     }
  155.     if (position!=0)
  156.         std::swap(main_matrix[position],main_matrix[0]);
  157.     gauss_simply();
  158. }
  159.  
  160. void matrix::display() {
  161.     cout<<endl<<"MACIERZ"<<endl;
  162.     for (int i=0; i<size; i++)
  163.     {
  164.         cout<<std::setw(11)<<"x"<<result[i];
  165.     }
  166.     cout<<std::setw(11)<<"b";
  167.     for (int i=0; i<size; i++)
  168.     {
  169.         cout<<endl;
  170.         for (int j=0; j<=size; j++)
  171.         {
  172.             cout<<std::setw(12)<<main_matrix[i][j];
  173.         }
  174.     }
  175.     cout<<endl<<endl;
  176. }
  177.  
  178. void matrix::swapc(int k1,int k2) {
  179.     double temp;
  180.     for (int i=0; i<size; i++)
  181.     {
  182.         temp = main_matrix[i][k1];
  183.         main_matrix[i][k1] = main_matrix[i][k2];
  184.         main_matrix[i][k2] = temp;
  185.     }
  186.     temp=result[k1];
  187.     result[k1]=result[k2];
  188.     result[k2]=temp;
  189. }
  190.  
  191. void matrix::full_gauss() {
  192.     double maks=0;
  193.     int kolumna=0,wiersz=0;
  194.     for (int k=0; k<size-1; k++)
  195.     {
  196.         kolumna=k;
  197.         wiersz=k;
  198.         maks=fabs(main_matrix[k][k]);
  199.         for (int j=k; j<size; j++)
  200.         {
  201.             for (int i=k; i<size; i++)
  202.             {
  203.                 if (fabs(main_matrix[j][i]) > maks)
  204.                 {
  205.                     maks=fabs(main_matrix[j][i]);
  206.                     kolumna=i;
  207.                     wiersz=j;
  208.                 }
  209.             }
  210.         }
  211.  
  212.         if (kolumna != k) swapc(kolumna, k);
  213.         if (wiersz != k) {
  214.             std::swap(main_matrix[wiersz],main_matrix[k]);
  215.         }
  216.         calculate_simply();
  217.         show_result();
  218.  
  219. }
  220. }
Advertisement
Add Comment
Please, Sign In to add comment