Advertisement
Guest User

Untitled

a guest
May 27th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cstring>
  4. #include <stdexcept>
  5. #include <new>
  6. #include <string>
  7. #include <algorithm>
  8. template <typename TipEl>
  9.  class Matrica {
  10.  int br_redova, br_kolona;
  11.  TipEl **elementi;
  12.  char ime_matrice;
  13.  static TipEl **AlocirajMemoriju(int br_redova, int br_kolona);
  14.  static void DealocirajMemoriju(TipEl **elementi, int br_redova);
  15.  void KopirajElemente(TipEl **elementi);
  16. public:
  17.  Matrica(int br_redova, int br_kolona, char ime = 0);
  18.  Matrica(const Matrica &m);
  19.  Matrica(Matrica &&m);
  20.  ~Matrica() { DealocirajMemoriju(elementi, br_redova); }
  21.  Matrica &operator =(const Matrica &m);
  22.  Matrica &operator =(Matrica &&m);
  23.  void Unesi();
  24.  
  25.  void Ispisi(int sirina_ispisa) const;
  26.  template <typename Tip2>
  27.  friend Matrica<Tip2> operator+(const Matrica<Tip2> &m1, const Matrica<Tip2> &m2);
  28.  template <typename Tip2>
  29.  friend Matrica<Tip2> &operator +=(Matrica<Tip2> &m1, Matrica<Tip2> &m2);
  30.  template<typename Tip2>
  31.  friend Matrica<Tip2> operator-(const Matrica<Tip2> &m1, const Matrica<Tip2> &m2);
  32.  template <typename Tip2>
  33.  friend Matrica<Tip2> &operator -=(Matrica<Tip2> &m1, Matrica<Tip2> &m2);
  34.  template<typename Tip>
  35.  friend std::istream &operator >>(std::istream &tok, Matrica<Tip> &matrica){
  36.   for(int i=0; i<matrica.br_redova; i++){
  37.    for(int j=0; j<matrica.br_kolona; j++){
  38.     std::cout<<matrica.ime_matrice<<"("<<i+1<<","<<j+1<<")=";
  39.     tok>>matrica.elementi[i][j];
  40.    }
  41.   }
  42.   return tok;
  43.  }
  44.  TipEl *operator[] (int i)const{
  45.   return elementi[i];
  46.  }
  47.  operator std::string() {
  48.   std::string recenica;
  49.   recenica += "{";
  50.   for(int i=0; i<br_redova; i++){
  51.    recenica +="{";
  52.    for(int j=0; j<br_kolona; j++){
  53.     std::string s;
  54.     std::string novi;
  55.     int n=this->elementi[i][j];
  56.  
  57.     int brojac=0;
  58.     while(n!=0){
  59.      s.push_back(n%10+'0');
  60.      n=n/10;
  61.      brojac++;
  62.     }
  63.     novi.resize(brojac);
  64.     std::reverse_copy(s.begin(), s.end(), novi.begin());
  65.     recenica += novi;
  66.     if(j<br_kolona-1){
  67.      recenica+=",";
  68.     }
  69.    
  70.    }
  71.    recenica+="}";
  72.    if(i<br_redova-1) recenica += ",";
  73.   }
  74.   recenica += "}";
  75.   return recenica;
  76.  }
  77.  };
  78.  template<typename Tip2>
  79.  Matrica<Tip2> operator +(const Matrica<Tip2>&m1, const Matrica<Tip2>&m2){
  80.   if(m1.br_redova!=m2.br_redova || m1.br_kolona!=m2.br_kolona) throw std::domain_error("Matrice nemaju jednake dimenzije!");
  81.  Matrica<Tip2>m(m1.br_redova,m1.br_kolona);
  82.  for(int i=0; i<m1.br_redova; i++){
  83.   for(int j=0; j<m1.br_kolona; j++){
  84.    m.elementi[i][j]=m1.elementi[i][j]+m2.elementi[i][j];
  85.   }
  86.  }
  87.  return m;
  88.  }
  89.  template<typename Tip2>
  90.  Matrica<Tip2> operator -(const Matrica<Tip2>&m1, const Matrica<Tip2>&m2){
  91.   if(m1.br_redova!=m2.br_redova || m1.br_kolona!=m2.br_kolona) throw std::domain_error("Matrice nemaju jednake dimenzije!");
  92.  Matrica<Tip2>m(m1.br_redova,m1.br_kolona);
  93.  for(int i=0; i<m1.br_redova; i++){
  94.   for(int j=0; j<m1.br_kolona; j++){
  95.    m.elementi[i][j]=m1.elementi[i][j]-m2.elementi[i][j];
  96.   }
  97.  }
  98.  return m;
  99.  }
  100.  template<typename Tip2>
  101.  Matrica<Tip2> operator -=( Matrica<Tip2>&m1, const Matrica<Tip2>&m2){
  102.   if(m1.br_redova!=m2.br_redova || m1.br_kolona!=m2.br_kolona) throw std::domain_error("Matrice nemaju jednake dimenzije!");
  103.  for(int i=0; i<m1.br_redova; i++){
  104.   for(int j=0; j<m1.br_kolona; j++){
  105.    m1.elementi[i][j]-=m2.elementi[i][j];
  106.   }
  107.  }
  108.  return m1;
  109.  }
  110.  template<typename Tip2>
  111.  Matrica<Tip2> &operator +=(  Matrica<Tip2>&m1, const Matrica<Tip2>&m2){
  112.   if(m1.br_redova!=m2.br_redova || m1.br_kolona!=m2.br_kolona) throw std::domain_error("Matrice nemaju jednake dimenzije!");
  113.  for(int i=0; i<m1.br_redova; i++){
  114.   for(int j=0; j<m1.br_kolona; j++){
  115.    m1.elementi[i][j]+=m2.elementi[i][j];
  116.   }
  117.  }
  118.  return m1;
  119.  }
  120.  
  121. template <typename TipEl>
  122.  TipEl ** Matrica<TipEl>::AlocirajMemoriju(int br_redova, int br_kolona) {
  123.  TipEl **elementi(new TipEl*[br_redova]{});
  124.  try {
  125.  for(int i = 0; i < br_redova; i++) elementi[i] = new TipEl[br_kolona];
  126.  }
  127.  catch(...) {
  128.  DealocirajMemoriju(elementi, br_redova);
  129.  throw;
  130.  }
  131.  return elementi;
  132.  }
  133. template <typename TipEl>
  134.  void Matrica<TipEl>::DealocirajMemoriju(TipEl **elementi, int br_redova) {
  135.  for(int i = 0; i < br_redova; i++) delete[] elementi[i];
  136.  delete[] elementi;
  137.  }
  138. template <typename TipEl>
  139.  Matrica<TipEl>::Matrica(int br_redova, int br_kolona, char ime) :
  140.  br_redova(br_redova), br_kolona(br_kolona), ime_matrice(ime),
  141.  elementi(AlocirajMemoriju(br_redova, br_kolona)) {}
  142. template <typename TipEl>
  143.  void Matrica<TipEl>::KopirajElemente(TipEl **elementi) {
  144.  for(int i = 0; i < br_redova; i++)
  145.  for(int j = 0; j < br_kolona; j++)
  146.  Matrica::elementi[i][j] = elementi[i][j];
  147.  }
  148. template <typename TipEl>
  149.  Matrica<TipEl>::Matrica(const Matrica<TipEl> &m) : br_redova(m.br_redova),
  150.  br_kolona(m.br_kolona), ime_matrice(m.ime_matrice),
  151.  elementi(AlocirajMemoriju(m.br_redova, m.br_kolona)) {
  152.  KopirajElemente(m.elementi);
  153.  }
  154. template <typename TipEl>
  155.  Matrica<TipEl>::Matrica(Matrica<TipEl> &&m) : br_redova(m.br_redova),
  156.  br_kolona(m.br_kolona), elementi(m.elementi), ime_matrice(m.ime_matrice) {
  157.  m.br_redova = 0; m.elementi = nullptr;
  158.  }
  159. template <typename TipEl>
  160.  Matrica<TipEl> &Matrica<TipEl>::operator =(const Matrica<TipEl> &m) {
  161.  if(br_redova < m.br_redova || br_kolona < m.br_kolona) {
  162.  TipEl **novi_prostor(AlocirajMemoriju(m.br_redova, m.br_kolona));
  163.  DealocirajMemoriju(elementi, br_redova);
  164.  elementi = novi_prostor;
  165.  }
  166.  else if(br_redova > m.br_redova)
  167.  for(int i = m.br_redova; i < br_redova; i++) delete elementi[i];
  168.  br_redova = m.br_redova; br_kolona = m.br_kolona;
  169.  ime_matrice = m.ime_matrice;
  170.  KopirajElemente(m.elementi);
  171.  return *this;
  172.  }
  173. template <typename TipEl>
  174. Matrica<TipEl> &Matrica<TipEl>::operator =(Matrica<TipEl> &&m) {
  175.  std::swap(br_redova, m.br_redova); std::swap(br_kolona, m.br_kolona);
  176.  std::swap(ime_matrice, m.ime_matrice); std::swap(elementi, m.elementi);
  177.  return *this;
  178.  }
  179.  template <typename TipEl>
  180.  void Matrica<TipEl>::Unesi() {
  181.  for(int i = 0; i < br_redova; i++)
  182.  for(int j = 0; j < br_kolona; j++) {
  183.  std::cout << ime_matrice << "(" << i + 1 << "," << j + 1 << ") = ";
  184.  std::cin >> elementi[i][j];
  185.  }
  186.  }
  187. template <typename TipEl>
  188.  void Matrica<TipEl>::Ispisi(int sirina_ispisa) const {
  189.  for(int i = 0; i < br_redova; i++) {
  190.  for(int j = 0; j < br_kolona; j++)
  191.  std::cout << std::setw(sirina_ispisa) << elementi[i][j];
  192.  std::cout << std::endl;
  193.  }
  194.  }/*
  195. template <typename TipEl>
  196.  Matrica<TipEl> ZbirMatrica(const Matrica<TipEl> &m1,
  197.  const Matrica<TipEl> &m2) {
  198.  if(m1.br_redova != m2.br_redova || m1.br_kolona != m2.br_kolona)
  199.  throw std::domain_error("Matrice nemaju jednake dimenzije!");
  200.  Matrica<TipEl> m3(m1.br_redova, m1.br_kolona);
  201.  for(int i = 0; i < m1.br_redova; i++)
  202.  for(int j = 0; j < m1.br_kolona; j++)
  203.  m3.elementi[i][j] = m1.elementi[i][j] + m2.elementi[i][j];
  204.  return m3;
  205.  }*/
  206.  int main(){
  207.    try {
  208. Matrica<double> a(2, 2, 'a');
  209. a[0][0] = 10; a[0][1] = 2;
  210. a[1][0] = 4; a[1][1] = 5;
  211. std::cout << std::string(a);
  212.   }
  213.   catch(std::bad_alloc) {
  214.     std::cout << "Nema dovoljno memorije!\n";
  215.   }
  216.     catch(std::domain_error e) {
  217.     std::cout << e.what();
  218.   }
  219.     catch(std::range_error e) {
  220.     std::cout << e.what();
  221.   }
  222.  }
  223. int smain() {
  224.  int m, n;
  225.  std::cout << "Unesi broj redova i kolona za matrice:\n";
  226.  std::cin >> m >> n;
  227.  try {
  228.  Matrica<double> a(m, n, 'A'), b(m, n, 'B');
  229.  std::cout << "Unesi matricu A:\n";
  230.  a.Unesi();
  231.  std::cout << "Unesi matricu B:\n";
  232.  b.Unesi();
  233.  std::cout << "Zbir ove dvije matrice je:\n";
  234. // ZbirMatrica(a, b).Ispisi(7);
  235.  }
  236.  catch(std::bad_alloc) {
  237.  std::cout << "Nema dovoljno memorije!\n";
  238.  }
  239.  
  240.  return 0;
  241. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement