@Vilmof20

Как создать класс, который проверяет, является матрица нормальной?

Необходимо создать класс, который проверяет, является матрица нормальной (размерность матрицы и ее элементы вводятся с клавиатуры пользователем). Но мне непонятно, как реализовать это на C++.

Когда я создаю два объекта, каждый имеет матрицу и мне нужно получить две матрицы одну введенную и другую транспонированную относительно введенной, чтобы я мог их умножит поэлементно и получить единичную матрицу.

Проблема в том, что я хочу передать элементы матрицы А в объект B в оригинале и сохранить там их статическими, а транспонировать только объект А и получить две матрицы над которыми можно сделать соответствующие математические операции, когда я транспонирую матрицу А, то и транспонируются элементы в B матрицы, а мне такое не нужно.

Мои наработки:

#include<iostream>
#include<cstdlib>
#include<conio.h>
using namespace std;
class Myclass{
    public:
    int rows;
    int cols;
    int **arr;
    
    Myclass(int rows,int cols)
    {
     this->rows=rows;
     this->cols=cols;
     this->arr=new int*[rows];
      for(int i=0;i<rows;i++)
     {
        arr[i]=new int[cols];
        
     }  
    
    }
    
   void input(int rows,int cols)
   {
    for(int i=0;i<rows;i++)
     {
       for(int j=0;j<cols;j++)
       {
        cin>>arr[i][j];
       }
     }  
   }
   void inputb(int rows,int cols)
   {
    for(int i=0;i<rows;i++)
     {
       for(int j=0;j<cols;j++)
       {
        arr[i][j]=0;
       }
     }  
   }
   void print()
   {
    for(int i=0;i<rows;i++)
     {
       for(int j=0;j<cols;j++)
       {
        cout<<arr[i][j]<<"\t";
       }
       cout<<endl;
     }  
   }
   void transpont(int rows,int cols)
   {
    int t;
    for(int i = 0; i < rows; ++i)
    {
        for(int j = i; j < cols; ++j)
        {
            t = arr[i][j];
            arr[i][j] = arr[j][i];
            arr[j][i] = t;
        }
    }
   }
    Myclass & operator=(const Myclass &other)
        {
         this->rows=other.rows;
         this->arr=new int*[other.rows];
         for(int i=0; i<other.rows; i++)
         {
            this->arr[i]=other.arr[i];
         }
         
         return *this;
           
        }
};
int main()
{
    int r,c;
    cout<<"Enter rows:";
    cin>>r;
    cout<<"Enter cols:";
    cin>>c;
    
    Myclass a(r,c);
    Myclass b(r,c);
   
        a.input(r,c);
        b.inputb(r,c);
 
    a.print();
    a.transpont(r,c);
    cout<<"_______B____"<<endl;
    b.print();
    b=a;
    cout<<"_______B_ after b=a___"<<endl;
    b.print();
        cout<<"_______A____"<<endl;
        a.print();
 
 
    _getch();
    return 0;
}
  • Вопрос задан
  • 52 просмотра
Решения вопроса 1
@Wildlife
Во-первых, вы неверно описали оператор присваивания. Матрицу нужно полностью копировать, а не только указатели на строки. Поэтому вы и работаете с одни и тем же набором чисел.

Во-вторых, вы не выполнили Правило трёх, а, тем более, Правило пяти.

В-третьих, вы неверно написали метод транспонирования. Например, неквадратную матрицу он у вас не обработает.

И, наконец, вы запутались в логике работы и начали придумывать какие-то пути обхода проблемы, которой не существует.

Попробуйте это:

#include<iostream>
#include<cstdlib>
#include<conio.h>
using namespace std;
class Myclass {
    void create()
    {
        arr = new int* [rows];
        for (int i = 0; i < rows; i++)
            arr[i] = new int[cols];
    }
    void destroy()
    {
        for (int i = 0; i < rows; i++)
            delete[] arr[i];
        delete arr;
    }
    void copyFrom(const Myclass& other)
    {
        for (int i = 0; i < rows; ++i)
            for (int j = 0; j < cols; ++j)
                arr[i][j] = other.arr[i][j];
    }
public:
    int rows;
    int cols;
    int** arr;
 
    Myclass(int r, int c) : rows(r), cols(c), arr(nullptr)
    {
        create();
    }
    Myclass(const Myclass& other) : rows(other.rows), cols(other.cols), arr(nullptr)
    {
        create();
        copyFrom(other);
    }
    ~Myclass()
    {
        destroy();
    }
 
    void input(int rows, int cols)
    {
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                cin >> arr[i][j];
            }
        }
    }
    void inputb(int rows, int cols)
    {
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                arr[i][j] = 0;
            }
        }
    }
    void print()
    {
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                cout << arr[i][j] << "\t";
            }
            cout << endl;
        }
    }
    Myclass transpont()
    {
        Myclass res(cols, rows);
        for (int i = 0; i < rows; ++i)
            for (int j = 0; j < cols; ++j)
                res.arr[j][i] = arr[i][j];
        return res;
    }
    Myclass& operator=(const Myclass& other)
    {
        destroy();
        rows = other.rows;
        cols = other.cols;
        create();
        copyFrom(other);
        return *this;
    }
};
int main()
{
    int r, c;
    cout << "Enter rows:";
    cin >> r;
    cout << "Enter cols:";
    cin >> c;
 
    Myclass a(r, c);
    Myclass b(r, c);
 
    a.input(r, c);
    cout << "_______A____" << endl;
    a.print();
 
    cout << "_______B____" << endl;
    b.inputb(r, c);
    b.print();
 
    b = a.transpont();
    cout << "_______B_ after b = a.transpont()___" << endl;
    b.print();
 
    cout << "_______A____" << endl;
    a.print();
 
 
    _getch();
    return 0;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы