Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не Qt, Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.
|
Опубликован: 07.03.2015 | Уровень: для всех | Доступ: платный | ВУЗ: Компания ALT Linux
Лекция 9:
Структуры в языке C++
Задача 9.4. Написать программу умножения матриц комплексных чисел. Матрицы и
имеют вид:

Пусть исходные данные хранятся в файле abc.txt. Данные к задаче 9.4, содержимое файла abc.txt:
3 4 5 (1,2) (2,3) (3,1.54) (4,-7.2) (2,5) (3,7) (4,10) (5,14) (1.5,3.25) (1.7,-3.94) (6.23,11.17) (-4.12,3.62) (6.23,-1.97) (0.19,0.22) (0.16,0.28) (3.4,1.95) (2.20,-0.18) (0.22,0.29) (11,12) (6.72,-1.13) (16,18) (34,66) (5,1) (1.4,-1.76) (4.5,2.3) (296,700) (4.2,1.03) (-3.14,-2.61) (1,11) (2,23) (3,-35) (4,47)
Далее приведён текст программы, реализующий алгоритм решения задачи 9.4.
#include <iostream> #include <fstream> #include <math.h> #include <complex> using namespace std; int main ( ) { int i, j, p,N,M,K; complex <float > **A, **B, **C; ifstream f; ofstream g; f.open ( " abc.txt " ); f>>N>>M>>K; cout<<" N = "<<N<<" \tM = "<<M<<" \tK = "<<K<<endl; A=new complex <float > * [N ]; for ( i =0; i<N;A [ i ]=new complex <float > [M], i++); B=new complex <float > * [M]; for ( i =0; i<M;B [ i ]=new complex <float > [K ], i++); C=new complex <float > * [N ]; for ( i =0; i<N;C [ i ]=new complex <float > [K ], i++); for ( i =0; i<N; i++) for ( j =0; j<M; f>>A [ i ] [ j ], j++); cout<<"Матрица A\n "; for ( i =0; i<N; cout<<endl, i++) for ( j =0; j<M; cout<<A [ i ] [ j ]<<" \t ", j++); for ( i =0; i<M; i++) for ( j =0; j<K; f>>B [ i ] [ j ], j++); cout<<"Матрица B\n "; for ( i =0; i<M; cout<<endl, i++) for ( j =0; j<K; cout<<B [ i ] [ j ]<<" \t ", j++); for ( i =0; i<N; i++) for ( j =0; j<K; j++) for (C [ i ] [ j ]=p=0;p<M; p++) C [ i ] [ j ]+=A [ i ] [ p ] *B [ p ] [ j ]; f.close ( ); cout<<"Матрица C\n "; for ( i =0; i<N; cout<<endl, i++) for ( j =0; j<K; cout<<C [ i ] [ j ]<<" \t ", j++); g.open ( " result.t x t " ); g<<"Матрица C=A*B\n "; for ( i =0; i<N; g<<endl, i++) for ( j =0; j<K; g<<C [ i ] [ j ]<<" \t ", j++); g.close ( ); return 0; }
Результат умножения матриц из задачи 9.4 (файл result.txt):
Матрица C=A*B (-8.152,34.598) (75.8604,91.276) (199.988,109.93) (-452.5,2486.99) (237.974,406.978) (51.78,26.61) (-177.52,190.35) (-290.01,242.21) (-5391.95,5813.9) (-986.2,783.76) (59.6291,78.3851) (49.9912,-59.0193) (-82.8542,-50.3838) (-5763.7,7803.92) (149.766,-140.709)
Задача 9.5. Заданы матрицы и
. Необходимо вычислить матрицу
, обратную к матрице
, найти определитель
матрицы
и решить матричное уравнение
, где
. Матрицы
и
имеют вид:

Для хранения исходных данных создадим текстовый файл abc2.txt следующего содержания:
3 (1,2) (2,3) (3,1.54) (2,5) (3,7) (4,10) (1.5,3.25) (1.7,-9.34) (6.23,11.17) (1.5,3.25) (1.7,-9.34) (6.23,11.17) (0.11,8.22) (0.34,-18.21) (1,-7) (1,5) (7,-13) (12,89)
Текст программы, реализующий поставленную задачу, представлен ниже.
#include <iostream> #include <fstream> #include <math.h> #include <complex> using namespace std; //Решение СЛАУ с комплексными коэффициентами int SLAU( complex <float > ** matrica_a, int n, complex <float > *massiv_b, complex <float > *x ) { int i, j, k, r; complex <float > c,M, s; float max; complex <float > **a, *b; a=new complex <float > *[ n ]; for ( i =0; i<n; i++) a [ i ]=new complex <float >[n ]; b=new complex <float > [ n ]; for ( i =0; i<n; i++) for ( j =0; j<n; j++) a [ i ] [ j ]=matrica_a [ i ] [ j ]; for ( i =0; i<n; i++) b [ i ]=massiv_b [ i ]; for ( k=0;k<n; k++) { max= abs ( a [ k ] [ k ] ); r=k; for ( i=k+1; i<n; i++) if ( abs ( a [ i ] [ k ] )>max) { max=abs ( a [ i ] [ k ] ); r= i; } for ( j =0; j<n; j++) { c=a [ k ] [ j ]; a [ k ] [ j ]=a [ r ] [ j ]; a [ r ] [ j ]= c; } c=b [ k ]; b [ k ]=b [ r ]; b [ r ]= 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 ]; b [ i ]-=M*b [ k ]; } } if ( abs ( a [ n -1 ] [ n-1 ])==0) if ( abs ( b [ n-1 ])==0) return -1; else return -2; else { for ( i=n-1; i >=0; i --) { for ( s =0, j= i +1; j<n; j++) s+=a [ i ] [ j ] * x [ j ]; x [ i ]=( b [ i ]- s ) /a [ i ] [ i ]; } return 0; } for ( i =0; i<n; i++) delete [ ] a [ i ]; delete [ ] a; delete [ ] b; } //Вычисление обратной матрицы с комплексными коэффициентами int INVERSE( complex <float > **a, int n, complex <float > **y ) { int i, j, res; complex <float > *b, *x; b=new complex <float > [ n ]; x=new complex <float > [ n ]; for ( i =0; i<n; i++) { for ( j =0; j<n; j++) if ( j==i ) b [ j ]= 1; else b [ j ]= 0; res=SLAU( a, n, b, x ); if ( res !=0) break; else for ( j =0; j<n; j++) y [ j ] [ i ]=x [ j ]; } delete [ ] x; delete [ ] b; if ( res !=0) return -1; else return 0; } //Вычисление определителя матрицы с комплексными коэффициентами complex <float > determinant ( complex <float > ** matrica_a, int n ) { int i, j, k, r; complex <float > c,M, s, det =1; complex <float > **a; float max; a=new complex <float > * [ n ]; for ( i =0; i<n; i++) a [ i ]=new complex <float >[n ]; 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=abs ( a [ k ] [ k ] ); r=k; for ( i=k+1; i<n; i++) if ( abs ( a [ i ] [ k ] )>max) { max=abs ( 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 ]; return det; for ( i =0; i<n; i++) delete [ ] a [ i ]; delete [ ] a; } //Умножение матриц с комплексными коэффициентами void umn ( complex <float > **a, complex <float > **b, complex <float > **c, int n, int m, int k ) { int i, j, p; for ( i =0; i<n; i++) for ( j =0; j<k; j++) for ( c [ i ] [ j ]=p=0;p<m; p++) c [ i ] [ j ]+=a [ i ] [ p ] * b [ p ] [ j ]; } int main ( ) { int i, j,N; complex <float > **A, **B, **X, **Y; ifstream f; ofstream g; f.open ( " abc2.txt " ); f>>N; cout<<" N = "<<N<<endl; A=new complex <float > * [N ]; for ( i =0; i<N; i++) A [ i ]=new complex <float > [N ]; B=new complex <float > * [N ]; for ( i =0; i<N; i++) B [ i ]=new complex <float > [N ]; X=new complex <float > * [N ]; for ( i =0; i<N; i++) X [ i ]=new complex <float > [N ]; Y=new complex <float > * [N ]; for ( i =0; i<N; i++) Y [ i ]=new complex <float > [N ]; for ( i =0; i<N; i++) for ( j =0; j<N; j++) f>>A [ i ] [ j ]; cout<<"Матрица A\n "; for ( i =0; i<N; cout<<endl, i++) for ( j =0; j<N; j++) cout<<A [ i ] [ j ]<<" \t "; for ( i =0; i<N; i++) for ( j =0; j<N; j++) f>>B [ i ] [ j ]; cout<<"Матрица B\n "; for ( i =0; i<N; cout<<endl, i++) for ( j =0; j<N; j++) cout<<B [ i ] [ j ]<<" \t "; if ( ! INVERSE(A, N, X) ) { cout<<"Обратная матрица\n "; for ( i =0; i<N; cout<<endl, i++) for ( j =0; j<N; j++) cout<<X [ i ] [ j ]<<" \t "; umn(X, B,Y,N,N,N); cout<<" \n Решение матричного уравнения \n "; for ( i =0; i<N; cout<<endl, i++) for ( j =0; j<N; j++) cout<<Y [ i ] [ j ]<<" \t "; } else cout<<"Не существует обратной матрицы\n "; cout<<"Определитель= "<<determinant (A,N); return 0; }
Результат работы программы к задаче 9.5:
N=3 Матрица A (1,2) (2,3) (3,1.54) (2,5) (3,7) (4,10) (1.5,3.25) (1.7,-9.34) (6.23,11.17) Матрица B (1.5,3.25) (1.7,-9.34) (6.23,11.17) (0.11,8.22) (0.34,-18.21) (1,-7) (1,5) (7,-13) (12,89) Обратная матрица (-0.495047,-0.748993) (0.325573,0.182901) (-0.0340879,-0.0958618) (0.125154,0.0765918) (-0.058179,-0.0728342) (0.00208664,0.0685887) (0.157733,0.322512) (-0.0859214,-0.127174) (0.0143863,-0.000518244) Определитель=(7.50219,-208.261) Решение матричного уравнения (0.669246,-0.302366) (-5.88068,-2.74393) (15.0106,-16.4762) (0.190248,0.114415) (0.488295,0.448942) (-6.72319,3.21833) (0.241332,0.347549) (1.02932,0.405788) (-3.37716,5.51956)