Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 18.09.2014
Сообщений: 70
1

Класс матрица (дружественные функции)

06.01.2016, 23:54. Показов 2607. Ответов 13
Метки нет (Все метки)

Здравствуйте, поставили задание написать класс матрица, через дружественные операторы сделать сложение, умножение, переприсваивание, а через дружественные функции транспонирование, ввод и вывод заданог оелемента матрицы(ввести индексы). Спервой частью вроде справился, вторую знаю как сделать транспонирование и вывод елемента, но как сделать ввод, и все это через дружественные функции не пойму. Подскажите пожалуйста.
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
#include "stdafx.h"
#include "iostream"
#include <conio.h>
#include "cmath"
#include <string.h>
 
using namespace std;
 
void menu();
void Enter();
 
class Matrix
{
private:
    double Matrica[10][10];
    int Size_Rows, Size_Colums;
 
public:
    Matrix(int i = 0, int j = 0);
 
    friend Matrix operator +(Matrix, Matrix);
    friend Matrix operator *(Matrix, Matrix);
    friend Matrix operator==(Matrix &, Matrix &);
 
 
    int getSize_Rows() { return Size_Rows; }
    int getSize_Colums() { return Size_Colums; }
    void setSize_Rows(int i) { Size_Rows = i; }
    void setSize_Colums(int j) { Size_Colums = j; }
    void setElement(double x, int i, int j) { Matrica[i][j] = x; }
    void Show();
};
Matrix MATR[3];
int main()
{
    char a; int  z;
    int i, j;
 
    for (;;)
    {
        menu();
        cin >> a;
        switch (a)
        {
        case '1': {
            Enter();
            break;
        }
        case '2': {
            MATR[0].Show();
            MATR[1].Show();
            break;
        }
        case '3': {  MATR[2] = MATR[0] + MATR[1];
            MATR[2].Show();
            break;
        }
        case '4': {
            MATR[2] = MATR[0] * MATR[1];
            MATR[2].Show();
            break;
        }
 
 
        case '5': {
            cout << "0 -pervaya==vtoraya\n1-vtoraya==pervaya \n";
            cin >> z;
            if (z == 0)
            {
                MATR[0] == MATR[1];
            }
            else if (z == 1)
            {
                MATR[1] == MATR[0];
            }
            break;
        }
 
 
 
        case '0':   exit(0);
        }
 
    }
 
 
    _getch();
    return 0;
}
 
Matrix::Matrix(int nx, int ny)
{
    Size_Rows = nx;
    Size_Colums = ny;
    for (int i = 0; i<nx; ++i)
        for (int j = 0; j<ny; ++j)
            Matrica[i][j] = 0;
 
}
 
Matrix operator+(Matrix X, Matrix Y)
{
    Matrix temp(X.Size_Rows, X.Size_Colums);
    if (X.Size_Rows == Y.Size_Rows && X.Size_Colums == Y.Size_Colums)
        for (int i = 0; i<X.Size_Rows; ++i)
            for (int j = 0; j<X.Size_Colums; ++j)
                temp.Matrica[i][j] = X.Matrica[i][j] + Y.Matrica[i][j];
 
    else
        cout << "Nesootvetstie razmerov!\n";
 
 
    return temp;
}
 
Matrix operator*(Matrix X, Matrix Y)
{
    Matrix temp(X.Size_Rows, Y.Size_Colums);
    if (X.Size_Colums == Y.Size_Rows)
        for (int i = 0; i<X.Size_Rows; ++i)
            for (int j = 0; j<Y.Size_Colums; ++j)
            {
                temp.Matrica[i][j] = 0;
                for (int k = 0; k<X.Size_Colums; ++k)
                    temp.Matrica[i][j] += X.Matrica[i][k] * Y.Matrica[k][j];
            }
 
    else
        cout << "Nesootvetstie razmerov!\n";
 
 
    return temp;
}
 
 
Matrix operator==(Matrix &X, Matrix &Y)
{
 
    if (X.Size_Rows == Y.Size_Rows && X.Size_Colums == Y.Size_Colums)
        for (int i = 0; i<X.Size_Rows; ++i)
            for (int j = 0; j<Y.Size_Colums; ++j)
                X.Matrica[i][j] = Y.Matrica[i][j];
 
    else
        cout << "Nesootvetstie razmerov!\n";
 
 
    return X;
}
 
 
 
 
 
void Matrix::Show()
{
    cout << "\n";
    for (int i = 0; i<Size_Rows; i++)
    {
        cout << "\n";
        for (int j = 0; j<Size_Colums; j++)
            cout << Matrica[i][j] << "  ";
 
    }
    cout << "\n";
 
}
void Enter()
{
    int N, M;
    double Matrica[10][10];
 
    printf("Matrix 1 : N=");
    cin >> N;
    printf("           M=");
    cin >> M;
    printf("Vvedite %d elementov:\n", N*M);
 
    for (int i = 0; i<N; i++)
        for (int j = 0; j<M; j++)
            cin >> Matrica[i][j];
 
    MATR[0].setSize_Rows(N);
    MATR[0].setSize_Colums(M);
 
    for (int i = 0; i<N; i++)
        for (int j = 0; j<M; j++)
            MATR[0].setElement(Matrica[i][j], i, j);
 
 
 
 
 
    printf("Matrix 2 : N=");
    cin >> N;
    printf("           M=");
    cin >> M;
    printf("Vvedite %d elementov:\n", N*M);
 
    for (int i = 0; i<N; i++)
        for (int j = 0; j<M; j++)
            cin >> Matrica[i][j];
 
    MATR[1].setSize_Rows(N);
    MATR[1].setSize_Colums(M);
 
    for (int i = 0; i<N; i++)
        for (int j = 0; j<M; j++)
            MATR[1].setElement(Matrica[i][j], i, j);
}
 
void menu()
{
    printf("\n1. Vvod\n2. Vuvod\n3. Summa\n4. Proizvedenie\n5. Prisvaivanie\n0.Vuxod\n\n");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2016, 23:54
Ответы с готовыми решениями:

Определить класс "Матрица", используя дружественные функции
Помогите с заданием, кому не сложно. Сложно с функциями, а особенно матрицы. Определить класс...

Класс, конструктор, деструктор, дружественные функции
Нужна помощь с ООП. Вот задание: Общая постановка. Пользовательский класс Х должен содержать...

Указатель на базовый класс и дружественные функции
Здравствуйте. У меня есть базовый класс Number-простое целое число типа long int. В классе имеется...

Найти ошибку (класс дружественные классы)
Пишет что то вроде неправильное обращение #include &lt;iostream&gt; #include &lt;cstring&gt; #include...

13
1378 / 405 / 144
Регистрация: 22.10.2014
Сообщений: 872
07.01.2016, 00:21 2
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
class Matrix
{
......
friend std::ostream& operator<<(std::ostream&,const Matrix&);
friend std::istream& operator>>(std::istream&,Matrix&);
......
};
 
std::ostream& operator<<(std::ostream& stream,const Matrix& mat)
{
    stream << mat.//циклом вывести в stream как в std::cout
    return stream;
}
std::istream& operator>>(std::istream& stream,Matrix& mat)
{
    stream >> mat//циклом считать из stream как из std::cin
    return stream;
}
 
main
{
// теперь можно делать так:
Matrix mat;
std::cin >> mat;//вызовется оператор для считывания.
std::cout << mat;//вызовется оператор для вывода.
}
0
1 / 1 / 0
Регистрация: 18.09.2014
Сообщений: 70
07.01.2016, 00:30  [ТС] 3
Благодарю, но сказано сделать транспонирование, взятие елемент и назначенеи елемента именно через дружественные функции, как именно это сделать я не пойму,
0
Эксперт CЭксперт С++
5064 / 2251 / 331
Регистрация: 20.02.2013
Сообщений: 5,602
Записей в блоге: 19
07.01.2016, 00:33 4
Цитата Сообщение от RamzezUA Посмотреть сообщение
сделать транспонирование, взятие елемент и назначенеи елемента именно через дружественные функции
С точки зрения архитектуры класса - это бред.
0
1 / 1 / 0
Регистрация: 18.09.2014
Сообщений: 70
07.01.2016, 00:36  [ТС] 5
gru74ik
Тут не могу не согласиться, но сказали сделать так, а как это сделать ума не приложу, именно как просят. Осталось 2 лабораторные защитить, это вторая из них(
0
1378 / 405 / 144
Регистрация: 22.10.2014
Сообщений: 872
07.01.2016, 00:41 6
Лучший ответ Сообщение было отмечено RamzezUA как решение

Решение

Цитата Сообщение от RamzezUA Посмотреть сообщение
взятие елемент и назначенеи елемента
А вы можете объяснить что это значит?
Если это оператор [], то как преподаватель хотел их видеть для двумерного массива (матрица двумерная) я конечно могу написать, но не уверен что это оно)
Цитата Сообщение от gru74ik Посмотреть сообщение
сделать транспонирование
Надеюсь с самим алгоритмом транспонирования нет проблем?
Тогда дружественная функция транспонирования отличается от обычной вот этим:
C++
1
2
3
4
5
6
7
8
9
10
class Matrix
{
    friend Matrix trans(const Matrix&);
};
 
Matrix trans(const Matrix& src)
{
    Matrix ret; // создать транспонированную матрицу на основе матрицы src. ( заполнить верно внутренний "массив")
    return ret;
}
1
Эксперт CЭксперт С++
5064 / 2251 / 331
Регистрация: 20.02.2013
Сообщений: 5,602
Записей в блоге: 19
07.01.2016, 00:43 7
Цитата Сообщение от Nosey Посмотреть сообщение
оператор []
Можно, но там сильно устанешь, пока сделаешь. Проще написать функцию член at(), либо перегрузить круглые скобки.
0
1 / 1 / 0
Регистрация: 18.09.2014
Сообщений: 70
07.01.2016, 00:45  [ТС] 8
Nosey
Последователньость действий для сего такова (как просят): 1)Для взятия: выбираем для какой матрицы (1 или 2), дальше вводим индексы, нам должно вывести елемент какой там находится
2) Для назначения все тоже самое, только мы еще вводим елемент на какой будем заменять.
Нет, ни с транспонированием, ни с выводом елементов, ни с заменой елемента (вроде) нет проблем, лишь проблема как сделать через дружественную функцию)
Благодарю, сейчас попробую так.
0
1378 / 405 / 144
Регистрация: 22.10.2014
Сообщений: 872
07.01.2016, 01:32 9
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Цитата Сообщение от gru74ik Посмотреть сообщение
Можно, но там сильно устанешь, пока сделаешь
challenge accepted
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
class Matrix
{
    template<std::size_t S, class T>
    class MagicHelper
    {
    private:
        T (&data_)[S];
    public:
        MagicHelper(T (&value)[S])
                : data_(value)
        {
        }
 
        T& operator[](std::size_t ind)
        {
            return data_[ind];
        }
 
        T& operator[](std::size_t ind) const
        {
            return data_[ind];
        }
    };
private:
    int data_[5][5];
 
public:
 
    const MagicHelper<5, const int> operator[](std::size_t ind) const
    {
        return MagicHelper<5, const int>(data_[ind]);
    }
 
    MagicHelper<5, int> operator[](std::size_t ind)
    {
        return MagicHelper<5, int>(data_[ind]);
    }
};
 
int main()
{
    Matrix mat;
    mat[3][3] = 10;
    std::cout << mat[3][3];
}
Добавлено через 31 минуту

Не по теме:

Я вспомнил/загуглил тайный синтаксис:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Matrix
{
private:
    int data_[5][5];
 
public:
    const int (& operator[](std::size_t ind) const) [5]
    {
        return data_[ind];
    }
 
    int (& operator[](std::size_t ind))[5]
    {
        return data_[ind];
    }
};
 
int main()
{
    Matrix mat = Matrix();
    mat[3][3] = 10;
    std::cout << mat[3][3];
}

2
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
14.01.2016, 14:32 10
Цитата Сообщение от Nosey Посмотреть сообщение
const int (& operator[](std::size_t ind) const) [5]
* * {
* * * * return data_[ind];
* * }
int (& operator[](std::size_t ind))[5]
* * {
* * * * return data_[ind];
* * }
Опять скрипит потертое седло В моих книженциях черным по белому написано что перегрузка функций идет по аргументам(параметрам), как в этом случае понять, подскажите пожалйста, очень очень хочу разобряться
0
1378 / 405 / 144
Регистрация: 22.10.2014
Сообщений: 872
14.01.2016, 14:49 11
Цитата Сообщение от anti-k Посмотреть сообщение
Опять скрипит потертое седло В моих книженциях черным по белому написано что перегрузка функций идет по аргументам(параметрам), как в этом случае понять, подскажите пожалйста, очень очень хочу разобряться
Для понимания:
0) Вспоминаем правила выбора перегруженных функций, особенно что константный параметр и некостантный - разные параметры.
1) Вспоминаем, что методы класса - это обычные функции с неявным первым параметром - указателем на объект.
2) Запоминаем что const у метода означает что первый неявный параметр - это константный указатель на объект.
->
C++
1
2
3
const int (& operator[](std::size_t ind) const) [5]
//эквивалент
const int (& operator[](const Matrix* this, std::size_t ind)) [5]
и
C++
1
2
3
const int (& operator[](std::size_t ind)) [5]
//эквивалент
const int (& operator[](Matrix* this, std::size_t ind)) [5]
С которыми уже правило выбора перегрузки работает хорошо)))

Не по теме:

Если быть супер извращенцем, то правильно не константный указатель, а указатель на константу.

1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
14.01.2016, 15:15 12
Цитата Сообщение от Nosey Посмотреть сообщение
0) Вспоминаем правила выбора перегруженных функций, особенно что константный параметр и некостантный - разные параметры.
1) Вспоминаем, что методы класса - это обычные функции с неявным первым параметром - указателем на объект.
2) Запоминаем что const у метода означает что первый неявный параметр - это константный указатель на объект.
Вот за это спасибо огромное!!!!!!
0
Эксперт CЭксперт С++
5064 / 2251 / 331
Регистрация: 20.02.2013
Сообщений: 5,602
Записей в блоге: 19
14.01.2016, 16:33 13
Цитата Сообщение от Nosey Посмотреть сообщение
Если быть супер извращенцем, то правильно не константный указатель, а указатель на константу.
Так-то, бывают и указатели на константу и константные указатели. И это разные вещи.
1
Nosey
14.01.2016, 18:18     Класс матрица (дружественные функции)
  #14

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
Так-то, бывают и указатели на константу и константные указатели. И это разные вещи.
Бывают, но в данном случае поправил дополнением таким вот.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2016, 18:18

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Дружественные функции. Наследование. Перегрузка функции
Здравствуйте, у меня проблема Не знаю куда Вставить имеющийся код(В какую строчку или строчки...

Дружественные функции
Создать объект динамический стек. Перегрузить операции +, +=, -= (с извлечением элемента).

Дружественные функции
Добрый день. Подскажите как правильно запихнуть данные код в тело дружественной функции. Моё...

Дружественные функции
День добрый. class Distance { private: int fut; int inch; public:...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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