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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
coPointer
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 6
#1

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

24.06.2013, 05:23. Просмотров 617. Ответов 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++ Написать программу сложения двух матриц А и В размерами 4 на 5
Перегрузка сложения для двумерных матриц C++
Написать процедуру сложения матриц. C++
Функция сложения матриц C++
C++ Функция сложения матриц
C++ Функция сложения матриц
Операция сложения матриц C++
C++ Консольная программа для сложения двух матриц
Реализовать функцию сложения матриц C++
Написать класс для сложения матриц C++
C++ Перегрузка оператора сложения матриц
Реализовать класс Vector и перегруженные операции сложения (+), скалярного (%) и векторного (*) произведения C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Гром
207 / 126 / 11
Регистрация: 20.03.2009
Сообщений: 1,094
Записей в блоге: 16
Завершенные тесты: 1
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     Наследование, нахождения произведения и сложения матриц
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru