Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не Qt, Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.
|
Статические и динамические матрицы
Задача 6.12. Найти определитель квадратной матрицы .
Пусть задана матрица (6.2), необходимо вычислить её определитель. Для этого матрицу необходимо преобразовать к треугольному виду (6.3), а затем воспользоваться свойством, известным из курса линейной алгебры, которое гласит, что определитель треугольной матрицы равен произведению её диагональных элементов: .
Преобразование матрицы (6.2) к виду (6.3) можно осуществить с помощью прямого хода метода Гаусса. Алгоритм вычисления определителя матрицы, изображённый в виде блок-схемы на рис. 6.16, представляет собой алгоритм прямого хода метода Гаусса, в процессе выполнения которого проводится перестановка строк матрицы. Эта операция приводит к смене знака определителя. В блок- схеме момент смены знака отражён в блоках 8–9. В блоке 8 определяется, будут ли строки меняться местами, и если ответ утвердительный, то в блоке 9 происходит смена знака определителя. В блоках 15–16 выполняется непосредственное вычисление определителя путём перемножения диагональных элементов преобразованной матрицы.
На листинге приведён текст программы решения задачи 6.12 с комментариями.
#include <iostream> #include <math.h> using namespace std; //Функция вычисления определителя. double determinant ( double ** matrica_a, int n ) //Формальные параметры: matrica_a — исходная матрица, n — размер матрицы, //функция возвращает значение определителя (тип double.) { int i, j, k, r; double c,M, max, s, det =1; //a — копия исходной матрицы. double **a; //Выделение памяти для матрицы a . a=new double * [ n ]; for ( i =0; i<n; i++) a [ i ]=new double [ n ]; //В a записываем копию исходной матрицы. for ( i =0; i<n; i++) for ( j =0; j<n; j++) a [ i ] [ j ]=matrica_a [ i ] [ j ]; //Прямой ход метода Гаусса. for ( k=0;k<n; k++) { max=fabs ( a [ k ] [ k ] ); r=k; for ( i=k+1; i<n; i++) if ( fabs ( a [ i ] [ k ] )>max) { max=fabs ( a [ i ] [ k ] ); r= i; } //Если строки менялись местами, то смена знака определителя. if ( r !=k ) det=-det; for ( j =0; j<n; j++) { c=a [ k ] [ j ]; a [ k ] [ j ]=a [ r ] [ j ]; a [ r ] [ j ]= c; } for ( i=k+1; i<n; i++) for (M=a [ i ] [ k ] / a [ k ] [ k ], j=k; j<n; j++) a [ i ] [ j ]-=M*a [ k ] [ j ]; } //Вычисление определителя. for ( i =0; i<n; i++) det*=a [ i ] [ i ]; //Возврат определителя в качестве результата функции for ( i =0; i<n; i++) delete [ ] a [ i ]; delete [ ] a; return det; } int main ( ) { int result, i, j,N; double **a, b; cout<<" N = "; cin>>N; a=new double _ [N ]; for ( i =0; i<N; i++) a [ i ]=new double [N ]; //Ввод значений исходной матрицы. cout<<"Ввод матрицы A "<<endl; for ( i =0; i<N; i++) for ( j =0; j<N; j++) cin>>a [ i ] [ j ]; //Обращение к функции вычисления определителя. cout<<"определитель= "<<determinant ( a,N)<<endl; }
В этой главе читатель познакомился с обработкой статических и динамических матриц в C++, а также с использованием функций для решения задач обработки динамических матриц.