00001 #include "MyLib.h"
00002
00016 const char det_naF[] = "A.dat";
00022 void WyswietlMacierzInd(int n, int m, double A[][matrix_M],int P[])
00023 {
00024 int i,j;
00025
00026 for(i=0; i<n; i=i+1)
00027 {
00028 for(j=0; j<m; j=j+1)
00029 {
00030 printf("%6.2lf ",A[P[i]][j]);
00031 }
00032 printf("\n");
00033 }
00034 }
00035
00036 void WyswietlWiersz(int m, double w[])
00037 {
00038 int j;
00039
00040 for(j=0; j<m; j=j+1)
00041 {
00042 printf("%6.2lf ",w[j]);
00043 }
00044 printf("\n");
00045 }
00046
00052 double ObliczWyznacznik(int *row, int P[], int n, int m, double A[][matrix_M])
00053 {
00054 double d[matrix_M],det;
00055 int i,j;
00056
00057 for(i=0; i<matrix_N; i=i+1)
00058 {
00059 P[i] = i;
00060 }
00061 det = 1.0;
00062 for(*row=0; *row<n; *row=*row+1)
00063 {
00064 if( fabs(A[P[*row]][*row])<=1.0e-100 )
00065 {
00066 for(i=*row+1; i<n; i=i+1 )
00067 {
00068 if( 1.0e-100<fabs( A[P[i]][*row] ) )
00069 {
00070 j = P[*row];
00071 P[*row] = P[i];
00072 P[i] = j;
00073 det = -det;
00074 break;
00075 }
00076 }
00077 if( i==n )
00078 {
00079 for(i=0; i<*row-1; i=i+1)
00080 {
00081 det = A[P[i]][i]*det;
00082 }
00083 return det;
00084 }
00085 }
00086 for(i=*row+1; i<m; i=i+1)
00087 {
00088 d[i] = A[P[*row]][i]/A[P[*row]][*row];
00089 }
00090 for(j=*row+1; j<n; j=j+1)
00091 {
00092 for(i=*row+1; i<m; i=i+1)
00093 {
00094 A[P[j]][i] = A[P[j]][i]-d[i]*A[P[j]][*row];
00095 }
00096 A[P[j]][*row] = 0.0;
00097 }
00098 }
00099 for(i=0; i<n; i=i+1)
00100 {
00101 det = A[P[i]][i]*det;
00102 }
00103 return det;
00104 }
00105
00106 int main()
00107 {
00108 double det,A[matrix_N][matrix_M];
00109 int n,m,P[matrix_N],row;
00110
00111 OdczytMacierzy(det_naF, &n, &m, A);
00112 printf("wczytana macierz: \"%s\"\n", det_naF);
00113 WyswietlMacierz(n, m, A);
00114 det = ObliczWyznacznik(&row, P, n, m, A);
00115 if( row!=n )
00116 {
00117 printf("Macierz \"%s\" jest osobliwa\n", det_naF);
00118 exit(-1);
00119 }
00120 puts("-----------------------------");
00121 printf("wyznacznik: %16le\n", det);
00122 puts("-----------------------------");
00123 puts("Wynikowa macierz gornotrojkatna:");
00124 WyswietlMacierzInd(n, m, A, P);
00125 puts("\nBez uwzglednienia przestawien wierszy:");
00126 WyswietlMacierz(n, m, A);
00127 puts("\nPermutacja wierszy:");
00128 for(row=0; row<n; row=row+1)
00129 {
00130 printf("%2i ",row+1);
00131 }
00132 puts("");
00133 for(row=0; row<n; row=row+1)
00134 {
00135 printf("%2i ",P[row]+1);
00136 }
00137 puts("");
00138 return 0;
00139 }