Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. class macierze {
  8. private:
  9. unsigned int w, k;
  10. float** a;
  11. bool sztuczna;
  12. public:
  13. macierze (unsigned int, unsigned int);
  14. ~macierze() {
  15. delete[] a[0];
  16. delete[] a;
  17. }
  18.  
  19. macierze& operator+(macierze&);
  20. macierze& operator-(macierze&);
  21. macierze& operator*(macierze&);
  22. macierze& operator=(macierze&);
  23.  
  24. macierze& operator*(float f); //mnozenie przez skalar z prawej strony
  25.  
  26. friend ostream& operator<<(ostream&, macierze&);
  27. friend istream& operator>>(istream&, macierze&);
  28.  
  29. macierze& odwracanie();
  30. };
  31.  
  32. macierze::macierze(unsigned int wi, unsigned int k) {
  33. w=wi;
  34. this->k = k; // <=> (*this).k = k;
  35. a = new float* [w]; // 'a' to tablica wskaznikow do poczatkow kolejnych wierszy
  36. float* tab = new float[w*k]; // 'tab' to wlasciwa tablica elementow macierzy
  37. for (int i=0; i<w; ++i)
  38. a[i] = tab+i*k; // przypisanie elementom 'a' adresow poczatkow kolejnych wierszy;
  39. // arytmetyka wskaznikowa
  40. sztuczna = false;
  41. }
  42.  
  43. macierze& macierze::operator+(macierze& R) {
  44. if (k==R.k && w==R.w) {
  45. macierze *m = new macierze (w, k);
  46. m->sztuczna = true;
  47. for (int i=0; i<w*k; ++i)
  48. m->a[0][i] = a[0][i]+R.a[0][i];
  49. if (R.sztuczna)
  50. delete &R;
  51. if (sztuczna)
  52. delete this;
  53. return *m;
  54. }
  55. }
  56.  
  57. macierze& macierze::operator*(macierze& R) {
  58. if (k==R.w) {
  59. macierze* XD = new macierze(w, R.k);
  60. XD->sztuczna = true; //o tym pan Mikolajczyk zapomnial albo kazal to dopisac i tak
  61. for (int i=0; i<XD->w*XD->k; ++i) { //krotsza wersja na 2 petle
  62. XD->a[0][i]=0;
  63. for (int j=0; j<k; ++j)
  64. XD->a[0][i] += a[i/XD->k][j]*R.a[j][i%XD->k];
  65. }
  66. if (R.sztuczna)
  67. delete &R;
  68. if (sztuczna)
  69. delete this;
  70. return *XD;
  71. }
  72. }
  73. macierze& macierze::operator=(macierze& wzor) {
  74. if (w==wzor.w && this->k==wzor.k) // w == this->w, this->k == k
  75. for (int i=0; i<w; ++i)
  76. for (int j=0; j<k; ++j)
  77. a[i][j]=wzor.a[i][j]; // a[i][j] == this->a[i][j]
  78. else
  79. cout << "Blad!\n";
  80. return *this; // automatycznie sciaga referencje ze zwracanej wartosci
  81. }
  82.  
  83. macierze& macierze::operator*(float f) {
  84. macierze* m = new macierze (w, k);
  85. m->sztuczna = true;
  86. for (int i=0; i<w; ++i)
  87. for (int j=0; j<k; ++j)
  88. m->a[i][j] = a[i][j]*f;
  89. if (sztuczna)
  90. delete this;
  91. return *m;
  92.  
  93. }
  94. macierze& operator*(float f, macierze& m) {
  95. return m*f; //mnozenie przez skalar jest przemienne, wiec f*m == m*f, natomiast drugi
  96. //przypadek mamy juz zalatwiony, wiec mozna AZ TAKIE NAIWNE kopiuj wklej zrobic
  97. }
  98.  
  99. macierze& macierze::operator-(macierze& R) { //definicja ponizej mnozenia przez skalar
  100. return (*this)+((-1)*R);
  101. }
  102.  
  103. ostream& operator<<(ostream& out, macierze& ktora) {
  104. for (int i=0; i<ktora.w; ++i) {
  105. for (int j=0; j<ktora.k; ++j)
  106. out << ktora.a[i][j] << '\t'; // tabulacja, ktora zrobi ladne, rowne wciecia
  107. out << endl;
  108. }
  109. if (ktora.sztuczna) //kasowanie sztucznych macierzy po wypisaniu
  110. delete &ktora;
  111. return out;
  112. }
  113. istream& operator>>(istream& in, macierze& ktora) {
  114. for (int i=0; i<ktora.w; ++i)
  115. for (int j=0; j<ktora.k; ++j) {
  116. // cout << "Element [" << i << "][" << j << "] == "; // prosta zacheta dla naszego przykladu,
  117. // scisle i czysto teoretycznie niepotrzebna
  118. in >> ktora.a[i][j];
  119. }
  120. return in;
  121. }
  122.  
  123. macierze& macierze::odwracanie() {
  124. if (w==k){
  125. macierze lol (w, 2*k);
  126. for (int i=0; i<w; ++i)
  127. for (int j=0; j<k; ++j) {
  128. lol.a[i][j] = a[i][j];
  129. lol.a[i][j+k] = (i==j) ? 1 : 0;
  130. }
  131. for (int i=0; i<w; ++i) {
  132. if (lol.a[i][i] == 0) {
  133. int j=i;
  134. while (++j<w && lol.a[j][i] == 0);
  135. if (j==w) {
  136. cout << "Macierz nieodwracalna!";
  137. return *this;
  138. }
  139. else
  140. for (int m=i; m<lol.k; ++m)
  141. swap(lol.a[i][m], lol.a[j][m]);
  142. }
  143. float wsp=lol.a[i][i];
  144. for (int m=i; m<lol.k; ++m)
  145. lol.a[i][m] /= wsp;
  146. for (int z=0; z<i; ++z)
  147. if (lol.a[z][i]) {
  148. float wp = lol.a[z][i];
  149. for (int g=i; g<lol.k; ++g)
  150. lol.a[z][g] -= wp*lol.a[i][g];
  151. }
  152. for (int z=i+1; z<lol.w; ++z)
  153. if (lol.a[z][i])
  154. for (int g=i; g<lol.k; ++g)
  155. lol.a[z][g] -= lol[z][g]*lol.a[i][g];
  156. }
  157. macierze *Wynik = new macierze (w, k);
  158. for (int i=0; i<w; ++i)
  159. for (int j=0; j<k; ++j)
  160. Wyinik->a[i][j] = lol.a[i][k+j];
  161. Wynik->sztuczna = true;
  162. if (sztuczna)
  163. delete this;
  164. return *Wynik;
  165. }
  166. else {
  167. cout << "Macierz niekwadratowa!";
  168. return *this;
  169. }
  170. }
  171.  
  172. int main() {
  173. ifstream is ("pliczek.txt");
  174. macierze n (3,4);
  175. macierze m (3,4);
  176. macierze p (4,3);
  177. float f;
  178. is >> n;
  179. is >> m;
  180. is >> p;
  181. // cout<<"Podaj skalar:";
  182. is >> f;
  183. cout << n << endl;
  184. cout << m << endl;
  185. cout << p << endl;
  186. cout << "Suma macierzy" << endl;;
  187. cout << n+m << endl;
  188. cout << "Roznica macierzy" << endl;;
  189. cout << n-m << endl;
  190. cout << "Mnozenie macierzy przez skalar f*macierz1*f" << endl;
  191. cout << f*n*f;
  192. cout << "Mnozenie macierzy1*macierz3" << endl;
  193. cout << n*p;
  194. return 0;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement