Advertisement
Kocyk

Gauss final

Jan 8th, 2020
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3. #include <iomanip>
  4. using namespace std;
  5.  
  6. void wyswietl2D(double **tablica, int rozmiar)
  7. {
  8.     cout<<"A="<<endl;
  9.     for(int i=0;i<rozmiar;i++)
  10.     {
  11.         for(int j=0;j<rozmiar;j++)
  12.         {
  13.             cout<<setw(10)<<tablica[i][j]<<" ";
  14.         }
  15.         cout<<endl;
  16.     }
  17. }
  18.  
  19. void wyswietl1D(double *tabrozwiazania,int rozmiar)
  20. {
  21.     for(int i=0;i<rozmiar;i++){
  22.      cout << setw(10)<<tabrozwiazania[i]<<endl;
  23.      }
  24. }
  25. bool sprawdzaniezera(double a)
  26. {
  27.     bool czy=false;
  28.     if(a==0)czy=true;
  29.     return czy;
  30. }
  31. void gaussbezsprawdania(double **tabaktualna,double *tabwyrazy, int rozmiar,int i )
  32. {
  33.     double p;
  34.        
  35.         for (int w=i+1; w < rozmiar; w++)
  36.         {
  37.             p = (tabaktualna[w][i] )/ (tabaktualna[i][i]);
  38.             tabwyrazy[w] = tabwyrazy[w] - tabwyrazy[i]*p;
  39.             for(int k = i; k < rozmiar; k++)
  40.             {
  41.                 tabaktualna[w][k] = tabaktualna[w][k] - tabaktualna[i][k]*p;
  42.             }
  43.         }
  44.  
  45.    
  46. }
  47. bool eliminacjanormalna(double **tabaktualna,double *tabwyrazy, int rozmiar)
  48. {
  49.     for(int i=0;i<rozmiar;i++){
  50.     if(sprawdzaniezera(tabaktualna[i][i])==true) return false;
  51.     gaussbezsprawdania(tabaktualna,tabwyrazy,rozmiar,i);    
  52.     }
  53.     return true;
  54. }
  55. bool eliminacjakolumny(double **tabaktualna,double *tabwyrazy, int rozmiar)
  56. {
  57.     double p;
  58.     for(int i=0; i < rozmiar; i++)
  59.     {  
  60.         double max = fabs(tabaktualna[i][i]);
  61.         int indeks=i;
  62.         for(int l = i+1; l < rozmiar; l++)
  63.         {
  64.             if(max < fabs(tabaktualna[l][i]))
  65.             {
  66.                 max = fabs(tabaktualna[l][i]);      //sprawdzanie maxa
  67.                 indeks = l;
  68.             }
  69.                
  70.         }            
  71.         if(sprawdzaniezera(max) )return false;
  72.         swap(tabaktualna[indeks],tabaktualna[i]);
  73.         swap(tabwyrazy[indeks],tabwyrazy[i]);       //swapowanie wiersza max z aktualnym                         
  74.         for(int z=0;z<rozmiar;z++)gaussbezsprawdania(tabaktualna,tabwyrazy,rozmiar,z);
  75.     }
  76.     return true;
  77. }
  78. void niewiadome(double **tabaktualna,double *tabwyrazy,double *tabrozwiazania,int rozmiar)
  79.     {
  80.         for(int i = rozmiar-1; i >= 0; i--)
  81.         {
  82.             if(i == rozmiar-1) tabrozwiazania[i] = tabwyrazy[i] / tabaktualna[i][i];
  83.             else
  84.             {
  85.                 double temp = tabwyrazy[i];
  86.                 for(int j = rozmiar-1; j > i; j--) temp = temp - ( tabrozwiazania[j] * tabaktualna[i][j]);   // suma
  87.                 tabrozwiazania[i] = temp / tabaktualna[i][i];
  88.             }
  89.         }
  90.     }
  91.  
  92. bool eliminacjapelna(double **tabaktualna,double *tabwyrazy, int rozmiar,double *pomocnicza)
  93. {
  94.     for(int i=0; i < rozmiar; i++)
  95.     {
  96.                    
  97.         double max = fabs(tabaktualna[i][i]);              
  98.         int indeksW=i;
  99.         int indeksK=i;
  100.         for(int w = i; w < rozmiar; w++)
  101.         {
  102.             for(int k = i; k<rozmiar;k++)
  103.             {
  104.                 if(max < fabs(tabaktualna[w][k]))
  105.                 {
  106.                     max = fabs(tabaktualna[w][k]);      //sprawdzanie maxa
  107.                     indeksK = k;
  108.                     indeksW = w;
  109.                 }
  110.             }            
  111.         }
  112.         if(sprawdzaniezera(max)==true)return false;
  113.         if(indeksW != i)
  114.         {
  115.             for(int b = 0; b < rozmiar; b++)
  116.                 swap(tabaktualna[indeksW][b], tabaktualna[i][b]);       //zamiana wierszy
  117.            
  118.             swap(tabwyrazy[indeksW],tabwyrazy[i]);
  119.         }
  120.  
  121.         if(indeksK != i)
  122.         {
  123.             for(int b = 0; b < rozmiar ;b++)
  124.                 swap(tabaktualna[b][indeksK], tabaktualna[b][i]);       //zamiana kolumn  
  125.  
  126.             swap(pomocnicza[indeksK],pomocnicza[i]);
  127.         }
  128.            
  129.     }
  130.     for(int i=0;i<rozmiar;i++)gaussbezsprawdania(tabaktualna,tabwyrazy,rozmiar,i);  
  131.     return true;
  132. }
  133. void sortdlapelnego(double *pomocnicza, double *tabrozwiazania,int rozmiar)
  134. {
  135.     for(int i = 0; i < rozmiar; i++)    
  136.     {
  137.         for(int j = 1; j < rozmiar; j++)
  138.         {
  139.             if(pomocnicza[j-1] > pomocnicza[j])
  140.             {
  141.                 swap(pomocnicza[j-1], pomocnicza[j]);
  142.                 swap(tabrozwiazania[j-1], tabrozwiazania[j]);
  143.             }
  144.         }
  145.     }
  146. }
  147. void wynikipelny(double **tabaktualna,double *tabwyrazy, int rozmiar,double *pomocnicza, double *tabrozwiazania)
  148. {
  149.     cout<<"Numery X:"<<endl;
  150.     wyswietl1D(pomocnicza,rozmiar);
  151.     niewiadome(tabaktualna, tabwyrazy, tabrozwiazania,rozmiar);
  152.     sortdlapelnego(pomocnicza,tabrozwiazania,rozmiar);
  153. }
  154.  
  155. void kreseczki()
  156. {
  157.     for(int i=0;i<50;i++) cout<<"_";
  158.     cout<<endl;
  159. }
  160. void recycling(double **tabaktualna,double *tabwyrazy, double *tabrozwiazania,int rozmiar)
  161. {
  162.     for(int i = 0; i < rozmiar; i++) delete[] tabaktualna[i];
  163.     delete[] tabaktualna;
  164.     delete[] tabwyrazy;
  165.     delete[] tabrozwiazania;
  166. }
  167. void sztywno1(double **tabaktualna,double *tabwyrazy)
  168. {
  169.     tabaktualna[0][0] = 1.0;
  170.     tabaktualna[0][1] = 1.0;
  171.     tabaktualna[0][2] = -3.0;
  172.     tabaktualna[0][3] = 1.0;
  173.     tabaktualna[1][0] = 0.0;
  174.     tabaktualna[1][1] = 2.0;
  175.     tabaktualna[1][2] = -1.0;
  176.     tabaktualna[1][3] = 2.0;
  177.     tabaktualna[2][0] = 1.5;
  178.     tabaktualna[2][1] = 3.5;
  179.     tabaktualna[2][2] = -3.5;
  180.     tabaktualna[2][3] = 6.5;
  181.     tabaktualna[3][0] = 0.5;
  182.     tabaktualna[3][1] = 1.5;
  183.     tabaktualna[3][2] = 0.0;
  184.     tabaktualna[3][3] = 7.5;
  185.        
  186.     tabwyrazy[0]= 3.0;
  187.     tabwyrazy[1]= 4.0;
  188.     tabwyrazy[2]= 14.5;
  189.     tabwyrazy[3]= 15.5;
  190. }
  191. void sztywno2(double **tabaktualna,double *tabwyrazy)
  192. {
  193.     tabaktualna[0][0] = 6.5;
  194.     tabaktualna[0][1] = -1.25;
  195.     tabaktualna[0][2] = 1.5;
  196.     tabaktualna[0][3] = 0.75;
  197.     tabaktualna[1][0] = 6.5;
  198.     tabaktualna[1][1] = 6.25;
  199.     tabaktualna[1][2] = -11.5;
  200.     tabaktualna[1][3] = -1.25;
  201.     tabaktualna[2][0] = 19.5;
  202.     tabaktualna[2][1] = 14.25;
  203.     tabaktualna[2][2] = 11.0;
  204.     tabaktualna[2][3] = -2.75;
  205.     tabaktualna[3][0] = 26.0;
  206.     tabaktualna[3][1] = 13.0;
  207.     tabaktualna[3][2] = 6.0;
  208.     tabaktualna[3][3] = -5.0;
  209.        
  210.     tabwyrazy[0]= 9.25;
  211.     tabwyrazy[1]= -11.25;
  212.     tabwyrazy[2]= 16.25;
  213.     tabwyrazy[3]= 19.0;
  214. }
  215. void sztywno3(double **tabaktualna,double *tabwyrazy)
  216. {
  217.     tabaktualna[0][0] = -6.5;
  218.     tabaktualna[0][1] = 1.75;
  219.     tabaktualna[0][2] = 2.25;
  220.     tabaktualna[0][3] = 0.0;
  221.     tabaktualna[1][0] = 6.5;
  222.     tabaktualna[1][1] = -5.0;
  223.     tabaktualna[1][2] = 0.0;
  224.     tabaktualna[1][3] = -3.0;
  225.     tabaktualna[2][0] = -26.0;
  226.     tabaktualna[2][1] = -6.0;
  227.     tabaktualna[2][2] = -6.0;
  228.     tabaktualna[2][3] = -12.0;
  229.     tabaktualna[3][0] = -13.0;
  230.     tabaktualna[3][1] = 10.0;
  231.     tabaktualna[3][2] = 2.0;
  232.     tabaktualna[3][3] = -6.0;
  233.        
  234.     tabwyrazy[0]= -9.0;
  235.     tabwyrazy[1]= 5.0;
  236.     tabwyrazy[2]= -76.0;
  237.     tabwyrazy[3]= -20.0;
  238. }
  239. void menu()
  240. {
  241.     int rozmiar=1;    
  242.     double **tabaktualna;
  243.     double *tabwyrazy;
  244.     double *tabrozwiazania;
  245.     double *pomocnicza;
  246.        
  247.     int menu,menu2,menu3;
  248.     cout<<"Co chcesz zrobic?"<<endl;
  249.     cout<<"1.Uzyc macierzy wspianej na sztywno"<<endl;
  250.     cout<<"2.Wpisac wspolczynniki samemu"<<endl;
  251.     cin>>menu;
  252.     switch(menu)
  253.     {
  254.        
  255.    
  256.     case 1:
  257.         rozmiar=4;
  258.        
  259.         pomocnicza=new double[rozmiar];
  260.         for(int i=0;i<rozmiar;i++) pomocnicza[i]=i+1;
  261.        
  262.         tabaktualna=new double*[rozmiar];
  263.         for(int i = 0; i<4;i++) tabaktualna[i] = new double[rozmiar];      
  264.         tabwyrazy=new double[rozmiar];
  265.         tabrozwiazania=new double[rozmiar];
  266. //---------------------------------------------------      
  267.         cout<<"Ktory chcesz wybrac:"<<endl;
  268.         kreseczki();
  269.    
  270.         cout<<"1.(Podstawowy/kolumny)"<<endl;
  271.         sztywno1(tabaktualna,tabwyrazy);    
  272.         wyswietl2D(tabaktualna,rozmiar);
  273.         cout<<"B= "<<endl;
  274.         wyswietl1D(tabwyrazy,rozmiar);
  275.         kreseczki();
  276.        
  277.         cout<<"2.(Pelny)"<<endl;       
  278.         sztywno2(tabaktualna,tabwyrazy);               
  279.         wyswietl2D(tabaktualna,rozmiar);
  280.         cout<<"B= "<<endl;
  281.         wyswietl1D(tabwyrazy,rozmiar);
  282.         kreseczki();
  283.  
  284.         cout<<"3.(Pelny)"<<endl;
  285.         sztywno3(tabaktualna,tabwyrazy);       
  286.         wyswietl2D(tabaktualna,rozmiar);
  287.         cout<<"B= "<<endl;
  288.         wyswietl1D(tabwyrazy,rozmiar);
  289.         kreseczki();
  290. //---------------------------------------------------          
  291.         cin>>menu3;
  292.         switch(menu3)
  293.         {      
  294.         case 1:            
  295.             sztywno1(tabaktualna,tabwyrazy);
  296.             break;
  297.         case 2:
  298.             sztywno2(tabaktualna,tabwyrazy);
  299.             break;         
  300.         case 3:
  301.             sztywno3(tabaktualna,tabwyrazy);
  302.             break;
  303.         default:
  304.             cout<<"error"<<endl;
  305.             return;
  306.         }
  307.        
  308.         break;
  309.        
  310.    
  311.     case 2:
  312.        
  313.    
  314.         cout<<"Podaj rozmiar macierzy n x n"<<endl;
  315.         cin>>rozmiar;
  316.    
  317.         pomocnicza=new double[rozmiar];
  318.         for(int i=0;i<rozmiar;i++)
  319.             pomocnicza[i]=i;
  320.         tabaktualna=new double*[rozmiar];
  321.         tabwyrazy=new double[rozmiar];
  322.         tabrozwiazania=new double[rozmiar];
  323.         for(int i = 0; i<rozmiar;i++)
  324.             tabaktualna[i] = new double[rozmiar];
  325.         cout<<"Podaj kolejne wspolczynniki: "<<endl;
  326.         for(int i=0;i<rozmiar;i++)
  327.         {
  328.             for(int j=0;j<rozmiar;j++)
  329.             {
  330.                 cout<<"Podaj element nr "<<i<<" x "<< j<<endl;
  331.                 cin>>tabaktualna[i][j];
  332.                 cout <<endl;
  333.             }
  334.         cout<<endl;
  335.         }
  336.         for(int i=0;i<rozmiar;i++)
  337.         {
  338.             cout<<"Podaj wyrazy wolne"<<endl;
  339.             cin>>tabwyrazy[i];
  340.             cout<<endl;
  341.         }
  342.     break;
  343.     //cout << tabaktualna[0][0];
  344.     default:
  345.         cout<<"error"<<endl;
  346.         return;
  347.         break;
  348.     }
  349.    
  350.     cout<<"Co chcesz zrobic ?"<<endl;
  351.     cout<<"1.Eliminacja normalna"<<endl;
  352.     cout<<"2.Eliminacja z wyborem kolumny"<<endl;
  353.     cout<<"3.Eliminacja z pelnym wyborem"<<endl;
  354.     cin>>menu2;
  355.     cout<<endl;
  356.     switch(menu2)
  357.     {
  358.         case 1:
  359.            
  360.             if(eliminacjanormalna(tabaktualna,tabwyrazy,rozmiar)==false)return;
  361.             wyswietl2D(tabaktualna,rozmiar);
  362.             niewiadome(tabaktualna,tabwyrazy,tabrozwiazania,rozmiar);
  363.             cout<<"B="<<endl;
  364.             wyswietl1D(tabwyrazy,rozmiar);
  365.             cout<<endl;
  366.             cout<<"wyniki:"<<endl;
  367.             wyswietl1D(tabrozwiazania,rozmiar);
  368.             cout<<endl;
  369.            
  370.             break;
  371.         case 2:
  372.        
  373.             if(eliminacjakolumny(tabaktualna,tabwyrazy,rozmiar)==false) return;
  374.             wyswietl2D(tabaktualna,rozmiar);
  375.             niewiadome(tabaktualna,tabwyrazy,tabrozwiazania,rozmiar);
  376.             cout<<"B="<<endl;
  377.             wyswietl1D(tabwyrazy,rozmiar);
  378.             cout<<endl;
  379.             cout<<"wyniki:"<<endl;
  380.             wyswietl1D(tabrozwiazania,rozmiar);
  381.             cout<<endl;
  382.            
  383.             break;
  384.         case 3:
  385.        
  386.             if(eliminacjapelna(tabaktualna,tabwyrazy,rozmiar,pomocnicza)==false) return;
  387.             wyswietl2D(tabaktualna,rozmiar);
  388.             wynikipelny(tabaktualna,tabwyrazy,rozmiar,pomocnicza,tabrozwiazania);
  389.             cout<<"B="<<endl;
  390.             wyswietl1D(tabwyrazy,rozmiar);
  391.             cout<<endl;
  392.             cout<<"wyniki:"<<endl;
  393.             wyswietl1D(tabrozwiazania,rozmiar);
  394.             cout<<endl;
  395.             //wyswietl1D(pomocnicza,rozmiar);
  396.             break;
  397.        
  398.             //kill-me
  399.         default:
  400.             cout<<"error"<<endl;
  401.             return;
  402.             break;
  403.     }
  404.     recycling(tabaktualna,tabwyrazy,tabrozwiazania,rozmiar);
  405.    
  406. }
  407. int main() 
  408. {
  409.     menu();
  410.     return 0;  
  411. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement