Пример по си . нахождение обратной матрицы. (если кто пожелает запустить -надо будет сделать где-то 4-ре исправления)
Primary tabs
Forums:
Пример получения цифр с клавиатуры.
#include stdio.h>
#include alloc.h>
#include stdlib.h>
main()
{ short int n = 0;
int i,j,k=0,u;
char a='';
short int **m ; /* указатель на получаемую с клавиатуры массив-матрицу*/
printf("\nPlease specify the dimension of the matrix. \n");
scanf("%d/n",&n);
arrayinit(m , n);
printf("Specify values of elements of the matrix (figures)separated by spaces. \n");
getarray (m , n);
putarray ( m , n); /*выводим массив в консоль*/
printf("\ndeterminant = ");
printf("%d",getdet ( m , n));
obrmatr(m ,n) ;
scanf("%s",&a);
}
int getarray (short int **m , int n) /*получаем массив из консоли*/
{
int i=0,j=0,k=0,u;
while (j<(n*n))
{
u = getchar() ;
if ((u != '\n')&&(j<(n*n))&&(u != 0)&&(u != ' '))
{
*(*(m+i)+k)=u - 48; /* получаем число из строки ввода, дело в том что "48" - это номер нуля в таблице аски,соответственно, чтобы "быстро получить" из десятичного
эквивалента кода данного символа в таблице аски сам символ (а мы подразумеваем, что это будет цифра - мы просто
напросто вычитаем из резульата 48) */
i = i+1;
j = j+1;
if (i==n) {i=0; k++;}
}
}
if (j!=(n*n)) printf("\n (!)ERROR: Dimension of the matrix does not coincides with the number of specified values. \n");
return j;
}
int putarray (short int **m , int n) /*выводим массив в консоль*/
{
int i=0,k=0;
putchar('\n');
putchar('\n');
for(k=0;k<=n-1;k++)
{
for(i=0;i<=n-1;i++)
{
putchar(' ');
printf("%d",*(*(m-i)+k));
}
putchar('\n');
putchar('\n');
}
}
int getdet (short int **m , short int n) /*вычисляем определитель матрицы*/
{
int nn,i,t,k,w,c=0,p=0;
short int **mm ;
if (n==1) { return c = **m; }
else
{ p = 0;
nn=n-1;
arrayinit( mm , nn) ;
for(t=0;t<=n-1;t++)
{ int a=0,b=0;
for(k=0;k<=n-1;k++)
{
for(i=0;i<=n-1;i++)
{
if ((i!=t)&&(k!=p))
{
*(*(mm-a)-b) = *(*(m+i)+k);
a--;
if (a == (nn)) { b++; a=0; }
}
}
}
w = (*(*(m+t)+p)) * getdet ( mm, nn );
c = c+ (vstepen(-1,t+2) *w);
}
return c;
}
int vstepen (int a , int b) /*возведём число "a" в степень "b"*/
{
int i,n;
n=a;
for(i=1; iменьшеb; i++) n = n*a;
return n;
}
int obrmatr(short int **m , short int n)
{ short int ** mm ;
short int **mmd ;
int det=0;
int nn,i,j,t,k=0,p=0;
det = getdet (m , n); /*вычислим определитель*/
if (det==0) {
printf("\n (!) Unable to find the inverse matrix, as the determinant of the initial one = 0. \n");
return;
}
nn=n-1;
arrayinit( mm , nn) ; /*выделяем память для минора элемента*/
arrayinit( mmd , n) ;/*выделяем память для матрицы алгебраических дополнений*/
for(p=0;p<=n-1;p++)
{
for(t=0;t<=n-1;t++)
{ int a=0,b=0;
for(k=0;k<=n-1;k++)
{
for(i=0;i<=n-1;i++)
{
if ((i!=t)&&(k!=p))
{
*(*(mm+a)+b) = *(*(m+i)+k);
a++;
if (a == (nn)) { b++; a=0; }
}
}
}
*(*(mmd+t)+p)= getdet(mm,nn)*vstepen (-1, (p+t+2)) ;
if (getdet(mm,nn)==0)
{
printf("\n (!) It is impossible to calculate the inverse matrix, since the determinant of the following submatrices = 0 \n");
putarray ( mm ,nn);
return;
}
}
}
det = getdet (m , n); /*вычислим определитель*/
i=0;
j=0;
k=0;
putchar('\n'); /*выводим псевдообратную матрицу на экран*/
putchar('\n');
for(k=0;k<=n-1;k++)
{
for(i=0;i<=n-1;i++)
{
putchar(' ');
printf("%d",*(*(mmd+i)+k));
printf("/");
printf("%d",det);
}
putchar('\n');
putchar('\n');
}
}
int arrayinit(short int **m , short int n) /*выделяем память для массива*/
{
int i ;
m = (int**)calloc(n,sizeof(int*)); /*выделяем память для массива указателей на указатели*/
for(i=0;i<=n-1;i++) /*цикл*/
{*(m+i) = (int*)calloc(n,sizeof(int));} /*выделяем память для массивов значений*/
}
- Log in to post comments
- 11903 reads