版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第15頁共15頁數據結構課程設計報告n維矩陣乘法數據結構課程設計報告設計題目:n維矩陣乘法:AB-1專業(yè)計算機科學與技術班級計本學生學號指導教師起止時間20__.X.3-20__.X.11學年第I學期一、具體任務功能:設計一個矩陣相乘的程序,首先從鍵盤輸入兩個矩陣a,b的內容,并輸出兩個矩陣,輸出ab-1結果。分步實施:1.初步完成總體設計,搭好框架,確定人機對話的界面,確定函數個數;2.完成最低要求:建立一個文件,可完成2維矩陣的情況;3.進一步要求:通過鍵盤輸入維數n。有興趣的同學可以自己擴充系統功能。要求:1.界面友好,函數功能要劃分好2.總體設計應畫一流程圖3.程序要加必要的注釋4.要提供程序測試方案5.程序一定要經得起測試,寧可功能少一些,也要能運行起來,不能運行的程序是沒有價值的。二、軟件環(huán)境MicrosoftVisualC++6.0三、問題的需求分析^p程序以二維數組作為矩陣的存儲結構,通過鍵盤輸入矩陣維數n,動態(tài)分配內存空間,創(chuàng)建n維矩陣。矩陣建立后再通過鍵盤輸入矩陣的各個元素值;也可以通過文件讀入矩陣的各項數據(維數及各元素值)。當要對矩陣作進一步操作(A*B或A*B^(-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);操作結果:創(chuàng)建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)*M(k,k);j=0,1,…,n-1;j!=k④M(i,j)=M(i,j)–M(i,k)*M(k,j);i,j=0,1,…,n-1;i,j!=k⑤M(i,k)=-M(i,k)*M(k,k),i=0,1…,n-1;i!=k最后,根據在全選主元過程中所記錄的行、列交換的信息進行恢復,恢復原則如下:在全選主元過程中,先交換的行(列)后進行恢復;原來的行(列)交換用列(行)交換來恢復。3.矩陣行列式求值運算算法設計思想利用行列式的性質:行列式等于它的任一行(列)各元素與其對應的代數余子式乘積,即D=∑a(i,k)*A(i,k);k=1,2,…,n;D=∑a(k,j)*A(k,j);k=1,2,…,n;再利用函數的遞歸調用法實現求其值。4.各函數間的調用關系MainReadFromFileDinVSwapPrintMenu_SelectMatrixDetermCreateMatrixMultMatrixInput5.流程圖否否是否是是否是否否是開始switch(Menu_Select)case1:case3:case2:n>0?是輸入矩陣維數n輸入矩陣A,B輸出矩陣維數nsystem(“pause”);通過鍵盤輸入需對哪個矩陣求逆,求出相應該的逆陣,并顯示求得的逆陣system(“pause”);若矩陣不可逆則返回主菜單case4:R=A*B并顯示矩陣Rsystem(“pause”);case5:是否是R=A*B^(-1)顯示矩陣Rsystem(“pause”);若B不可逆,則返回主菜單case6:從指定文件中讀入矩陣數據case0:exit(0);結果否五、代碼_include<conio.h>_include<stdio.h>_include<stdlib.h>_include<math.h>_include<malloc.h>_include<string.h>_defineYES1_defineNO0typedeffloatElemType;ElemType**A;//矩陣AElemType**B;//矩陣BElemType**R;//矩陣R,用于存放運算結果ElemType**V;//矩陣V,存放逆矩陣intn=0;//矩陣維數intflag=-1;//標記voidswap(ElemType*a,ElemType*b)//交換記錄a,b的值{ElemTypec;c=*a;*a=*b;*b=c;}ElemType**CreateMatrix(intn)//創(chuàng)建n維矩陣,返回該矩陣{inti,j;ElemType**M;M=(ElemType**)malloc(sizeof(ElemType*)*n);if(M==NULL)exit(1);for(i=0;i<n;i++){*(M+i)=(ElemType*)malloc(sizeof(ElemType)*n);for(j=0;j<n;j++)*(*(M+i)+j)=0;}returnM;}ElemTypeMatrixDeterm(ElemType**M,intn)/*遞歸法求n維矩陣行列式的值,返回運算結果*/{inti,j,k,l,s;ElemType**T1;ElemType**T2;T1=CreateMatrix(n);T2=CreateMatrix(n);ElemTypeu;ElemTypevalue=0;//運算結果for(i=0;i<n;i++){for(j=0;j<n;j++){T1[i][j]=M[i][j];T2[i][j]=M[i][j];}}if(n==2)//若為2維矩陣,則直接運算并返回運算結果{value=T2[0][0]*T2[1][1]-T2[0][1]*T2[1][0];returnvalue;}else{for(j=0;j<n;j++)//將矩陣的行列式以第一行展開{u=T1[0][j];for(i=1,l=0;i<n;i++)//求矩陣行列式的余子式M(0,j){for(k=0,s=0;k<n;k++){if(k==j)continue;else{T2[l][s]=T1[i][k];s++;}}l++;}value=value+u*((int)pow(-1,j))*MatrixDeterm(T2,n-1);/*行列式等于某一行的各個元素與其代數余子式的乘積之和*/}returnvalue;}}intDinV(ElemType**M,ElemType**V)/*全選主元法求矩陣M的逆矩陣,結果存入矩陣V中*/{inti,j,k;ElemTyped;ElemTypeu;int*JS,*IS;JS=(int*)malloc(sizeof(int)*n);IS=(int*)malloc(sizeof(int)*n);u=MatrixDeterm(M,n);//返回矩陣A的行列式值if(u==0)return-1;for(i=0;i<n;i++)for(j=0;j<n;j++)V[i][j]=M[i][j];for(k=0;k<n;k++){d=0;for(i=k;i<n;i++)//找出矩陣M從M[k][k]開始絕對值最大的元素{for(j=k;j<n;j++){if(fabs(V[i][j])>d){d=fabs(V[i][j]);//d記錄絕對值最大的元素的值/*把絕對值最大的元素在數組中的行、列坐標分別存入IS[K],JS[K]*/IS[k]=i;JS[k]=j;}}}if(d+1.0==1.0)return0;//所有元素都為0if(IS[k]!=k)/*若絕對值最大的元素不在第k行,則將矩陣IS[K]行的元素與k行的元素相交換*/for(j=0;j<n;j++)swap(&;V[k][j],&;V[IS[k]][j]);if(JS[k]!=k)/*若絕對值最大的元素不在第k列,則將矩陣JS[K]列的元素與k列的元素相交換*/for(i=0;i<n;i++)swap(&;V[i][k],&;V[i][JS[k]]);V[k][k]=1/V[k][k];//絕對值最大的元素求倒for(j=0;j<n;j++)/*矩陣M第k行除元素M[k][k]本身外都乘以M[k][k]*/if(j!=k)V[k][j]=V[k][j]*V[k][k];for(i=0;i<n;i++)/*矩陣除第k行的所有元素與第k列的所有元素外,都拿本身減去M[i][k]*M[k][j],其中i,j為元素本身在矩陣的位置坐標*/if(i!=k)for(j=0;j<n;j++)if(j!=k)V[i][j]=V[i][j]-V[i][k]*V[k][j];for(i=0;i<n;i++)/*矩陣M第k列除元素M[k][k]本身外都乘以-M[k][k]*/if(i!=k)V[i][k]=-V[i][k]*V[k][k];}for(k=n-1;k>=0;k--)/*根據上面記錄的行IS[k],列JS[k]信息恢復元素*/{for(j=0;j<n;j++)if(JS[k]!=k)swap(&;V[k][j],&;V[JS[k]][j]);for(i=0;i<n;i++)if(IS[k]!=k)swap(&;V[i][k],&;V[i][IS[k]]);}free(IS);free(JS);return0;}voidMultMatrix(ElemType**M1,ElemType**M2,ElemType**R)/*矩陣M1乘M2結果存入矩陣R*/{inti,j,k;for(i=0;i<n;i++){for(j=0;j<n;j++){R[i][j]=0;}}for(i=0;i<n;i++){for(j=0;j<n;j++){for(k=0;k<n;k++){R[i][j]=R[i][j]+M1[i][k]*M2[k][j];}}}}voidInput(ElemType**M)//輸入矩陣M的各個元素值{inti,j;charstr[10];charc='A';if(flag==1)c='B';system(“cls“);printf(“\n\n輸入矩陣%c(%d*%d)\n“,c,n,n);for(i=0;i<n;i++){for(j=0;j<n;j++){scanf(“%f“,*(M+i)+j);}}flag=1;gets(str);//吸收多余的字符}voidPrint(ElemType**M)//顯示矩陣M的各個元素值{inti,j;printf(“\t“);for(i=0;i<n;i++){for(j=0;j<n;j++){printf(“%.3f“,M[i][j]);}puts(““);printf(“\t\t“);}}intMenu_Select{charc;do{system(“cls“);puts(“\t\t*************n維矩陣乘法器*************“);puts(“\t\t|1.通過鍵盤輸入各項數據|“);puts(“\t\t|2.顯示矩陣A,B|“);puts(“\t\t|3.矩陣求逆,并顯示逆矩陣|“);puts(“\t\t|4.求矩陣運算A*B,并顯示運算結果|“);puts(“\t\t|5.求矩陣運算A*B^(-1),并顯示運算結果|“);puts(“\t\t|6.從文件讀入矩陣A,B與維數n|“);puts(“\t\t|0.退出|“);puts(“\t\t***************************************“);printf(“\t\t請選擇(0-6):“);c=getchar;}while(c<'0'||c>'6');return(c-'0');}voidReadFromFile//從指定文件讀入矩陣的維數及矩陣各元素的值{inti,j;FILE*fp;if((fp=fopen(“tx.txt“,“r“))==NULL){puts(“無法打開文件!!!“);system(“pause“);exit(0);}fscanf(fp,“%d“,&;n);//讀入矩陣維數A=CreateMatrix(n);//創(chuàng)建矩陣ABVRB=CreateMatrix(n);V=CreateMatrix(n);R=CreateMatrix(n);for(i=0;i<n;i++)//讀入矩陣A{for(j=0;j<n;j++){fscanf(fp,“%f“,&;A[i][j]);}}for(i=0;i<n;i++)//讀入矩陣A{for(j=0;j<n;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(n>0)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\tA*B=“);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“);break;}MultMatrix(A,V,R);printf(“\n\nA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年09月江蘇2024江寧上銀村鎮(zhèn)銀行秋季校園招考筆試歷年參考題庫附帶答案詳解
- 2024年09月江蘇2024年興業(yè)銀行蘇州分行校園招考筆試歷年參考題庫附帶答案詳解
- 2025年度市政道路沉降預防與監(jiān)測合同書4篇
- 2025年度個人租賃房屋租賃合同違約責任協議范本4篇
- 2025年度臨時工勞動派遣服務合同4篇
- 二零二五版特殊場所保安服務合同示范文本2篇
- 2024年05月貴州2024屆中國民生銀行貴陽分行畢業(yè)生“未來銀行家”暑期管培生校園招考筆試歷年參考題庫附帶答案詳解
- 二零二五年度文化產業(yè)發(fā)展基金投資合作合同4篇
- 2024年03月內蒙古民生銀行呼和浩特分行社會招考筆試歷年參考題庫附帶答案詳解
- 2025版智能養(yǎng)殖基地家畜自動化購銷合同4篇
- 表B. 0 .11工程款支付報審表
- 警務航空無人機考試題庫及答案
- 空氣自動站儀器運營維護項目操作說明以及簡單故障處理
- 新生兒窒息復蘇正壓通氣課件
- 2022年12月Python-一級等級考試真題(附答案-解析)
- 法律顧問投標書
- 班主任培訓簡報4篇(一)
- 成都市數學八年級上冊期末試卷含答案
- T-CHSA 020-2023 上頜骨缺損手術功能修復重建的專家共識
- 危重癥患者轉運指南-課件
- Hypermesh lsdyna轉動副連接課件完整版
評論
0/150
提交評論