Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Написать функцию вычисления определителя методом Жордана-Гаусса.
- Обязательный входной параметр – исходная матрица.
- Поиск ведущего элемента проводить по столбцу или прямоугольной области матрицы.
- */
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <locale.h>
- #include <math.h>
- template <class T> void swap ( T& a, T& b )
- {
- T c(a); a=b; b=c;
- }
- FILE* fopen_secure(const char fname[], const char mode[]) //функция безопасного открытия
- {
- FILE *f=fopen(fname, mode);
- if(f==NULL) //если fopen возвращает нулевой указатель, то выводит ошибку
- {
- fclose(f);
- printf("Cannot open file %s with mode %s\n", fname, mode);
- exit(0);
- }
- return f;
- }
- void Det (FILE *res, int n, float **M) //вычисление определителя
- {
- float eps=0.01;
- float det=1;
- int c; //номер строки в которой будет макс эл
- for ( int j=0; j<n; j++ )
- {
- c=j;
- for (int i=j+1; i<n; i++ ) //поиск макс эл в столбце
- {
- if ( abs(M[i][j]) > abs(M[c][j]) )
- c = i;
- }
- if ( abs(M[c][j]) < eps ) //проверка на нулевой столбец
- {
- det=0;
- break;
- }
- if ( c != j)
- {
- swap(M[j],M[c]); //меняем строки местами
- det=-det; //меняем знак определителя
- }
- //промежуточная проверка
- /* for (int i=0; i<n; i++)
- { for (int j=0; j<n; j++)
- printf("%f ",M[i][j]);
- putchar('\n');
- }
- putchar('\n');
- */
- det*=M[j][j]; //счет определителя
- // printf("%f ",det);
- // putchar('\n');
- for ( int i=j+1; i<n; i++ ) //диагон множитель выносим
- M[j][i]/=M[j][j];
- M[j][j]=1;
- for ( int i=0; i<n ; i++) //вычитание строк
- {
- if ( (i!=j) && (abs(M[i][j])>eps) ) //если эл не (диагон и нул)
- {
- for ( int k=j+1; k<n; k++) //вычитаем верхнюю строку
- M[i][k]-=M[j][k]*M[i][j];
- M[i][j]=0; //обнуление столбца
- }
- }
- //промежуточная проверка
- /*
- for (int i=0; i<n; i++)
- { for (int j=0; j<n; j++)
- printf("%f ",M[i][j]);
- putchar('\n');
- }
- putchar('\n');
- */
- }
- //промежуточная проверка
- /* for (int i=0; i<n; i++)
- { for (int j=0; j<n; j++)
- printf("%f ",M[i][j]);
- putchar('\n');
- }
- */
- ceil(det);
- fprintf(res,"%f ",det);
- fflush(res);
- }
- void Inv(FILE *f, int n, float **M) //обратная матрица
- {
- int v=0;
- float el, c;
- for (int i=0; i<n; i++)
- { for (int j=0; j<n; j++)
- printf("%f ",M[i][j]);
- putchar('\n');
- }
- float **D=new float *[n]; //обратная матрица
- for ( int i=0; i<n; ++i )
- {
- D[i]=new float[n];
- }
- for (int i=0; i<n; i++)
- {
- for (int j=0; j<n; j++)
- {
- if (i==j)
- D[i][j]=1;
- else D[i][j]=0;
- }
- }
- for( int i=0; i<n; i++)
- {
- v=i;
- for (int j=i+1; j<n; j++) //выбор ведущего эл
- {
- if ( abs(M[j][i]) > abs(M[v][i]) )
- v=j;
- }
- if ( abs(M[v][i])<0.001)
- {
- n=i;
- break;
- }
- else
- {
- if (v != i) //перестановка строк
- {
- swap(M[i],M[v]);
- swap(D[i],D[v]);
- }
- el=M[i][i]; //деление строки на диаг эл
- for (int j=i; j<n; j++)
- M[i][j]/=el;
- for (int j=0; j<n; j++)
- D[i][j]/=el;
- for( int k=0; k<n; k++) //вычисление
- {
- if (k!= i)
- {
- c=M[k][i];
- for (int j=i; j<n; j++)
- M[k][j]-=c*M[i][j];
- for (int j=0; j<n; j++)
- D[k][j]-=c*D[i][j];
- }
- }
- }
- }
- fprintf(f, " Обратная матрица: \n");
- for (int i=0; i<n; i++)
- {
- for (int j=0; j<n; j++)
- fprintf(f,"%4f ",floor(D[i][j]*1000)/1000);
- fprintf(f, "\n");
- }
- }
- int main()
- {
- setlocale(LC_CTYPE, "rus");
- FILE *f, *res, *res_m;
- int ch=0, n, pr=0, m=0;
- char *str, *test, *a;
- a=new char[];
- str=new char[];
- str[0]='\0';
- test=new char[];
- f=fopen_secure("13 det_tests.txt","r");
- res=fopen_secure("res.txt","w+");
- res_m=fopen_secure("res_m.txt","w+");
- printf ("введите номер теста от 1 до 9:\n");
- scanf ("%d", &ch);
- while ( (ch < 1) || (ch > 9) )
- {
- printf ("Выберите тест из предложенного диапозона (1-9), пожалуйста");
- scanf ("%d", ch);
- }
- int z=ch;
- sprintf(test, "%s %d", "Тест", ch);
- fscanf(f,"%s %d", str,&n);
- sprintf(str, "%s %d", str, n);
- while(strcmp(test,str))
- {
- fscanf(f,"%s %d", str,&n);
- sprintf(str, "%s %d", str, n);
- }
- fscanf(f,"%d", &m);
- float **M=new float *[m];
- for ( int i=0; i<m; ++i )
- {
- M[i]=new float[m];
- }
- for ( int i=0; i<m && (!feof(f)); ++i )
- {
- for ( int j=0; j<m && (!feof(f)); ++j )
- {
- fscanf(f,"%4f",&M[i][j]);
- }
- }
- //промежуточная проверка
- for (int i=0; i<m; i++)
- { for (int j=0; j<m; j++)
- printf("%f ",M[i][j]);
- putchar('\n');
- }
- float **I=new float *[m];
- for ( int i=0; i<m; ++i )
- {
- I[i]=new float[m];
- }
- for (int i=0; i<m; i++)
- { for (int j=0; j<m; j++)
- I[i][j]=M[i][j];
- }
- Inv(res_m,m,I);
- Det(res,m,M);
- }
Advertisement
Add Comment
Please, Sign In to add comment