A. c語言計算行列式
你好,我用C#寫過計算行列式值的winform程序,不過演算法應該一樣,你可以看看
//按鈕事件
privatevoidbtnResult_Click(objectsender,EventArgse)
{
stringsInfo=txtInfo.Text.Trim();
string[]R=sInfo.Replace(" ","※").Split('※');
intn=R.Length;//維數
string[,]A=newstring[n,n];
for(inti=0;i<n;i++)
{
for(intj=0;j<n;j++)
{
string[]C=R[i].Split('');
if(C.Length!=n)
{
MessageBox.Show("請輸入n階行列式");
return;
}
A[i,j]=C[j];
}
}
try
{
lblResult.Text=DGRowLayout(A).ToString();
}
catch
{
MessageBox.Show("本程序只支持一般的數字形式,不支持特殊的數字形式");
return;
}
}
//遞歸演算法
privatedoubleDGRowLayout(string[,]A)
{
if(A.Length==1)
{
returndouble.Parse(A[0,0]);
}
doubles=0;
intm=0,n=0;
intN=int.Parse(Math.Sqrt(A.Length).ToString());
for(inti=0;i<N;i++)
{
string[,]B=newstring[N-1,N-1];
m=0;
for(intj=1;j<N;j++)
{
n=0;
for(intk=0;k<N;k++)
{
if(k!=i)
{
B[m,n]=A[j,k];
n++;
}
}
m++;
}
intO=0;
if(i%2==0)
{
O=1;
}
else
{
O=-1;
}
s+=double.Parse(A[0,i])*O*DGRowLayout(B);
}
returns;
}
B. 關於C語言的問題:如何用C語言實現n階行列式和矩陣的值
輸入:
3---7
2---1
得出錯誤結果。
而當輸入n=3
0---1---3
3---0---2
5---2---0
時也會得出錯誤結果。
錯誤的原因有2:
1
是數據類型不對,匿名的程序是設定輸入都是整數int,顯然按照行列式的定義結果肯定是整數,但是他程序中使用了整型數的除法,結果是取整整數,雖然他使用了類型強制轉換,但結果顯然不同,有誤差而且有時候這個誤差很大形成錯誤。
2
是演算法有點問題。小可很欣賞匿名的演算法思路,簡潔明快。不過有相當缺陷,這在程序中註明。
下面的程序是在匿名的程序思路上改寫的。考慮到數據類型和精確度問題,程序中行列式數據使用double型。由於tc和win-tc是16位編輯器,對float型和double型數據支持不好,所以程序是在32位編輯器Dev-c++下調試並通過的。
本題的一個完整的c程序如下,程序在Dev-c++下都調試通過,結果正確。
/*
用C語言解決:求任意階(n階)矩陣的行列式值
*/
#include
<stdio.h>
#include
<math.h>
void
getarray(int
n);
void
showarray(int
n);
double
getresult(int
n);
double
array[10][10];/*設矩陣不超過10階,可更改*/
int
main()
{
int
n;
double
result;
printf("\nPlease
input
the
Array
size
n:");
scanf("%d",&n);
getarray(n);
showarray(n);
result=getresult(n);
printf("\nResult=%f\n",result);
system("pause");
return
0;
}
void
getarray(int
n)
{
int
row,col;
for(row=0;row<n;row++)
{
printf("\nPlease
input
line
%d:",row+1);
for(col=0;col<n;col++)
scanf("%lf",&array[row][col]);
}
}
void
showarray(int
n)
{
int
row,col;
printf("\nA=");
for(row=0;row<n;row++)
{
for(col=0;col<n;col++)
printf("\t%f",array[row][col]);
printf("\n");
}
}
double
getresult(int
n)
{
double
temp,result=1.0;
int
switchtime=0,flag=0;
int
row,nextrow,col,stemp;
for(row=0;row<n-1;row++)
{
nextrow=row+1;
if(array[row][row]==0)/*
開始處理第一列,如果行列式第一行第一個數為零,要交換行
*/
{
while(array[nextrow][row]==0)
{
nextrow++;
/*
如果行列式第二行第一個數為零,行增加繼續尋找非零數值的行
*/
if(nextrow==n)/*
如果遍歷完行列式行列式第一列元素都為零,退出while循環
*/
{
flag=1;
break;
}
}
if(flag==1)
/*
退出while循環後回到for(row=0;row<n-1;row++)行加1?*/
continue;
/*
從array[row][row]==0知列也相應加1,開始處理第二列
*/
switchtime++;
/*
每交換一次行,行列式符號變化1次,統計變化次數
*/
for(col=0;col<n;col++)
/*
交換非零行到行列式頂部
*/
{
stemp=array[row][col];
array[row][col]=array[nextrow][col];
array[nextrow][col]=stemp;
}
}
for(nextrow=row+1;nextrow<n;nextrow++)
{
/*
類似高斯消去法,消第一行下各行第一列數值到零*/
temp=array[nextrow][row]/array[row][row];
for(col=0;col<n;col++)
array[nextrow][col]+=-temp*array[row][col];/*
化行列式為上三角行列式形式
*/
}
}
showarray(n);
for(row=0;row<n;row++)
result*=array[row][row];
if(switchtime%2)
return
-result;
else
return
result;
}
C. 求c語言求矩陣的行列式和逆天天向哪兒
引用型參數應該在能被定義為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(n>2) {for(z=0;z<n;z++)
{for(j=0;j<n-1;j++)
for(k=0;k<n-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;z<n;z++)
{l=z;
for(j=0;j<n;j++)
{ m=j;
for (k=0;k<n-1;k++)
for(g=0;g<n-1;g++)
{ if(g>=m&&k<l) a[k][g]=s[k][g+1];
else if(k>=l&&g<m) a[k][g]=s[k+1][g];
else if(k>=l&&g>=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;z<N;z++) /*輸入所需要的數據,為整型數據*/
for(j=0;j<N;j++)
scanf("%d",&a[z][j]);
printf("\nPress Enter continue......");
getchar();
//gotoxy(1,1);
printf("The original matrix is:\n");
for(z=0;z<N;z++)/*列印原矩陣*/
{for(j=0;j<N;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;z<N;z++) /*求代數餘子式,此時b[N][N]中存放的為原矩陣各元素對應的"代數餘子式"*/
for(j=0;j<N;j++)
if((z+j)%2!=0 && b[z][j]!=0) b[z][j]=-b[z][j];
for(z=0;z<N;z++) /*對b[N][N]轉置,此時b[N][N]中存放的為原矩陣的伴隨矩陣*/
for(j=z+2;j<N;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;z<N;z++)/* 列印伴隨矩陣A* */
{for(j=0;j<N;j++)
printf("%4.0f\t",b[z][j]);
printf("\n");
}
for(z=0;z<N;z++) /*求逆矩陣,此時b[N][N]中存放的是原矩陣的逆矩陣*/
for(j=0;j<N;j++)
b[z][j]=b[z][j]/r;
printf("\nThe nijuzhen is:(A*)/|A|(|A|=%d)\n",r); /*列印逆矩陣*/
for(z=0;z<N;z++)
{for(j=0;j<N;j++)
printf("%8.3f",b[z][j]);
printf("\n");
}
}
}
D. C語言 計算行列式
利用一定的固定方法把他化成上三角或者下三角,然後用一個新數組儲存對角線上,連乘,得結果
E. 求行列式的值,用C語言怎麼寫啊
行列式的值的源代碼如下:
#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;i<n;i++)
for (j=0;j<n;j++)
scanf ("%lf",&a[i][j]);
for (i=0,j=0;i<n&&j<n;i++,j++)
{
if (a[i][j]==0)
{
for (m=i;a[m][j]==0;m++);
if (m==n)
{
sn=0;
printf("deta=%lf ",sn);
exit(0);
}
else
for (n=j;n<n;n++)
{
c=a[i][n];
a[i][n]=a[m][n];
a[m][n]=c;
}
k*=(-1);
}
for (s=n-1;s>i;s--)
{
x=a[s][j];
for (t=j;t<n;t++)
a[s][t]-=a[i][t]*(x/a[i][j]);
}
for (i=0;i<n;i++)
f*=a[i][i];
sn=k*f;
printf ("deta=%lf ",sn);
}
(5)c語言打開行列式擴展閱讀
1、每個C語言程序中main函數是有且只有一個。
2、C語言程序寫完後,都是先編譯,後連接,最後運行。(.c-->.obj-->.exe)這個過程中注意.c和.obj文件時無法運行的,只有.exe文件才可以運行
F. C語言求行列式的值
C語言程序如下:
#include<stdio.h>
#include<math.h>
#defineMAX100
doubleD(doublearr[][MAX],intn);
voidDisplay(doublearr[][MAX],intn);
voidmain()
{
doublearr[MAX][MAX];
doublebak[MAX][MAX];
doublevalue;
intn;
inti,j,k,c;
printf("Pleaseentermatrixsizen(1<=n<20):");
scanf("%d",&n);
printf("Pleaseinputmatrixlinebyline: ");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%lf",&arr[i][j]);
}
}
printf("matrixa: ");
Display(arr,n);
/*保存D(0,i)的值到bak中*/
for(i=0;i<n;i++) /*處理第1行的每一列元素*/
{
for(j=1;j<n;j++) /*逐行處理*/
{
for(c=0,k=0;k<n;k++) /*逐列處理*/
{
if(k==i)
{
continue;
}
bak[j-1][c++]=arr[j][k];
}
}
value=D(bak,n-1);
printf("Submatrix: ");
Display(bak,n-1);
printf("DValueoftheSubmatrixis%f ",D(bak,n-1));
}
value=D(arr,n);
printf("result=%f ",value);
}
doubleD(doublearr[][MAX],intn)
{
doublebak[MAX][MAX];
inti,j,k,c,d;
doublesum=0;
if(n==1)
{
returnarr[0][0];
}
for(i=0;i<n;i++) /*處理第1行的每一列元素*/
{
for(j=1;j<n;j++) /*逐行處理*/
{
for(c=0,k=0;k<n;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);
}
returnsum;
}
voidDisplay(doublearr[][MAX],intn)
{
inti,j;
printf("");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%10.1lf",arr[i][j]);
}
printf(" ");
}
}
運行測試:
G. 用c語言編程 求n階行列式
#include"stdio.h"
#define n 100
int main()
{
int i, j, t, g, h, f = 1, N;
double m, k[n], a[n][n], detA = 1;
printf("請輸入行列式的階:\n");
scanf_s("%d", &N);
printf("請輸入行列式:\n");
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
scanf_s("%lf", &a[i][j]);
for (i = 1; i < N; i++)
{
if (a[i][i] != 0)
m = a[i][i];
else
{
for (g = i; a[g][i] == 0 && g <= N; g++);
if (g == N + 1)
{
printf("detA=0");
return 0;
}
else
{
for (h = i; h <= N; h++)
{
a[i][h] = a[i][h] + a[g][h];
a[g][h] = a[i][h] - a[g][h];
a[i][h] = a[i][h] - a[g][h];
}
m = a[i][i];
f = f * (-1);
}
}
for (j = i + 1; j <= N; j++)
{
k[j] = a[j][i] / m;
for (t = i; t <= N; t++)
a[j][t] = a[j][t] - a[i][t] * k[j];
}
detA = detA * a[i][i];
}
for (i = 1; a[i][i] != 0 && i <= N; i++);
if (i == N + 1)
{
detA = detA * a[N][N] * f;
}
else
detA = 0;
printf("detA=%.0f\n", detA);
return 0;
}
H. 如何用c語言來求一個四階行列式的值
#include <stdio.h>
#include <stdlib.h>
#define MAX 9 /*定義最大為9階行列式*/
int Fun(int n, int a[MAX][MAX] ); /*函數聲明*/
int main()
{
int n = 0; /*初始化階數n*/
int i = 0, j = 0; /*i,j分別表示行與列*/
int a[MAX][MAX] = {{0}}; /*定義行列式*/
scanf("%d",&n); /*讀入階數*/
while( n != 0) /*輸入為0時退出程序*/
{
for( i = 0; i < n; i++) /*此處2次循環將行列式存入數組中*/
{
for( j = 0; j < n; j++)
scanf("%d", &a[i][j]);
}
printf("%d\n", Fun( n, a ) );
scanf("%d", &n);
}
return 0;
}
/*以下為計算行列式值的遞歸函數*/
int Fun( int n, int a[MAX][MAX] )
{
int b[MAX][MAX] = {{0}}; /*定義數組b並初始化*/
int i = 0, j = 0, sum = 0; /*i,j為行與列,sum為行列式的值*/
int x = 0,c = 0,p=0; /*用x判斷加與減,c,p為中間變數*/
if(n == 1)
return a[0][0];
for(i = 0;i < n; i++) /*此處大循環實現將餘子式存入數組b中*/
{
for(c = 0;c < n-1; c++)
{
for(j = 0;j < n-1;j++)
{
if (c < i){ /*藉助c判斷每行的移動方法*/
p = 0; /*當p=0時,行列式只向左移,即消去對應的第一列的數*/
}
else{ /*否則行列式左移後再上移*/
p = 1;
}
b[c][j] = a[c+p][j+1];
}
}
if(i % 2 == 0){ /*i+j(此時j=0,故只考慮i)為偶數,加法預算*/
x = 1;
}
else{ /*i+j為奇數,減法運算*/
x = (-1);
}
sum += a[i][0] * Fun(n - 1, b ) * x; /*計算行列式的值*/
}
return sum; /*將值返回*/
}