Advertisement
Guest User

projekt

a guest
Apr 26th, 2011
827
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.93 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class macierz
  5. {
  6.       public:
  7.       //zmienne
  8.       unsigned int wiersze;
  9.       unsigned int kolumny;  
  10.       double **tablica;        //wskaznik na dynamiczna tablice (macierz)
  11.      
  12.       //konstruktory i destruktory
  13.       macierz(unsigned int wiersze, unsigned int kolumny); //konstruktor dwuparametrowy
  14.       macierz(); //konstruktor domyslny
  15.       ~macierz() //destruktor
  16.       {
  17.       for( int i = 0; i < wiersze; i++ )                
  18.       {delete[]tablica[i];}        
  19.       delete[] tablica;
  20.       }
  21.      
  22.       macierz(macierz const &m); //konstruktor kopiujacy
  23.      
  24.       //zaprzyjaznione operatory przeciazane
  25.       friend macierz operator+(const macierz &m1, const macierz &m2);
  26.       friend macierz operator-(const macierz &m1, const macierz &m2);
  27.       friend macierz operator*(const macierz &m1, const macierz &m2);
  28.       friend macierz operator*(const macierz &m1, const double skalar);
  29.       //metody
  30.       void Wyswietl()const;
  31.       void WprowadzDane(unsigned int wiersze, unsigned int kolumny);
  32. };
  33.  
  34. class macierzkwadratowa: public macierz
  35. { macierzkwadratowa(unsigned int wymiar){wiersze=kolumny=wymiar;};
  36.   ~macierzkwadratowa();
  37.   friend macierzkwadratowa operator+(const macierzkwadratowa &m1, const macierzkwadratowa &m2);
  38.   friend macierzkwadratowa operator-(const macierzkwadratowa &m1, const macierzkwadratowa &m2);
  39.   friend macierzkwadratowa operator*(const macierzkwadratowa &m1, const macierzkwadratowa &m2);
  40.   friend macierzkwadratowa operator*(const macierzkwadratowa &m1, const double skalar);
  41.    
  42. };
  43.  
  44. //////////////////////////////////////////////////////////////////////////////////////////////////
  45. void macierz::WprowadzDane (unsigned int wiersze, unsigned int kolumny)
  46. {for ( int i = 0; i < wiersze; i ++ )
  47.       {  for (int j=0; j<kolumny; j++)
  48.           { cout << "Wprowadz [" << i << "]" << "[" << j << "] element macierzy: ";
  49.               double wartosc;
  50.               while(!(cin>>wartosc))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  51.               {
  52.               cout << "Wprowadz poprawna wartosc: ";
  53.               cin.clear(); //kasowanie flagi błędu strumienia
  54.               cin.sync(); //kasowanie zawartosci bufora obiektu cin
  55.               }
  56.           tablica[i][j] = wartosc;
  57.           }
  58.       }  
  59. }
  60. ///////////////////////////////////////////////////////////////////////////////
  61. macierz::macierz ()  //domyslnie tworzy macierz 2x2 wypelniona zerami
  62. {          
  63.       wiersze=kolumny=2;
  64.        
  65.       tablica = new double *[wiersze];
  66.       for (int i=0; i<wiersze;i++)
  67.           tablica[i]=new double[kolumny];    
  68.        
  69.       for ( int i = 0; i < wiersze; i ++ )
  70.       {
  71.           cout<<"wiersz "<<i<<": ";
  72.           for (int j=0; j<kolumny; j++)  
  73.               tablica[i][j] = 0;
  74.        
  75.       }
  76. }
  77. ////////////////////////////////////////////////////////////////////////////////
  78.  
  79. macierz::macierz(macierz const &m)  //konstruktor kopiujacy
  80. {
  81.     kolumny = m.kolumny;
  82.     wiersze = m.wiersze;
  83.     tablica = new double *[wiersze];
  84.     for (int i = 0; i < wiersze; i ++ )
  85.         tablica[i] = new double[kolumny];
  86.      
  87.     for (int i = 0; i < wiersze; i ++ )
  88.         for (int j = 0; j < kolumny; j ++ )
  89.             tablica[i][j] = m.tablica[i][j];
  90. }
  91.  
  92. ///////////////////////////////////////////////////////////////////////////////
  93. macierz::macierz (unsigned int wier, unsigned int kol)  //konstruktor dwuparametrowy
  94. {
  95.       kolumny = kol;
  96.       wiersze = wier;
  97.       double wartosc;
  98.       tablica = new double *[wiersze];
  99.       for (int i=0; i<wiersze;i++)
  100.           tablica[i]=new double[kolumny];    
  101. }
  102. ///////////////////////////////////////////////////////////////////////////////
  103. void macierz::Wyswietl()const
  104. {
  105.       for ( int i = 0; i < wiersze; i ++ )
  106.       {
  107.           cout<<endl<<"wiersz "<<i<<": \t";
  108.           for (int j=0; j<kolumny; j++)
  109.           {
  110.               cout<<tablica[i][j]<<" ";
  111.           }
  112.       }
  113.       cout<<endl;  
  114. }
  115. //////////////////////////////////////////////////////////////////////////////
  116. macierz operator+(const macierz &m1, const macierz &m2)
  117. {
  118.  
  119.   if (!(m1.wiersze == m2.wiersze && m1.kolumny == m2.kolumny))
  120.      cerr << "Wymiary macierzy nie sa zgodne, nie mozna wykonac dodawania";
  121.   else
  122.   { macierz m3(m1);
  123.       for (int i=0; i<m3.wiersze; i++)
  124.           for (int j=0; j<m3.kolumny; j++)
  125.           {
  126.               m3.tablica[i][j] += m2.tablica[i][j];
  127.           }
  128.           return m3;
  129.   }
  130.  
  131.  
  132. }
  133. ////////////////////////////////////////////////////////////////////////////////
  134. macierz operator-(const macierz &m1, const macierz &m2)
  135. {
  136.  
  137.   if (m1.wiersze != m2.wiersze || m1.kolumny != m2.kolumny)
  138.      cerr << "Wymiary macierzy nie sa zgodne, nie mozna wykonac odejmowania";
  139.   else
  140.   { macierz m3(m1);
  141.       for (int i=0; i<m3.wiersze; i++)
  142.           for (int j=0; j<m3.kolumny; j++)
  143.           {
  144.               m3.tablica[i][j] -= m2.tablica[i][j];
  145.           }
  146.           return m3;
  147.   }
  148.  
  149.    
  150. }
  151. ///////////////////////////////////////////////////////////////////////////////////
  152. macierz operator*(const macierz &m1, const macierz &m2)
  153. {
  154.   if (m1.kolumny != m2.wiersze)
  155.      cerr << "Wymiary macierzy nie sa zgodne, nie mozna wykonac mnozenia";
  156.   else  
  157.   {    macierz m3(m1);
  158.        for (int i = 0; i <m1.wiersze; i++)        
  159.            {for (int j = 0; j <m2.kolumny; j++)
  160.                {m3.tablica[i][j] = 0;}}            
  161.                
  162.        for(int i = 0; i < m1.wiersze; i++)
  163.                {for(int j = 0; j < m2.kolumny; j++){
  164.                        for(int k = 0; k < m2.wiersze; k++){
  165.        m3.tablica[i][j] = m3.tablica[i][j] + m1.tablica[i][k] * m2.tablica[k][j];}}}
  166.   return m3;
  167.   }
  168. }  
  169. //////////////////////////////////////////////////////////////////////////
  170. macierz operator*(const macierz &m1, const double skalar)
  171. {
  172. macierz m2(m1);
  173.  
  174.        for (int i = 0; i <m1.wiersze; i++)        
  175.        for (int j = 0; j <m1.kolumny; j++)
  176.        m2.tablica[i][j] = m1.tablica[i][j]*skalar;            
  177.        return m2;
  178. }  
  179. //////////////////////////////////////////////////////////////////////
  180. void wyswietlmenu(){
  181.     cout << "Program wykonujacy dzialania na macierzach\n";
  182.     cout << "1.Dodaj macierze\n";
  183.     cout << "2.Odejmij macierze\n";
  184.     cout << "3.Pomnoz macierze (A*B)\n";
  185.     cout << "4.Pomnoz przez skalar\n";
  186.     cout << "5.Transponuj (tylko dla macierzy kwadratowej)\n";
  187.     cout << "6.Wyjscie\n";
  188.     cout << "Wybierz wlasciwa opcje\n";
  189.      };
  190. ////////////////////////////////////////////////////////////////////
  191. void obslugabledow (){
  192.      cout << "Wprowadz poprawna wartosc: ";
  193.      cin.clear(); //kasowanie flagi błędu strumienia
  194.      cin.sync(); //kasowanie zawartosci bufora obiektu cin
  195.      }
  196. ///////////////////////////////////////////////////////////////////
  197. int main()
  198. {   wyswietlmenu();
  199.     int wybor;
  200.     while(!(cin>>wybor))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  201.     {obslugabledow();}
  202.    
  203.     int liczbawierszy;
  204.     int liczbakolumn;
  205.    
  206.     switch (wybor){
  207.  
  208.            case 1: {cout << "Wprowadz liczbe wierszy pierwszej macierzy: ";
  209.                    while(!(cin>>liczbawierszy))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  210.                    {obslugabledow();}
  211.                    
  212.                    cout << "Wprowadz liczbe kolumn pierwszej macierzy: ";
  213.                    while(!(cin>>liczbakolumn))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  214.                    {obslugabledow();}
  215.                    
  216.                    macierz A (liczbawierszy,liczbakolumn);
  217.                    A.WprowadzDane (liczbawierszy,liczbakolumn);
  218.                    
  219.                    cout << "Wprowadz liczbe wierszy drugiej macierzy: ";
  220.                    while(!(cin>>liczbawierszy))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  221.                    {obslugabledow();}
  222.                    cout << "Wprowadz liczbe kolumn drugiej macierzy: ";
  223.                    while(!(cin>>liczbakolumn))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  224.                    {obslugabledow();}
  225.                    
  226.                    macierz B (liczbawierszy,liczbakolumn);
  227.                    B.WprowadzDane (liczbawierszy, liczbakolumn);
  228.                    
  229.                    if (A.wiersze==B.wiersze&&A.kolumny==B.kolumny)
  230.                    {macierz C=A+(B);
  231.                    C.Wyswietl();}
  232.                    else
  233.                    {cerr << "Nie mozna wykonac dzialania\n";}
  234.                    break;}
  235.                    //DODAWANIE
  236.  
  237.            case 2: {cout << "Wprowadz liczbe wierszy pierwszej macierzy: ";
  238.                    while(!(cin>>liczbawierszy))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  239.                    {obslugabledow();}
  240.                    
  241.                    cout << "Wprowadz liczbe kolumn pierwszej macierzy: ";
  242.                    while(!(cin>>liczbakolumn))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  243.                    {obslugabledow();}
  244.                    
  245.                    macierz A (liczbawierszy,liczbakolumn);
  246.                    A.WprowadzDane(liczbawierszy, liczbakolumn);
  247.                    
  248.                    
  249.                    cout << "Wprowadz liczbe wierszy drugiej macierzy: ";
  250.                    while(!(cin>>liczbawierszy))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  251.                    {obslugabledow();}
  252.                    
  253.                    
  254.                    cout << "Wprowadz liczbe kolumn drugiej macierzy: ";
  255.                    while(!(cin>>liczbakolumn))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  256.                    {obslugabledow();}
  257.                    
  258.                    macierz B (liczbawierszy,liczbakolumn);
  259.                    B.WprowadzDane(liczbawierszy, liczbakolumn);
  260.                    if (A.wiersze==B.wiersze&&A.kolumny==B.kolumny)
  261.                    {macierz C=A-(B);
  262.                    C.Wyswietl();}
  263.                    else
  264.                    {cerr << "Nie mozna wykonac dzialania\n";}
  265.                    break;}//ODEJMOWANIE
  266.                    
  267.            case 3: {cout << "Wprowadz liczbe wierszy pierwszej macierzy: ";
  268.                    while(!(cin>>liczbawierszy))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  269.                    {obslugabledow();}
  270.                                      
  271.                    cout << "Wprowadz liczbe kolumn pierwszej macierzy: ";
  272.                    while(!(cin>>liczbakolumn))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  273.                    {obslugabledow();}
  274.                    
  275.                    macierz A (liczbawierszy,liczbakolumn);
  276.                    A.WprowadzDane(liczbawierszy, liczbakolumn);
  277.                    
  278.                    cout << "Wprowadz liczbe wierszy drugiej macierzy: ";
  279.                    while(!(cin>>liczbawierszy))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  280.                    {obslugabledow();}
  281.                    
  282.                    cout << "Wprowadz liczbe kolumn drugiej macierzy: ";
  283.                    while(!(cin>>liczbakolumn))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  284.                    {obslugabledow();}
  285.                    
  286.                    macierz B (liczbawierszy,liczbakolumn);
  287.                    B.WprowadzDane(liczbawierszy, liczbakolumn);
  288.                    
  289.                    if (A.kolumny == B.wiersze)
  290.                    {macierz C=A*(B);
  291.                    C.Wyswietl();}
  292.                    else
  293.                    cerr << "Nie mozna wykonac dzialania\n";
  294.                    break;} //MNOZENIE
  295.  
  296.            case 4: {cout << "Wprowadz liczbe wierszy pierwszej macierzy: ";
  297.                    while(!(cin>>liczbawierszy))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  298.                    {obslugabledow();}
  299.                    
  300.                    cout << "Wprowadz liczbe kolumn pierwszej macierzy: ";
  301.                    while(!(cin>>liczbakolumn))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  302.                    {obslugabledow();}
  303.                    
  304.                    macierz A (liczbawierszy,liczbakolumn);
  305.                    A.WprowadzDane(liczbawierszy, liczbakolumn);
  306.                    cout << "Wprowadz skalar: ";
  307.                    double skalar;
  308.                    
  309.                    while(!(cin>>skalar))//wykonuje sie dopoki uzytkownik bedzie wprowadzal bledne dane
  310.                    {obslugabledow();}
  311.                    macierz C=A*(skalar);
  312.                    C.Wyswietl();
  313.                    break;}
  314.                 ; //MNOZENIE PRZEZ SKALAR
  315.            case 5:break; //TRANSPONOWANIE
  316.            case 6: cout << "Koniec programu!\n";
  317.                
  318.                 break; //WYJSCIE
  319.            default:break  ;
  320.            
  321.            };
  322.      
  323.     system ("PAUSE");
  324.     return 0;
  325. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement