1 / 1 / 0
Регистрация: 29.11.2019
Сообщений: 9
1

Класс Матриц: вставка/извлечение столбца

29.11.2019, 19:45. Показов 3384. Ответов 7
Метки нет (Все метки)

Добрый вечер, у меня возникла такая проблема. Я только начал изучать классы и дуб дубом, а уже дали задание: Необходимо создать класс "Матрица". Предусмотреть в нём методы: конструктор, деструктор, а также операторы перегрузки: сложение, вычитание, умножение 2 матриц,ВСТАВКА СТОЛБЦА В МАТРИЦУ, умножение матрицы на число, транспонирование и тд.
Возникли с трудности с вставкой столбца в матрицу и извлечением из неё столбца. Может кто-нибудь объяснить, каким способом можно реализовать это?
Из этого списка у меня два задания 1. Транспонирование матрицы, с которой вроде не возникло проблем

C++
1
2
3
4
5
6
7
8
9
// транспонирование матрицы
Matrix transp(Matrix & a)
{
    Matrix c = Matrix(a.M(), a.N());
    for (int i = 0; i < a.N(); ++i)
        for (int j = 0; j < a.M(); ++j)
            c[j][i] = a[i][j];
    return c;
}
2.Ну и собственно вставка столбца и вытаскивания столбца из него с которой возникли проблемы
к сожаление это всё, что у меня есть по этому пункту, пытаюсь разобраться с вставкой, до вытаскивания пока не добрался.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Matrix addCols(Matrix & a, int index)
 {
     for (int i = 0; i < a.N(); ++i)
     {
         int* temp = new int[a.M + 1];
         for (int j = 0; j < a.M; j++)
             temp[j] = (a.M(), a.N());
 
         for (int k = a.M; k >= index; k--)
             temp[k + 1] = temp[k];
 
         temp[index] = std::rand() % 10;
 
         if (temp != NULL)
         {
             Matrix(a.M()) = temp; a.M++;
         }
     }
 }
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
#include<iostream>
#include<fstream>
using namespace std;
 
const double eps = 1e-9;
 
class Matrix
{
private:
    unsigned int n, m;
    double* a;
public:
    // матрица без элементов
    Matrix()
    {
        a = NULL;
        n = NAN;
        m = NAN;
    }
    // матрица NxM
    Matrix(unsigned N, unsigned M)
    {
        n = N;
        m = M;
        a = new double[n * m];
 
        for (unsigned i = 0; i < n * m; i++)
        {
            *(a + i) = 0;
        }
        /*double* a_end = (a + n * m);
        for (; a < a_end; a++)
        {
            *a = 0;
        }*/
    }
    // матрица NxN
    Matrix(unsigned N)
    {
        n = N;
        a = new double[n * n];
 
        for (unsigned i = 0; i < n * n; i++)
        {
            *(a + i) = 0;
        }
        /*double* a_end = (a + n * n);
        for (; a < a_end; a++)
        {
            *a = 0;
        }*/
    }
Буду очень признателен!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2019, 19:45
Ответы с готовыми решениями:

Базовый класс Complex и производный класс для реализации квадратных матриц
1) Создайте базовый класс Complex (комплексное число) для реализации комплексных чисел в...

Класс Комплексные числа. Извлечение и помещение в поток
Дано такое задание Создать класс представляющий понятие комплексных чисел с переопределёнными...

Вставка столбца в матрицу
Помогите, пожалуйста, с программой. Дана целочисленная квадратная матрица размерности nxn....

Класс строка текста(хранение и извлечение символов) Стандарт C++ 2011
Добрый день. Нужно реализовать класс &quot;строка текста&quot;. Хранение символов должно быть в UTF-16, а...

7
Just Do It!
3376 / 1842 / 618
Регистрация: 23.09.2014
Сообщений: 5,832
29.11.2019, 19:46 2
Лучший ответ Сообщение было отмечено Enot321 как решение

Решение

Цитата Сообщение от Enot321 Посмотреть сообщение
class 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
void addCols(Matrix & a, int index)
 {
    //--------------------------------|
    // Временная матрица
    Matrix temp(a.N,a.M + 1);
    
    //--------------------------------|
    // Пишем до вставляемого столбцы.
    for     (int i = 0; i < a.N(); ++i)
    {   for (int j = 0; j < index; ++i)
        {   temp[i][j] = a[i][j]
        }
    }
    
    //--------------------------------|
    // Пишем рандомно сам столбец.
    for     (int i = 0; i < a.N(); ++i)
    {   temp[i][index] = std::rand() % 10;
    }
    
    //--------------------------------|
    // Пишем оставшиеся столбцы.
    for     (int i = 0;     i < a.N();   ++i)
    {   for (int j = index; j < a.M()+1; ++i)
        {   temp[i][j] = a[i][j]
        }
    }
    
    //--------------------------------|
    // operator= перегружен.
    a = temp;
    
    //--------------------------------|
    // Если реализован конструктор 
    // перемещения, то можно и так.
    // return temp;
 }
1
1 / 1 / 0
Регистрация: 29.11.2019
Сообщений: 9
29.11.2019, 20:14  [ТС] 3
Спасибо большое, а что нужно улучшить, чтобы вставить его таким способом?
0
Just Do It!
3376 / 1842 / 618
Регистрация: 23.09.2014
Сообщений: 5,832
29.11.2019, 20:52 4
Лучший ответ Сообщение было отмечено Enot321 как решение

Решение

Цитата Сообщение от Enot321 Посмотреть сообщение
Спасибо большое, а что нужно улучшить, чтобы вставить его таким способом?
вот я улучшил уже, но ещё не до конца:

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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<iomanip>
///----------------------------------------------------------------------------|
/// Двумерный динамический массив инкапсулированный в структуре.
///----------------------------------------------------------------------------:
#define FORi(v)  for(int i = 0; i < v; ++i)
#define FORj(v)  for(int j = 0; j < v; ++j)
#define LOG(v)   //Log(#v, v)
 
template<class T>
class carr
{
public:
    carr(int _r, int _c) : arr(NULL), row(_r), column(_c)
    {
        arr = create_arr(row, column);
    }
 
    carr() : arr(NULL), row(0), column(0)
    {
    }
 
    carr(carr& _arr) : arr(NULL), row(0), column(0)
    {
        resize(_arr.row, _arr.column);
        FORi(row)
            FORj(column)
            arr[i][j] = _arr[i][j];
    }
 
    carr(carr&& _arr) : arr(NULL), row(0), column(0)
    {
    }
 
    ~carr()
    {
        delete_arr(arr);
    }
 
    carr<T>& operator=(carr<T>& rhs) //noexcept ///-------------copy assignment:
    {   //Log("copy assignment");
        if (this != &rhs)
        {
            carr<T> tmp(rhs);
            swap(*this, tmp);
        }
        return *this;
    }
 
    carr<T>& operator=(carr<T>&& rhs) //noexcept ///------------move assignment:
    {   //Log("move assignment");
        swap(*this, rhs);
        return *this;
    }
 
    //------------------------------------------------------resize(int r, int c)
    void resize(int _r, int _c)
    {
        if (arr != NULL)
        {
            delete_arr(arr);
        }
        row = _r;
        column = _c;
        arr = create_arr(row, column);
    }
 
    //-----------------------------------------------------------init_one(T val)
    void init_one(T _val)
    {
        if (arr == NULL)
        {
            std::cout << "Нет массива!\n";
            return;
        }
        FORi(row)
            FORj(column)
            arr[i][j] = _val;
    }
 
    int row_   (){  return row;}
    int column_(){  return column;}
 
    //-------------------------------------------------------------------show():
    void show()
    {
        if (arr == NULL)
        {
            std::cout << "Нет массива!\n";
            return;
        }
        FORi(row)
        {
            FORj(column)
            {
                std::cout << arr[i][j];
            }
        }
        std::cout << "\n";
    }
    void info()
    {   //Log(__PRETTY_FUNCTION__);
        LOG(row);
        LOG(column);
        LOG(arr);
        std::cout << "\n";
    }
    //-------------------------------------------Форматированный вывод на экран:
    void show_format()
    {
        std::cout << "\nrow    =" << std::setw(3) << row << "\n";
        std::cout << "column =" << std::setw(3) << column << "\n";
 
        FORi(row)
        {
            FORj(column)
            {
                if (arr[i][j] != -77)
                    std::cout << std::setw(5)
                    << std::setprecision(4)
                    << std::setfill(' ') << arr[i][j] << " \t";
                else
                    std::cout << std::setw(5)
                    << std::setprecision(4)
                    << std::setfill(' ') << " empty\t";
            }
            std::cout << "\n";
        }
        std::cout << "\n";
    }
 
    T* operator[](const int i) const  //noexcept
    {   return arr[i];
    }
 
    void init_rand(int border_start, int border_end = 0)
    {
        if (arr == NULL)
        {
            std::cout << "Нет массива!\n"; return;
        }
        if (border_start > border_end) std::swap(border_start, border_end);
        FORi(row)
            FORj(column)
            arr[i][j] = rrand(border_end, border_start);
    }
 
    static int rrand(int range_max, int range_min = 0)
    {
        return rand() % (range_max - range_min + 1) + range_min;
    }
 
protected:
    T** arr;
    int row, column;
 
    //--------------------------------------------------------------create_arr()
    T** create_arr(int r, int c)
    {   //LOG(__PRETTY_FUNCTION__);
        T** _arr = new T * [r];
        FORi(r)
        {
            _arr[i] = new T[c];
        }
        return _arr;
    }
 
    //--------------------------------------------------------------delete_arr()
    void delete_arr(T**& p)
    {
        FORi(row)
        {
            delete[] p[i];
        }
        delete[] p;
        p = NULL;
    }
 
    friend void swap(carr<T>& l, carr<T>& r) //noexcept
    {
        using std::swap;
        swap(l.arr, r.arr);
        swap(l.row, r.row);
        swap(l.column, r.column);
    }
};
 
///----------------------------------------------------------------------------|
/// Добавить столбик.
///----------------------------------------------------------------------------:
carr<int>& addCols(carr<int>& a, int index)
 {
    //--------------------------------|
    // Временная матрица
    carr<int> temp(a.row_(), a.column_() + 1);
    
    //--------------------------------|
    // Пишем до вставляемого столбцы.
    for     (int i = 0; i < a.row_(); ++i)
    {   for (int j = 0; j < index; ++j)
        {   temp[i][j] = a[i][j];
        }
    }
    
    //--------------------------------|
    // Пишем рандомно сам столбец.
    for     (int i = 0; i < a.row_(); ++i)
    {   temp[i][index] = temp.rrand(2019, 2000); ///<<<-----------------Столбец!
    }
    
    //--------------------------------|
    // Пишем оставшиеся столбцы.
    for     (int i = 0;     i < a.row_();   ++i)
    {   for (int j = index+1; j < a.column_()+1; ++j)
        {   temp[i][j] = a[i][j-1];
        }
    }
    
    //--------------------------------|
    // operator= перегружен.
    a = temp;
    
    //--------------------------------|
    // Если реализован конструктор /// надо тесты написать и поправить его
    // перемещения, то можно и так.
    //return temp;
 }
 
///----------------------------------------------------------------------------|
/// Старт.
///----------------------------------------------------------------------------:
int main()
{   srand((unsigned int)time(NULL));
 
    carr<int> matrix(5,7);
              matrix.init_rand(-20, 20);
              matrix.show_format();
    
    addCols(matrix, 3);
            matrix.show_format();
    
    return 0;
}
Добавлено через 2 минуты
из за конструктора перемещения нужна поддержка C++11

Добавлено через 29 минут
Enot321,
вот вроде работает конструктор перемещения, но нужно написать тесты и тщательно протестить это дело:
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
...
 
///----------------------------------------------------------------------------|
/// Добавить столбик.
///----------------------------------------------------------------------------:
carr<int> addCols(carr<int>& a, int index)
 {
    //--------------------------------|
    // Временная матрица
    carr<int> temp(a.row_(), a.column_() + 1);
    
    //--------------------------------|
    // Пишем до вставляемого столбцы.
    for     (int i = 0; i < a.row_(); ++i)
    {   for (int j = 0; j < index; ++j)
        {   temp[i][j] = a[i][j];
        }
    }
    
    //--------------------------------|
    // Пишем рандомно сам столбец.
    for     (int i = 0; i < a.row_(); ++i)
    {   temp[i][index] = temp.rrand(2019, 2000); ///<<<-----------------Столбец!
    }
    
    //--------------------------------|
    // Пишем оставшиеся столбцы.
    for     (int i = 0;     i < a.row_();   ++i)
    {   for (int j = index+1; j < a.column_()+1; ++j)
        {   temp[i][j] = a[i][j-1];
        }
    }
    
    //--------------------------------|
    // operator= перегружен.
    //a = temp;
    
    //--------------------------------|
    // Если реализован конструктор /// надо тесты написать и поправить его
    // перемещения, то можно и так.
    return temp;
 }
 
///----------------------------------------------------------------------------|
/// Старт.
///----------------------------------------------------------------------------:
int main()
{   srand((unsigned int)time(NULL));
 
    carr<int> matrix(5,7);
              matrix.init_rand(-20, 20);
              matrix.show_format();
    
    carr<int> mat = addCols(matrix, 3);
              mat.show_format();
    
    return 0;
}
1
1 / 1 / 0
Регистрация: 29.11.2019
Сообщений: 9
29.11.2019, 21:02  [ТС] 5
Ох, спасибо большое, буду разбираться!
1
1 / 1 / 0
Регистрация: 29.11.2019
Сообщений: 9
05.12.2019, 18:17  [ТС] 6
Доброго времени суток.Столкнулся с такой проблемой, недавно я начал изучать классы и дуб дубом, а уже дали задание: Необходимо создать класс "Матрица" Предусмотреть в нём методы: конструктор, деструктор, а также операторы перегрузки: сложение, вычитание, умножение 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
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
216
217
218
#include<iostream>
#include<fstream>
using namespace std;
 
const double eps = 1e-9;
 
class Matrix
{
private:
    unsigned int n, m;
    double* a;
public:
    // матрица без элементов
    Matrix()
    {
        a = NULL;
        n = NAN;
        m = NAN;
    }
    // матрица NxM
    Matrix(unsigned N, unsigned M)
    {
        n = N;
        m = M;
        a = new double[n * m];
 
        for (unsigned i = 0; i < n * m; i++)
        {
            *(a + i) = 0;
        }
    }
    // матрица NxN
    Matrix(unsigned N)
    {
        n = N;
        a = new double[n * n];
 
        for (unsigned i = 0; i < n * n; i++)
        {
            *(a + i) = 0;
        }
 
    }
    // матрица из элементов array, размера NxM (если кол-во эл-ов матрицы > эл-ов array, оставшееся заполняем нулями)
    Matrix(double p[], unsigned N, unsigned M)
    {
        n = N;
        m = M;
        a = new double[n * m];
 
        for (unsigned i = 0; i < n*m; i++)
        {
            *(a + i) = *(p + i);
        }
    }
 
    // матрица из элементов array, размера NxM (если кол-во эл-ов матрицы > эл-ов array, оставшееся заполняем нулями)
    Matrix(double* p, unsigned N)
    {
        n = N;
        a = new double[n * m];
 
        for (unsigned i = 0; i < n * n; i++)
        {
            *(a + i) = 0;
        }
 
    }
 
    int N()
    {
        return n;
    }
    int M()
    {
        return m;
    }
 
    double operator [] (int i)
    {
        return getEl(i);
    }
    // получить строку матрицы
    double getEl(int i)
    {
        if (i >= 0 && i < n*m)
            return a[i];
        return 0;
    }
 
    double* str(unsigned num = 1) // Получение указателя на строку 
    {
        double* ptr = a;
        ptr += m * (num - 1);
        return(ptr);
    }
 
    ~Matrix() {
        a = NULL;
        n = m = NAN;
    }
    friend Matrix transpose(Matrix& b);
 
};
 
// вывести матрицу на консоль
void printMatrix(Matrix & a)
{
    for (unsigned i = 0; i < a.N(); i++)
    {
        for (unsigned j = 0; j < a.M(); j++)
            cout << a[i*a.M() + j] << "\t";
        cout << endl;
    }
    cout << endl;
 
}
 
 
Matrix transpose(Matrix & b)
 
{
    Matrix c = Matrix(b.M(), b.N());
 
    for (unsigned i = 0; i < b.N(); i++)
    {
        for (unsigned j = 0; j < b.M(); j++)
        {
            *(c.a + j * c.M() + i) = *(b.a + i * b.M() + j);
        }
    }
    return c;
}
 
Matrix multi(Matrix &a, Matrix &b) //произведение двух матриц (ЛОГИНОВ)
{
    if (a.M() == b.N())
    {
        Matrix c = Matrix(a.N(), b.M());
        double* ptrA = a.str(); double* ptrB = b.str(); double* ptrC = c.str();
        for (int i = 0; i < a.N(); i++)
            for (int j = 0; j < b.M(); j++)
                for (int k = 0; k < a.M(); k++)
                    *(ptrC + i * c.M() + j) += *(ptrA + i * a.M() + k) * *(ptrB + k * b.M() + j);
        return c;
    }
    else
    {
        Matrix err;
        return err;
    }
}
Matrix addCols(Matrix & a, int index)
{
    //--------------------------------|
    // Временная матрица
    Matrix temp(a.N, a.M + 1);
 
    //--------------------------------|
    // Пишем до вставляемого столбцы.
    for (int i = 0; i < a.N(); ++i)
    {
 
        for (int j = 0; j < index; ++i)
        {
            temp[i][j] = a[i][j]
        }
    }
 
    //--------------------------------|
    // Пишем рандомно сам столбец.
    for (int i = 0; i < a.N(); ++i)
    {
        temp[i][index] = std::rand() % 10;
    }
 
    //--------------------------------|
    // Пишем оставшиеся столбцы.
    for (int i = 0; i < a.N(); ++i)
    {
        for (int j = index; j < a.M() + 1; ++i)
        {
            temp[i][j] = a[i][j]
        }
    }
 
    //--------------------------------|
    // operator= перегружен.
    a = temp;
 
    return a;
}
 
 
int main() {
    setlocale(0, "RUS");
    //double k;
    double a[] = { 4,2,3,1,1,5 };
    double b[] = { 1,2,2,3,1,1 };
    Matrix A(a, 2, 3);//m-столбы n-строки
    printMatrix(A);
    cout << A.N() << "x" << A.M() << endl;
    Matrix B(b, 3, 2);
    cout << B.N() << "x" << B.M() << endl;
    printMatrix(B);
    Matrix C = multi(A, B);
    printMatrix(C);
    cout << C.N() << "x" << C.M() << endl;
    //A = transpose(A);
    //ptr = A.str(2);
    //cout << *ptr << endl;
 
    //cout << "Матрица А:\n";
 
    //printMatrix(A);
 
    system("pause");
}
Это то, что мне пока удалось сделать именно по вставке, но чтобы использовать это, мне посоветовали улучшить класс и сделать конструктор перемещения, но как реализовать его, я не знаю
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
Matrix addCols(Matrix & a, int index)
{
    //--------------------------------|
    // Временная матрица
    Matrix temp(a.N, a.M + 1);
 
    //--------------------------------|
    // Пишем до вставляемого столбцы.
    for (int i = 0; i < a.N(); ++i)
    {
 
        for (int j = 0; j < index; ++i)
        {
            temp[i][j] = a[i][j]
        }
    }
 
    //--------------------------------|
    // Пишем рандомно сам столбец.
    for (int i = 0; i < a.N(); ++i)
    {
        temp[i][index] = std::rand() % 10;
    }
 
    //--------------------------------|
    // Пишем оставшиеся столбцы.
    for (int i = 0; i < a.N(); ++i)
    {
        for (int j = index; j < a.M() + 1; ++i)
        {
            temp[i][j] = a[i][j]
        }
    }
 
    //--------------------------------|
    // operator= перегружен.
    a = temp;
 
    return a;
}
Спасибо!
0
1 / 1 / 0
Регистрация: 29.11.2019
Сообщений: 9
06.12.2019, 16:54  [ТС] 7
Доброго времени суток. Недавно я начал изучать классы и столкнулся с такой проблемой: Необходимо создать класс "Матрица" Предусмотреть в нём методы: конструктор, деструктор, а также операторы перегрузки: сложение, вычитание, умножение 2 матриц,Вставка столбца и извлечение.

Возникли трудности с вставкой столбца в матрицу и извлечением столбца из матрицы. Может кто-нибудь объяснить, каким способом можно реализовать это?
Пример работы:
Пусть дана матрица 3x3
1 2 3
4 5 6
7 8 9
нам нужно вставить столбец на номер K столбца т.е например столбец
1
1
1
при вставке в матрицу вместо 1-го столбца должен выдавать
1 2 3
1 5 6
1 6 9

Вот пока всё, что у меня есть

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
#include<iostream>
#include<fstream>
using namespace std;
 
const double eps = 1e-9;
 
class Matrix
{
private:
    unsigned int n, m;
    double* a;
public:
    // матрица без элементов
    Matrix()
    {
        a = NULL;
        n = NAN;
        m = NAN;
    }
    // матрица NxM
    Matrix(unsigned N, unsigned M)
    {
        n = N;
        m = M;
        a = new double[n * m];
 
        for (unsigned i = 0; i < n * m; i++)
        {
            *(a + i) = 0;
        }
    }
    // матрица NxN
    Matrix(unsigned N)
    {
        n = N;
        a = new double[n * n];
 
        for (unsigned i = 0; i < n * n; i++)
        {
            *(a + i) = 0;
        }
 
    }
    // матрица из элементов array, размера NxM (если кол-во эл-ов матрицы > эл-ов array, оставшееся заполняем нулями)
    Matrix(double p[], unsigned N, unsigned M)
    {
        n = N;
        m = M;
        a = new double[n * m];
 
        for (unsigned i = 0; i < n*m; i++)
        {
            *(a + i) = *(p + i);
        }
    }
 
    // матрица из элементов array, размера NxM (если кол-во эл-ов матрицы > эл-ов array, оставшееся заполняем нулями)
    Matrix(double* p, unsigned N)
    {
        n = N;
        a = new double[n * m];
 
        for (unsigned i = 0; i < n * n; i++)
        {
            *(a + i) = 0;
        }
 
    }
 
    int N()
    {
        return n;
    }
    int M()
    {
        return m;
    }
    
    double operator [] (int i)
    {
        return getEl(i);
    }
    // получить строку матрицы
    double getEl(int i)
    {
        if (i >= 0 && i < n*m)
            return a[i];
        return 0;
    }
 
    double* str(unsigned num = 1) // Получение указателя на строку (ЛОГИНОВ)
    {
        double* ptr = a;
        ptr += m*(num - 1);
        return(ptr);
    }
    
    ~Matrix() {
        a = NULL;
        n = m = NAN;
    }
    friend Matrix transpose(Matrix& b);
 
};
 
// вывести матрицу на консоль
void printMatrix(Matrix & a)
{
    for (unsigned i = 0; i < a.N(); i++)
    {
        for (unsigned j = 0; j < a.M(); j++)
            cout << a[i*a.M() + j] << "\t";
        cout << endl;
    }
    cout << endl;
 
}
 
 
Matrix transpose(Matrix & b)
 
{
    Matrix c = Matrix(b.M(), b.N());
 
    for (unsigned i = 0; i < b.N(); i++)
    {
        for (unsigned j = 0; j < b.M(); j++)
        {
            *(c.a + j * c.M() + i) = *(b.a + i * b.M() + j);
        }
    }
    return c;
}
 
Matrix multi(Matrix &a, Matrix &b) //произведение двух матриц (ЛОГИНОВ)
{
    if (a.M() == b.N())
            {
                Matrix c = Matrix(a.N(), b.M());
                double* ptrA = a.str(); double* ptrB = b.str(); double* ptrC = c.str();
                for (int i = 0; i < a.N(); i++)
                    for (int j = 0; j < b.M(); j++)
                        for (int k = 0; k < a.M(); k++)
                            *(ptrC + i*c.M() + j) += *(ptrA + i*a.M() + k) * *(ptrB + k*b.M() + j);
                return c;
            }
            else
            {
                Matrix err;
                return err;
            }
}
 
Matrix addCols(Matrix & a, Matrix & c, int index)
{
 
    for (int i = 0; i < a.N(); ++i)
    {// Пишем до вставляемого столбцы.
        for (int j = 0; j < index; ++i)
        {
            Matrix c = Matrix(a.M(), a.N());
        }
    }
    // Пишем рандомно сам столбец.
    for (int i = 0; i < a.N(); ++i)
    {
        Matrix c = Matrix(a.N(), index) = std::rand() % 10;
    }
 
    //--------------------------------|
    // Пишем оставшиеся столбцы.
    for (int i = 0; i < a.N(); ++i)
    {
        for (int j = index; j < a.M() + 1; ++i)
        {
            Matrix c = Matrix(a.N(), index);
        }
    }
 
 
    return c;
}
 
 
int main() {
    setlocale(0, "RUS");
    //double k;
    double a[] = { 4,2,3,1,1,5 };
    double b[] = { 1,2,2,3,1,1 };
    Matrix A(a, 2, 3);//m-столбы n-строки
    printMatrix(A);
    cout << A.N() << "x" << A.M() << endl;
    Matrix B(b, 3, 2);
    cout << B.N() << "x" << B.M() << endl;
    printMatrix(B);
    Matrix C = multi(A, B);
    printMatrix(C);
    cout << C.N() << "x" << C.M() << endl;
    //A = transpose(A);
    //ptr = A.str(2);
    //cout << *ptr << endl;
    
    //cout << "Матрица А:\n";
 
    //printMatrix(A);
 
    system("pause");
}


Сам я и дуб дубом, а уже дали задание.Буду очень благодарен, если кто-то откликнется
0
Just Do It!
3376 / 1842 / 618
Регистрация: 23.09.2014
Сообщений: 5,832
07.12.2019, 15:47 8
Цитата Сообщение от Enot321 Посмотреть сообщение
при вставке в матрицу вместо 1-го столбца должен выдавать
ага
Цитата Сообщение от Enot321 Посмотреть сообщение
Возникли трудности
Чтобы разрулить трудности вам нужно сначала определиться между вставкой и заменой столбца?

1. Вставка: это когда куда-то внутрь матрицы вы ДОБАВИТЕ ещё один столбец, т.е. кол-во элементов увеличится.
2. Замена: это когда размер матрицы не изменится, а ПОМЕНЯЮТСЯ только её элементы.

Итого: старайтесь как можно четче формулировать себе само задание, на то, что нужно сделать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2019, 15:47
Помогаю со студенческими работами здесь

Динамическая матрица. вставка столбца
не получается вставка. задание таково, что после столбцов, не содержащих отрицательные элементы...

В каждой из матриц: A (5 строк, 4 столбца) и В (4 строки, 3 столбца) поменять местами два столбца
В каждой из матриц: A (5 строк, 4 столбца) и В (4 строки, 3 столбца) поменять местами два столбца:...

Определите класс матриц. Напишите перегруженные конструкторы для создания одномерной и двумерной матриц. В конструкторы передаются размерности матриц
Доброго времени суток всем) Извините если не в том разделе) Не могу понять как решить данную...

Вставка и извлечение файлов из БД
Добрый день! Проблема в следующем - не могу организовать вставку и извлечение фала из базы данных...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru