Transponowanie macierzy

0

Witam, jest sobie coś takiego...:

#include<iostream>
#include<stdlib.h>

using namespace std;

class MATRIX{
protected: int rows, columns; float **A, **B; //protected zamiast private-dla main jest jak private a dla klasy pochodnej jak public; zmienna jest adresem wskazujacym na zmienna w ktorej jest wskaznik
public: 
        MATRIX(int, int); //prototyp konstruktora
        MATRIX(const MATRIX& );// k.kopiujacy  //przy kopiujacym const
     ~MATRIX(); //destruktor
        float get(int, int);   //prototyp
        void set(int, int, float);   
        void set(float); //dwa sety-przeciazenie
        void print();
       void trans();
        int getrows(){ return rows; }
        int getcolumns(){ return columns; }
};
MATRIX::MATRIX(int a, int b){ //definicja konstruktora-gdy metoda jest konstruktorem musi sie nazywac jak klasa
rows=a; columns=b;
if(rows<1) rows=1; if(columns<1) columns=1;
A=new float *[rows]; //zamiast malloc jest new
for(int i=0;i<rows;i++) A[i]=new float[columns];
set(0); 
}
MATRIX::MATRIX(const MATRIX &m){ //przy kopiujacym const
rows=m.rows; columns=m.columns; A=new float *[rows];
for(int i=0;i<rows;i++) A[i]=new float[columns];
for(int i=0;i<rows;i++)
for(int j=0;j<columns;j++)
this->A[i][j]=m.A[i][j];                      
}
MATRIX::~MATRIX(){
for(int i=0;i<rows;i++) delete[] A[i]; 
delete[] A;          
}  
void  MATRIX::set(float a){
for(int j=0;j<columns;j++)
for(int i=0;i<rows;i++)   
A[i][j]=a;   
}    
void MATRIX::trans(){
    for(int i = 0; i < rows; i++) //transponowanie macierzy
   {
       for(int j = 0;j < columns; j++)
         B[j][i]=A[i][j];
   }       
}           
void MATRIX::set(int w, int k, float a){
if(w<1||w>rows||k<1||k>columns){ cout << "przekroczony zakres!!!\n"; abort(); } 
A[w-1][k-1]=a;    
}
float MATRIX::get(int w, int k){
if(w<1||w>rows||k<1||k>columns){ cout << "przekroczony zakres!!!\n"; abort(); } 
return A[w-1][k-1];     
}
void MATRIX::print(){
for(int i=0;i<rows;i++){
for(int j=0;j<columns;j++)
cout << A[i][j] << "\t";
cout << "\n"; 
        }    
        cout << "\n"; 
}

class matrix :public MATRIX{ //klasą bazową jest klasa MATRIX
public:
       matrix(int a, int b) :MATRIX(a,b) {}
       matrix(const matrix& m) :MATRIX(m) {} //wywolanie konstruktora klasy bazowej
       matrix operator+(float); //do macierzy dodaje liczbe
//       matrix operator+(const matrix&);      
void operator=(const matrix&);
};
matrix matrix::operator+(float a){
 matrix wynik(rows,columns);
 for(int i=0;i<rows;i++) for(int j=0;j<columns;j++)
 wynik.A[i][j]=A[i][j]+a;      
 return wynik;
}           
void matrix::operator=(const matrix& m){
rows=m.rows; columns=m.columns;     
}
int main(){
    matrix M1(3,4); // M2(5,6);
    M1.set(-8);
    M1.set(2,2,7);
  
  M1.print(); //(M1+3).print();
 matrix M2(5,6); 
 M2=(M1+3);
 M2.set(1,1,-1);
  
  M2.print();
  matrix M3(3,4); M3.set(7); M3.set(1,2,3);
   M3.trans();
   M3.print();
    system("pause"); return 0;
}

Jak do 'tego' dorobić funkcję transponowania macierzy? moje żałosne próby j/w -

void trans(); void MATRIX::trans(){
    for(int i = 0; i < rows; i++) //transponowanie macierzy
   {
       for(int j = 0;j < columns; j++)
         B[j][i]=A[i][j];
   }       
}  

Coś źle zadeklarowałem, podstawiłem, a może pętla nie taka? Z góry dzięki za pomoc

0

moje żałosne próby j/w -

A może napisz jaki rezultat otrzymujesz TERAZ?

0
Azarien napisał(a)

moje żałosne próby j/w -

A może napisz jaki rezultat otrzymujesz TERAZ?

Teraz wyświetla te dwie pierwsze macierze, trzeciej już nie, program się "wiesza" i zamyka.

Przydzieliłem pamięć dla B:

#include<iostream>
#include<stdlib.h>

using namespace std;

class MATRIX{
protected: int rows, columns; float **A, **B; //protected zamiast private-dla main jest jak private a dla klasy pochodnej jak public; zmienna jest adresem wskazujacym na zmienna w ktorej jest wskaznik
public: 
        MATRIX(int, int); //prototyp konstruktora
        MATRIX(const MATRIX& );// k.kopiujacy  //przy kopiujacym const
     ~MATRIX(); //destruktor
        float get(int, int);   //prototyp
        void set(int, int, float);   
        void set(float); //dwa sety-przeciazenie
        void print();
       void trans();
        int getrows(){ return rows; }
        int getcolumns(){ return columns; }
};
MATRIX::MATRIX(int a, int b){ //definicja konstruktora-gdy metoda jest konstruktorem musi sie nazywac jak klasa
rows=a; columns=b;
if(rows<1) rows=1; if(columns<1) columns=1;
A=new float *[rows]; //zamiast malloc jest new
for(int i=0;i<rows;i++) A[i]=new float[columns];
set(0); 
B=new float *[columns]; //zamiast malloc jest new
for(int i=0;i<columns;i++) B[i]=new float[rows];
set(0); 
}
MATRIX::MATRIX(const MATRIX &m){ //przy kopiujacym const
rows=m.rows; columns=m.columns; A=new float *[rows];
for(int i=0;i<rows;i++) A[i]=new float[columns];
for(int i=0;i<rows;i++)
for(int j=0;j<columns;j++)
this->A[i][j]=m.A[i][j];                      
}
MATRIX::~MATRIX(){
for(int i=0;i<rows;i++) delete[] A[i]; 
delete[] A;          
}  
void  MATRIX::set(float a){
for(int j=0;j<columns;j++)
for(int i=0;i<rows;i++)   
A[i][j]=a;   
}    
void MATRIX::trans(){
    for(int i = 0; i < rows; i++) //transponowanie macierzy
   
       for(int j = 0;j < columns; j++)
         B[j][i]=A[i][j];
         
}            
void MATRIX::set(int w, int k, float a){
if(w<1||w>rows||k<1||k>columns){ cout << "przekroczony zakres!!!\n"; abort(); } 
A[w-1][k-1]=a;    
}
float MATRIX::get(int w, int k){
if(w<1||w>rows||k<1||k>columns){ cout << "przekroczony zakres!!!\n"; abort(); } 
return A[w-1][k-1];     
}
void MATRIX::print(){
for(int i=0;i<rows;i++){
for(int j=0;j<columns;j++)
cout << A[i][j] << "\t";
cout << "\n"; 
        }    
        cout << "\n"; 
}

class matrix :public MATRIX{ //klasą bazową jest klasa MATRIX
public:
       matrix(int a, int b) :MATRIX(a,b) {}
       matrix(const matrix& m) :MATRIX(m) {} //wywolanie konstruktora klasy bazowej
       matrix operator+(float); //do macierzy dodaje liczbe
//       matrix operator+(const matrix&);      
void operator=(const matrix&);
};
matrix matrix::operator+(float a){
 matrix wynik(rows,columns);
 for(int i=0;i<rows;i++) for(int j=0;j<columns;j++)
 wynik.A[i][j]=A[i][j]+a;      
 return wynik;
}           
void matrix::operator=(const matrix& m){
rows=m.rows; columns=m.columns;     
}
int main(){
    matrix M1(3,4); // M2(5,6);
    M1.set(-8);
    M1.set(2,2,7);
  
  M1.print(); //(M1+3).print();
 matrix M2(5,6); 
 M2=(M1+3);
 M2.set(1,1,-1);
  
  M2.print();
  matrix M3(3,4); M3.set(7); M3.set(1,2,3);
   M3.trans();
   M3.print();
    system("pause"); return 0;
}

kompiluje się, ale nie transponuje tej trzeciej macierzy...

0

kto pomoże?

1 użytkowników online, w tym zalogowanych: 0, gości: 1