Advertisement
Guest User

Untitled

a guest
Dec 7th, 2011
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstdlib>
  4. #include "macierz.h"
  5.  
  6. Macierz::Macierz (const char *path){
  7.  
  8. fstream FILE;
  9. FILE.open (path,ios::in);
  10. if (FILE.good()){
  11. FILE >> n >> m;
  12. alokacja(n,m);
  13. wypelnijMacierz(FILE);
  14. }
  15. else {
  16. cout << "Nie mozna otworzyc ktoregos z plikow.";
  17. exit(-1);
  18. }
  19.  
  20. FILE.close();
  21. }
  22. Macierz::Macierz (int n,int m) {
  23. this->n=n;
  24. this->m=m;
  25. alokacja(n,m);
  26.  
  27. }
  28.  
  29. Macierz::Macierz(const Macierz& A){
  30. n=A.n;
  31. m=A.m;
  32. try{
  33. tab=new double *[n];
  34. for(int i=0;i<n; i++) {
  35. tab[i]=new double [m];
  36. }
  37. }
  38. catch(bad_alloc){
  39. cout<<"nie udalo sie zaalokowac pamieci"<<endl;
  40. exit(-1);
  41. }
  42. for(int i=0;i<n;i++){
  43. for(int j=0;j<m;j++){
  44. tab[i][j]=A.tab[i][j];
  45. }
  46. }
  47. }
  48.  
  49. Macierz::~Macierz() {
  50. cout<<endl<<"Hello ;P"<<endl;
  51.  
  52. for (int i = 0;i < n; i++) {
  53. delete [] tab[i];
  54. }
  55. delete [] tab;
  56.  
  57. }
  58.  
  59. void Macierz::alokacja(int n, int m){
  60. try{
  61. tab = new double*[n];
  62. for (int i=0;i< n;i++){
  63. tab[i] = new double [m];
  64. }
  65.  
  66. if (tab == NULL){
  67. throw bad_alloc();
  68. }
  69. }
  70. catch(bad_alloc){
  71. cout<<"Nie udalo sie zaalokowac pamieci"<<endl;
  72. exit(-1);
  73. }
  74. for (int i=0;i< n;i++){
  75. for (int j=0;j< m;j++){
  76. tab[i][j]=0;
  77. }
  78. }
  79. }
  80.  
  81. void Macierz::wypelnijMacierz(fstream & FILE) {
  82. for (int i = 0; i < n; i++) {
  83. for (int j = 0; j < m; j++) {
  84. FILE >> tab[i][j];
  85. }
  86. }
  87. }
  88.  
  89. ostream & operator << (ostream& out, const Macierz &A){
  90. for (int i = 0; i < A.n; i++){
  91. for (int j=0; j < A.m; j++){
  92. out.width(3);
  93. out << A.tab[i][j];
  94. }
  95. out << endl;
  96. }
  97. out << endl;
  98. return out;
  99. }
  100. double & Macierz::operator()(int N, int M) {
  101. try {
  102. if(N < 0 || N < 0 || N >= n || M >= m) {
  103. throw ZlyIndeks();
  104. }
  105. }
  106. catch(ZlyIndeks) {
  107. cout << "Zly indeks macierzy." << endl;
  108. exit(1);
  109. }
  110. return tab[N][M];
  111. }
  112. Macierz & Macierz::operator=(const Macierz &A){
  113. for(int i=0;i<this->n;i++) delete []this->tab[i];
  114. delete []this->tab;
  115. if( this != &A ) {
  116.  
  117. alokacja(A.n, A.m);
  118. n=A.n;
  119. m=A.m;
  120. for(int i=0; i<A.n; i++) {
  121. for(int j=0; j<A.m; j++) {
  122. tab[i][j] = A.tab[i][j];
  123. }
  124. }
  125. }
  126. return *this;
  127. }
  128.  
  129. Macierz Macierz::operator+(const Macierz &A){
  130. try {
  131. if (n != A.n || m !=A.m) {
  132. throw ZlyRozmiar();
  133. }
  134. }
  135. catch (ZlyRozmiar) {
  136. cout << "Blad! Macierze maja rozne rozmiary";
  137. exit(-1);
  138. }
  139. Macierz sum(*this);
  140. sum+=A;
  141. return sum;
  142. }
  143.  
  144. Macierz Macierz::operator-(const Macierz &A){
  145. try {
  146. if (n != A.n || m !=A.m) {
  147. throw ZlyRozmiar();
  148. }
  149. }
  150. catch (ZlyRozmiar) {
  151. cout << "Blad! Macierze maja rozne rozmiary";
  152. exit(-1);
  153. }
  154. Macierz roznica(*this);
  155. roznica-=A;
  156. return roznica;
  157. }
  158.  
  159. Macierz Macierz::operator*(const Macierz &A){
  160. try {
  161.  
  162. if (m != A.n) {
  163. throw ZlyRozmiar();
  164. }
  165. }
  166. catch (ZlyRozmiar) {
  167. cout << "Blad! Macierze maja niepoprawne rozmiary";
  168. exit(-1);
  169. }
  170. Macierz iloczyn(n, A.m);
  171. for (int i=0 ; i< iloczyn.n ; i++){
  172. for (int j=0 ; j< iloczyn.m ; j++){
  173. for (int k=0 ; k< A.n ; k++){
  174. iloczyn.tab[i][j]+=tab[i][k]*A.tab[k][j];
  175. }
  176. }
  177. }
  178. return iloczyn;
  179. }
  180.  
  181. Macierz & Macierz::operator+=(const Macierz &A){
  182. try {
  183. if (n != A.n || m !=A.m) {
  184. throw ZlyRozmiar();
  185. }
  186. }
  187. catch (ZlyRozmiar) {
  188. cout << "Blad! Macierze maja rozne rozmiary";
  189. exit(-1);
  190. }
  191. for (int i=0 ; i< A.n ; i++){
  192. for (int j=0 ; j< A.m ; j++){
  193. tab[i][j]+=A.tab[i][j];
  194. }
  195. }
  196. return *this;
  197. }
  198.  
  199. Macierz & Macierz::operator-=(const Macierz &A){
  200. try {
  201. if (n != A.n || m !=A.m) {
  202. throw ZlyRozmiar();
  203. }
  204. }
  205. catch (ZlyRozmiar) {
  206. cout << "Blad! Macierze maja rozne rozmiary";
  207. exit(-1);
  208. }
  209. for (int i=0 ; i< A.n ; i++){
  210. for (int j=0 ; j< A.m ; j++){
  211. tab[i][j]-=A.tab[i][j];
  212. }
  213. }
  214. return *this;
  215. }
  216.  
  217. Macierz &Macierz::operator*=(const Macierz &A){
  218. try {
  219.  
  220. if (m != A.n) {
  221. throw ZlyRozmiar();
  222. }
  223. }
  224. catch (ZlyRozmiar) {
  225. cout << "Blad! Macierze maja niepoprawne rozmiary";
  226. exit(-1);
  227. }
  228. Macierz iloczyn(n, A.m);
  229. for (int i=0 ; i< n ; i++){
  230. for (int j=0 ; j< m ; j++){
  231. for (int k=0 ; k< A.n ; k++){
  232. iloczyn.tab[i][j]+=tab[i][k]*A.tab[k][j];
  233. }
  234. }
  235. }
  236. *this=iloczyn;
  237. return *this;
  238. }
  239.  
  240. void Macierz::transponuj() {
  241. Macierz help(m,n);
  242.  
  243. for(int i=0; i<n; i++) {
  244. for(int j=0; j<m; j++) {
  245. help.tab[j][i] = tab[i][j];
  246. }
  247. }
  248. alokacja(m,n);
  249. for(int i=0; i<m; i++) {
  250. for(int j=0; j<n; j++) {
  251. tab[i][j] = help.tab[i][j];
  252. }
  253. }
  254. int tmp=m;
  255. m=this->n;
  256. n=tmp;
  257.  
  258. }
  259.  
  260.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement