Форум программистов, компьютерный форум CyberForum.ru

Класс матриц - C++

Восстановить пароль Регистрация
 
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
20.03.2012, 21:41     Класс матриц #1
Пишу класс для работы с матрицами . Не могу понять , почему не работают функции power и swap_rows (функции возвращают ту же матрицу без изменений) . Вот код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include<iostream.h>
class Matrix
{
    private : 
        int n_rows;
        int n_columns;
        double **mData;
 
    public :
        Matrix() : n_rows(0), n_columns(0), mData(0) {}
        Matrix(int n , int m) : n_rows(n), n_columns(m) {
            mData = new double * [n_rows];
            for ( int i = 0; i < n_rows; i++ )
                mData[i] = new double [n_columns];
        }
        double get_element(int i,int j){return mData[i][j];}
        void print(char name[]) {
            cout<<"The matrix"<<"\t"<<name<<endl;
            for(int i=0;i<n_rows;i++){
                for(int j=0;j<n_columns;j++){
                    cout<<mData[i][j]<<"\t";
                }
                cout<<endl;
            }
        }
        void input(char name[]) {
            cout<<"Enter the matrix"<<"\t"<<name<<endl;
            for(int i=0;i<n_rows;i++)
                for(int j=0;j<n_columns;j++)
                    cin>>mData[i][j];
        }
 
        Matrix operator + (const Matrix & m) const {
            if(n_rows != m.n_rows || n_columns != m.n_columns ) {
                cout << "Different sizes!" <<endl;
            }
            Matrix res(n_rows,n_columns);
             for ( int i = 0; i < n_rows; i++ )
                for ( int j = 0; j < n_columns; j++ )
                    res.mData[i][j] = mData[i][j] + m.mData[i][j];
                    return res;
        }
        Matrix operator - (const Matrix & m) const {
                    if(n_rows != m.n_rows || n_columns != m.n_columns ) {
                        cout << "Different sizes!" <<endl;
                    }
                    Matrix res(n_rows,n_columns);
                     for ( int i = 0; i < n_rows; i++ )
                        for ( int j = 0; j < n_columns; j++ )
                            res.mData[i][j] = mData[i][j] - m.mData[i][j];
                            return res;
                }
        Matrix operator * (const Matrix & m) const {
                            if(n_columns != m.n_rows ) {
                                cout << "Different sizes!" <<endl;
                            }
                            Matrix res(n_rows,m.n_columns);
                             for ( int i = 0; i < n_rows; i++ )
                                 for ( int j = 0; j < n_columns; j++ ) {
                                    res.mData[i][j] =0;
                                    for(int k = 0; k < n_columns; k++)
                                        res.mData[i][j] += mData[i][k] * m.mData[k][j];
                                 }
                                    return res;
                        }
        Matrix & operator = (const Matrix & m) const {
            Matrix res(m.n_rows,m.n_columns);
            for ( int i = 0; i < n_rows; i++ )
                for ( int j = 0; j < n_columns; j++ ) res.mData[i][j] = m.mData[i][j];
        }           
        Matrix trans() {
            Matrix res(n_columns,n_rows);
            for ( int i = 0; i < n_rows; i++ )
                for ( int j = 0; j < n_columns; j++ ) res.mData[j][i] = mData[i][j];
                return res;
        }
        Matrix swap_rows(int i,int j) {
            Matrix res(n_rows,n_columns);
            double tmp = 0;
            for(int k=0;k<n_columns;k++) {
                tmp = res.mData[i][k];
                res.mData[i][k] = res.mData[j][k];
                res.mData[j][k] = tmp;
            }
            return res;
        }
 
        Matrix power(int n) {
            Matrix res(n_rows,n_columns);
            if(n==1) return res;
            if(n==2) return res*res;
            else return res*res.power(n-1);
        }
 
};
 
int main()
{
    Matrix A(2,2),B(2,2);
    A.input("A");A.print("A");
    B.input("B");B.print("B");
    Matrix C=A+B;
    C.swap_rows(0,1);C.print("C=A+B");
    C.power(3);C.print("");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2012, 21:41     Класс матриц
Посмотрите здесь:

Класс матриц C++
C++ Класс Матриц ( исправьте Ошибки плз)
Класс матриц C++
C++ Класс матриц
C++ Класс матриц с арифметическими операциями С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
20.03.2012, 22:01     Класс матриц #2
swap_rows - понятно почему:
в цикле в 80 строке
for(int k=0;k<n_columns;k++) {
Вы переставляете элементы дважды
(в первой половине строки, а потом снова - во второй половине).
Замените на
for(int k=0;k<n_columns/2;k++) {
C++
1
2
3
4
5
6
7
Matrix power(int n) 
{
       Matrix res(*this); // используйте копиконструктор
       if(n==1) return res;
       if(n==2) return res*res;
       else return res*res.power(n-1);
}
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
20.03.2012, 22:16     Класс матриц #3
Цитата Сообщение от dota Посмотреть сообщение
C.swap_rows(0,1);
C.power(3);
в этих строчках С изменится только если написать
C++
1
2
C = C.swap_rows(0,1);
C = C.power(3);
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
20.03.2012, 23:03  [ТС]     Класс матриц #4
Алгоритм обмена строк правильный : если мы зафиксировали две строки , то двигаясь по столбцам , мы поочередно обмениваем соответствующие элементы . Проблема была не в этом . После того , как я вместо Matrix res(n_rows,n_columns) поставил Matrix res(*this) , оба метода заработали . Так что спасибо большое за дельный совет )

Добавлено через 27 минут
Да , еще такой вот вопрос : у меня память под матрицу в конструкторе выделяется динамически , нужно ли мне явно задавать деструктор ? (я пробовал делать деструктор, но программа "вылетает")
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
21.03.2012, 07:36     Класс матриц #5
C++
1
2
3
4
5
6
 ~Matrix()
{
    for ( int i = 0; i < n_rows; i++ )
        delete[] mData[i];
    delete[]  mData;
}
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
21.03.2012, 09:04     Класс матриц #6
Цитата Сообщение от dota Посмотреть сообщение
После того , как я вместо Matrix res(n_rows,n_columns) поставил Matrix res(*this) , оба метода заработали .
у вас не определён конструктор копирования. поэтому для Matrix res(*this) был сгенерирован конструктор копирования по умолчанию, в котором идёт простое копирование полей класса:
C++
1
2
3
res.n_rows = this->n_rows;
res.n_columns = this->n_columns;
res.mData = this->mData;
и вы получаете 2 объекта с общим mData: член mData объектов *this и res указывают на одну и ту же область памяти.
без деструктора код "работал" именно поэтому - все манипуляции производились с этой общей памятью. но как только вы определяете деструктор, уже в swap_rows он вызывается для res перед выходом из ф-ии, память освобождается(общая для нескольких объектов). таким образом, становятся невалидными res.mData и this->mData. в результате при последующем вызове print (или другого метода)
Цитата Сообщение от dota Посмотреть сообщение
программа "вылетает"
далее. ваш operator= не только ничего не возвращает, но и присваивает временной, локальной переменной.
в общем, если вы исправите свои операции копирования, то вылетать перестанет.
но т.к. ваши swap_rows и power изменяют временный локальный объект, придётся либо писать как я показывал в своем предыдущем посте, либо работать в ф-ях с данными объекта this
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2012, 17:38     Класс матриц
Еще ссылки по теме:

Класс матрица (осуществить вывод матриц в виде массива 3х3) C++
Реализовать класс матриц, СРОЧНО! C++
Класс матриц C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
23.03.2012, 17:38  [ТС]     Класс матриц #7
а как правильно написать конструктор копирования ?
Yandex
Объявления
23.03.2012, 17:38     Класс матриц
Ответ Создать тему
Опции темы

Текущее время: 23:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru