Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- using namespace std;
- class Macierze{
- friend ostream & operator<< (ostream & s1, Macierze & o1);
- friend istream & operator>>(istream & s1, Macierze & o1);
- double *ws;
- int rozmiar;
- public:
- Macierze(){
- ws=NULL;
- }
- Macierze(int rozm, int wart){
- rozmiar = rozm;
- ws = new double[rozm*rozm];
- for ( int i = 0; i < rozmiar*rozmiar; i++){
- ws[i] = wart;
- }
- }
- Macierze(const Macierze &o1){ // kopiujacy konstruktor, potrzebny przy dodawaniu
- rozmiar = o1.rozmiar;
- ws = new double[o1.rozmiar*o1.rozmiar];
- for ( int i = 0; i < rozmiar*rozmiar; i++){
- ws[i] = o1.ws[i];
- }
- }
- ~Macierze(){
- if (ws!=NULL){
- delete [] ws;
- ws=NULL;
- }
- }
- Macierze & operator=(const Macierze & o1){
- //zwolnić pamięć dla lewej str
- //zarezerwować pamieć
- //przepisać pamieć
- if (this == &o1) return *this;
- this->rozmiar = o1.rozmiar;
- if (o1.rozmiar>0){
- if (this->ws!=NULL){
- delete [] this->ws;
- }
- this->ws = new double[o1.rozmiar*o1.rozmiar];
- for (int i=0;i<(o1.rozmiar*o1.rozmiar);i++){
- this->ws[i] = o1.ws[i];
- }
- }
- return *this;
- }
- Macierze operator+(const Macierze &o1){
- Macierze wynik= Macierze(*this);
- if (this->rozmiar != o1.rozmiar){
- cout <<"Nie można dodać różnych macierzy!";
- return wynik;
- }
- else{
- for (int i=0;i< o1.rozmiar*o1.rozmiar; i++){
- wynik.ws[i] += o1.ws[i];
- }
- return wynik;
- }
- }
- Macierze operator-(const Macierze &o1){
- Macierze wynik= Macierze(*this);
- if (this->rozmiar != o1.rozmiar){
- cout <<"nie można wykonać" <<endl;
- return wynik;
- }
- else{
- for (int i=0;i< o1.rozmiar*o1.rozmiar; i++){
- wynik.ws[i] -= o1.ws[i];
- }
- return wynik;
- }
- }
- Macierze operator*(const Macierze &o1){
- //działa już dla wszystkich
- Macierze wynik= Macierze(o1.rozmiar, 0);
- cout <<wynik <<endl;
- if (this->rozmiar != o1.rozmiar){
- cout <<"nie można wykonać" <<endl;
- return wynik;
- }
- else{
- /* int count=0;
- for (int i=0;i<o1.rozmiar*o1.rozmiar; i++){
- int k=0;
- int wynik_klatki=0;
- for (int j=i;j<=(o1.rozmiar*o1.rozmiar + count);j+=o1.rozmiar){
- wynik_klatki += o1.ws[k]*this->ws[j];
- k++;
- }
- count +=1;
- wynik.ws[i]=wynik_klatki;
- */
- int n=o1.rozmiar;
- for (int i=0; i<n*n;i+=n){
- for (int j=0; j<n;j++){
- for (int k=0; k<n;k++){
- cout<<i <<"=i " <<i+j << "=i+j XX "; //w terminalu będzie mi pokazywać iteracje przy mnożeniu dla ułatwienia sobie wizualizacji działania tych 3 pętli
- wynik.ws[i+j]+=this->ws[k+i]*o1.ws[k*n+j];
- }
- cout <<endl;
- }
- }
- return wynik;
- }
- }
- int operator==(const Macierze &o1){
- if (this->rozmiar != o1.rozmiar){
- cout <<"Macierze różnych rozmiarów!" <<endl;
- return 0;
- }
- else{
- int flaga=0;
- for(int i=0;i< o1.rozmiar*o1.rozmiar; i++){
- if(this->ws[i] == o1.ws[i]) flaga+=1;
- }
- if(flaga==0) return 1;
- else{
- return 0;
- }
- }
- }
- int operator>=(const Macierze &o1){
- //operatory >= <= działają na zasadzie: zlicza sumę wszystkich elementów jednego i drugiego, a później porównuje te liczby
- if (this->rozmiar != o1.rozmiar){
- cout <<"Macierze różnych rozmiarów! Nie porównam" <<endl;
- return 0;
- }
- else{
- int suma1=0;
- int suma2=0;
- for(int i=0;i< this->rozmiar*this->rozmiar; i++){
- suma1+=this->ws[i];
- }
- for(int i=0;i< o1.rozmiar*o1.rozmiar; i++){
- suma2+=o1.ws[i];
- }
- if(suma1>=suma2) return 1;
- else{
- return 0;
- }
- }
- }
- int operator<=(const Macierze &o1){
- if (this->rozmiar != o1.rozmiar){
- cout <<"Macierze różnych rozmiarów! Nie porównam" <<endl;
- return 0;
- }
- else{
- int suma1=0;
- int suma2=0;
- for(int i=0;i< this->rozmiar*this->rozmiar; i++){
- suma1+=this->ws[i];
- }
- for(int i=0;i< o1.rozmiar*o1.rozmiar; i++){
- suma2+=o1.ws[i];
- }
- if(suma1<=suma2) return 1;
- else{
- return 0;
- }
- }
- }
- int operator!=(const Macierze &o1){
- if (this->rozmiar != o1.rozmiar){
- cout <<"Macierze różnych rozmiarów! Nie porównam" <<endl;
- return 0;
- }
- else{
- int roznica=0;
- for(int i=0;i< this->rozmiar*this->rozmiar; i++){
- if (this->ws[i] != o1.ws[i])roznica+=1;
- }
- if(roznica!=0) return 1;
- else{
- return 0;
- }
- }
- }
- //koniec klasy macierze
- };
- ostream & operator<< (ostream & s1, Macierze & o1){
- if (o1.ws!=NULL){
- for(int i=0, j=1;i<(o1.rozmiar*o1.rozmiar);i++, j++){
- cout << o1.ws[i] <<" " ;
- if (j==o1.rozmiar){
- s1<<endl;
- j=0;
- }
- }
- }
- return s1;
- }
- istream & operator>>(istream & s1, Macierze & o1){
- s1>>o1.rozmiar;
- if (o1.rozmiar>0){
- if (o1.ws!=NULL){
- delete [] o1.ws;
- }
- o1.ws = new double[o1.rozmiar*o1.rozmiar];
- for (int i=0;i<(o1.rozmiar*o1.rozmiar);i++){
- cin >> o1.ws[i];
- }
- }
- return s1;
- }
- int main(){
- Macierze zm, zm2, zm3, zm4, zm5;
- Macierze zmien(2,3);
- cout << zmien <<"Podaj macierz z1."<< endl;
- cin >> zm;
- cout << zm <<endl;
- zm2 = zm;
- cout << zm2 << endl;
- zm3 = zm+zm2;
- cout <<"tu sprawdź" <<endl;
- cout <<zm <<endl;
- cout <<zm3 <<endl;
- zm4 = zm-zm2;
- cout <<"odejmowanie" <<endl<<zm4 <<endl;
- zm5=zm*zm2;
- cout <<"mnożenie" <<endl <<zm5;
- if (zm>=zm2) cout<<"działa" <<endl;
- if (zm<=zm2) cout<<"działa" <<endl;
- if (zm>=zm3) cout<<"nie powinno pokazać";
- if (zm!=zm3) cout<<"działa" <<endl;
- zm.~Macierze();
- /* Macierze o1;
- cin >> o1;
- cout << o1;
- */
- return 0;
- }
- /*dokonczyc dodawanie klasy Macierze "c=a+b" DONE
- po tych zajęciach do znaku równa się DONE
- ws=NULL to to samo co this->NULL DONE
- 12.03.18r
- do zrobienia jescze ==, <=, >=, != DONE
- konstruktor kopiiujący, DONE
- konstruktor z 2 intami: rozmiar macierzy a reszta to wartości DONE
- dalej nie ma mnożenia macierzy :( DONE
- edit 18.03.18 mnożenie w jednowymiarowej DONE
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement