Advertisement
Guest User

Zadaca5_4

a guest
Jun 26th, 2017
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.85 KB | None | 0 0
  1. //TP 16/17 (Zadaća 5, Zadatak 4)
  2. //Autotestovi by Ivona Ivkovic (mail: iivkovic2@etf.unsa.ba)
  3. //Za autotestove se obracati *iskljucivo* osobi koja ih pise
  4. #include <iostream>
  5. #include <vector>
  6. #include <initializer_list>
  7. #include <stdexcept>
  8. #include <iomanip>
  9. using namespace std;
  10.  
  11. template <typename Tip>
  12. class GMatrica {
  13.     int redovi, kolone;
  14.     Tip matrica[4][4];  
  15.     public:
  16.     GMatrica();
  17.     GMatrica(int redovi, int kolone, Tip element = Tip());
  18.     template <typename Tip2>
  19.     GMatrica(const GMatrica<Tip2> &mat);
  20.     template <typename Tip2>
  21.     GMatrica(Tip2 mat[4][4]);
  22.     GMatrica(const vector<vector<Tip>> &vektor);
  23.     GMatrica(const initializer_list<initializer_list<Tip>> &mat);
  24.     int DajBrojRedova() const {
  25.         return redovi;
  26.     }
  27.     int DajBrojKolona() const {
  28.         return kolone;
  29.     }
  30.    
  31.     template <typename Tip2>
  32.     GMatrica<Tip> &operator +=(const GMatrica<Tip2> &mat);
  33.    
  34.     template <typename Tip2>
  35.     GMatrica<Tip> &operator -=(const GMatrica<Tip2> &mat);
  36.    
  37.     template <typename Tip2>
  38.     GMatrica<Tip> &operator *=(const GMatrica<Tip2> &mat);
  39.    
  40.     template<typename Tip2>
  41.     GMatrica<Tip> &operator *=(Tip2 broj);
  42.    
  43.     Tip &operator ()(int i, int j);
  44.     Tip operator ()(int i, int j) const;
  45.    
  46.     Tip *operator [](int i);
  47.    
  48.     template<typename Tip1, typename Tip2>
  49.     friend auto operator +(const GMatrica<Tip1> &m1, const GMatrica<Tip2> &m2) -> GMatrica<typename remove_reference<decltype(Tip1() + Tip2())>::type>;
  50.    
  51.     template<typename Tip1, typename Tip2>
  52.     friend auto operator -(const GMatrica<Tip1> &m1, const GMatrica<Tip2> &m2) -> GMatrica<typename remove_reference<decltype(Tip1() - Tip2())>::type>;
  53.    
  54.     template<typename Tip1, typename Tip2>
  55.     friend auto operator *(const GMatrica<Tip1> &m1, const GMatrica<Tip2> &m2) -> GMatrica<typename remove_reference<decltype(Tip1() * Tip2())>::type>;
  56.  
  57.     template<typename Tip1>
  58.     friend bool operator ==(const GMatrica<Tip1> &m1, const GMatrica<Tip1> &m2);
  59.    
  60.     template<typename Tip1>
  61.     friend bool operator !=(const GMatrica<Tip1> &m1, const GMatrica<Tip1> &m2);
  62.    
  63.     template<typename Tip1, typename Tip2>
  64.     friend auto operator *(const GMatrica<Tip1> &m1, Tip2 broj) -> GMatrica<typename remove_reference<decltype(Tip1() * Tip2())>::type>;
  65.    
  66.     template<typename Tip1, typename Tip2>
  67.     friend auto operator *(Tip1 broj, const GMatrica<Tip2> &m1) -> GMatrica<typename remove_reference<decltype(Tip1() * Tip2())>::type>;
  68.    
  69.     template<typename Tip1>
  70.     friend ostream &operator <<(ostream &tok, const GMatrica<Tip1> &m);
  71.    
  72.     template<typename Tip1>
  73.     friend istream &operator >>(istream &tok, GMatrica<Tip1> &m);
  74.    
  75. };
  76.  
  77. template <typename Tip>
  78. GMatrica<Tip>::GMatrica() : redovi(0), kolone(0) {
  79.    
  80. }
  81.  
  82. template <typename Tip>
  83. GMatrica<Tip>::GMatrica(int redovi, int kolone, Tip element) : redovi(redovi), kolone(kolone) {
  84.     if(redovi < 0 || redovi > 4 || kolone < 0 || kolone > 4) {
  85.         throw logic_error("Ilegalan format matrice");
  86.     }
  87.     for(int i=0; i < redovi; i++) {
  88.         for(int j=0; j<kolone; j++) {
  89.             matrica[i][j] = element;
  90.         }
  91.     }
  92. }
  93.  
  94. template <typename Tip>
  95. template <typename Tip2>
  96. GMatrica<Tip>::GMatrica(const GMatrica<Tip2> &mat) : redovi(mat.DajBrojRedova()), kolone(mat.DajBrojKolona()) {
  97.     for(int i=0; i < redovi; i++) {
  98.         for(int j=0; j<kolone; j++) {
  99.             matrica[i][j] = mat(i+1,j+1);
  100.         }
  101.     }
  102. }
  103.  
  104. template <typename Tip>
  105. template <typename Tip2>
  106. GMatrica<Tip>::GMatrica(Tip2 mat[4][4]) : redovi(4), kolone(4) {
  107.     for(int i=0; i<redovi; i++) {
  108.         for(int j=0; j<kolone; j++) {
  109.             matrica[i][j] = mat[i][j];
  110.         }
  111.     }
  112. }
  113.  
  114. template <typename Tip>
  115. GMatrica<Tip>::GMatrica(const vector<vector<Tip>> &vektor) : redovi(vektor.size()) {
  116.     if(redovi > 0) {
  117.         kolone = vektor[0].size();
  118.     }
  119.     if(redovi < 0 || redovi > 4 || kolone < 0 || kolone > 4) {
  120.         throw logic_error("Ilegalan format matrice");
  121.     }
  122.     for(int i=1; i < vektor.size(); i++) {
  123.         if(vektor[0].size() != vektor[i].size()) {
  124.             throw logic_error("Ilegalan format matrice");
  125.         }
  126.     }
  127.     for(int i=0; i < vektor.size(); i++) {
  128.         for(int j=0; j<vektor[i].size(); j++) {
  129.             matrica[i][j] = vektor[i][j];
  130.         }
  131.     }
  132. }
  133.  
  134. template <typename Tip>
  135. GMatrica<Tip>::GMatrica(const initializer_list<initializer_list<Tip>> &lista) {
  136.     vector<vector<Tip>> mat;
  137.     for(initializer_list<Tip> red : lista) {
  138.         vector<Tip> temp;
  139.         for(Tip e : red) {
  140.             temp.push_back(e);
  141.         }
  142.         mat.push_back(temp);
  143.     }
  144.     redovi = mat.size();
  145.     if(redovi > 0) {
  146.         kolone = mat[0].size();
  147.     }
  148.     if(redovi < 0 || redovi > 4 || kolone < 0 || kolone > 4) {
  149.         throw logic_error("Ilegalan format matrice");
  150.     }
  151.     for(int i=1; i < mat.size(); i++) {
  152.         if(mat[0].size() != mat[i].size()) {
  153.             throw logic_error("Ilegalan format matrice");
  154.         }
  155.     }
  156.     for(int i=0; i < mat.size(); i++) {
  157.         for(int j=0; j < mat[i].size(); j++) {
  158.             matrica[i][j] = mat[i][j];
  159.         }
  160.     }
  161. }
  162.  
  163. template<typename Tip>
  164. Tip* GMatrica<Tip>::operator [](int i) {
  165.     return matrica[i];
  166. }
  167.  
  168. template<typename Tip1, typename Tip2>
  169. auto operator +(const GMatrica<Tip1> &m1, const GMatrica<Tip2> &m2) -> GMatrica<typename remove_reference<decltype(Tip1() + Tip2())>::type> {
  170.     if(m1.DajBrojRedova() != m2.DajBrojRedova() || m1.DajBrojKolona() != m2.DajBrojKolona()) {
  171.         throw domain_error("Nedozvoljena operacija");
  172.     }
  173.     GMatrica<typename remove_reference<decltype(Tip1() + Tip2())>::type> temp(m1);
  174.     for(int i=0; i < m2.DajBrojRedova(); i++) {
  175.         for(int j=0; j < m2.DajBrojKolona(); j++) {
  176.             temp.matrica[i][j] += m2.matrica[i][j];
  177.         }
  178.     }
  179.     return temp;
  180. }
  181.  
  182. template<typename Tip1, typename Tip2>
  183. auto operator -(const GMatrica<Tip1> &m1, const GMatrica<Tip2> &m2) -> GMatrica<typename remove_reference<decltype(Tip1() - Tip2())>::type> {
  184.     if(m1.DajBrojRedova() != m2.DajBrojRedova() || m1.DajBrojKolona() != m2.DajBrojKolona()) {
  185.         throw domain_error("Nedozvoljena operacija");
  186.     }
  187.     GMatrica<typename remove_reference<decltype(Tip1() - Tip2())>::type> temp(m1);
  188.     for(int i=0; i < m2.DajBrojRedova(); i++) {
  189.         for(int j=0; j < m2.DajBrojKolona(); j++) {
  190.             temp.matrica[i][j] -= m2.matrica[i][j];
  191.         }
  192.     }
  193.     return temp;
  194. }
  195.  
  196. template<typename Tip1, typename Tip2>
  197. auto operator *(const GMatrica<Tip1> &m1, const GMatrica<Tip2> &m2) -> GMatrica<typename remove_reference<decltype(Tip1() * Tip2())>::type> {
  198.     if(m1.DajBrojKolona() != m2.DajBrojRedova()) {
  199.         throw domain_error("Nedozvoljena operacija");
  200.     }
  201.     GMatrica<typename remove_reference<decltype(Tip1() * Tip2())>::type> temp(m1.DajBrojRedova(), m2.DajBrojKolona());
  202.     for(int i=0; i < m1.DajBrojRedova(); i++) {
  203.         for(int j=0; j < m2.DajBrojKolona(); j++) {
  204.             for(int k=0; k < m1.DajBrojKolona(); k++) {
  205.                 temp.matrica[i][j] += m1.matrica[i][k] * m2.matrica[k][j];
  206.             }
  207.         }
  208.     }
  209.     return temp;
  210. }
  211.  
  212. template<typename Tip1, typename Tip2>
  213. auto operator *(const GMatrica<Tip1> &m1, Tip2 broj) -> GMatrica<typename remove_reference<decltype(Tip1() * Tip2())>::type> {
  214.     GMatrica<typename remove_reference<decltype(Tip1() * Tip2())>::type> temp(m1);
  215.     for(int i=0; i < m1.DajBrojRedova(); i++) {
  216.         for(int j=0; j < m1.DajBrojKolona(); j++) {
  217.             temp.matrica[i][j] *= broj;
  218.         }
  219.     }
  220.     return temp;
  221. }
  222.  
  223. template<typename Tip1, typename Tip2>
  224. auto operator *(Tip1 broj, const GMatrica<Tip2> &m1) -> GMatrica<typename remove_reference<decltype(Tip1() * Tip2())>::type> {
  225.     GMatrica<typename remove_reference<decltype(Tip1() * Tip2())>::type> temp(m1);
  226.     for(int i=0; i < m1.DajBrojRedova(); i++) {
  227.         for(int j=0; j < m1.DajBrojKolona(); j++) {
  228.             temp.matrica[i][j] *= broj;
  229.         }
  230.     }
  231.     return temp;
  232. }
  233.  
  234. template<typename Tip>
  235. template<typename Tip2>
  236. GMatrica<Tip>& GMatrica<Tip>::operator +=(const GMatrica<Tip2> &mat) {
  237.     if(DajBrojRedova() != mat.DajBrojRedova() || DajBrojKolona() != mat.DajBrojKolona()) {
  238.         throw domain_error("Nedozvoljena operacija");
  239.     }
  240.     for(int i=0; i < mat.DajBrojRedova(); i++) {
  241.         for(int j=0; j < mat.DajBrojKolona(); j++) {
  242.             matrica[i][j] += mat(i+1,j+1);
  243.         }
  244.     }
  245.     return *this;
  246. }
  247.  
  248. template<typename Tip>
  249. template<typename Tip2>
  250. GMatrica<Tip>& GMatrica<Tip>::operator -=(const GMatrica<Tip2> &mat) {
  251.     if(DajBrojRedova() != mat.DajBrojRedova() || DajBrojKolona() != mat.DajBrojKolona()) {
  252.         throw domain_error("Nedozvoljena operacija");
  253.     }
  254.     for(int i=0; i < mat.DajBrojRedova(); i++) {
  255.         for(int j=0; j < mat.DajBrojKolona(); j++) {
  256.             matrica[i][j] -= mat(i+1,j+1);
  257.         }
  258.     }
  259.     return *this;
  260. }
  261.  
  262. template<typename Tip>
  263. template<typename Tip2>
  264. GMatrica<Tip>& GMatrica<Tip>::operator *=(const GMatrica<Tip2> &mat) {
  265.     if(DajBrojKolona() != mat.DajBrojRedova() || DajBrojKolona() != mat.DajBrojKolona()) {
  266.         throw domain_error("Nedozvoljena operacija");
  267.     }
  268.     for(int i=0; i < DajBrojRedova(); i++) {
  269.         for(int j=0; j < DajBrojKolona(); j++) {
  270.             for(int k=0; k < DajBrojKolona(); k++) {
  271.                 matrica[i][j] += matrica[i][k] * mat(i+1,k+1);
  272.             }
  273.         }
  274.     }
  275.     return *this;
  276. }
  277.  
  278. template<typename Tip>
  279. template<typename Tip2>
  280. GMatrica<Tip>& GMatrica<Tip>::operator *=(Tip2 broj) {
  281.     for(int i=0; i < DajBrojRedova(); i++) {
  282.         for(int j=0; j < DajBrojKolona(); j++) {
  283.             matrica[i][j] *= broj;
  284.         }
  285.     }
  286.     return *this;
  287. }
  288.  
  289. template<typename Tip1>
  290. bool operator ==(const GMatrica<Tip1> &m1, const GMatrica<Tip1> &m2) {
  291.     if(m1.DajBrojRedova() != m2.DajBrojRedova() || m1.DajBrojKolona() != m2.DajBrojKolona()) {
  292.         return false;
  293.     }
  294.     for(int i=0; i < m1.DajBrojRedova(); i++) {
  295.         for(int j=0; j < m1.DajBrojKolona(); j++) {
  296.             if(m1.matrica[i][j] != m2.matrica[i][j]) {
  297.                 return false;
  298.             }
  299.         }
  300.     }
  301.     return true;
  302. }
  303.  
  304. template <typename Tip1>
  305. bool operator !=(const GMatrica<Tip1> &m1, const GMatrica<Tip1> &m2) {
  306.     if(m1.DajBrojRedova() != m2.DajBrojRedova() || m1.DajBrojKolona() != m2.DajBrojKolona()) {
  307.         return true;
  308.     }
  309.     for(int i=0; i < m1.DajBrojRedova(); i++) {
  310.         for(int j=0; j < m1.DajBrojKolona(); j++) {
  311.             if(m1.matrica[i][j] != m2.matrica[i][j]) {
  312.                 return true;
  313.             }
  314.         }
  315.     }
  316.     return false;
  317. }
  318.  
  319. template<typename Tip>
  320. Tip& GMatrica<Tip>::operator ()(int i, int j) {
  321.     if(i < 1 || i > redovi || j < 1 || j > kolone) {
  322.         throw range_error("Nedozvoljen indeks");
  323.     }
  324.     return matrica[i-1][j-1];
  325. }
  326.  
  327. template<typename Tip>
  328. Tip GMatrica<Tip>::operator ()(int i, int j) const {
  329.     if(i < 1 || i > redovi || j < 1 || j > kolone) {
  330.         throw range_error("Nedozvoljen indeks");
  331.     }
  332.     return matrica[i-1][j-1];
  333. }
  334.  
  335. template<typename Tip1>
  336. ostream &operator <<(ostream &tok, const GMatrica<Tip1> &m) {
  337.     int sirina(tok.width());
  338.     if(sirina < 6) {
  339.         sirina = 6;
  340.     }
  341.     for(int i=0; i < m.DajBrojRedova(); i++) {
  342.         for(int j=0; j < m.DajBrojKolona(); j++) {
  343.             tok << setw(sirina) << m.matrica[i][j];
  344.         }
  345.         tok << endl;
  346.     }
  347.     return tok;
  348. }
  349.  
  350. template<typename Tip1>
  351. istream &operator >>(istream &tok, GMatrica<Tip1> &m) {
  352.     char znak;
  353.     tok >> znak;
  354.     vector<vector<Tip1>> vektor(1,vector<Tip1>());
  355.     if(znak == '[') {
  356.         Tip1 element;
  357.         int i(0);
  358.         do {
  359.             tok >> element >> znak;
  360.             vektor[i].push_back(element);
  361.             if(znak == ';') {
  362.                 i++;
  363.                 vektor.push_back(vector<Tip1>());
  364.             } else if(znak == ',') {
  365.                 continue;
  366.             } else if(znak == ']') {
  367.                 break;
  368.             } else {
  369.                 tok.setstate(ios::failbit);
  370.                 return tok;
  371.             }
  372.         }while(znak != ']');
  373.     } else {
  374.         tok.setstate(ios::failbit);
  375.         return tok;
  376.     }
  377.     m = GMatrica<Tip1>(vektor);
  378.     return tok;
  379. }
  380.  
  381. int main() {
  382.     //orbob
  383.     GMatrica<int> m1({{1, 2}, {3, 4}});
  384.     GMatrica<double> m2{{2,3},{3,3}};
  385.     cout << m1 + m2 << endl;
  386.     cout << m1 - m2 << endl;
  387.     cout << m1 * m2 << endl;
  388.     GMatrica<int> m3(m1 *= 3);
  389.     cout << m1(1,1) << endl;
  390.     cout << m1[1][1] << endl;
  391.     cout << m3 << endl;
  392.     GMatrica<double> m4(m3);
  393.     m4 *= m3;
  394.     m3 += m2;
  395.     m1 -= m3;
  396.     m1 = m3;
  397.     if(m1 != m3) {
  398.         cout << "Nisu jednaki" << endl;
  399.     } else if(m1 == m3) {
  400.         cout << "Jednaki su" << endl;
  401.     }
  402.     m4 *= 3;
  403.     cout << m4 << endl;
  404.     return 0;
  405. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement