引用型参数应该在能被定义为const的情况下,尽量定义为const 。
创新互联公司专注于云溪网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供云溪营销型网站建设,云溪网站制作、云溪网页设计、云溪网站官网定制、成都小程序开发服务,打造云溪网络公司原创品牌,更为您提供云溪网站排名全网营销落地服务。
#define N 5 /*[注]:修改6为你所要的矩阵阶数*/
#include "stdio.h"
#include "conio.h"
/*js()函数用于计算行列式,通过递归算法实现*/
int js(s,n)
int s[][N],n;
{int z,j,k,r,total=0;
int b[N][N];/*b[N][N]用于存放,在矩阵s[N][N]中元素s[0]的余子式*/
if(n2) {for(z=0;zn;z++)
{for(j=0;jn-1;j++)
for(k=0;kn-1;k++)
if(k=z) b[j][k]=s[j+1][k+1];
else b[j][k]=s[j+1][k];
if(z%2==0) r=s[0][z]*js(b,n-1); /*递归调用*/
else r=(-1)*s[0][z]*js(b,n-1);
total=total+r;
}
}
else if(n==2) total=s[0][0]*s[1][1]-s[0][1]*s[1][0];
return total;
}
/*n_1()函数用于求原矩阵各元素对应的余子式,存放在数组b[N][N]中,定义为float型*/
void n_1(s,b,n)
int s[][N],n;
float b[][N];
{int z,j,k,l,m,g,a[N][N];
for(z=0;zn;z++)
{l=z;
for(j=0;jn;j++)
{ m=j;
for (k=0;kn-1;k++)
for(g=0;gn-1;g++)
{ if(g=mkl) a[k][g]=s[k][g+1];
else if(k=lgm) a[k][g]=s[k+1][g];
else if(k=lg=m) a[k][g]=s[k+1][g+1];
else a[k][g]=s[k][g];
}
b[z][j]=js(a,n-1);
}
}
}
main()
{int a[N][N];
float b[N][N];
int r,z,j;
float temp;
//clrscr();
printf("Input original data:\n");
for(z=0;zN;z++) /*输入所需要的数据,为整型数据*/
for(j=0;jN;j++)
scanf("%d",a[z][j]);
printf("\nPress Enter continue......");
getchar();
//gotoxy(1,1);
printf("The original matrix is:\n");
for(z=0;zN;z++)/*打印原矩阵*/
{for(j=0;jN;j++)
printf("%5d",a[z][j]);
printf("\n");
}
r=js(a,N); /*调用js()函数计算原矩阵的行列式值*/
printf("\nThe original matrix hanglieshi is:|A|==%d\n",r);
if (r==0) printf("Because |A|==0,the original matrix have no nijuzhen!"); /*判断条件:若|A|==0,则原矩阵无逆矩阵,反之则存在逆矩阵*/
else
{n_1(a,b,N); /*调用n_1()函数,得到原矩阵各元素对应的"余子式",存放在数组b[N][N]中*/
for(z=0;zN;z++) /*求代数余子式,此时b[N][N]中存放的为原矩阵各元素对应的"代数余子式"*/
for(j=0;jN;j++)
if((z+j)%2!=0 b[z][j]!=0) b[z][j]=-b[z][j];
for(z=0;zN;z++) /*对b[N][N]转置,此时b[N][N]中存放的为原矩阵的伴随矩阵*/
for(j=z+2;jN;j++)
{temp=b[z][j];
b[z][j]=b[j][z];
b[j][z]=temp;
}
printf("Because |A|!=0,the original matrix have nijuzhen!\n");
printf("The bansuijuzhen A* is:\n");
for(z=0;zN;z++)/* 打印伴随矩阵A* */
{for(j=0;jN;j++)
printf("%4.0f\t",b[z][j]);
printf("\n");
}
for(z=0;zN;z++) /*求逆矩阵,此时b[N][N]中存放的是原矩阵的逆矩阵*/
for(j=0;jN;j++)
b[z][j]=b[z][j]/r;
printf("\nThe nijuzhen is:(A*)/|A|(|A|=%d)\n",r); /*打印逆矩阵*/
for(z=0;zN;z++)
{for(j=0;jN;j++)
printf("%8.3f",b[z][j]);
printf("\n");
}
}
}
C语言程序如下:
#include stdio.h
#include math.h
#define MAX 100
double D(double arr[][MAX], int n);
void Display(double arr[][MAX], int n);
void main()
{
double arr[MAX][MAX];
double bak[MAX][MAX];
double value;
int n;
int i, j, k, c;
printf("Please enter matrix size n(1=n20):");
scanf("%d", n);
printf("Please input matrix line by line:\n");
for(i=0; in; i++)
{
for(j=0; jn; j++)
{
scanf("%lf", arr[i][j]);
}
}
printf("matrix a:\n");
Display(arr, n);
/* 保存D(0,i)的值到bak中 */
for(i=0; in; i++) /* 处理第1行的每一列元素 */
{
for(j=1; jn; j++) /* 逐行处理 */
{
for(c=0,k=0; kn; k++) /* 逐列处理 */
{
if(k == i)
{
continue;
}
bak[j-1][c++] = arr[j][k];
}
}
value = D(bak, n-1);
printf("Submatrix:\n");
Display(bak, n-1);
printf("DValue of the Submatrix is %f\n", D(bak, n-1));
}
value = D(arr, n);
printf("result = %f\n", value);
}
double D(double arr[][MAX], int n)
{
double bak[MAX][MAX];
int i, j, k, c, d;
double sum = 0;
if(n == 1)
{
return arr[0][0];
}
for(i=0; in; i++) /* 处理第1行的每一列元素 */
{
for(j=1; jn; j++) /* 逐行处理 */
{
for(c=0,k=0; kn; k++) /* 逐列处理 */
{
if(k == i)
{
continue;
}
bak[j-1][c++] = arr[j][k];
}
}
/* 计算arr(row, col) * D(row, col)的值 */
sum += (i % 2 == 0 ? 1 : -1) * arr[0][i] * D(bak, n-1);
}
return sum;
}
void Display(double arr[][MAX], int n)
{
int i, j;
printf("");
for(i=0; in; i++)
{
for(j=0; jn; j++)
{
printf("%10.1lf", arr[i][j]);
}
printf("\n");
}
}
运行测试:
用递归写了一个求n阶行列式的算法。用4阶行列式举例:
1 2 3 4
5 6 7 8
4 3 2 1
8 7 6 5
为了方便计算,我没有用二维数组。
把矩阵用一维数组A存起来,并指出维数n。
第i行第j列的元素的下标是i*n+j
#include stdio.h
#include stdlib.h
//求余子式M的函数,参数是矩阵,维数,i行,j列
//比如M(A, 4, 0, 0)表示去掉第1列,第1列的元素后剩下的数组成一个数组
//6 7 8
//3 2 1
//7 6 5
//然后用A[i*n+j]和余子式的值相乘
int* M(int *A, int n, int i, int j)
{
int *B= (int*)malloc((n - 1)*sizeof(int));
int k = 0;
for (int k1 = 0; k1 n; ++k1)
{
if (k1 != i)
for (int k2 = 0; k2 n; ++k2)
if (k2 != j)
B[k++] = A[k1*n + k2];
}
return B;
}
int det(int A[], int n)
{
int sum = 0, N = n*n;
if (n == 1)
sum = A[0];
else
{
for (int i = 0; i n; ++i)
{
int *tmp = M(A, n, i, 0);
int Aij = A[i*n]*det(tmp, n - 1);
if (i%2 != 0)
Aij = -Aij;
sum = sum + Aij;
}
}
return sum;
}
int main()
{
int A[]={2,1,3,-1,1,-5,1,1,2,3,2,2,0,-1,4,2};
printf("%d\n", det(A, 4));
return 0;
}
行列式的值的源代码如下:
#include stdio.h
#include stdlib.h
void main()
{
int i,j,m,n,s,t,k=1;
double a[n][n],f=1,c,x,sn;
for (i=0;in;i++)
for (j=0;jn;j++)
scanf ("%lf",a[i][j]);
for (i=0,j=0;injn;i++,j++)
{
if (a[i][j]==0)
{
for (m=i;a[m][j]==0;m++);
if (m==n)
{
sn=0;
printf("deta=%lf\n",sn);
exit(0);
}
else
for (n=j;nn;n++)
{
c=a[i][n];
a[i][n]=a[m][n];
a[m][n]=c;
}
k*=(-1);
}
for (s=n-1;si;s--)
{
x=a[s][j];
for (t=j;tn;t++)
a[s][t]-=a[i][t]*(x/a[i][j]);
}
for (i=0;in;i++)
f*=a[i][i];
sn=k*f;
printf ("deta=%lf\n",sn);
}
扩展资料
1、每个C语言程序中main函数是有且只有一个。
2、C语言程序写完后,都是先编译,后连接,最后运行。(.c--.obj--.exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe文件才可以运行