Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/341: Рейтинг темы: голосов - 341, средняя оценка - 4.62
1 / 1 / 2
Регистрация: 31.01.2010
Сообщений: 63

Нужен пример нахождения определителя матрицы

16.02.2010, 19:14. Показов 69866. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста простенький пример нахождения определителя матрицы?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.02.2010, 19:14
Ответы с готовыми решениями:

Формула для нахождения определителя матрицы
Здравствуйте! У меня имеется небольшой вопрос: как записать формулу для нахождения определителя матрицы(ранг>2) на с++? Считать...

Программа для нахождения определителя матрицы
#include<iostream> #include<iomanip> #include<stdio.h> #include<math.h> using namespace std; void sysout(int **arr, int n) { ...

Функция нахождения определителя матрицы с вычислением времени
Ребят, помогите доделать программу. Программа ищет определитель матрицы, данные заполняются рандомно либо от руки. Надо сделать еще функцию...

11
29 / 29 / 6
Регистрация: 14.12.2009
Сообщений: 79
16.02.2010, 19:18
kursant,
Тут глянь:
https://www.cyberforum.ru/cpp/thread3119.html
0
1 / 1 / 2
Регистрация: 31.01.2010
Сообщений: 63
16.02.2010, 19:25  [ТС]
А не методом Гауса есть?
0
31 / 10 / 1
Регистрация: 07.04.2010
Сообщений: 3
18.04.2010, 13:50
Лучший ответ Сообщение было отмечено как решение

Решение

Вчера написал. Программа считает определитель квадратной матрицы NxN методом Гауса:

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
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#define NN 6
 
main()
{
clrscr();
 
float a[NN][NN],kst;
int i,j,n,p,k=0,t;
char yn;
 
// <----Ввод размера квадратной матрицы---->
 
while(k==0)
{
printf("\nВведите размер матрицы (от 2 до %d): N=",NN);
n=getche()-48;
if ((n<2) || (n>NN)) k=0;
else k=1;
}
 
// <----Ввод матрицы a[NN][NN]---->
 
k=0;
while(k==0)
{
printf("\n\nЗадать матрицу случайно? y/n: ");
yn=getche();
if ((yn=='y') || (yn=='n')) k=1;
else k=0;
}
switch(yn)
{
case 'y': for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=rand()%100;break;
default:
{
printf("\nВведите матрицу %dx%d\n",n,n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
}
break;
}
 
 
// <----Выводим введенную матрицу---->
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) printf("%6.2f\t",a[i][j]);
printf("\n\n");
}
 
// <----Считаем определитель---->
 
p=0;
for (i=0; i<n-1; i++)
{
t=1;
while(a[i][i]==0)
{
for(j=0; j<n; j++)
{
a[i][j]=kst;
a[i][j]=a[i+t][j];
a[i+t][j]=kst;
}
p++;
t++;
}
 
for (k=i+1; k<n; k++)
{
kst=a[k][i]/a[i][i];
for(j=0; j<n; j++)
a[k][j]-=a[i][j]*kst;
}
}
 
kst=pow(-1,p);
for(i=0; i<n; i++)
kst*=a[i][i];
 
printf("Определитель равен: %14.3f",kst);
getch();
}
Изначально требовалось найти минор матрицы. Сама программа:

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
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#define NN 6
 
main()
{
clrscr();
 
float a[NN][NN],kst;
int i,j,n,im,jm,p,k=0,t;
char yn;
 
// <----Ввод размера квадратной матрицы---->
 
while(k==0)
{
printf("\nВведите размер матрицы (от 2 до %d): N=",NN);
n=getche()-48;
if ((n<2) || (n>NN)) k=0;
else k=1;
}
 
// <----Ввод матрицы a[NN][NN]---->
 
k=0;
while(k==0)
{
printf("\n\nЗадать матрицу случайно? y/n: ");
yn=getche();
if ((yn=='y') || (yn=='n')) k=1;
else k=0;
}
switch(yn)
{
case 'y': for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=rand()%100;break;
default:
{
printf("\nВведите матрицу %dx%d\n",n,n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
}
break;
}
 
 
// <----Выводим введенную матрицу---->
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) printf("%6.2f\t",a[i][j]);
printf("\n\n");
}
 
// <----Вводим минор---->
printf("По какому элементу искать минор? i=");
im=getche()-49;
printf(" j=");
jm=getche()-49;
 
// <----Считаем матрицу минора---->
 
for (i=0; i<n; i++)
if(i==im) for(p=i; p<n; p++) for(j=0; j<n; j++) a[p][j]=a[p+1][j];
for (j=0; j<n; j++)
if(j==jm) for(p=j; p<n; p++) for(i=0; i<n; i++) a[i][p]=a[i][p+1];
n-=1;
 
// <----Выводим матрицу минора---->
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) printf("%6.2f\t",a[i][j]);
printf("\n\n");
}
 
// <----Считаем минор---->
 
p=0;
for (i=0; i<n-1; i++)
{
t=1;
while(a[i][i]==0)
{
for(j=0; j<n; j++)
{
a[i][j]=kst;
a[i][j]=a[i+t][j];
a[i+t][j]=kst;
}
p++;
t++;
}
 
for (k=i+1; k<n; k++)
{
kst=a[k][i]/a[i][i];
for(j=0; j<n; j++)
a[k][j]-=a[i][j]*kst;
}
}
 
kst=pow(-1,p);
for(i=0; i<n; i++)
kst*=a[i][i];
 
printf("Минор по А[%d][%d] равен: %14.3f",im+1,jm+1,kst);
getch();
}
Может кому и пригодится.
8
 Аватар для OffyGhost
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
23.02.2011, 15:33
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
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#define NN 6
 
void main()
{
 
float a[NN][NN],kst;
int i,j,n,p,k=0,t;
char yn;
 
// <----Ввод размера квадратной матрицы---->
 
while(k==0)
{
printf("\nВведите размер матрицы (от 2 до %d): N=",NN);
n=getche()-48;
if ((n<2) || (n>NN)) k=0;
else k=1;
}
 
// <----Ввод матрицы a[NN][NN]---->
 
k=0;
while(k==0)
{
printf("\n\nЗадать матрицу случайно? y/n: ");
yn=getche();
if ((yn=='y') || (yn=='n')) k=1;
else k=0;
}
switch(yn)
{
case 'y': for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=rand()%100;break;
default:
{
printf("\nВведите матрицу %dx%d\n",n,n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
}
break;
}
 
 
// <----Выводим введенную матрицу---->
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) printf("%6.2f\t",a[i][j]);
printf("\n\n");
}
 
// <----Считаем определитель---->
 
p=0;
for (i=0; i<n-1; i++)
{
t=1;
while(a[i][i]==0)
{
for(j=0; j<n; j++)
{
a[i][j]=kst;
a[i][j]=a[i+t][j];
a[i+t][j]=kst;
}
p++;
t++;
}
 
for (k=i+1; k<n; k++)
{
kst=a[k][i]/a[i][i];
for(j=0; j<n; j++)
a[k][j]-=a[i][j]*kst;
}
}
 
kst=pow(-1,p);
for(i=0; i<n; i++)
kst*=a[i][i];
 
printf("Определитель равен: %14.3f",kst);
getch();
}
1>------ Build started: Project: det, Configuration: Debug Win32 ------
1>Compiling...
1>lab1.cpp
1>c:\documents and settings\admin\my documents\visual studio 2008\projects\det\det\lab1.cpp(19) : warning C4996: 'getche': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getche. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\conio.h(146) : see declaration of 'getche'
1>c:\documents and settings\admin\my documents\visual studio 2008\projects\det\det\lab1.cpp(30) : warning C4996: 'getche': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getche. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\conio.h(146) : see declaration of 'getche'
1>c:\documents and settings\admin\my documents\visual studio 2008\projects\det\det\lab1.cpp(36) : warning C4244: '=' : conversion from 'int' to 'float', possible loss of data
1>c:\documents and settings\admin\my documents\visual studio 2008\projects\det\det\lab1.cpp(42) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : see declaration of 'scanf'
1>c:\documents and settings\admin\my documents\visual studio 2008\projects\det\det\lab1.cpp(82) : error C2668: 'pow' : ambiguous call to overloaded function
1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(575): could be 'long double pow(long double,int)'
1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(527): or 'float pow(float,int)'
1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(489): or 'double pow(double,int)'
1> while trying to match the argument list '(int, int)'
1>Build log was saved at "file://c:\Documents and Settings\Admin\My Documents\Visual Studio 2008\Projects\det\det\Debug\BuildLog.htm "
1>det - 1 error(s), 4 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0
-5 / 6 / 4
Регистрация: 16.12.2010
Сообщений: 68
29.11.2011, 12:11
оно не правильно считает!!!
0
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
29.11.2011, 13:45
Рекурсивно, раскладывая по первому столбцу
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
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <string>
#include <fstream>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <conio.h>
#include <functional>
 
template <typename iteratorType, typename predType>
bool all_of (iteratorType iterBegin, iteratorType iterEnd, predType* pred)
{
        for ( ; iterBegin != iterEnd; ++iterBegin)
                if (!pred(*iterBegin))
                        return false;
        return true;
}
 
template <typename valueType>
class printing_matrix :
        public std::unary_function<std::vector<valueType>, void >
{
public:
        void operator() (const std::vector<valueType>& vec) const
        {
                std::copy(vec.begin(), vec.end(), std::ostream_iterator<valueType>(std::cout, " "));
                std::cout << std::endl;
        }
};
 
template <typename valueType>
void printMatrix(const std::vector<std::vector<valueType> >& matrix)
{
        std::for_each(matrix.begin(), matrix.end(), printing_matrix<valueType>());
}
 
template <typename valueType>
bool zero(const std::vector<valueType>& value)
{
        return !value.front();
}
 
template <typename valueType>
class comparer :
        public std::binary_function<std::vector<valueType>, std::vector<valueType>, bool>
{
        mutable int& compair;
public:
        comparer(int& value) :
          compair(value)
          {
          }
          bool operator() (const std::vector<valueType>& first, const std::vector<valueType>& second) const
          {
                  if (first.front() < second.front())
                          ++compair;
                  return first.front() > second.front();
          }
};
 
template <typename valueType>
class calc :
        public std::unary_function<std::vector<valueType>, void>
{
        mutable std::vector<std::vector<valueType> >& new_matrix;
        const std::vector<std::vector<valueType> > matrix;
 
        template <typename value_type>
        class privater :
                public std::unary_function<value_type, value_type>
        {
                mutable typename std::vector<value_type>::const_iterator first;
                const value_type k;
        public:
                privater(value_type k, const typename std::vector<value_type>::const_iterator& first) :
                  k(k), first(first)
                  {
                  }
                  value_type operator() (value_type value) const
                  {
                          return value -= k * (*first++);
                  }
        };
 
public:
        calc(std::vector<std::vector<valueType> >& new_matrix, const std::vector<std::vector<valueType> >& matrix) :
          new_matrix(new_matrix), matrix(matrix)
          {
          }
          void operator() (std::vector<valueType>& i) const
          {
                  std::transform(i.begin(), i.end(), i.begin(), privater<valueType>(i.front() / matrix.front().front(), matrix.begin()->begin()));
 
                  new_matrix.push_back(std::vector<double>(++i.begin(), i.end()));
          }
};
 
double determinant(std::vector<std::vector<double> > matrix)
{
        if (matrix.size() == 1)
                return matrix.front().front();
 
        if (all_of(matrix.begin(), matrix.end(), &zero<double>))
                return 0;
 
        int compair = 0;
        std::sort(matrix.begin(), matrix.end(), comparer<double>(compair));
 
        std::vector<std::vector<double> > new_matrix;
        std::for_each(++matrix.begin(), matrix.end(), calc<double>(new_matrix, matrix));
 
        return matrix.front().front() * determinant(new_matrix) * pow(-1.0, compair);
}
 
template <typename streamType>
class streamer :
        public std::unary_function<void, double>
{
        streamType& _file;
public:
        streamer(streamType& file) :
          _file(file)
          {
          }
 
          double operator() ()
          {
                  double tmp;
                  _file >> tmp;
                  return tmp;
          }
};
 
template <typename streamType, typename valueType>
class rander :
        public std::unary_function<std::vector<valueType>, void>
{
        mutable streamType& file;
        const unsigned int size;
public:
        rander(streamType& file, unsigned int size) :
          file(file), size(size)
          {
          }
          void operator() (std::vector<valueType>& vec) const
          {
                  std::generate_n(std::back_inserter(vec), size, streamer<streamType>(file));
          }
};
 
int main()
{
        srand(static_cast<unsigned int>(time(NULL)));
        setlocale(LC_ALL, "Russian");
 
        unsigned char key;
        do
        {
                std::cout << "Выберите тип формирования матрицы" << std::endl
                        << "\t1. Считать матрицы из файла" << std::endl
                        << "\t2. Ввод с клавиатуры" << std::endl
                        << "\t3. Выход из программы" << std::endl;
                key = _getch();
        } while (key < '1' || key > '3');
 
        std::vector<std::vector<double> > matrix;
 
        switch (key)
        {
        case '1':
                {
                        std::string fileName;
                        std::cout << "Введите имя файла" << std::endl;
                        std::cin >> fileName;
                        std::ifstream file(fileName.c_str());
 
                        std::vector<double>::size_type size;
                        file >> size;
                        matrix.resize(size);
                        std::for_each(matrix.begin(), matrix.end(), rander<std::ifstream, double>(file, size));
                }
                break;
        case '2':
                {
                        std::cout << "Введите размер матрицы" << std::endl;
                        std::vector<double>::size_type size;
                        std::cin >> size;
                        matrix.resize(size);
                        std::cout << "Введите матрицу" << std::endl;
                        std::for_each(matrix.begin(), matrix.end(), rander<std::istream, double>(std::cin, size));
                }
                break;
        case '3':
                return EXIT_SUCCESS;
        default:
                return EXIT_FAILURE;
        }
 
        std::cout << "Введенная матрица" << std::endl;
        printMatrix<double>(matrix);
 
        std::cout << "Определитель: \t" << determinant(matrix) << std::endl;
 
        _getch();
        return EXIT_SUCCESS;
}
2
-5 / 6 / 4
Регистрация: 16.12.2010
Сообщений: 68
05.12.2011, 15:23
Лучший ответ Сообщение было отмечено как решение

Решение

Вот простенький код нахождения определителя.
Считает все правильно...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
double det (double xk[10][10], int razm)   //нахождение определителя
{
int l;
double d;
double sum11=1,sum12=0, sum21=1, sum22=0;
// находим детерминант
        for (int i=0;i<razm;i++)
        {
                sum11=1; l=2*razm-1-i;sum21=1;
        for (int j=0;j<razm;j++)
                {
            sum21*=xk[j][l%razm];
            l--;
            sum11*=xk[j][(j+i)%(razm)];
        }
        sum22+=sum21;
        sum12+=sum11;
    }
    d=sum12-sum22;
return d;
}
вызывать так:
C++
1
2
3
4
double dt;
double a[10][10];
int n;   //порядок матрицы
dt = det(a,n);
4
EvgeTrofi
20.03.2014, 06:55
Не пойму, каким образом у Вас всё работает? Переменная L становится отрицательной, а потом начинает использоваться в качестве индекса массива??? Это как?
Может быть Вы что-то скрыли от публики?
Вот мой вариант вычисления определителя на языке VB NET:
VB.NET
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
    'Возвращает детерминант (определитель) матрицы
    Public Function det(ByVal M(,) As Double) As Double
        Dim a As Long = UBound(M, 1)
        Dim b As Long = UBound(M, 2)
        Dim multi As Double = 1
        If a <> b Then Return 0
        For i As Long = a + 1 To 3 Step -1 'Порядок матрицы
            Dim multiplier As Double
            EasyM(M, multiplier)
            multi *= multiplier
        Next
        det = multi * (M(0, 0) * M(1, 1) - M(0, 1) * M(1, 0))
    End Function
    'Процедура разложения определителя по элементам первой строки
    Private Sub EasyM(ByRef M(,) As Double, ByRef multiplier As Double)
        Dim a As Long = UBound(M, 1)
        Dim b As Long = UBound(M, 2)
        Dim i As Long = getNotNull(M)
        Do While i > -1 And i < b
            Dim j As Long = getNotNull(M, i + 1)
            If j < 0 Then Exit Do
            'Вычисляем множитель, на который нужно умножить j столбец, чтобы прибавить к i 
            'и при этом получить нулевой элемент в первой строке
            multiplier = -M(0, i) / M(0, j)
            For k As Long = 0 To a
                M(k, i) += multiplier * M(k, j)
            Next
            i = j
        Loop
        multiplier = Math.Pow(-1, 2 + i) * M(0, i)
        MinorMatrix(M, 0, i)
    End Sub
    'После выполнения процедуры в переменной M сформируется матрица с вычеркнутыми строкой row и столбцом col
    'Если найти определитель такой уменьшеной матрицы, то он будет называться минором
    Public Sub MinorMatrix(ByRef M(,) As Double, row As Long, col As Long)
        Dim a As Long = UBound(M, 1)
        Dim b As Long = UBound(M, 2)
        Dim EM(a - 1, b - 1) As Double
        Dim t As Long = -1
        For i As Long = 0 To a
            If i = row Then Continue For
            t += 1
            Dim p As Long = -1
            For j As Long = 0 To b
                If j = col Then Continue For
                p += 1
                EM(t, p) = M(i, j)
            Next
        Next
        M = EM
    End Sub
    'Возвращает индекс столбца в котором первая строка не нулевая
    'поиск начинается с позиции start включительно. Если не находит, то возвращает -1
    Private Function getNotNull(ByRef M(,) As Double, Optional start As Long = 0) As Long
        For i As Long = start To UBound(M, 2)
            If M(0, i) <> 0 Then Return i
        Next
        Return -1
    End Function
Тестировать так:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Public Sub testDET()
        'Dim M(,) As Double = {{4, 3, -4, 2, 0}, {2, -1, -3, -4, 2}, {3, 1, 1, 2, -1}, {1, 2, 3, 4, -1}, {-1, 1, -1, -2, 3}}
        Dim M(,) As Double = {{-3, 1, -2}, {1, -2, 1}, {2, 3, -1}}
        MsgBox(det(M))
    End Sub
 
    Private Sub printMatrix(M(,) As Double)
        Dim txt As String = ""
        For i As Long = 0 To UBound(M, 1)
            For j As Long = 0 To UBound(M, 2)
                txt &= " " & M(i, j)
            Next
            txt &= vbCrLf
        Next
        MsgBox(txt)
    End Sub
0 / 0 / 0
Регистрация: 12.10.2015
Сообщений: 17
29.11.2016, 00:35
dino-4udo, господи, спасибо тебе добрый человек
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
15.01.2017, 20:47
dino-4udo, ваш алгоритм неверно работает, точнее вообще не работает
0
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,750
15.01.2017, 21:34
Подсуну свой по крамеру
Кликните здесь для просмотра всего текста
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
// решение систем уравнении методом Крамера
#include <iostream>
#include <windows.h>
#include <cstdlib> 
#include <ctime>
#include <iomanip>
 
using namespace std;
 
    double findOpred (double **,int);                       //Функция для возврвтв определителя массива      
                                                            // поиск определителя
    bool getMatrixCoef(double **, int,double *,double **);  //заполнение
    void showMatrixCoef(double **, int ,double *);          // вывод на экран
    void MatrixCopy(double **a, int size, double **v);      //копирование массива v в а
    
int main(int argc, char* argv[])
 
{ setlocale(LC_ALL, "Rus");
 
//  int { 5, -1,  2},{  2, 3,-4},{ 1, 2,  3}    {-2, 19, 1};            //Массив для правой части
//  int { 3, -2, -4},{ -7, 4, 6},{ 2, 3, -1}    { 4,-34, 3};
  
 
    cout << "Введите колличество уровнений: ";
    int size;
    cin >> size;
    double **a = new double*[size];
    double **v = new double*[size];
    for (int i = 0; i < size; i++) {
        a[i] = new double[size + size] {};
        v[i] = new double[size + size] {};
    }
 
    double *b = new double[size] {};
    
    if (getMatrixCoef(a, size, b, v))
    {
    //  memcpy(v, a, sizeof(v)); 
        cout << endl << endl;
        showMatrixCoef(a, size, b);// Вывод массива после ввода
    }
   cout << endl;
//-------------------------------------------------------------------------------------//
    double temp, oprM; 
       
    oprM = findOpred(a, size);
    cout << "Vernul opr massiva  " << oprM << endl;
  
    if (oprM==0){
         cout << "Определитель массива равен 0. Уравнение имеет множество решении " << endl;
     }
    //Готовим массив для определителя х1..хn
    for (int j = 0; j < size; j++) {
         for (int i = 0; i < size; i++)     {  
            a[i][j]=b[i];
        }
     temp = findOpred(a,size);
     
    cout << "Vernul opr" << j <<"-  " << temp << endl;
    cout << "X" << j+1 << "- " << temp/oprM << endl;   
    // memcpy(a, v, sizeof(v));         //копирование массива v в а
    MatrixCopy(a, size ,v);         //копирование массива v в а 
    //  showMatrixCoef(a, size, b);
    }                                   // cout.setf(ios::scientific);
   
   for (int i = 0; i < size; i++) {
    delete [] a[i];
    delete [] v[i];
    }
    delete []a;
    delete []v;
    delete []b;
 
    system("PAUSE"); 
  return 0;
}
 
//-----------------------------------------------------------------------------------------------// 
 
double findOpred (double **arr, int rows)       //Функция для возврвтв определителя массива
{
    double opr1, sum;
    //-------------------------------------------------------------------------------------//
    //Приводим матрицу к правилу Саррюса 
 
    for (int i = 0; i < rows; i++){
        for (int j = 0; j < rows; j++) {
            arr[i][j+rows]=arr[i][j];
        }
    }
 //-----------------------------------------------------------------------------------------//   
 // находим определитель основной матрицы а+а+а-а-а-а  
    opr1=0;
    
    // метод крамера шаг 1 сумма диоганали для плюса надо повторить n раз от k=n
    for (int k = 0; k < rows; k++){
        sum=1;
        for (int i = 0; i < rows; i++){
            sum*=arr[i][i+k];
        }                       
    opr1+=sum;
    }
  // метод крамера шаг 2 сумма побочной диоганали для минуса повторить n-1 раз от k=n-1
    for (int k = 0; k < rows; k++){
        sum=1;    
        for (int i = 0; i < rows; i++){
        sum*=arr[i][rows-i-1+k];
        } 
    opr1-=sum;
    }
    
    return(opr1);
}
//----------------------------------------------------------------------------------------------
bool getMatrixCoef(double **a, int size, double *b,double **v)
{
    try
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cout << "Введите " << j + 1 << " коиффициент " << i + 1 << " уравнения: ";
                cin >> a[i][j];
                v[i][j]=a[i][j];
            }
            cout << "Введите  свободный член " << i + 1 << " уравнения: ";
            cin >> b[i];
        }
    }
 
    catch (char *msg)
    {
        cout << "ВОЗНИКЛА ОШИБКА" << endl;
        cout << msg << endl;
        return false;
    }
    return true;
}
//-----------------------------------------------
void showMatrixCoef(double **a, int size ,double *b)
{
    cout << "Матрица коэффициентов СЛУ и соотв. свободные члены:" << endl;
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size ; j++)
            cout << setw(4) << a[i][j] ;
            cout << setw(4) << b[i] << endl;
    }
}
//-----------------------------------------------
void MatrixCopy(double **a, int size, double **v)
     {
        for (int i = 0; i < size; i++)
            for (int j = 0; j < size; j++)
                a[i][j] = v[i][j];
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.01.2017, 21:34
Помогаю со студенческими работами здесь

Написать функцию для нахождения определителя квадратной матрицы
Здравствуйте! Помогите, пожалуйста, написать функцию для нахождения определителя квадратной матрицы

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

Код для нахождения определителя матрицы N на N исключением строки и столбца
Подскажите пожалуйста код для нахождения определителя матрицы N на N исключением строки и столбца

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

Нужен пример вычисления матрицы
Пожалуйста скиньте кто-нибудь программу, которая считает матрицы! Оригинал: будьласка скиньте хтонебудь програму яка рахує матриці! ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru