版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
編制函數實現矩陣運算C語言課程設計報告2012年9月1日目錄設計目的與要求2總體設計2詳細設計2調試分析13設計總結及心得體會16答辯記錄16教師意見171.1設計目的:鞏固對C語言基本知識與技能的掌握,并且利用所學解決簡單的程序設計問題。1.2.1設計要求:任選所給題目之一,也可以自己找難度相當的題目。其中A級題目可以一人完成也可以兩人合作完成,B級要求個人單獨完成。要對源程序進行注釋和分析,并且工整書寫程序。1.2.2題目:編制不同的函數實現以下矩陣運算的功能要求矩陣加減;(b)矩陣數乘;(c)矩陣乘法;(d)矩陣轉置。2.總體設計2.1開始主函數流程圖:開始選擇運算類型進行運算并輸出結果結束選擇運算類型進行運算并輸出結果結束轉置數乘減法加法轉置數乘減法加法乘法乘法是是是否再次運算是否再次運算否否2.2子函數流程圖(1)加法、減法、乘法運算函數流程圖(2)轉置、數乘運算函數流程圖開始開始開始開始開辟存放二維數組的空間開辟存放二維數組的空間開辟存放二維數組的空間開辟存放二維數組的空間判斷兩個矩陣是否可以進行運算判斷兩個矩陣是否可以進行運算輸入矩陣數據并顯示輸入矩陣數據并顯示是是進行運算并顯示結果進行運算并顯示結果輸入矩陣數據并顯示輸入矩陣數據并顯示釋放二維數組空間進行運算并顯示結果釋放二維數組空間進行運算并顯示結果釋放二維數組空間釋放二維數組空間否否結束結束結束結束3.詳細設計整個程序由一個主函數和五個子函數組成。主函數中通過調用子函數來完成運算過程,這樣使得主函數看起來清晰明了,需要修改時也方便簡潔,符合模塊化設計的原則。在主函數中定義了兩個整型變量ch1和ch2,將ch1的值初始化為1,以保證第一次計算的運行,在每一次計算結束后都會顯示“重新運算?”,根據提示輸入數字賦值給ch1,從而決定是否執(zhí)行while循環(huán)中的內容。ch2是用來選擇運算類型的,主函數源代碼如下:#include<stdio.h>#include<stdlib.h>intmain(){ voidcheng();/*函數聲明*/ voidadd(); voidjian(); voidshucheng(); voidzhuanzhi(); intch1=1,ch2; while(ch1==1)/*設置循環(huán),在一次運行里可以進行多次運算*/{printf("請選擇運算類型\n1:加法\n2:減法\n3:乘法\n4:數乘\n5:轉置\n");/*顯示選項,選擇運算類型*/scanf("%d",&ch2);if(ch2==1)add();/*根據不同的選擇,執(zhí)行相應的函數*/if(ch2==2)jian();if(ch2==3)cheng();if(ch2==4)shucheng();if(ch2==5)zhuanzhi();printf("重新運算?\n1是0否\n");/*顯示提示,根據提示輸入選項選擇是否繼續(xù)計算,不繼續(xù)便結束程序*/scanf("%d",&ch1);} return0;}各種運算所對應的函數如下:加法voidadd();減法voidjian();乘法voidcheng();數乘voidshucheng();轉置voidzhuanzhi()。每個子函數都沒有返回值,都是在子函數內部完成運算,并顯示結果。每個子函數都是在一開始的時候詢問矩陣的行數以及列數,然后根據顯示的提示來輸入數字,再將輸入的數據賦給各自相應的整型變量。這樣子設計是為了根據需要的大小來開辟二維數組空間,而不是從一開始就定義好數組及其大小,如inta[80][80]。根據需要開辟二維數組可以避免浪費原本不必要占用的空間,更具有靈活性,不會將矩陣的行數和列數限制在特定的范圍內,如a[80][80]最多只能用來存放80行*80列的方陣,即便將80改成800,也是有所限制的。對于數乘和轉置,是單個矩陣的運算,所以不用判斷輸入的矩陣之間是否可以計算。但是進行加減運算時,兩個矩陣之間的行數和列數要都相等才能執(zhí)行計算,所以需要判斷計算的可行性,如果行數和列數之中有一項不相等便不能運算,結束程序;進行乘法運算時,根據線性代數的相關知識,若是矩陣A*B,那么矩陣A的列數就要等于矩陣B的行數,否則不可以計算,同樣結束程序,且兩個矩陣相乘得出的矩陣的行數與矩陣A相等,列數與矩陣B相等。子函數中,在計算結束之后,用free函數釋放之前開辟的二維數組空間。由于用到了malloc函數開辟空間和free函數,所以在開頭要加上#include<stdlib.h>。各個子函數源代碼如下:voidcheng()/*定義實現矩陣乘法的函數*/{inti=0,j=0,line1=0,row1=0,line2=0,row2=0,n;int**p=NULL;/*p是二重指針,用來存儲二維數組(即矩陣)*/int**q=NULL;/*q是二重指針,用來存儲二維數組(即矩陣)*/int**result=NULL;/*result是二重指針,用來存儲二維數組(即矩陣)*/printf("***(溫馨提示:矩陣的乘法要求前一個矩陣的列數等于后一個矩陣的行數)***\n");printf("請輸入矩陣1的行數:\n");scanf("%d",&row1);printf("請輸入矩陣1的列數:\n");scanf("%d",&line1);p=(int**)malloc(sizeof(int*)*row1);/*將p強制轉換為(int**)型的指針,并且根據需要的行數開辟行指針空間*/if(NULL==p){exit(0);}/*如果根據需要開辟的指針為空指針,便結束程序*/for(i=0;i<row1;i++){*(p+i)=(int*)malloc(sizeof(int)*line1);}/*根據需要的列數開辟列指針空間*/if(NULL==*(p+i)){exit(0);}printf("請輸入矩陣2的行數:\n");scanf("%d",&row2);printf("請輸入矩陣2的列數:\n");scanf("%d",&line2);if(line1!=row2)/*判斷兩個矩陣是否可以相乘(即第一個矩陣的列數是否等于第二個矩陣的行數*/{ printf("無法相乘!\n"); exit(0);}q=(int**)malloc(sizeof(int*)*row2);if(NULL==q){exit(0);}for(i=0;i<row2;i++){*(q+i)=(int*)malloc(sizeof(int)*line2);}if(NULL==*(q+i)){exit(0);}if(line1==row2)/*若滿足兩個矩陣可以相乘的條件,便可賦值并執(zhí)行運算*/{ intline,row;line=line2;row=row1;result=(int**)malloc(sizeof(int*)*row);/*開辟第三個二維數組,用來存放運算結果*/if(NULL==p){exit(0);}for(i=0;i<row;i++){*(result+i)=(int*)malloc(sizeof(int)*line);}if(NULL==*(result+i)){exit(0);}printf("請輸入矩陣A:");/*輸入矩陣數據(按二維數組存放)*/for(i=0;i<row1;i++){for(j=0;j<line1;j++)scanf("%d",&p[i][j]);}printf("\n原本的矩陣A是:\n");for(i=0;i<row1;i++){for(j=0,n=1;j<line1;j++,n++)/*當輸入數據的個數是矩陣列數的整數倍時,換行顯示(即顯示成矩陣的形式)*/{if((n%line1==0)&&(j!=0))printf("%d\n",p[i][j]);elseprintf("%d\t",p[i][j]);}}printf("請輸入矩陣B:");for(i=0;i<row2;i++){for(j=0;j<line2;j++)scanf("%d",&q[i][j]);}printf("\n原本的矩陣B是:\n");for(i=0;i<row2;i++){for(j=0,n=1;j<line2;j++,n++){if((n%line==0)&&(j!=0))printf("%d\n",q[i][j]);elseprintf("%d\t",q[i][j]);}}for(i=0;i<row;i++){for(j=0;j<line;j++)result[i][j]=0;}intk=0;for(i=0;i<row;i++)for(j=0;j<line;j++)for(k=0;k<line1;k++)result[i][j]+=p[i][k]*q[k][j];printf("\n兩個矩陣相乘的結果是:\n");for(i=0;i<row;i++){for(j=0,n=1;j<line;j++,n++){if((n%line==0)&&(j!=0))printf("%d\n",result[i][j]);elseprintf("%d\t",result[i][j]);}}for(i=0;i<row1;i++)/*釋放原本根據需要開辟的指針空間*/{free(*(p+i));p[i]=NULL;}free(p);p=NULL;for(i=0;i<row2;i++){free(*(q+i));q[i]=NULL;}free(q);q=NULL;for(i=0;i<row;i++){free(*(result+i));result[i]=NULL;}free(result);result=NULL;}}voidshucheng()/*定義實現矩陣數乘的函數*/{ inti=0,j=0,line=0,row=0,n=1,k; int**p=NULL; int**q=NULL; printf("請輸入矩陣的行數:"); scanf("%d",&row); printf("請輸入矩陣的列數:"); scanf("%d",&line); p=(int**)malloc(sizeof(int*)*row); if(NULL==p) exit(0); for(i=0;i<row;i++) {*(p+i)=(int*)malloc(sizeof(int)*line); if(NULL==*(p+i)) exit(0);} for(i=0;i<row;i++) {for(j=0;j<line;j++) scanf("%d",&p[i][j]);} printf("原本的矩陣是:\n"); for(i=0;i<row;i++) {for(j=0;j<line;j++,n++) {if((n%line==0)&&(j!=0)) printf("%d\n",p[i][j]); else printf("%d",p[i][j]);} } printf("\n"); q=(int**)malloc(sizeof(int*)*row); if(NULL==q) exit(0); for(i=0;i<row;i++) {*(q+i)=(int*)malloc(sizeof(int)*line); if(NULL==*(q+i)) exit(0);} printf("\n請輸入需要數乘的數:"); scanf("%d",&k); for(i=0;i<row;i++) {for(j=0;j<line;j++) q[i][j]=k*(p[i][j]);}printf("\n數乘后的矩陣是:\n"); for(i=0;i<row;i++) {for(j=0,n=1;j<line;j++,n++) {if((n%line==0)&&(j!=0)) printf("%d\n",q[i][j]); else printf("%d",q[i][j]);} } for(i=0;i<row;i++) {free(*(p+i)); p[i]=NULL;} free(p); p=NULL; for(i=0;i<row;i++) {free(*(q+i)); q[i]=NULL;} free(q); q=NULL;}voidzhuanzhi()/*定義實現矩陣轉置的函數*/{ inti=0,j=0,line=0,row=0,n=1; int**p=NULL; int**q=NULL; printf("請輸入矩陣的行數:"); scanf("%d",&row); printf("請輸入矩陣的列數:"); scanf("%d",&line); p=(int**)malloc(sizeof(int*)*row); if(NULL==p) exit(0); for(i=0;i<row;i++) {*(p+i)=(int*)malloc(sizeof(int)*line); if(NULL==*(p+i)) exit(0);} printf("請輸入矩陣:\n"); for(i=0;i<row;i++) {for(j=0;j<line;j++) scanf("%d",&p[i][j]);} printf("原本的矩陣是:\n"); for(i=0;i<row;i++) {for(j=0;j<line;j++,n++) {if((n%line==0)&&(j!=0)) printf("%d\n",p[i][j]); else printf("%d",p[i][j]);} } printf("\n"); q=(int**)malloc(sizeof(int*)*line); if(NULL==q) exit(0); for(i=0;i<line;i++) {*(q+i)=(int*)malloc(sizeof(int)*row); if(NULL==*(q+i)) exit(0);} for(i=0;i<row;i++) {for(j=0;j<line;j++) q[j][i]=p[i][j];}/*原矩陣和轉置后的矩陣行數和列數對調*/ printf("轉置后的矩陣是:\n"); for(i=0;i<line;i++) {for(j=0,n=1;j<row;j++,n++) {if((n%row==0)&&(j!=0)) printf("%d\n",q[i][j]); else printf("%d",q[i][j]);} } printf("\n"); for(i=0;i<row;i++) {free(*(p+i)); p[i]=NULL;} free(p); p=NULL; for(i=0;i<line;i++) {free(*(q+i)); q[i]=NULL;} free(q); q=NULL;}voidjian()/*定義實現矩陣減法的函數*/{ inti=0,j=0,line1=0,row1=0,line2=0,row2=0,n=1; int**p=NULL; int**q=NULL; int**result=NULL; printf("請輸入矩陣1的行數:"); scanf("%d",&row1); printf("請輸入矩陣1的列數:"); scanf("%d",&line1); p=(int**)malloc(sizeof(int*)*row1); if(NULL==p) exit(0); for(i=0;i<row1;i++) {*(p+i)=(int*)malloc(sizeof(int)*line1); if(NULL==*(p+i)) exit(0);} printf("請輸入矩陣1:"); for(i=0;i<row1;i++) {for(j=0;j<line1;j++) scanf("%d",&p[i][j]);} printf("原本的矩陣1是:\n"); for(i=0;i<row1;i++) {for(j=0;j<line1;j++,n++) {if((n%line1==0)&&(j!=0)) printf("%d\n",p[i][j]); else printf("%d\t",p[i][j]);} } printf("\n"); printf("請輸入矩陣2的行數:"); scanf("%d",&row2); printf("請輸入矩陣2的列數:"); scanf("%d",&line2); if((line1!=line2)||(row1!=row2))/*判斷兩個矩陣是否可以相減,如果兩個矩陣的行數不等或者列數不等即不可相減,結束程序*/ {printf("\n無法相減!\n"); exit(0);} q=(int**)malloc(sizeof(int*)*row2); if(NULL==q) exit(0); for(i=0;i<row2;i++) {*(q+i)=(int*)malloc(sizeof(int)*line2); if(NULL==*(q+i)) exit(0);} printf("請輸入矩陣2:"); for(i=0;i<row2;i++) {for(j=0;j<line2;j++) scanf("%d",&q[i][j]);} printf("原本的矩陣2是:\n"); for(i=0;i<row2;i++) {for(j=0,n=1;j<line2;j++,n++) {if((n%line2==0)&&(j!=0))/*若兩個矩陣行數和列數都相等,執(zhí)行運算*/ printf("%d\n",q[i][j]); else printf("%d\t",q[i][j]);} } introw,line; if((row1==row2)&&(line1==line2)) {row=row1; line=line1; result=(int**)malloc(sizeof(int*)*row); if(NULL==result) exit(0); for(i=0;i<row;i++) {*(result+i)=(int*)malloc(sizeof(int)*line); if(NULL==*(result+i)) exit(0);} } printf("\n"); for(i=0;i<row;i++) {for(j=0;j<line;j++) result[i][j]=p[i][j]-q[i][j];} printf("\n運算后的結果是:\n"); for(i=0;i<row;i++) {for(j=0,n=1;j<line;j++,n++) {if((n%line==0)&&(j!=0)) printf("%d\n",result[i][j]); else printf("%d\t",result[i][j]);}} for(i=0;i<row;i++) {free(*(p+i)); p[i]=NULL;} free(p); p=NULL; for(i=0;i<row;i++) {free(*(q+i)); q[i]=NULL;} free(q); q=NULL; for(i=0;i<row;i++) {free(*(result+i)); result[i]=NULL;} free(result); result=NULL;} voidadd()/*定義實現矩陣加法的函數*/{ inti=0,j=0,line1=0,row1=0,line2=0,row2=0,n=1; int**p=NULL; int**q=NULL; int**result=NULL; printf("請輸入矩陣1的行數:"); scanf("%d",&row1); printf("請輸入矩陣1的列數:"); scanf("%d",&line1); p=(int**)malloc(sizeof(int*)*row1); if(NULL==p) exit(0); for(i=0;i<row1;i++) {*(p+i)=(int*)malloc(sizeof(int)*line1); if(NULL==*(p+i)) exit(0);} printf("請輸入矩陣1:"); for(i=0;i<row1;i++) {for(j=0;j<line1;j++) scanf("%d",&p[i][j]);} printf("原本的矩陣1是:\n"); for(i=0;i<row1;i++) {for(j=0;j<line1;j++,n++) {if((n%line1==0)&&(j!=0)) printf("%d\n",p[i][j]); else printf("%d\t",p[i][j]);} } printf("\n"); printf("請輸入矩陣2的行數:"); scanf("%d",&row2); printf("請輸入矩陣2的列數:"); scanf("%d",&line2); if((line1!=line2)||(row1!=row2)) {printf("\n無法相加!\n"); exit(0);} q=(int**)malloc(sizeof(int*)*row2); if(NULL==q) exit(0); for(i=0;i<row2;i++) {*(q+i)=(int*)malloc(sizeof(int)*line2); if(NULL==*(q+i)) exit(0);} printf("請輸入矩陣2:"); for(i=0;i<row2;i++) {for(j=0;j<line2;j++) scanf("%d",&q[i][j]);} printf("原本的矩陣2是:\n"); for(i=0;i<row2;i++) {for(j=0,n=1;j<line2;j++,n++) {if((n%line2==0)&&(j!=0)) printf("%d\n",q[i][j]); else printf("%d\t",q[i][j]);} } introw,line; if((row1==row2)&&(line1==line2)) {row=row1; line=line1; result=(int**)malloc(sizeof(int*)*row); if(NULL==result) exit(0); for(i=0;i<row;i++) {*(result+i)=(int*)malloc(sizeof(int)*line); if(NULL==*(result+i)) exit(0);} } printf("\n"); for(i=0;i<row;i++) {for(j=0;j<line;j++) result[i][j]=p[i][j]+q[i][j];} printf("\n運算后的結果是:\n"); for(i=0;i<row;i++) {for(j=0,n=1;j<line;j++,n++) {if((n%line==0)&&(j!=0)) printf("%d\n",result[i][j]); else printf("%d\t",result[i][j]);}} for(i=0;i<row;i++) {free(*(p+i)); p[i]=NULL;} free(p); p=NULL; for(i=0;i<row;i++) {free(*(q+i)); q[i]=NULL;} free(q); q=NULL; for(i=0;i<row;i++) {free(*(result+i)); result[i]=NULL;} free(result); result=NULL;}4.調試分析:先把各個函數分開調試,運行無誤后再把所有函數放入同一個文件中運行,這樣有利于快速找出錯誤并改正。下圖是主函數運行出現的首畫面:以下先以乘法為例,展示不能計算時的運行結果:接下來從加法開始,展示運算的過程:(減法與加法類似,在此不進行贅述)若選擇“1是”便會再次出現選擇運算類型的選項如下圖所示是乘法運行結果:以下是數乘:以下是轉置:5.設計總結及心得體會:由于本人c語言水平有限,本程序雖然能夠通過while循環(huán)來達到多次運算的目的,但是每次的運算都只能是兩個矩陣進行計算,而后將計算結果賦值給第三方,不能做到一次性將多個矩陣相加(或相減、相乘等等)。這是本程序的一大缺點。不過本程序是動態(tài)開辟二維數組并且到函數結尾釋放所占用的空間,運用到了與二維指針有關的c語言知識,鞏固了過去所學。還多次運用到for語句,感到for語句的使用比while和do…while型簡潔靈活一些,適用范圍也更廣泛。而且本函數需要特別注意循環(huán)的嵌套。在調試時不僅要關注程序是否能順利進行,還要關注計算結果是否正確,要有一定的線性代數的知識。?參考文獻:《c程序設計(第四版)》譚浩強著清華大學出版社《線性代數》陳建龍周建華韓瑞珠周后型編科學出版社6.答辯記錄:____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________7.教師意見:______________________________________________________________________________________________________________________________________
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《經濟增長理論綜述》課件
- 2024年續(xù)約意向協議范本版B版
- 2025版畜牧企業(yè)家畜養(yǎng)殖基地養(yǎng)殖補貼與購銷合同3篇
- 科研人員勞動合同三篇
- 2025版環(huán)??萍脊緜鶛噢D股權的綠色發(fā)展協議3篇
- 2024技術咨詢合同模板
- 2024建筑圍墻施工合同
- 2024年版智能出行應用程序服務規(guī)范協議版B版
- 2024年餐飲店鋪裝修合同
- 2024年大型公共文化設施建設項目單項工程承包施工合同范本3篇
- 2025年上半年河南省西峽縣部分事業(yè)單位招考易考易錯模擬試題(共500題)試卷后附參考答案-1
- 深交所創(chuàng)業(yè)板注冊制發(fā)行上市審核動態(tài)(2020-2022)
- 手術室護理組長競聘
- 電力系統繼電保護試題以及答案(二)
- 小學生防打架斗毆安全教育
- 2024-2025學年九年級英語上學期期末真題復習 專題09 單詞拼寫(安徽專用)
- 網絡運營代銷合同范例
- 2024年新人教版七年級上冊歷史 第14課 絲綢之路的開通與經營西域
- 植保無人機安全飛行
- 醫(yī)療糾紛事件匯報
- 2024年村干部個人工作總結例文(3篇)
評論
0/150
提交評論