С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 18.09.2014
Сообщений: 70
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, поставили задание написать класс матрица, через дружественные операторы сделать сложение, умножение, переприсваивание, а через дружественные функции транспонирование, ввод и вывод заданог оелемента матрицы(ввести индексы). Спервой частью вроде справился, вторую знаю как сделать транспонирование и вывод елемента, но как сделать ввод, и все это через дружественные функции не пойму. Подскажите пожалуйста.
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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.01.2016, 23:54
Ответы с готовыми решениями:

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

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

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

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

13
1379 / 406 / 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Эксперт С++
5287 / 2374 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
07.01.2016, 00:33 4
Цитата Сообщение от RamzezUA Посмотреть сообщение
сделать транспонирование, взятие елемент и назначенеи елемента именно через дружественные функции
С точки зрения архитектуры класса - это бред.
0
1 / 1 / 0
Регистрация: 18.09.2014
Сообщений: 70
07.01.2016, 00:36  [ТС] 5
gru74ik
Тут не могу не согласиться, но сказали сделать так, а как это сделать ума не приложу, именно как просят. Осталось 2 лабораторные защитить, это вторая из них(
0
1379 / 406 / 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Эксперт С++
5287 / 2374 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
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
1379 / 406 / 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
1379 / 406 / 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Эксперт С++
5287 / 2374 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
14.01.2016, 16:33 13
Цитата Сообщение от Nosey Посмотреть сообщение
Если быть супер извращенцем, то правильно не константный указатель, а указатель на константу.
Так-то, бывают и указатели на константу и константные указатели. И это разные вещи.
1
Nosey
14.01.2016, 18:18     Класс матрица (дружественные функции)
  #14

Не по теме:

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru