Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 827
1

Написать класс Матрица. Массив объектов класса Массив

20.06.2016, 10:25. Просмотров 1659. Ответов 15
Метки нет (Все метки)

Написать класс Матрица (в данном случае матрица – массив объектов класса Массив из предыдущего задания).
В классе реализовать следующие методы:
конструкторы (по умолчанию, с параметрами); деструктор; ввод с клавиатуры, вывод на экран (в виде методов). В этом же классе, перегрузить операции: +, += (сложение матриц); – (вычитание); = (присвоение); == (сравнение по элементам);
[] (взятие элемента с заданным индексом).

В общем застрял на присвоении. Помогите пожалуйста реализовать программу.
C++ (Qt)
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
#include <iostream>
#include <ctime>
#include <iomanip>
 
#define PI 3.1415956535
 
using namespace std;
 
class Matrix;
 
class Array
{
public:
    int x[5];
    Array(){
        for (int i = 0; i < 5; i++){
            x[i] = rand() % 21 - 10;
            //cout << x[i] << setw(4);
        }
        //cout << endl;
    }
 
    int& operator [](int i)
    {
        return x[i];
    }
    friend Matrix;
};
 
 
 
class Matrix
{
 
public:
    Array y[5];
    Matrix(){
 
        //y[0][0] = 1;
        //cout << y[0][0];
    }
 
    void show(){
        for (int i = 0; i < 5; i++){
            for (int j = 0; j < 5; j++){
                cout << setw(4) << y[i][j];
            }
            cout << endl;
        }
        cout << endl;
    }
 
    void edit(int a, int b){
        cin >> y[a][b];
    }
 
    Array& operator [](int i)
    {
        return y[i];
    }
 
    Matrix &operator +(Matrix N)
    {
        int i, j;
        Matrix temp;
        for (i = 0; i < 5; i++){
            for (j = 0; j < 5; j++){
                temp[i][j] = N.y[i][j] + y[i][j];
            }
        }
        return temp;
    }
 
    Matrix &operator -(Matrix N)
    {
        int i, j;
        Matrix temp;
        for (i = 0; i < 5; i++){
            for (j = 0; j < 5; j++){
                temp[i][j] = N.y[i][j] - y[i][j];
            }
        }
        return temp;
    }
    
    bool operator ==(Matrix N)
    {
        bool k=1;
        int i, j;
        Matrix temp;
        for (i = 0; i < 5; i++){
            for (j = 0; j < 5; j++){
                if (N.y[i][j] != y[i][j]){
                    k = 0;
                }
            }
        }
        return k;
    }
    
    /*
    //???????
    //не работает
    Matrix &operator =(Matrix N)
    {
        int i, j;
        Matrix temp;
        for (i = 0; i < 5; i++){
            for (j = 0; j < 5; j++){
                temp[i][j] = N.y[i][j];
            }
        }
        return temp;
    }*/
 
};
 
void main(){
    srand(time(NULL));
    Matrix m, n, r;
    m.show();
    cout << (m == m);
    //r.show();
    system("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2016, 10:25
Ответы с готовыми решениями:

Написать класс «множество» – наследник класса «массив»
Ребята может есть что-то прошу помощи. Написать класс «множество» – наследник класса «массив»...

Определить класс Rectangle и класс Point. Объявить массив из n объектов класса Point. Написать функцию, определяющ
Определить класс Rectangle и класс Point. Объявить массив из n объектов класса Point. Написать ...

Класс содержащий массив объектов другого класса
Добрый день. Нужно создать класс,содержащий массив объектов другого класса: ref class Queue1...

Разработать класс Book, создать массив объектов класса
Разработать классы для описанных ниже объектов. Включить в класс методы set (), get (), show ()....

15
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
20.06.2016, 11:26 2
C++
1
2
3
4
5
6
7
8
9
10
Matrix &operator =(Matrix N)
    {
        int i, j;
        for (i = 0; i < 5; i++){
            for (j = 0; j < 5; j++){
                y[i][j] = N.y[i][j];
            }
        }
        return *this;
    }
0
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 827
20.06.2016, 16:39  [ТС] 3
return *this; Что это означает?
0
91 / 80 / 57
Регистрация: 19.02.2016
Сообщений: 336
20.06.2016, 16:53 4
Цитата Сообщение от Jman Посмотреть сообщение
return *this; Что это означает?
возвращает
C++
1
Matrix &operator
1
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 827
20.06.2016, 17:44  [ТС] 5
Спасибо. Подскажите пожалуйста, я сделал прототип методов и перегрузок. Но ругается на вот такое:
C++ (Qt)
1
2
3
4
Array& operator [](int i)
    {
        return y[i];
    }
Делаю
C++
1
Array& operator [](int i);
Выношу под класс:
C++
1
2
3
4
Array& :: operator [](int i)
    {
        return y[i];
    }
Ругается... Как правильно это вынести?
0
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
20.06.2016, 22:59 6
Цитата Сообщение от Jman Посмотреть сообщение
Array& :: operator [](int i)
Array& Matrix::operator [](int i)
1
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 827
21.06.2016, 15:45  [ТС] 7
Спасибо получилось.
Добавлено через 2 часа 3 минуты
Народ подскажите, как правильно вывести в мейне все операции над матрицей. Сложение, вычитание, индексацию и тд...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
switch (menu_switch)
    {
        case 1:
        {   // перегурзка +
            SUM = FIRST + SECOND;
            SUM.Print();        
        }
        
        case 2:
        {
            SUB = FIRST - SECOND;
            SUB.Print();        // перегрузка -
        }
        
        case 3:
        {
            cout << a[0][0];
        }
    }
Пока дошел до такого...

Добавлено через 2 часа 13 минут
Помогите так же, как можно реализовать деструктор, сделал вот так:
C++
1
2
3
4
5
Matrix::~Matrix()
{
    cout << "Удаляем массив" << endl;
    delete [] MYMATRIX;
}
Не работает... Кажется потому, что не выделил память... Не знаю в общем нарвался на такие моменты. Помогите пожалуйста. Задачу почти решил..
0
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
21.06.2016, 21:15 8
Цитата Сообщение от Jman Посмотреть сообщение
как можно реализовать деструктор
Если ты нигде не используешь new, то никаких delete обычно в деструкторе быть не должно.
0
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 827
21.06.2016, 21:34  [ТС] 9
По заданию есть деструкторе. Но я не пойму, где нужно правильно выделить память, а потом в деструкторе ее очистить. Предполагаю что в классе Matrix нужно проделать некое такое:
C++
1
2
3
4
5
6
class Matrix
{
 
public:
    Array y = new int [5];
    Matrix();
~Matrix()
{
cout << "Удаляем массив" << endl;
delete [] Array;
}
0
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
22.06.2016, 01:59 10
Array y = new int [5];
C++
1
Array *y;
и в конструкторе:
C++
1
y = new Array[5];
а в деструкторе:
C++
1
delete[] y;
0
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 827
22.06.2016, 10:32  [ТС] 11
Сделал так в хедере:
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
#pragma once
#include <iostream>
#include <iomanip>
using namespace std;
 
class Matrix;
 
class Array
{
public:
    int MYARR[5];
    Array();
    int& operator [](int i);    //заполняем одномерный массив
    friend Matrix;
};
 
class Matrix
{
 
public:
    Array *MYMATRIX;
    Matrix();
    ~Matrix();
    void Message();
    void Print();
    void Edit(int a, int b);
    Array& operator [](int i);
    Matrix &operator +(Matrix N);
    Matrix &operator -(Matrix N);
    bool operator ==(Matrix N);
    Matrix &operator =(Matrix N);
};
Описание класса:
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
#include "MyArr.h"
#include <iomanip>
 
//***************************************** Описание прототипов *************************************//
// конструктор 
Array::Array()
{
    for (int i = 0; i < 5; i++)
    {
        MYARR[i] = rand() % 20;
    }
}
 
Matrix::Matrix()
{
    MYMATRIX = new Array[5];
}
 
int& Array :: operator [](int i)
{
    return MYARR[i];
}
//перегрузка индексирования
Array& Matrix::operator [](int i)
{
    return MYMATRIX[i];
}
//перегрузка оператора сложения
Matrix &Matrix :: operator +(Matrix N)
{
    Matrix BUFFER;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            BUFFER[i][j] = N.MYMATRIX[i][j] + MYMATRIX[i][j];
        }
    }
    return BUFFER;
}
// перегружаем оператор вычитанием
Matrix &Matrix :: operator -(Matrix N)
{
    Matrix BUFFER;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            BUFFER[i][j] = N.MYMATRIX[i][j] - MYMATRIX[i][j];
        }
    }
    return BUFFER;
}
 
//перегружаем сравнение по элементам
bool Matrix :: operator ==(Matrix N)
{
    bool ASSIGMENT = true;
    //Matrix BUFFER;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            if (N.MYMATRIX[i][j] != MYMATRIX[i][j])
            {
                ASSIGMENT = false;
            }
        }
    }
    return ASSIGMENT;
}
//перегружаем оператор присвоения возвращаем Matrix &operator
Matrix &Matrix :: operator =(Matrix N)
{
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            MYMATRIX[i][j] = N.MYMATRIX[i][j];
        }
    }
    return *this;
}
//удаляем массив
Matrix::~Matrix()
{
    cout << "Удаляем массив" << endl;
    delete [] MYMATRIX;
}
//сообщение при старте программы
void Matrix::Message()
{
    cout << "================= Реализация класса "Матрица" =================\n"
        << " * В классе реализовать следующие методы:\n"
        << " * конструкторы (по умолчанию, с параметрами);\n"
        << " * деструктор;\n"
        << " * ввод с клавиатуры, вывод на экран (в виде методов).\n"
        << " * В этом же классе, перегрузить операции:\n"
        << " * +, += (сложение матриц);\n"
        << " * – (вычитание);\n"
        << " * = (присвоение);\n"
        << " * == (сравнение по элементам);\n"
        << " * [] (взятие элемента с заданным индексом)." << endl;
    
    cout << "                       Выберите операцию                        \n"
        << "1....Сложение матриц\n"
        << "2....Вычитание матриц\n"
        << "3....Присвоение матриц\n"
        << "4....Сравнение матриц по элементам\n"
        << "5....Взятие элемента с заданным адресом\n"
        << "6....Вывод матрицы а\n" 
        << "7....Вывод матрицы b\n" << endl;
    
}
//метод вывода матрицы
void Matrix::Print()
{
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            cout << setw(4) << MYMATRIX[i][j];
        }
        cout << endl;
    }
    cout << endl;
}
// изменение элементов матрицы
void Matrix::Edit(int a, int b)
{
    cin >> MYMATRIX[a][b];
}
Вылезает ошибка: MyMatrixClass_21.06.2016.exe вызвал срабатывание точки останова.
C++
1
2
3
4
5
6
7
8
void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK);
    #else
    free(block);
    #endif
}
Мне кажется, что я не верно использую конструктор... Выбираю метод сложения матриц например. Вижу как в консоле срабатывает деструктор 3 раза и прога крешится.
Ткните пожалуйста, куда копать?
0
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
22.06.2016, 10:51 12
Цитата Сообщение от Jman Посмотреть сообщение
Ткните пожалуйста, куда копать?
Ну, предположу, что как минимум помимо обычного конструктора тебе нужен конструктор копирования.
0
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 827
22.06.2016, 11:44  [ТС] 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
// конструктор 
Array::Array()
{
    for (int i = 0; i < 5; i++)
    {
        MYARR[i] = rand() % 20;
    }
}
// конструктор Matrix
Matrix::Matrix()
{
    MYMATRIX = new Array[5];
}
//конструктор копирования
Matrix::Matrix(const Matrix &obj)
{
    MYMATRIX = new Array[5];
    //cout << "\nКонструктор копирования\n";
}
//деструктор
Matrix::~Matrix()
{
    delete[] MYMATRIX;
    cout << "\n Очищаем память \n";
}
Верное - ли это решение задачи?
0
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
22.06.2016, 12:25 14
Цитата Сообщение от Jman Посмотреть сообщение
Верное - ли это решение задачи?
Конструктор копирования должен копировать.
0
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 827
22.06.2016, 19:18  [ТС] 15
Копировать сам конструктор? Какой в данном случае?
0
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
22.06.2016, 19:25 16
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Конструктор копирования должен копировать.
Конструктор копирования должен копировать содержимое одного объекта в текущий.
В твоем случае - из переданной матрицы в текущую матрицу.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2016, 19:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Передача объектов дочерних классов через массив объектов родительского класса в функцию
Здравствуйте. Возможно, вопрос больше относится к теории ООП, но все же я не решился задавать его в...

Массив объектов базового класса, позволяющий работать с набором объектов — чтение, вывод
Расширить программы с классами. Каждый разработанный класс считать базовым; для каждого такого...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив...

Как правильно создать массив объектов текущего класса в методе данного класса?
Привет! Ставится задача создания метода, который формирует массив объектов. Правильно ли делать...


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

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

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