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

Класс матриц с арифметическими операциями С++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Vlad1993
7 / 3 / 1
Регистрация: 08.08.2012
Сообщений: 62
Завершенные тесты: 3
08.08.2012, 23:37     Класс матриц с арифметическими операциями С++ #1
Я создаю класс матриц с операциями сложения, умножения, вычитания матриц, умножения на константу, транспонирования на С++. Почему-то не работает умножение матриц. Помогите пожалуйста. Вот код.

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
#include<iostream>
 
using namespace std;
 
class Matrix{
    friend Matrix operator * (Matrix, Matrix);
    public:
    void SetMatrix();
    void GetMatrix();
    void SetSize(int size);
    void Transponation();
    Matrix operator+(const Matrix &rhs);
    Matrix operator*(const Matrix &rhs);
    Matrix operator-(const Matrix &rhs);
    Matrix operator*(const float &rhs);
    Matrix operator/(const float &rhs);
    private:
        int n;
        float a[10][10];
};
 
void Matrix::SetMatrix(){
    int i,j;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            cin>>a[i][j];
}
 
void Matrix::GetMatrix(){
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
}
 
void Matrix::SetSize(int size){
    n=size;}
;
 
Matrix Matrix::operator+(const Matrix &rhs){
      Matrix result(*this);
      for (int i = 0; i <n; i++)
        for (int j = 0; j <n; j++)
            result.a[i][j] = a[i][j] + rhs.a[i][j];
return result;
}
 
Matrix operator*(Matrix A,Matrix B){
      Matrix result;
      for(int i=0;i<A.n;i++){
          for(int j=0;j<A.n;j++)
              result.a[i][j]=0;
              for(int k=0;k<A.n;k++)
                  result.a[i][j]+=A.a[i][k]*B.a[k][j];
      }
    return result;  
}
 
Matrix Matrix::operator-(const Matrix &rhs){
      Matrix result(*this);
      for (int i = 0; i <n; i++)
        for (int j = 0; j <n; j++)
            result.a[i][j] = a[i][j] - rhs.a[i][j];
return result;
}
 
Matrix Matrix::operator*(const float &rhs){
    Matrix result(*this);
    for (int i = 0; i <n; i++)
        for (int j = 0; j <n; j++)
            result.a[i][j]*=rhs;
return result;
}
 
Matrix Matrix::operator/(const float &rhs){
    Matrix result(*this);
    for (int i = 0; i <n; i++)
        for (int j = 0; j <n; j++)
            result.a[i][j]/=rhs;
return result;
}
 
void Matrix::Transponation(){
    float tmp;
    for(int i=0;i<n;i++)
        for(int j=i;j<n;j++){
            tmp=a[i][j];
            a[i][j]=a[j][i];
            a[j][i]=tmp;
    }
}
 
int main(void){
    Matrix a,b,c;
    int size;
    float koef;
    cin>>size;
    cin>>koef;
    a.SetSize(size);
    b.SetSize(size);
    a.SetMatrix();
    b.SetMatrix();
    cout<<"Sum:"<<endl;
    c=a+b;
    c.GetMatrix();
    cout<<"Differense:"<<endl;
    c=a-b;
    c.GetMatrix();
    c=a*b;
    cout<<"Matrix multiplication"<<endl;
    c.GetMatrix();
    c=a*koef;
    cout<<"Multiplication by float:"<<endl;
    c.GetMatrix();
    c=a/koef;
    cout<<"Dividing by float:"<<endl;
    c.GetMatrix();
    cout<<"Transponation:"<<endl;
    a.Transponation();
    a.GetMatrix();
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2012, 23:37     Класс матриц с арифметическими операциями С++
Посмотрите здесь:

Создать абстрактный базовый класс Integer(целое) с виртуальными арифметическими операциями и функцией вывода на экран C++
Не пользуясь никакими другими арифметическими операциями, кроме умножения, сложения и вычитания, вычислить за минимальное число операций C++
C++ Дано действительное число а, не пользуясь ни какими другими арифметическими операциями, кроме умножения получить а^5 и а^13 за 5 операция
Класс матриц C++
Класс вектор с арифметическими операциями, перегруженные операторы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
miriganua
129 / 100 / 4
Регистрация: 05.02.2012
Сообщений: 241
09.08.2012, 00:59     Класс матриц с арифметическими операциями С++ #2
По мойму у тебя не хватает скобок, попробуй так:
C++
1
2
3
4
5
6
7
8
9
10
11
Matrix operator*(Matrix A,Matrix B){
Matrix result;
for(int i=0;i<A.n;i++){
for(int j=0;j<A.n;j++){
result.a[i][j]=0;
for(int k=0;k<A.n;k++)
result.a[i][j]+=A.a[i][k]*B.a[k][j];
}
}
return result; 
}
Добавлено через 6 минут
И кстати тебе необходим конструктор копирования и вообще конструктор. а функции void SetMatrix();
void GetMatrix(); на мой взгляд некорректны(лучше без ввода).
А void Matrix::SetSize(int size) не нужна.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
09.08.2012, 01:11     Класс матриц с арифметическими операциями С++ #3
Цитата Сообщение от Vlad1993 Посмотреть сообщение
private:
int n;
float a[10][10];
Почему размеры массива заданы явно, размер же является полем класса?
Лучше бы GetMatrix возвращала указатель на массив, что вместе с вызовом GetSize могло бы пригодиться. Для вывода на экран или в др. поток можно использовать другие названия, или внешние функции.
Неплохо бы добавить конструкторы.
Посмотрите тут:
Матрицы - перегрузка оператора *
Vlad1993
7 / 3 / 1
Регистрация: 08.08.2012
Сообщений: 62
Завершенные тесты: 3
09.08.2012, 15:02  [ТС]     Класс матриц с арифметическими операциями С++ #4
Возник новый вопрос. Почему когда в main() ввожу коэффициент для умножения матрицы на константу перед сложением и умножением матриц получается неправильный ответ для этих операций, а когда сначала вычисляю сумму, а потом ввожу константу - правильный? В обеих случаях сначала вычисляется и выводится сумма матриц, а после идет умножение на константу. Разница только в месте ввода константы.

Добавлено через 7 минут
Так ничего и не получается с умножением матриц. Проблема наверное в том, что переменная Matrix result не инициализирована. Инициализация Matrix result(*this); не подходит, хотя тогда и выводится ответ, а точнее искомое произведение+значения первой матрицы. Как можно сделать матрицу result нулевой размерности N*N?
Yandex
Объявления
09.08.2012, 15:02     Класс матриц с арифметическими операциями С++
Ответ Создать тему
Опции темы

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