當前位置:成語大全網 - 書法字典 - 字典矩陣建築代碼

字典矩陣建築代碼

大壹的時候寫的,當時自學了C++。很多事情都是不對的,但是樓主可以將就壹下:

# include & ltiostream & gt

# include & ltcstdlib & gt

# include & ltcstdio & gt

# include & ltcmath & gt

# include & ltcstring & gt

使用命名空間std

類別行列式

{

公共:

行列式()

{

int i,j;

side lenth = 2;

array = new double *[side lenth];

for(I = 0;我& lt側面長度;i++)

{

array[I]= new double[side lenth];

}

for(I = 0;我& lt側面長度;i++)

{

for(j = 0;j & lt側面長度;j++)

{

array[I][j]= 0;

}

}

}

行列式(整數倍)

{

int i,j;

這-& gt;sideLenth = sideLenth

array = new double *[side lenth];

for(I = 0;我& lt側面長度;i++)

{

array[I]= new double[side lenth];

}

for(I = 0;我& lt側面長度;i++)

{

for(j = 0;j & lt側面長度;j++)

{

array[I][j]= 0;

}

}

}

~行列式()

{

for(int I = 0;我& lt側面長度;i++)

{

刪除[]數組[I];

}

刪除[]數組;

}

void set determinant();

double calculate();

double等號();

雙* *陣;

int getsideLenth();

double calCofactor(int m,int n);//m是水平刻度,n是垂直刻度。

void show();//用於測試

受保護:

int sideLenth

私人:

double cal two();

無效拷貝(行列式& ampforCal);

void exchangeCorOrRow(行列式& ampforCal,int m,int n,bool colorrow);

};

int行列式::getsideLenth()

{

返回側面長度;

}

void行列式::setdeterminant()

{

for(int j = 0;j & lt側面長度;j++)

{

for(int I = 0;我& lt側面長度;i++)

{

CIN & gt;& gtarray[I][j];

}

}

}

雙重行列式::calculate()

{

if(邊長==2)

{

返回cal two();

}

雙結果= 0.0;

for(int I = 0;我& lt側面長度;i++)

{

result+=calCofactor(i,0)* array[I][0];

}

返回結果;

}

雙重行列式::calCofactor(int m,int n)

{

int yi=0,yj = 0;

int I;

行列式yzs(sideLenth-1);

for(I = 0;我& lt側面長度;i++)

{

如果(我!=m)

{

for(int j = 0;j & lt側面長度;j++)

{

如果(j!=n)

yzs . array[yi][yj++]= array[I][j];

}

yi++;

yj = 0;

}

}

double tmp = yzs . calculate();

if((m+n)%2==1)

tmp =-tmp;

返回tmp

}

雙重行列式::caltwo()

{

如果(sideLenth!=2)

{

cout & lt& lt“錯誤!”& lt& ltendl

返回0.0;

}

其他

{

返回數組[0][0]*數組[1][1]-數組[0][1]*數組[1][0];

}

}

雙重行列式::equal()

{

if(sideLenth & lt;4)

{

返回calculate();

}

行列式forCal(邊長);

副本(for cal);

bool b = true

for(int I = 0;我& ltsideLenth-1;I++)//i是需要三角化的列。

{

if(forCal.array[i][i]==0)

{

for(int k = I+1;k & lt側面長度;k++)

{

if(forCal.array[k][i]!=0)

{

exchange corrow(for cal,I,k,true);

b=!b;

打破;

}

}

if(k = =邊長)

返回0;

}

for(int j = I+1;j & lt側面長度;J++)//j是需要三角剖分的線。

{

if(forCal.array[i][j]!=0)

{

double times = forcal . array[I][j]/forcal . array[I][I];

for(int k = I;k & lt側面長度;k++)

{

for cal . array[k][j]-=(for cal . array[k][I]* times);

}

}

}

}

雙結果= 1;

for(I = 0;我& lt側面長度;i++)

{

result * = forcal . array[I][I];

}

如果(!b)結果=-結果;

返回結果;

}

void行列式::復制(行列式& ampforCal)

{

int i,j;

if(forCal.sideLenth!=側面長度)

{

cout & lt& lt"尺寸不同,無法復制"

返回;

}

for(I = 0;我& lt側面長度;i++)

{

for(j = 0;j & lt側面長度;j++)

{

forcal . array[I][j]= array[I][j];

}

}

}

void行列式::exchangeCorOrRow(行列式& ampforCal,int m,int n,bool colorrow)

{

雙溫;

如果(m & gt= sideLenth | | n & gt= sideLenth | | m & lt0 | | n & lt0)

{

cout & lt& lt"參數錯誤"

返回;

}

If(colorrow)//true是交換列。

{

for(int I = 0;我& lt側面長度;i++)

{

temp = forcal . array[I][m];

for cal . array[I][m]= for cal . array[I][n];

forcal . array[I][n]= temp;

}

}

否則//false是交換行。

{

for(int I = 0;我& lt側面長度;i++)

{

temp = forcal . array[m][I];

for cal . array[m][I]= for cal . array[n][I];

forcal . array[n][I]= temp;

}

}

}

void行列式::show()

{

for(int I = 0;我& lt側面長度;i++)

{

for(int j = 0;j & lt側面長度;j++)

{

printf("%-6.2lf ",array[j][I]);

}

printf(" \ n ");

}

}

類別矩陣

{

私人:

int行;//線標簽的最大值

int col//列標簽的最大值

void copyToDeterminant(行列式& amp目的地);

void equalConvers(int rs,int rd,int cs,double factor);

void divider row(int r,int cs,double factor);

void exchangerow(int rs,int rd);

公共:

雙* *陣;

matrix(){ row = 0;col = 0;}

void setArray();//初始化二維數組

matrix(int row,int col);

~ matrix();

void set matrix();//給矩陣賦值

void show();

void inverse();

虛空運();

朋友無效乘法(矩陣& amp結果,常數矩陣和。faciend,常數矩陣& amp乘數);

int stairlize(int start,int end);

int getrow(){ return row;}

int getcol(){ return col;}

};

void matrix::setArray()

{

int i,j;

array = new double *[row];

for(I = 0;我& lt排;i++)

{

array[I]= new double[col];

}

for(I = 0;我& ltcoli++)

{

for(j = 0;j & lt排;j++)

{

array[j][I]= 0;

}

}

}

matrix::matrix(int row,int col)

{

這-& gt;row = row

這-& gt;col = col

setArray();

}

矩陣::~矩陣()

{

int I;

for(I = 0;我& lt排;i++)

{

刪除[]數組[I];

}

刪除[]數組;

array = NULL

}

void matrix::setmatrix()

{

if(row==0||col==0)

{

拋出“矩陣未初始化\ n”;

}

int i,j;

for(I = 0;我& ltcoli++)

{

for(j = 0;j & lt排;j++)

{

scanf("%lf ",& amparray[j][I]);

}

}

}

void matrix::show()

{

int i,j;

for(I = 0;我& ltcoli++)

{

for(j = 0;j & lt排;j++)

{

printf("%.2lf ",array[j][I]);

}

printf(" \ n ");

}

}

空隙倍增(矩陣& amp結果,常數矩陣和。faciend,常數矩陣& amp乘數)

{

if(faciend.row!=multiplicator.col)

拋出“左矩陣的列數必須等於右矩陣的行數\ n”;

result . row = multiplicator . row;

result . col = faciend . col;

result . set array();

int times = faciend.row

int m,n,I;

for(n = 0;n & lt結果. row;n++)

{

for(m = 0;m & lt結果. col;m++)

{

雙結果數= 0.0;

for(I = 0;我& lt時代;i++)

{

result number+= faciend . array[I][m]* multiplier . array[n][I];

}

result . array[n][m]=結果編號;

}

}

}

void矩陣::copyToDeterminant(行列式& amp目的地)

{

如果(排!=列)

Throw“只有當矩陣的行數和列數相等時才能復制到行列式中\ n”;

如果(排!=destination.getsideLenth())

拋出“行列式大小與矩陣不匹配\ n”;

int i,j;

for(I = 0;我& lt排;i++)

{

for(j = 0;j & ltcolj++)

{

destination . array[I][j]= array[I][j];

}

}

}

void矩陣::運輸()

{

如果(排!=列)

拋出“僅當矩陣的行數和列數相等時可逆\ n”;

行列式tmp determinant(row);

copyToDeterminant(tmpDeterminant);

double value = tmpdeterminant . equal();

如果(值==0)

{

Printf("行列式的值是%lf,所以矩陣是不可逆的\n ",value);

返回;

}

int i,j;

for(I = 0;我& lt排;i++)

{

for(j = 0;j & ltcolj++)

{

array[j][I]= tmp determinant . calco factor(I,j)/value;

}

}

}

void矩陣::inverse()

{

int i,j;

for(I = 0;我& ltcol-1;I++)//縱坐標

{

for(j = I+1;我& lt排;I++)//橫幅

{

double tmp = array[j][I];

array[j][I]= array[I][j];

array[I][j]= tmp;

}

}

}

Voidmatrix:: equal convers (int RS,int rd,int cs,double factor)//RS是起始行標記ds,目標行cs和起始列。

{

for(int I = cs;我& lt排;i++)

{

array[I][rd]-= array[I][RS]*因子;

//printf(" array[% d][% d]= % . 2 lf ",I,rd,array[I][rd]);

}

//printf(" \ n ");

}

void matrix::exchangerow(int rs,int rd)

{

for(int I = 0;我& lt排;i++)

{

雙tmp

tmp = array[I][RS];

數組[I][RS]=數組[I][rd];

array[I][rd]= tmp;

}

}

void matrix::divideRow(int r,int cs,double factor)

{

for(int I = cs;我& lt排;i++)

{

array[I][r]/= factor;

}

}

int matrix::stairlize(int start,int end)

{

int i,j;

雙重因素;

int R = 0;

if(start & lt;0 | | end & gt= row | | start & gt結束)

{

cout & lt& lt"不正確的傳入參數"

返回0;

}

for(I = start;我& lt=結束;I++)//是橫幅。

{

if(array[R][i]==0)

{

int k;

for(k = R+1;k & ltcolk++)

{

if(數組[i][k])

{

exchangerow(i,k);

打破;

}

}

if(k==col)

{

繼續;

}

}

for(j = 0;j & ltcolj++)

{

if(array[I][j]& amp;& ampj!=R)

{

因子= array[I][j]/array[I][R];

equalConvers(R,j,I,factor);

}

}

r++;

}

for(I = 0;我& lt= R;i++)

{

for(j = I;j & lt排;j++)

{

if(array[j][i])

{

divideRow(i,j,array[j][I]);

打破;

}

}

}

return R;

}

void main()

{

cout & lt& lt"請選擇您要執行的操作"

cout & lt& lt"1.決定因素評估”

cout & lt& lt"2.矩陣乘法”

cout & lt& lt"3.矩陣的逆矩陣”

cout & lt& lt"4.矩陣轉置”

cout & lt& lt"5.步驟類型" < & ltendl

cout & lt& lt"0.退出程序"

int選擇;

而(CIN & gt;& gt選擇)

{

開關(選擇)

{

案例1:

{

int大小;

cout & lt& lt"請輸入要計算的行列式的維數"

CIN & gt;& gt尺寸;

行列式jz(大小);

JZ . set determinant();

Printf("這個行列式的值是%.2lf\n ",JZ . equal());

打破;

}

案例二:

{

int rc,col,row//rc是矩陣A的行和列的最大值,col是矩陣A的列的最大值,row是矩陣b的行的最大值。

cout & lt& lt請輸入矩陣A的行數和矩陣B的列數、矩陣A的列數和矩陣B的行數的最大值

CIN & gt;& gtrc & gt& gtcol & gt& gt排;

矩陣A(rc,col);

矩陣B(row,RC);

cout & lt& lt"請給矩陣A賦值"

a . set matrix();

cout & lt& lt"請給矩陣b賦值"

b . set matrix();

矩陣C;

乘法(C,A,B);

c . show();

打破;

}

案例三:

{

int大小;

cout & lt& lt"請輸入正方形的大小"

CIN & gt;& gt尺寸;

矩陣求逆(大小,大小);

inversing . set matrix();

inversing . transportation();

inversing . show();

打破;

}

案例4:

{

int大小;

cout & lt& lt"請輸入正方形的大小"

CIN & gt;& gt尺寸;

矩陣求逆(大小,大小);

inversing . set matrix();

inversing . inverse();

inversing . show();

打破;

}

案例5:

{

int m,n,R;

cout & lt& lt"請分別輸入矩陣的列數和行數"

CIN & gt;& gtm & gt& gtn;

矩陣求逆(m,n);

inversing . set matrix();

R=inversing.stairlize(0,m-1);

cout & lt& lt“矩陣的秩是”

inversing . show();

打破;

}

案例0:

退出(0);

打破;

}

cout & lt& lt"請選擇新的計算類型"

}

}

/*

5 4

1 -2 2 -1 1

2 -4 8 0 2

-2 4 -2 3 3

3 -6 0 -6 4

*/