Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
18 / 18 / 12
Регистрация: 06.10.2015
Сообщений: 94

В пользовательском классе "Матрица" реализовать функцию-член для вычисления определителя

26.08.2016, 00:28. Показов 953. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прива всем. Такой вопрос. Написал класс "Матрица". Хочу добавить метод для вычисления определителя. Написал функцию ("не для класса") (притом работает идеально) и попробовал добавить её в класс(ну записал в public прототип, изменил аргументы, объявил метод) но у меня не вышло ((( код не работает. Может кто подскажет в чем проблема.

//Matrix.h
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
#pragma once
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
 
using namespace std;
 
class Matrix
{
private:
    int size;
    int det = 0;
    int trace;
    int** matrix;
 
    void resize(const int newSize);
    void copy(int** innerData);
public:
    Matrix();                           // Constructor
    Matrix(int sz);                     // Constructor
    Matrix(const Matrix& obj);          // Copy Constructor
 
    void add_random(Matrix&);           // Заполнение случайными числами
    
    int determinant(Matrix&, int, int); // Нахождение определителя матрицы
    void print(const Matrix&, int);     // Вывод матрицы 
    void print_det(Matrix&);
 
    ~Matrix();
};
 
inline void Matrix::resize(const int newSize)
{
    matrix = new int*[newSize];
 
    for (size_t i = 0; i < newSize; i++)
    {
        matrix[i] = new int[newSize];
    }
}
 
inline void Matrix::copy(int** innerData)
{
    for (size_t i = 0; i < size; i++)
    {
        innerData[i] = matrix[i];
    }
 
}
 
 
 
Matrix::Matrix()
{
    size = det = trace = 0;
    matrix = NULL;
}
 
Matrix::Matrix(int sz)
{
    size = sz;
    matrix = new int*[size];
    det = trace = 0;
    for (size_t i = 0; i < size; i++)
    {
        matrix[i] = new int[size]();
    }
}
 
Matrix::Matrix(const Matrix& obj)
{
    resize(obj.size);
    copy(obj.matrix);
}
 
 
void Matrix::add_random(Matrix& matrix)
{
    srand(time(NULL));
    for (size_t i = 0; i < matrix.size; i++)
    {
        for (size_t j = 0; j < matrix.size; j++)
        {
            matrix.matrix[i][j] = rand() % 42 + 10;
        }
    }
}
 
int Matrix::determinant(Matrix& matrix, int size_mat, int deep = 0)
{
    if (size_mat == 2)
        return matrix.matrix[0][0 + deep] * matrix.matrix[1][1 + deep] - matrix.matrix[0][1 + deep] * matrix.matrix[1][0 + deep];
 
    int sign = 1;
    int sum_det = 0;
    for (int i = 0; i < size_mat; i++)
    {
        Matrix b(size_mat - 1);                 
                                        
        int p = 0;
        for (int ii = 0; ii < size_mat; ii++)
        {
            if (ii == i)
                continue;
 
            b.matrix[p] = matrix.matrix[ii];
            p++;
        }
        sum_det += sign * matrix.matrix[i][deep] * determinant(b, size_mat - 1 , deep + 1);
 
        delete[] b.matrix;
        sign *= -1;
 
    }
 
    return sum_det;
}
 
void Matrix::print(const Matrix& matrix, int num)
{
    switch (num)
    {
    case 1:
        cout << "Ваша матрица:\n";
        for (size_t i = 0; i < matrix.size; i++)
        {
            for (size_t j = 0; j < matrix.size; j++)
            {
                cout << matrix.matrix[i][j] << setw(4);
            }
 
            cout << endl;
        }
        break;
    case 2:
        cout << "Определитель матрицы равен " << matrix.det << endl;
        break;
    case 3:
        cout << "След матрицы равен " << matrix.trace << endl;
    }
}
 
void Matrix::print_det(Matrix& matrix)
{
     matrix.det = determinant(matrix, matrix.size, 0);
     cout <<  matrix.det << endl;
}
//Source.cpp (main)

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
#include <iostream>
#include "Matrix.h"
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    cout << "Здравствуйте. Вас приветствует мастер работы с квадратными матрицами. Пожалуйста введите размер матрицы. Размер не должен превышать значение 6 и не должен быть меньше 1. ";
 
    int size_matrix;
    cin >> size_matrix;
 
    Matrix matrix(size_matrix);     // Нужно после написания класса вызвыть конструктор
 
    cout << "Квадратная матрица создана. Теперь нужно заполнить её.\nЧто Вы предпочитаете? Ввести её сам или заполнить её случайными числами.\n";
    cout << "Выберите вариант\n 1. Заполнить случайно    2. Ввести с клавиатуры\n";
 
    int num;
 
    cin >> num;
 
    switch (num)
    {
    case 1:
        matrix.add_random(matrix);    //  заполняет массив случайными числами 
        cout << "Матрица заполнена\n";
        break;
    /*case 2:
        cout << "Можете вводить элементы матрицы\n";
        matrix.add_element(matrix);   //  вводите массив сами
        break;
        */
    default:
        cout << "Вы ввели неправильное значение. Такого варианта нету в списке.\n";
        return 0;
    }
 
    cout << "Вот ваша матрица:\n";
    matrix.print(matrix, 1);
    cout << endl;
    matrix.print_det(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
int determinant(int** matrix, int size,int deep=0)
{  
    if(n==2)
        return matrix[0][0+deep]*matrix[1][1+deep]-matrix[0][1+deep]*matrix[1][0+deep];
     
    int sign= 1;
    int sum_det= 0;
     
    for(int i= 0; i< size; i++)
    {  
        int** minor= new int* [size-1];
        int p=0;   
        for(int ii= 0; ii< size; ii++ )
        {
            if(ii==i)continue;
             
            ninor[p]=matrix[ii];
            p++;
        }
         
        sum_det+= sign*matrix[i][deep]*determinant(minor, size - 1, deep+1);
         
        delete [] minor;
        sign *= -1;
         
    }
    return sum_det;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.08.2016, 00:28
Ответы с готовыми решениями:

Реализовать в пользовательском классе дружественную функцию согласно условию
Помогите пожалуйста, много задач за день прорешал и эту уже не понимаю(( Дан класc. Добавьте дружественную функцию ИмяФункции(),...

Реализовать умножение матриц в пользовательском классе "Матрица"
Напишите ф-ции для выделения памяти под массив и умножения матриц #include &quot;stdafx.h&quot; #include&quot;iostream&quot; using...

Класс матрица, написать метод для вычисления определителя
Здравствуйте! Помогите, пожалуйста, разобраться с методом для вычисления определителя. Есть код: int Get_matr(int **u, int r, int I,...

2
93 / 93 / 33
Регистрация: 17.03.2012
Сообщений: 536
26.08.2016, 10:51
Надо сказать, что разделение на заголовочный файл и файл исходников придумали не просто так.
Попробуйте, все сразу заработает.
И еще, у вас нет определения деструктора. Ругаться будет.
0
18 / 18 / 12
Регистрация: 06.10.2015
Сообщений: 94
28.08.2016, 01:13  [ТС]
Деструктор есть просто при копи пасте забыл добавить его

Добавлено через 13 часов 16 минут
На если кому то будет нужен код. Я нашел и исправил ошибку.
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
inline int determinant(int** matrix, int size_mat, int deep = 0)
{
    if (size_mat == 2)
        return matrix[0][0 + deep] * matrix[1][1 + deep] - matrix[0][1 + deep] * matrix[1][0 + deep];
 
    int sign = 1;
 
    int sum_det = 0;
    for (int i = 0; i < size_mat; i++)
    {
        int** minor = new int*[size_mat - 1];
 
        int p = 0;
        for (int ii = 0; ii < size_mat; ii++)
        {
            if (ii == i)
                continue;
 
            minor[p] = matrix[ii];
            p++;
        }
        sum_det += sign * matrix[i][deep] * determinant(minor, (size_mat - 1), deep + 1);
 
        delete[] minor;
        sign *= -1;
 
    }
 
    return sum_det;
}
Вот для объекта моего класса функцию я вызывал вот так
C++
1
2
3
4
inline void Matrix::print_det(Matrix& matrix)
{
    cout << "Определитель матрицы равен: " << determinant(matrix.matrix, matrix.size, 0) << endl;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.08.2016, 01:13
Помогаю со студенческими работами здесь

Разработать функцию для вычисления определителя матрицы
разработать функцию для вычисления определителя матрицы порядка n (1&lt;=n&lt;=20)

Написать функцию для вычисления определителя матрицы
Нужна функция для вычисления ОПРЕДЕЛИТЕЛЯ матрицы, аргументами которой будет количество строк в матрице N и сама матрица. п.с. или ссылку...

Создать функцию для вычисления определителя матрицы 2х2
Создать функцию для вычисления определителя матрицы 2х2. (в C++) HELP ME PLEASE

Составить функцию для вычисления определителя третьего порядка
Составить функцию для вычисления определителя третьего порядка: а11 а12 а13 а21 а22 а23 а31 а32 а33 Использовать...

Используя рекурсию и рекуррентную формулу для вычисления определителя матрицы написать алгоритм вычисления определителя матрицы
Помогите, пожалуйста.


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru