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

Наследование, нахождения произведения и сложения матриц - C++

Восстановить пароль Регистрация
 
coPointer
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 6
24.06.2013, 05:23     Наследование, нахождения произведения и сложения матриц #1
Организовать производный класс, дополнительно содержащий функции нахождения произведения и сложения матриц.
Программу написал, но почему-то значения во всех матрицах задаются одинаково?

class.cpp
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <windows.h>
#include <cmath>
#include <ctime>
using namespace std;
class Matrix
{
    private:
        int **array;
        int size;
    public:
        void set_Matrix_element(int, int, int);
        int get_Matrix_size();
        int get_Matrix_element(int, int);
        void set_Matrix();
        float set_det();
        void show_Matrix(int);
        void show_TMatrix();
        Matrix::Matrix();
        Matrix::Matrix(int);
        ~Matrix(){cout<< "ГЊГ*òðèöГ* ГіГ*è÷òîæåГ*Г*"<<endl;};
};
void Matrix::set_Matrix_element(int i, int j, int el)
{
    array[i][j]=el; 
}
int Matrix::get_Matrix_size()
{
    return size;
}
int Matrix::get_Matrix_element(int i, int j)
{
    return array[i][j];
}
void Matrix::set_Matrix()
{
    srand((unsigned)time(NULL));
    array = new int*[size];
    for(int i=0; i<size; i++)
        array[i] = new int [size];
        for(int i=0; i<size; i++)
            for(int j=0; j<size; j++)
                array[i][j]=rand()%50;
}
float Matrix::set_det()
{
    int l;
    float sum11=1,sum12=0, sum21=1, sum22=0, det;
    for(int i=0; i<size; i++)
    {
        sum11=1; l=2*size-1-i; sum21=1;
        for(int j=0; j<size; j++)
        {
            sum21*=array[j][l%size];
            l--;
            sum11*=array[j][(j+i)%(size)];
        }
        sum22+=sum21;
        sum12+=sum11;
    }
    det=sum12-sum22;
    cout<<"Îïðåäåëèòåëü Г°Г*ГўГҐГ* "<<det<<endl;
}
void Matrix::show_Matrix(int k)
{
    switch(k)
    {
        case 0: cout<<"ÈñõîäГ*Г*Гї Г¬Г*òðèöГ*:"<<endl; break;
        case 1: cout<<"ÐåçóëüòГ*ГІ ñëîæåГ*ГЁГї Г¬Г*òðèö"<<endl; break;
        case 2: cout<<"ÐåçóëüòГ*ГІ ГіГ¬Г*îæåГ*ГЁГї Г¬Г*òðèö"<<endl; break;
    }
    for(int i=0; i<size; i++)
    {
        for(int j=0; j<size; j++)
            cout<<setw(7)<<array[i][j];
        cout<<endl;
    }
}
void Matrix::show_TMatrix()
{
    cout<<"Г’Г°Г*Г*Г±ГЇГ®Г*èðîâГ*Г*Г*Г*Гї Г¬Г*òðèöГ*:"<<endl;
    for(int j=0; j<size; j++)
    {
        for(int i=0; i<size; i++)
        cout<<setw(7)<<array[i][j];
    cout<<endl;
    }            
}
Matrix::Matrix()
{
    size=3;
    set_Matrix();
    cout<<"Èñïîëüçóåòñÿ ГЄГ®Г*ñòðóêòîð ГЇГ® óìîë÷Г*Г*ГЁГѕ! ГђГ*çìåð Г¬Г*òðèöû ГЇГ® óìîë÷Г*ГЁГѕ Г°Г*ГўГҐГ* 3"<<endl;
}
Matrix::Matrix(int a)
{
    size=a;
    set_Matrix();
    cout<<"Èñïîëüçóåòñÿ ГЄГ®Г*ñòðóêòîð Г± ГЇГ*Г°Г*ìåòðГ*ìè! ГђГ*çìåð Г¬Г*òðèöû Г°Г*ГўГҐГ* "<<size<<endl;
}
 
class Matrix2 : public Matrix
{
    public:
        Matrix2(int a) : Matrix(a){};
        Matrix2() : Matrix(){};
        ~Matrix2(){};
        void add(Matrix* A, Matrix* B) 
        {
            int sz_A=A->get_Matrix_size();
            if(sz_A==B->get_Matrix_size()&&this->get_Matrix_size()==sz_A)
            {
                int i,j;
                for(i=0; i<sz_A; i++)
                    for(j=0; j<sz_A; j++)
                        set_Matrix_element(i, j, A->get_Matrix_element(i,j)+B->get_Matrix_element(i,j));
                this->show_Matrix(1);
            }
            else cout<<"ÍåâîçìîæГ*Г® ñëîæèòü Г¬Г*òðèöû"<<endl;
        };
        void mul(Matrix* A, Matrix* B) 
        {
            int sz_A=A->get_Matrix_size();
            if(sz_A==B->get_Matrix_size()&&this->get_Matrix_size()==sz_A)
            {
                int i,j, k,l;
                int p;
                for(i=0; i<sz_A; i++)
                    for(j=0; j<sz_A; j++)
                    {
                        for(p=0, k=0; k<sz_A; k++)
                        {
                            p+=A->get_Matrix_element(i,k)*B->get_Matrix_element(k, j);
                        }
                    set_Matrix_element(i, j, p);
                    }
                this->show_Matrix(2);
            }
            else cout<<"ÍåâîçìîæГ*Г® ïåðåìГ*îæèòü Г¬Г*òðèöû"<<endl;
        }
};
main.cpp
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
#include "class.cpp"
int main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    Matrix A(3);
    A.show_Matrix(0);
    A.show_TMatrix();
    A.set_det();
    cout<<endl;
    Matrix T;
    T.show_Matrix(0);
    T.show_TMatrix();
    T.set_det();
    cout<<endl;
    Matrix2 D(4);
    D.show_Matrix(0);
    D.show_TMatrix();
    D.set_det();
    D.add(&A, &T);
    D.mul(&A, &T);
    system("pause");
    return (0);
}
Добавлено через 8 часов 0 минут
up!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2013, 05:23     Наследование, нахождения произведения и сложения матриц
Посмотрите здесь:

Функция для сложения и вычитания вещественных матриц C++
Перегрузка сложения для двумерных матриц C++
C++ Матрицы: сложения двух матриц (двумерных массивов)
Написать процедуру сложения матриц. C++
Функция сложения матриц C++
C++ Функция сложения матриц
C++ Функция сложения матриц
Операция сложения матриц C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
24.06.2013, 05:52     Наследование, нахождения произведения и сложения матриц #2
Нужно вызывать srand всего один раз за время работы программы, где-нибудь в начале функции main.

P.S.
1. Деструктор должен освобождать выделенную память:
C++
1
2
3
4
5
6
Matrix::~Matrix()
{
for (int i = 0; i < size; ++i)
 delete[] array[i];
delete[] array;
}
2. Функция подсчета определителя должна, во-первых, называть det или get_det (вовсе не set_det); во-вторых, должна возвращать целое значение (как произведение и разность целых; это же касается и всех внутренних переменных этой функции); в-третьих, вообще его возвращать - через return det; в-четвертых, насколько я понял, у вас он считается как сумма произведений элементов на линиях, параллельных главной диагонали минус то же для побочной - это на самом деле верно только для матриц 2*2 и 3*3, в более общем случае определитель (т.е. минор n-го порядка) - это линейная комбинация миноров n-1 порядка (т.е. определителей матриц размером на 1 меньше) и далее рекурсивно. Обычно он раскладывается по первой строке или столбцу, если только нет более удобного варианта (строки или столбца с большим количеством нулей).

3. Матрица вообще не должна знать, что вы там с ней делали - вместо двух функций типа showMatrix (одна из которых с параметром вообще никак не относящемся к матрице) вам нужна одна:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Matrix::show_Matrix()
{
    for(int j=0; j<size; j++)
    {
        for(int i=0; i<size; i++)
        cout<<setw(7)<<array[i][j];
    cout<<endl;
    }            
}
 
int main()
{
//...
Matrix C = A + B;   //по-хорошему тут бы перегрузить operator+, но можно и как ниже:
//Matrix C = A;
//C.add(B);
std::cout << "Сумма матриц A и B" << std::endl;
C.show_Matrix();
}
4. В названиях функций не обязательно везде писать слово Matrix. Вызовы функций типа show, get_size или size, get_element, set_element и т.п. гораздо короче и не менее понятны.

5. Функции, которые не изменяют значения переменных настоятельно рекомендуется помечать как const:
C++
1
2
3
4
5
6
7
class Matrix
{
public:
//...
int get_size() const { return size; }
//...
};
И еще довольно много замечаний по вашему коду, но для начала хотя бы это.
Yandex
Объявления
24.06.2013, 05:52     Наследование, нахождения произведения и сложения матриц
Ответ Создать тему
Опции темы

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