fork download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <new>
  4. #include <stdexcept>
  5. #include <vector>
  6.  
  7. template <typename TipElemenata> struct Matrica
  8. {
  9. char ime_matrice; // Koristi se samo u funkciji "UnesiMatricu"
  10. int br_redova, br_kolona;
  11. TipElemenata ** elementi = nullptr; // VEOMA BITNA INICIJALIZACIJA!!!
  12. };
  13. template <typename TipElemenata> void UnistiMatricu(Matrica <TipElemenata> & mat)
  14. {
  15. if(!mat.elementi) return;
  16. for(int i = 0; i < mat.br_redova; i++) delete[] mat.elementi[i];
  17. delete[] mat.elementi;
  18. mat.elementi = nullptr;
  19. }
  20. template <typename TipElemenata> Matrica <TipElemenata> StvoriMatricu(int br_redova, int br_kolona, char ime = 0)
  21. {
  22. Matrica <TipElemenata> mat;
  23. mat.br_redova = br_redova;
  24. mat.br_kolona = br_kolona;
  25. mat.ime_matrice = ime;
  26. mat.elementi = new TipElemenata * [br_redova]{};
  27. try
  28. {
  29. for(int i = 0; i <br_redova; i++) mat.elementi[i] = new TipElemenata[br_kolona];
  30. }
  31. catch (...)
  32. {
  33. UnistiMatricu(mat);
  34. throw;
  35. }
  36. return mat;
  37. }
  38. template <typename TipElemenata> void UnesiMatricu(Matrica <TipElemenata> & mat)
  39. {
  40. for(int i = 0; i < mat.br_redova; i++)
  41. for(int j = 0; j < mat.br_kolona; j++)
  42. {
  43. std::cout << mat.ime_matrice <<"(" <<i + 1 <<"," <<j + 1 <<") = ";
  44. std::cin>> mat.elementi[i][j];
  45. }
  46. }
  47. template <typename TipElemenata> void IspisiMatricu(const Matrica <TipElemenata> & mat, int sirina_ispisa,
  48. int preciznost = 6, bool treba_brisati = false)
  49. {
  50. for(int i = 0; i < mat.br_redova; i++)
  51. {
  52. for(int j = 0; j < mat.br_kolona; j++) std::cout <<std::setw(sirina_ispisa)
  53. <<std::setprecision(preciznost) <<mat.elementi[i][j];
  54. std::cout <<std::endl;
  55. }
  56. if(treba_brisati)
  57. {
  58. auto del = mat;
  59. UnistiMatricu(del);
  60. }
  61. }
  62. template <typename TipElemenata> Matrica <TipElemenata> Jedinicna(const int br_redova, const int br_kolona, char ime = 'I')
  63. {
  64. try
  65. {
  66. auto I = StvoriMatricu<TipElemenata>(br_redova, br_kolona, ime);
  67. Nuliraj(I);
  68. for(int j = 0; j < br_kolona; j++) I.elementi[j][j] = 1;
  69. return I;
  70. }
  71. catch(...)
  72. {
  73. throw;
  74. }
  75. }
  76. template <typename TipElemenata> Matrica <TipElemenata> ZbirMatrica(const Matrica <TipElemenata> & m1,
  77. const Matrica <TipElemenata> & m2)
  78. {
  79. if(m1.br_redova != m2.br_redova || m1.br_kolona != m2.br_kolona) throw std::domain_error("Matrice nemaju jednake dimenzije!");
  80. try
  81. {
  82. auto m3 = StvoriMatricu <TipElemenata> (m1.br_redova, m1.br_kolona);
  83. for(int i = 0; i < m1.br_redova; i++)
  84. for(int j = 0; j < m1.br_kolona; j++) m3.elementi[i][j] = m1.elementi[i][j] + m2.elementi[i][j];
  85. return m3;
  86. }
  87. catch(...)
  88. {
  89. throw;
  90. }
  91.  
  92. }
  93.  
  94. template <typename TipElemenata> Matrica <TipElemenata> ProduktMatrica(const Matrica <TipElemenata> & m1,
  95. const Matrica <TipElemenata> & m2)
  96. {
  97. if(m1.br_kolona != m2.br_redova) throw std::domain_error("Matrice nisu saglasne za mnozenje");
  98. Matrica <TipElemenata> m3{};
  99. try
  100. {
  101. m3 = StvoriMatricu <TipElemenata> (m1.br_redova, m2.br_kolona);
  102. Nuliraj(m3);
  103. for(int i{}; i < m1.br_redova; i++)
  104. {
  105. TipElemenata element_nove{};
  106. for(int k{}; k < m2.br_kolona; k++)
  107. {
  108. element_nove = 0;
  109. for(int j{}; j < m1.br_kolona; j++)
  110. {
  111. element_nove += m1.elementi[i][j] * m2.elementi[j][k];
  112. }
  113. m3.elementi[i][k] = element_nove;
  114. }
  115. }
  116. }
  117. catch(...)
  118. {
  119. throw;
  120. }
  121. return m3;
  122. }
  123.  
  124. template <typename TipElemenata> void PomnoziSkalarom(Matrica <TipElemenata> & A, double skalar)
  125. {
  126. for(int i{}; i < A.br_redova; i++)
  127. for(int j{}; j < A.br_kolona; j++) A.elementi[i][j] *= skalar;
  128. }
  129.  
  130. template <typename TipElemenata> void Nuliraj(Matrica <TipElemenata> &A)
  131. {
  132. for(int i = 0; i < A.br_redova; i++)
  133. for(int j = 0; j < A.br_kolona; j++)
  134. A.elementi[i][j] = 0;
  135. }
  136. template <typename TipElemenata> Matrica <TipElemenata> MatricniPolinom(const Matrica <TipElemenata> & A,
  137. std::vector<double> p)
  138. {
  139. if(A.br_kolona != A.br_redova) throw std::domain_error("Matrica mora biti kvadratna");
  140. try
  141. {
  142. if(p.size() == 0)
  143. {
  144. auto nova = StvoriMatricu<TipElemenata>(A.br_redova, A.br_kolona, 'O');
  145. return nova;
  146. }
  147. auto N = StvoriMatricu<TipElemenata>(A.br_redova, A.br_kolona);
  148. Nuliraj(N);
  149. for(int i = 0; i < p.size(); i++)
  150. {
  151. auto rez = Jedinicna<TipElemenata>(A.br_redova, A.br_kolona);
  152. for(int j = 0; j < i; j++)
  153. {
  154. auto temp = ProduktMatrica(A, rez);
  155. UnistiMatricu(rez);
  156. rez = temp;
  157. }
  158. PomnoziSkalarom(rez, p.at(i));
  159. auto temp = ZbirMatrica(N, rez);
  160. UnistiMatricu(N);
  161. N = temp;
  162. }
  163. return N;
  164. }
  165. catch(...)
  166. {
  167. throw;
  168. }
  169. }
  170. int main()
  171. {
  172. int vel{};
  173. Matrica <double> A{};
  174. std::cout<<"Unesite dimenziju kvadratne matrice: ";
  175. std::cin>>vel;
  176. try
  177. {
  178. A = StvoriMatricu <double> (vel, vel, 'A');
  179. UnesiMatricu(A);
  180. }
  181. catch (std::bad_alloc)
  182. {
  183. std::cout <<"Nema dovoljno memorije!\n";
  184. }
  185. int red{};
  186. std::cout<<"Unesite red polinoma: ";
  187. std::cin>>red;
  188. std::cout<<"Unesite koeficijente polinoma: ";
  189. std::vector<double> koef(red + 1);
  190. for(int i{}; i <= red; i++) std::cin>> koef.at(i);
  191. auto P = MatricniPolinom(A, koef);
  192. UnistiMatricu(A);
  193. IspisiMatricu(P, 10, 6, true);
  194. //UnistiMatricu(P);
  195. return 0;
  196. }
Success #stdin #stdout 0.01s 5184KB
stdin
Standard input is empty
stdout
Unesite dimenziju kvadratne matrice: Unesite red polinoma: Unesite koeficijente polinoma: