Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33

Класс для работы с матрицами - Что дает перегруженный оператор индексирования?

07.04.2013, 01:15. Показов 1814. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть работающая программа, которая имеет:
  • конструктор с параметрами, который заполняет матрицу псевдослучайными числами
  • конструктор копирования
  • деструктор
  • метод для отображения матрицы
  • метод для отображения подматрицы указанного размера начиная с заданного элемента (пока без защиты от неправильных действий пользователя, но планируется)
  • перегруженный оператор индексирования
  • перегруженный оператор сложения


Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <stdlib.h>
using namespace std;
 
class Matrix
{
private:
    int row, col;
//  static int numb;
    int ** IntData;
public:
    friend Matrix operator+ (const Matrix& l, const Matrix& r);
    Matrix(int _row, int _col): row(_row), col(_col) // конструктор c параметрами
    {
//      numb++;
        IntData = new int*[row];
        for (int i = 0; i < row; i++){
            IntData[i] = new int[col];
                 for (int j = 0; j < col; j++){
                     IntData[i][j] = rand();
                 }
             }
    }
    Matrix(const Matrix& m) // конструктор копирования
        {
        if (row != m.row || col != m.col)
        {
            for(int i = 0; i < row; ++i)
            delete [] IntData[i];
            delete [] IntData;
            row = m.row;
            col = m.col;
            IntData = new int*[row];
            for(int i = 0; i < row; ++i)
                IntData[i] = new int[col];
        }
        for (int i = 0; i < row; ++i)
            for (int j = 0; j < col; ++j)
                IntData[i][j] = m.IntData[i][j];
//      numb++;
        };
 
    ~Matrix()
    {for (int i = 0; i < row; i++){
        delete IntData[i];
        delete IntData;
//      numb--;
        }
    }
 
/*  void Fill()
    {
        cout << "\nNumber of rows: " ;
        cin >> row ;
        cout << "\nNumber of columns: " ;
        cin >> col ;
        cout << endl;
        for (int i = 0; i < row; i++){
             for (int j = 0; j < col; j++){
                 cout << "x[" << i << "][" << j << "]= ";
                 cin >> IntData[i][j];
             }}
    }
*/
 
    void Display()
    {
         cout << "\n Matrix \n";
         for (int i = 0; i < row; i++){
             cout << "\nRow: " << i << " >";        // нумеруем каждый ряд
             for (int j = 0; j < col; j++){
                 cout << " " << IntData[i][j]; // печатаем колонки
             }
         }
         return;
    }
 
        void SubMatrix()
        {
            int x, y, n, m;
            cout << "\nStart element [x][y]" << "\nx = ";
            cin >> x;
            cout << "y = ";
            cin >> y;
            cout << "Submatrix rows = ";
            cin >> m;
            cout << "Submatrix columns = ";
            cin >> n;
                 cout << "\n SubMatrix \n";
                 for (int i = x; i < m + x; i++){
                     cout << "\nRow: " << i << " >";
                     for (int j = y; j < n + y; j++){
                         cout << " " << IntData[i][j];
                     }
                 }
                 return;
        }
 
        int* operator[](int elem)
        {
            return IntData[elem];
        }
 
    /*  Matrix operator++ ()
        {
            col++;
            row++;
            return *this;
        } */
 
//      Matrix& operator=(const Matrix&){} ? не менять счетчик numb для присваивния
 
};
 
        Matrix operator+ (const Matrix& l, const Matrix& r)
        {
            if (l.col != r.col || l.row != r.row)
            cout << "wrong matrix size";
            Matrix result(l.row, l.col);
            for (int i = 0; i < l.row; ++i)
            for (int j = 0; j < l.col; ++j)
                result.IntData[i][j] = l.IntData[i][j] + r.IntData[i][j];
            return result;
        };
 
int main()
{
    Matrix m1(4, 5);
    m1.Display();
    Matrix m2(4, 5);
    m2.Display();
    Matrix m3 = m1 + m2;
    m3.Display();
    m3.SubMatrix();
 
    system("pause");
    return(0);
}


Вопросы и проблемы:
1. Что вообще дает перегруженный оператор индексирования? Он правильно написан? Писал просто по примерам.
2. Не получается сделать перегруженный оператор инкремента, который добавлял бы 1 строку и 1 столбец (пример попытки есть в коде в виде комментария).
3. Счетчик количества созданных объектов класса (переменная numb, тоже оставил в виде комментариев, выдает ошибку).
4. Методы вывода матрицы и подматрицы должны быть описаны в дружественном классе (у меня в основном). Когда выношу их в дружественный, они не видят переменных, хотя дружественный класс в основном прописывал.
5. Метод для ввода матрицы с клавиатуры Fill() подвешивает комп, если не хотите перезагружаться - не компилируйте его) Он мне в принципе и не нужен, но просто любобытно в чем там дело.
Может будут просто какие-то замечания по поводу реализации (более эффективные методы и т.п.).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.04.2013, 01:15
Ответы с готовыми решениями:

Класс: Разработать класс для работы с матрицами(операции над матрицами)...
Добрый вечер, хочу попросить о помощи с отловом проблемы. Сама задача: разработать класс для работы с матрицами(операции над...

Класс для работы с матрицами
Неплохая библиотека :) . Люди, у кого есть нервы скачать весь сайт и в архиве прислать ко мне на мыло :) (Библиотека хорошая, а на качалку...

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

10
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.04.2013, 13:33
EvengarS, по-моему, на форуме достаточно тем, которые расжевывают подобные классы.
P.S. деструктор реализован не правильно: удалять массив надо через delete [] ptr.
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
07.04.2013, 14:01  [ТС]
То, что нашел - реализовал, что не реализовал - не нашел или не получается. Не подскажете где смотреть?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.04.2013, 14:09
EvengarS, такой поиск делали ?
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
07.04.2013, 19:35  [ТС]
Конечно делал, ни в одном примере не нашел операций, которые бы увеличивали количество строк и столбцов.
Счетчик объектов сделал как нашел - почему-то не работает.
Проблемы 2, 3 реализованы в коде, 4 не отображал, чтобы код оставался работающим.
Примеры и учебники мне уже не помогали, поэтому обратился за помощью.

Добавлено через 1 час 52 минуты
Попробовал написать инкремент так:

C++
1
2
3
4
5
6
    Matrix operator++(Matrix& x) // префиксная
        {
            ++x.col;
            ++x.row;
            return x;
        };
Гворит - increment of member in read-only object.
Что не так?

Добавлено через 3 часа 0 минут
Ребята, неужели никто не знает? Вроде не очень сложные вопросы, очень надо.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.04.2013, 21:03
Цитата Сообщение от EvengarS Посмотреть сообщение
Что не так?
А что должно увеличиваться? Если кол-во строк и столбцов, то писать надо так хотя бы:
C++
1
2
3
4
5
6
Matrix& operator++() // префиксная
{
   ++col;
   ++row;
   return *this;
};
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
07.04.2013, 21:18  [ТС]
У меня был почти такой вариант, только Matrix вместо Matrix&, это существенно?
В любом случае с таким вариантом тоже не работает, програма зависает.
Сейчас такой вариант, можете попробовать скомпилировать?
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
#include <iostream>
#include <stdlib.h>
using namespace std;
 
class Matrix
{
private:
    int row, col;
//  static int numb;
    int ** IntData;
public:
    friend Matrix operator+(const Matrix& l, const Matrix& r);
    Matrix() // конструктор по умолчанию
    {
//      numb++;
        row = 0; col = 0;
        IntData = new int*[row];
                for (int i = 0; i < row; i++){
                    IntData[i] = new int[col];
                }
    }
 
    Matrix(int _row, int _col): row(_row), col(_col) // конструктор c параметрами
    {
//      numb++;
        IntData = new int*[row];
        for (int i = 0; i < row; i++){
            IntData[i] = new int[col];
                 for (int j = 0; j < col; j++){
                     IntData[i][j] = rand();
                 }
             }
    }
    Matrix(const Matrix& m) // конструктор копирования
    {
//      numb++;
        if (row != m.row || col != m.col)
        {
            for(int i = 0; i < row; ++i)
            delete [] IntData[i];
            delete [] IntData;
            row = m.row;
            col = m.col;
            IntData = new int*[row];
            for(int i = 0; i < row; ++i)
                IntData[i] = new int[col];
        }
        for (int i = 0; i < row; ++i)
            for (int j = 0; j < col; ++j)
                IntData[i][j] = m.IntData[i][j];
        };
 
    ~Matrix()
    {
        for (int i = 0; i < row; i++){
        delete[] IntData[i];
        delete[] IntData;
//      numb--;
        }
    }
 
 
    int* operator[](int elem)
    {
        return IntData[elem];
    }
 
    Matrix& operator++() // префиксная
    {
        ++row;
        ++col;
        return *this;
    }
 
    Matrix& operator++(int notused) // постфиксная
    {
        row++;
        col++;
        return *this;
    }
 
    void Display()
    {
         cout << "\n Matrix \n";
         for (int i = 0; i < row; i++){
             cout << "\nRow: " << i << " >";
             for (int j = 0; j < col; j++){
                 cout << " " << IntData[i][j];
             }
         }
         return;
    }
 
    void SubMatrix()
    {
        int x, y, n, m;
        cout << "\nStart element [x][y]" << "\nx = ";
        cin >> x;
        cout << "y = ";
        cin >> y;
        cout << "Submatrix rows = ";
        cin >> m;
        cout << "Submatrix columns = ";
        cin >> n;
        cout << "\n SubMatrix \n";
             for (int i = x; i < m + x; i++){
                 cout << "\nRow: " << i << " >";
                 for (int j = y; j < n + y; j++){
                     cout << " " << IntData[i][j];
                 }
             }
             return;
    }
};
 
    Matrix operator+(const Matrix& l, const Matrix& r)
    {
        if (l.col != r.col || l.row != r.row)
        cout << "wrong matrix size";
        Matrix result(l.row, l.col);
        for (int i = 0; i < l.row; ++i)
        for (int j = 0; j < l.col; ++j)
            result.IntData[i][j] = l.IntData[i][j] + r.IntData[i][j];
        return result;
    };
 
 
int main()
{
    Matrix m1(4, 4);
    m1.Display();
    Matrix m2(5, 5);
    m2.Display();
    ++m1;
    m1.Display();
    Matrix m3 = m1 + m2;
    m3.Display();
 
    system("pause");
    return(0);
}
Без операции ++m1; в main() вполне себе работает
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.04.2013, 21:28
EvengarS, в деструкторе ошибка, должно быть так:
C++
1
2
3
4
5
6
7
    ~Matrix()
    {
        for (int i = 0; i < row; i++)
            delete[] IntData[i];
        delete[] IntData;
//      numb--;
    }
Ну и если уж правильно реализовать постфиксную форму инкремента, то он должен возвращать объект ДО увеличения размеров.
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
07.04.2013, 21:36  [ТС]
Деструктор поправил, спасибо.
Но инкремент все-равно не работает, даже если использовать префиксную форму, которая там тоже прописана.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.04.2013, 22:51
Цитата Сообщение от EvengarS Посмотреть сообщение
Но инкремент все-равно не работает
Потому что нужно память перераспределить под новые размеры.
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
07.04.2013, 23:45  [ТС]
Еще бы я знал как это правильно сделать...

Так не получается
C++
1
2
3
4
5
6
7
8
9
10
    Matrix& operator++() // префиксная
    {
        ++row;
        ++col;
        IntData = new int*[row];
            for (int i = 0; i < row; i++){
                IntData[i] = new int[col];
                }
        return *this;
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2013, 23:45
Помогаю со студенческими работами здесь

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

Класс для работы с матрицами
Добрый день. Подскажите, пожалуйста, существует ли какой-то общепринятый класс для работы с матрицами (сложение, умножение, вычисление...

Разработать класс для работы с матрицами
Кто может помоч написать программку!!!! Вот задание Разработать класс для работы с матрицами, содержащий следующие методы: ...

Создать класс для работы с матрицами
Нужно создать класс для работы с матрицами и предусмотреть функции: -добавления(+); -умножения двух матриц(*); -транспонирования...

Разработать класс для работы с матрицами
Здравствуйте Уважаемые!!! Помогите пожалуйста написать код вот этого задания!!! Задание 1. Разработать методы, использующие (при...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru