Advertisement
wilk_maciej

C++ zaj2

Mar 5th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. using namespace std;
  4.  
  5. class Macierze{
  6.   friend ostream & operator<< (ostream & s1, Macierze & o1);
  7.   friend istream & operator>>(istream & s1, Macierze & o1);
  8.    
  9.  
  10.   double *ws;
  11.   int rozmiar;
  12.   public:
  13.    
  14.   Macierze(){
  15.     ws=NULL;
  16.   }
  17.   Macierze(int rozm, int wart){
  18.     rozmiar = rozm;
  19.     ws = new double[rozm*rozm];
  20.     for ( int i = 0; i < rozmiar*rozmiar; i++){
  21.             ws[i] = wart;
  22.     }
  23.  
  24.   }
  25.  
  26.   Macierze(const Macierze &o1){  // kopiujacy konstruktor, potrzebny przy dodawaniu
  27.     rozmiar = o1.rozmiar;
  28.     ws = new double[o1.rozmiar*o1.rozmiar];
  29.     for ( int i = 0; i < rozmiar*rozmiar; i++){
  30.             ws[i] = o1.ws[i];
  31.     }
  32.     }
  33.  
  34.   ~Macierze(){
  35.     if (ws!=NULL){
  36.       delete [] ws;
  37.       ws=NULL;
  38.     }
  39.   }
  40.  
  41.     Macierze & operator=(const Macierze & o1){
  42. //zwolnić pamięć dla lewej str
  43. //zarezerwować pamieć
  44. //przepisać pamieć
  45.     if (this == &o1) return *this;
  46.  
  47.     this->rozmiar = o1.rozmiar;
  48.  
  49.     if (o1.rozmiar>0){
  50.           if (this->ws!=NULL){
  51.               delete [] this->ws;
  52.           }
  53.           this->ws = new double[o1.rozmiar*o1.rozmiar];
  54.           for (int i=0;i<(o1.rozmiar*o1.rozmiar);i++){
  55.               this->ws[i] = o1.ws[i];
  56.           }
  57.     }
  58.  
  59.     return *this;
  60.     }
  61.  
  62.  
  63.     Macierze  operator+(const Macierze &o1){
  64.         Macierze wynik= Macierze(*this);
  65.         if (this->rozmiar != o1.rozmiar){
  66.             cout <<"Nie można dodać różnych macierzy!";
  67.             return wynik;
  68.         }
  69.         else{
  70.             for (int i=0;i< o1.rozmiar*o1.rozmiar; i++){
  71.                 wynik.ws[i] += o1.ws[i];
  72.             }
  73.             return wynik;
  74.         }
  75.  
  76.     }
  77.  
  78.     Macierze  operator-(const Macierze &o1){
  79.         Macierze wynik= Macierze(*this);
  80.         if (this->rozmiar != o1.rozmiar){
  81.             cout <<"nie można wykonać" <<endl;
  82.             return wynik;
  83.         }
  84.         else{
  85.             for (int i=0;i< o1.rozmiar*o1.rozmiar; i++){
  86.                 wynik.ws[i] -= o1.ws[i];
  87.             }
  88.         return wynik;
  89.  
  90.         }
  91.     }
  92.  
  93.     Macierze  operator*(const Macierze &o1){
  94. //działa już dla wszystkich
  95.         Macierze wynik= Macierze(o1.rozmiar, 0);
  96.         cout <<wynik <<endl;
  97.         if (this->rozmiar != o1.rozmiar){
  98.             cout <<"nie można wykonać" <<endl;
  99.             return wynik;
  100.         }
  101.         else{
  102.  
  103.  
  104.  
  105. /*            int count=0;
  106.             for (int i=0;i<o1.rozmiar*o1.rozmiar; i++){
  107.                 int k=0;
  108.                 int wynik_klatki=0;
  109.                 for (int j=i;j<=(o1.rozmiar*o1.rozmiar + count);j+=o1.rozmiar){
  110.                     wynik_klatki += o1.ws[k]*this->ws[j];
  111.                     k++;
  112.                 }
  113.                 count +=1;
  114.                 wynik.ws[i]=wynik_klatki;
  115. */
  116.             int n=o1.rozmiar;
  117.             for (int i=0; i<n*n;i+=n){
  118.                 for (int j=0; j<n;j++){
  119.                     for (int k=0; k<n;k++){
  120.                         cout<<i <<"=i  " <<i+j << "=i+j  XX ";          //w terminalu będzie mi pokazywać iteracje przy mnożeniu dla ułatwienia sobie wizualizacji działania tych 3 pętli
  121.                         wynik.ws[i+j]+=this->ws[k+i]*o1.ws[k*n+j];
  122.                     }
  123.                 cout <<endl;
  124.                 }
  125.             }
  126.            
  127.            
  128.         return wynik;
  129.  
  130.         }
  131.     }
  132.  
  133.  
  134.     int operator==(const Macierze &o1){
  135.         if (this->rozmiar != o1.rozmiar){
  136.             cout <<"Macierze różnych rozmiarów!" <<endl;
  137.             return 0;
  138.         }
  139.         else{
  140.             int flaga=0;
  141.             for(int i=0;i< o1.rozmiar*o1.rozmiar; i++){
  142.                 if(this->ws[i] == o1.ws[i]) flaga+=1;
  143.             }
  144.  
  145.             if(flaga==0) return 1;
  146.             else{
  147.                 return 0;
  148.             }
  149.         }
  150.     }
  151.  
  152.     int operator>=(const Macierze &o1){
  153. //operatory >= <= działają na zasadzie: zlicza sumę wszystkich elementów jednego i drugiego, a później porównuje te liczby
  154.         if (this->rozmiar != o1.rozmiar){
  155.             cout <<"Macierze różnych rozmiarów! Nie porównam" <<endl;
  156.             return 0;
  157.         }
  158.         else{
  159.             int suma1=0;
  160.             int suma2=0;
  161.             for(int i=0;i< this->rozmiar*this->rozmiar; i++){
  162.                 suma1+=this->ws[i];
  163.             }
  164.  
  165.             for(int i=0;i< o1.rozmiar*o1.rozmiar; i++){
  166.                 suma2+=o1.ws[i];
  167.             }
  168.  
  169.             if(suma1>=suma2) return 1;
  170.             else{
  171.                 return 0;
  172.             }
  173.         }
  174.     }
  175.  
  176.     int operator<=(const Macierze &o1){
  177.         if (this->rozmiar != o1.rozmiar){
  178.             cout <<"Macierze różnych rozmiarów! Nie porównam" <<endl;
  179.             return 0;
  180.         }
  181.         else{
  182.             int suma1=0;
  183.             int suma2=0;
  184.             for(int i=0;i< this->rozmiar*this->rozmiar; i++){
  185.                 suma1+=this->ws[i];
  186.             }
  187.  
  188.             for(int i=0;i< o1.rozmiar*o1.rozmiar; i++){
  189.                 suma2+=o1.ws[i];
  190.             }
  191.  
  192.             if(suma1<=suma2) return 1;
  193.             else{
  194.                 return 0;
  195.             }
  196.         }
  197.     }
  198.    
  199.     int operator!=(const Macierze &o1){
  200.         if (this->rozmiar != o1.rozmiar){
  201.             cout <<"Macierze różnych rozmiarów! Nie porównam" <<endl;
  202.             return 0;
  203.         }
  204.         else{
  205.             int roznica=0;
  206.             for(int i=0;i< this->rozmiar*this->rozmiar; i++){
  207.                 if (this->ws[i] != o1.ws[i])roznica+=1;
  208.             }
  209.  
  210.  
  211.             if(roznica!=0) return 1;
  212.             else{
  213.                 return 0;
  214.             }
  215.         }
  216.     }
  217.  
  218. //koniec klasy macierze
  219. };
  220.  
  221. ostream & operator<< (ostream & s1, Macierze & o1){
  222.   if (o1.ws!=NULL){
  223.       for(int i=0, j=1;i<(o1.rozmiar*o1.rozmiar);i++, j++){
  224.           cout << o1.ws[i] <<" " ;
  225.           if (j==o1.rozmiar){
  226.               s1<<endl;
  227.               j=0;
  228.           }
  229.       }
  230.   }
  231.   return s1;
  232. }
  233.  
  234. istream & operator>>(istream & s1, Macierze & o1){
  235.   s1>>o1.rozmiar;
  236.  
  237.   if (o1.rozmiar>0){
  238.       if (o1.ws!=NULL){
  239.           delete [] o1.ws;
  240.       }
  241.       o1.ws = new double[o1.rozmiar*o1.rozmiar];
  242.       for (int i=0;i<(o1.rozmiar*o1.rozmiar);i++){
  243.           cin >> o1.ws[i];
  244.       }
  245.   }
  246.   return s1;
  247. }
  248.  
  249.  
  250.  
  251.  
  252. int main(){
  253.   Macierze zm, zm2, zm3, zm4, zm5;
  254.   Macierze zmien(2,3);
  255.   cout << zmien <<"Podaj macierz z1."<< endl;
  256.   cin >> zm;
  257.  
  258.   cout << zm <<endl;
  259.   zm2 = zm;
  260.   cout << zm2 << endl;
  261.   zm3 = zm+zm2;
  262.   cout <<"tu sprawdź" <<endl;
  263.   cout <<zm <<endl;
  264.   cout <<zm3 <<endl;
  265.   zm4 = zm-zm2;
  266.   cout <<"odejmowanie" <<endl<<zm4 <<endl;
  267.   zm5=zm*zm2;
  268.   cout <<"mnożenie" <<endl <<zm5;
  269.  
  270.   if (zm>=zm2) cout<<"działa" <<endl;
  271.   if (zm<=zm2) cout<<"działa" <<endl;
  272.   if (zm>=zm3) cout<<"nie powinno pokazać";
  273.   if (zm!=zm3) cout<<"działa" <<endl;
  274.  
  275.  
  276.  
  277.  
  278.   zm.~Macierze();
  279.  
  280. /*  Macierze o1;
  281.     cin >> o1;
  282.     cout << o1;
  283. */
  284.   return 0;
  285. }
  286.  
  287. /*dokonczyc dodawanie klasy Macierze "c=a+b"    DONE
  288. po tych zajęciach do znaku równa się         DONE
  289. ws=NULL to to samo co this->NULL            DONE
  290.  
  291. 12.03.18r
  292. do zrobienia jescze ==, <=, >=, !=          DONE
  293. konstruktor kopiiujący,                        DONE
  294. konstruktor z 2 intami: rozmiar macierzy a reszta to wartości  DONE
  295.  
  296.  
  297. dalej nie ma mnożenia macierzy :(              DONE
  298. edit 18.03.18 mnożenie w jednowymiarowej   DONE
  299. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement