數據結構課程設計報告n維矩陣乘法_第1頁
數據結構課程設計報告n維矩陣乘法_第2頁
數據結構課程設計報告n維矩陣乘法_第3頁
數據結構課程設計報告n維矩陣乘法_第4頁
數據結構課程設計報告n維矩陣乘法_第5頁
已閱讀5頁,還剩6頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1/1數據結構課程設計報告n維矩陣乘法數據結構課程設計報告設計題目:n維矩陣乘法:AB-1專業計算機科學與技術班級計本學生學號指導教師起止時間20XX.X.3-20XX.X.11學年第I學期一、具體任務功能:設計一個矩陣相乘的程序,首先從鍵盤輸入兩個矩陣a,b的內容,并輸出兩個矩陣,輸出ab-1結果。分步實施:1.初步完成總體設計,搭好框架,確定人機對話的界面,確定函數個數;2.完成最低要求:建立一個文件,可完成2維矩陣的情況;3.進一步要求:通過鍵盤輸入維數n。有興趣的同學可以自己擴充系統功能。要求:1.界面友好,函數功能要劃分好2.總體設計應畫一流程圖3.程序要加必要的注釋4.要提供程序測試方案5.程序一定要經得起測試,寧可功能少一些,也要能運行起來,不能運行的程序是沒有價值的。二、軟件環境MicrosoftVisualC++6.0三、問題的需求分析程序以二維數組作為矩陣的存儲結構,通過鍵盤輸入矩陣維數n,動態分配內存空間,創建n維矩陣。矩陣建立后再通過鍵盤輸入矩陣的各個元素值;也可以通過文件讀入矩陣的各項數據(維數及各元素值)。當要對矩陣作進一步操作(AxB或AxB^(-1))時,先判斷內存中是否已經有相關的數據存在,若還未有數據存在則提示用戶先輸入相關數據。當要對矩陣進行求逆時,先利用矩陣可逆的充要條件:|A|!=0判斷矩陣是否可逆,若矩陣的行列式|A|==0則提示該矩陣為不可逆的;若|A|!=0則求其逆矩陣,并在終端顯示其逆矩陣。四、算法設計思想及流程圖1.抽象數據類型ADTMatrixMulti{數據對象:D={a(I,j)|i=1,2,3,…,n;j=1,2,…,n;a(i,j)∈ElemSet,n為矩陣維數}數據關系:R={Row,Col}Row={a(i,j),a(i,j+1)|1=i=n,1=j=n-1}Col={a(i,j),a(i+1,j)|1=i=n-1,1=j=n}基本操作:Swap(a,b);初始條件:記錄a,b已存在。操作結果:交換記錄a,b的值。CreateMatrix(n);操作結果:創建n維矩陣,返回該矩陣。Input(M);初始條件:矩陣M已存在。操作結果:從終端讀入矩陣M的各個元素值。Print(M)初始條件:矩陣M已存在。操作結果:在終端顯示矩陣M的各個元素值。ReadFromFile();操作結果:從文件讀入矩陣的相關數據。Menu_Select();操作結果:返回菜單選項。MultMatrix(M1,M2,R);初始條件:矩陣M1,M2,R已存在。操作結果:矩陣M1,M2作乘法運算,結果放在R中。DinV(M,V);初始條件:矩陣M,V已存在。操作結果:求矩陣M的逆矩陣,結果放入矩陣V中。MatrixDeterm(M,n);初始條件:矩陣M已存在。操作結果:求矩陣M的行列式的值。}ADTMatrixMulti2.矩陣求逆算法設計思想算法采用高斯-約旦法(全選主元)求逆,主要思想如下:首先,對于k從0到n-1作如下幾步:①從第k行、第k列開始的右下角子陣中選取絕對值最大的元素,并記住此元素所在的行號與列號,再通過行交換和列交換將它交換到主元素位置上。這一步稱為全選主元。②主元求倒:M(k,k)=1/M(k,k)③M(k,j)=M(k,j)xM(k,k);j=0,1,…,n-1;j!=k④M(i,j)=M(i,j)–M(i,k)xM(k,j);i,j=0,1,…,n-1;i,j!=k⑤M(i,k)=-M(i,k)xM(k,k),i=0,1…,n-1;i!=k最后,根據在全選主元過程中所記錄的行、列交換的信息進行恢復,恢復原則如下:在全選主元過程中,先交換的行(列)后進行恢復;原來的行(列)交換用列(行)交換來恢復。3.矩陣行列式求值運算算法設計思想利用行列式的性質:行列式等于它的任一行(列)各元素與其對應的代數余子式乘積,即D=∑a(i,k)xA(i,k);k=1,2,…,n;D=∑a(k,j)xA(k,j);k=1,2,…,n;再利用函數的遞歸調用法實現求其值。4.各函數間的調用關系Main()ReadFromFile()DinV()Swap()Print()Menu_Select()MatrixDeterm()CreateMatrix()MultMatrix()Input()5.流程圖否否是否是是否是否否是開始switch(Menu_Select())case1:case3:case2:n0?是輸入矩陣維數n輸入矩陣A,B輸出矩陣維數nsystem(“pause”);通過鍵盤輸入需對哪個矩陣求逆,求出相應該的逆陣,并顯示求得的逆陣system(“pause”);若矩陣不可逆則返回主菜單case4:R=AxB并顯示矩陣Rsystem(“pause”);case5:是否是R=AxB^(-1)顯示矩陣Rsystem(“pause”);若B不可逆,則返回主菜單case6:從指定文件中讀入矩陣數據case0:exit(0);結果否五、源代碼#includeconio.h#includestdio.h#includestdlib.h#includemath.h#includemalloc.h#includestring.h#defineYES1#defineNO0typedeffloatElemType;ElemTypexxA;//矩陣AElemTypexxB;//矩陣BElemTypexxR;//矩陣R,用于存放運算結果ElemTypexxV;//矩陣V,存放逆矩陣intn=0;//矩陣維數intflag=-1;//標記voidswap(ElemTypexa,ElemTypexb)//交換記錄a,b的值{ElemTypec;c=xa;xa=xb;xb=c;}ElemTypexxCreateMatrix(intn)//創建n維矩陣,返回該矩陣{inti,j;ElemTypexxM;M=(ElemTypexx)malloc(sizeof(ElemTypex)xn);if(M==NULL)exit(1);for(i=0;in;i++){x(M+i)=(ElemTypex)malloc(sizeof(ElemType)xn);for(j=0;jn;j++)x(x(M+i)+j)=0;}returnM;}ElemTypeMatrixDeterm(ElemTypexxM,intn)/x遞歸法求n維矩陣行列式的值,返回運算結果x/{inti,j,k,l,s;ElemTypexxT1;ElemTypexxT2;T1=CreateMatrix(n);T2=CreateMatrix(n);ElemTypeu;ElemTypevalue=0;//運算結果for(i=0;in;i++){for(j=0;jn;j++){T1[i][j]=M[i][j];T2[i][j]=M[i][j];}}if(n==2)//若為2維矩陣,則直接運算并返回運算結果{value=T2[0][0]xT2[1][1]-T2[0][1]xT2[1][0];returnvalue;}else{for(j=0;jn;j++)//將矩陣的行列式以第一行展開{u=T1[0][j];for(i=1,l=0;in;i++)//求矩陣行列式的余子式M(0,j){for(k=0,s=0;kn;k++){if(k==j)continue;else{T2[l][s]=T1[i][k];s++;}}l++;}value=value+ux((int)pow(-1,j))xMatrixDeterm(T2,n-1);/x行列式等于某一行的各個元素與其代數余子式的乘積之和x/}returnvalue;}}intDinV(ElemTypexxM,ElemTypexxV)/x全選主元法求矩陣M的逆矩陣,結果存入矩陣V中x/{inti,j,k;ElemTyped;ElemTypeu;intxJS,xIS;JS=(intx)malloc(sizeof(int)xn);IS=(intx)malloc(sizeof(int)xn);u=MatrixDeterm(M,n);//返回矩陣A的行列式值if(u==0)return-1;for(i=0;in;i++)for(j=0;jn;j++)V[i][j]=M[i][j];for(k=0;kn;k++){d=0;for(i=k;in;i++)//找出矩陣M從M[k][k]開始絕對值最大的元素{for(j=k;jn;j++){if(fabs(V[i][j])d){d=fabs(V[i][j]);//d記錄絕對值最大的元素的值/x把絕對值最大的元素在數組中的行、列坐標分別存入IS[K],JS[K]x/IS[k]=i;JS[k]=j;}}}if(d+1.0==1.0)return0;//所有元素都為0if(IS[k]!=k)/x若絕對值最大的元素不在第k行,則將矩陣IS[K]行的元素與k行的元素相交換x/for(j=0;jn;j++)swap(V[k][j],V[IS[k]][j]);if(JS[k]!=k)/x若絕對值最大的元素不在第k列,則將矩陣JS[K]列的元素與k列的元素相交換x/for(i=0;in;i++)swap(V[i][k],V[i][JS[k]]);V[k][k]=1/V[k][k];//絕對值最大的元素求倒for(j=0;jn;j++)/x矩陣M第k行除元素M[k][k]本身外都乘以M[k][k]x/if(j!=k)V[k][j]=V[k][j]xV[k][k];for(i=0;in;i++)/x矩陣除第k行的所有元素與第k列的所有元素外,都拿本身減去M[i][k]xM[k][j],其中i,j為元素本身在矩陣的位置坐標x/if(i!=k)for(j=0;jn;j++)if(j!=k)V[i][j]=V[i][j]-V[i][k]xV[k][j];for(i=0;in;i++)/x矩陣M第k列除元素M[k][k]本身外都乘以-M[k][k]x/if(i!=k)V[i][k]=-V[i][k]xV[k][k];}for(k=n-1;k=0;k--)/x根據上面記錄的行IS[k],列JS[k]信息恢復元素x/{for(j=0;jn;j++)if(JS[k]!=k)swap(V[k][j],V[JS[k]][j]);for(i=0;in;i++)if(IS[k]!=k)swap(V[i][k],V[i][IS[k]]);}free(IS);free(JS);return0;}voidMultMatrix(ElemTypexxM1,ElemTypexxM2,ElemTypexxR)/x矩陣M1乘M2結果存入矩陣Rx/{inti,j,k;for(i=0;in;i++){for(j=0;jn;j++){R[i][j]=0;}}for(i=0;in;i++){for(j=0;jn;j++){for(k=0;kn;k++){R[i][j]=R[i][j]+M1[i][k]xM2[k][j];}}}}voidInput(ElemTypexxM)//輸入矩陣M的各個元素值{inti,j;charstr[10];charc='A';if(flag==1)c='B';system(“cls“);printf(“\n\n輸入矩陣%c(%dx%d)\n“,c,n,n);for(i=0;in;i++){for(j=0;jn;j++){scanf(“%f“,x(M+i)+j);}}flag=1;gets(str);//吸收多余的字符}voidPrint(ElemTypexxM)//顯示矩陣M的各個元素值{inti,j;printf(“\t“);for(i=0;in;i++){for(j=0;jn;j++){printf(“%.3f“,M[i][j]);}puts(““);printf(“\t\t“);}}intMenu_Select(){charc;do{system(“cls“);puts(“\t\txxxxxxxxxxxxxn維矩陣乘法器xxxxxxxxxxxxx“);puts(“\t\t|1.通過鍵盤輸入各項數據|“);puts(“\t\t|2.顯示矩陣A,B|“);puts(“\t\t|3.矩陣求逆,并顯示逆矩陣|“);puts(“\t\t|4.求矩陣運算AxB,并顯示運算結果|“);puts(“\t\t|5.求矩陣運算AxB^(-1),并顯示運算結果|“);puts(“\t\t|6.從文件讀入矩陣A,B與維數n|“);puts(“\t\t|0.退出|“);puts(“\t\txxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx“);printf(“\t\t請選擇(0-6):“);c=getchar();}while(c'0'||c'6');return(c-'0');}voidReadFromFile()//從指定文件讀入矩陣的維數及矩陣各元素的值{inti,j;FILExfp;if((fp=fopen(“tx.txt“,“r“))==NULL){puts(“無法打開文件!!!“);system(“pause“);exit(0);}fscanf(fp,“%d“,n);//讀入矩陣維數A=CreateMatrix(n);//創建矩陣ABVRB=CreateMatrix(n);V=CreateMatrix(n);R=CreateMatrix(n);for(i=0;in;i++)//讀入矩陣A{for(j=0;jn;j++){fscanf(fp,“%f“,A[i][j]);}}for(i=0;in;i++)//讀入矩陣A{for(j=0;jn;j++){fscanf(fp,“%f“,B[i][j]);}}puts(“\n\n讀文件成功“);fclose(fp);flag=1;}intmain(){inti;charc,h;charstr[10];for(;;){switch(Menu_Select()){case1:flag=-1;for(;;){system(“cls“);printf(“\n\n\t矩陣維數n:“);scanf(“%d“,n);gets(str);if(n0)break;else{printf(“\n\t輸入有誤,請重新輸入!\n“);puts(““);system(“pause“);}}A=CreateMatrix(n);B=CreateMatrix(n);V=CreateMatrix(n);R=CreateMatrix(n);Input(A);Input(B);break;case2:system(“cls“);if(flag==-1){puts(“\n\n\t不存在任何矩陣數據,請先輸入數據“);system(“pause“);break;}puts(“\n“);printf(“\tA=“);Print(A);puts(“\n“);printf(“\tB=“);Print(B);puts(““);system(“pause“);break;case3:system(“cls“);if(flag==-1){puts(“\n\n\t不存在任何矩陣數據,請先輸入數據“);system(“pause“);break;}for(;;){printf(“\n\n\t輸入需要求逆的矩陣(A/B):“);h=getchar();c=getchar();//h=getchar();if(c=='A'||c=='a'){i=DinV(A,V);if(i==-1){puts(“\n\n\t矩陣A的行列式等于0,不可逆!“);system(“pause“);break;}printf(“\tA=“);Print(A);puts(“\n“);printf(“A^(-1)=“);Print(V);puts(““);system(“pause“);break;}elseif(c=='B'||c=='b'){i=DinV(B,V);if(i==-1){puts(“\n\n\t矩陣B的行列式等于0,不可逆!“);system(“pause“);break;}printf(“\tB=“);Print(B);puts(“\n“);printf(“B^(-1)=“);Print(V);puts(““);system(“pause“);break;}elseputs(“\n\n\t輸入有誤,請重新輸入!\n“);}break;case4:system(“cls“);if(flag==-1){puts(“\n\n\t不存在任何矩陣數據,請先輸入數據“);system(“pause“);break;}MultMatrix(A,B,R);printf(“\n\n\tAxB=“);Print(R);puts(““);system(“pause“);break;case5:system(“cls“);if(flag==-1){puts(“\n\n\t不存在任何矩陣數據,請先輸入數據“);system(“pause“);break;}i=DinV(B,V);if(i==-1){puts(“\n\n\t矩陣B的行列式等于0,不可逆!“);system(“pause“

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論