




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
/序號:學號:課程設計設計課程名稱:C語言課程設計題目:矩陣的運算學生姓名:**********學院〔系:*********專業班級:*********指導教師:*******專業技術職務:設計時間:****年*月**日****年*月**日目錄矩陣運算任務書……………3描述及繪制出系統的功能結構框圖………7C語言程序代碼……………8使用說明……………………15設計日志及心得體會………16"矩陣運算"任務書一、目的要求本課程設計任務的目的是要求學生按照分析、設計、編碼、調試和測試的軟件開發過程獨立完成一個矩陣運算子程序集,并能最終實現本系統的功能要求。二、功能要求[題目描述]矩陣運算是大多數科學運算的必要工具。假定所有矩陣均以文本文件形式保存,試編寫程序,處理簡單的矩陣運算。矩陣文件每一行以文本保存矩陣中一行數據每個數據之間以一個或者多個空格隔開。目前矩陣僅保存整數值。下面是一個矩陣文件例子:文件名:matrix1.txt1123-431-14520056567891011121413你的程序需要實現以下功能:1.矩陣加法。2.矩陣轉置3.矩陣乘法[程序要求]〔1 程序正確。能夠嚴格實現任務書中描述的功能;〔2 界面友好。盡可能使界面友好、直觀、易操作;〔3 風格友好。源程序應有良好的編碼風格,使程序容易閱讀。〔4從文件中讀矩陣,將矩陣寫入文件,矩陣3個操作均需要以子程序形式編寫。[輸入/輸出要求]〔1每項功能在選擇后,應提示用戶輸入源矩陣所在文件名,并檢驗該文件是否存在,但是并不讀取該文件內容。然后再提示用戶輸入結果矩陣文件名。通過子程序讀取矩陣數據,將運算結果同時輸出到文件和屏幕上。〔2所有源矩陣均可使用記事本生成。〔3若main函數帶有參數repeat則所有讀取矩陣和運算函數操作均需重復10000次。[課程設計報告內容要求]〔1 封面:統一采用《XX大學課程設計說明書》封面〔2 內容提要〔3 目錄〔4 "課程設計報告"正文格式1 概述所作系統的主要功能;2 分析和描述任務書的基本要求與內容;3 描述及繪制出系統的功能結構框圖;4 C語言程序代碼;5 使用說明;6 設計日志以及心得體會三、難點提示輸入矩陣沒有限定大小,不能采用靜態數組來實現,需要使用動態數組技術。main函數參數的檢測和使用參見教材相應內容。3、菜單部分樣例代碼可參閱網絡課堂里相關幫助——頂層菜單設計框架。概述系統的主要功能假定矩陣文件每一行以文本形式保存,矩陣中的一行數據中每個數據之間以一個或多個空格隔開,目前矩陣僅保存整數值。本程序通過文件操作及動態內存分配技術實現簡單的矩陣運算,包括矩陣加法〔Plus,矩陣轉置<Transpose>,矩陣乘法<Multiply>。運行程序時,首先提示用戶選擇相應功能選項,每項功能在選擇后,提示用戶輸入源矩陣所在文件名,程序檢驗該文件是否存在,但不讀取該文件內容。然后再提示用戶輸入結果矩陣所在文件名,通過子程序讀取矩陣數據,將運算結果同時輸到文件和屏幕上。描述及繪制出系統的功能結構框圖首先選擇相應的功能,打開文件,讀取數據,進行各項功能的操作,輸出結果,關閉文件,再次選擇相應的功能。功能選擇加法功能選擇加法轉置相乘打開所要執行的文件輸出數據關閉相應文件退出C語言程序代碼#include<stdio.h>#include<stdio.h>#include<stdlib.h>#include<conio.h>voidPlus<>{ FILE*fp1,*fp2,*fp3; printf<"請輸入兩個源矩陣所在文件名:\n">; charfilename1[15],filename2[15],filename3[15]; scanf<"%s%s",filename1,filename2>; if<<fp1=fopen<filename1,"r">>==NULL||<fp2=fopen<filename2,"r">>==NULL> { printf<"can'topenfile">; exit<0>; } printf<"請輸入結果矩陣所在文件名:\n">; scanf<"%s",filename3>; fp3=fopen<filename3,"w">; int*p,C=0,R=0,l=0,r=0,i,j,jk1,jk2,jk3; printf<"\n">; charch; ch=fgetc<fp1>; while<!feof<fp1>> { ch=fgetc<fp1>; if<ch==''> C++; if<ch=='\n'> R++; } C=C/R+1; printf<"R=%d,C=%d\n",R,C>;rewind<fp1>;ch=fgetc<fp2>; while<!feof<fp2>> { ch=fgetc<fp2>; if<ch==''> l++; if<ch=='\n'> r++; } l=l/r+1; printf<"r=%d,l=%d\n",r,l>;rewind<fp2>; fscanf<fp1,"%d",&jk1>; fscanf<fp2,"%d",&jk2>; if<jk1!=''&&jk1!='\n'> { jk3=jk1+jk2; printf<"%d\t",jk3>; fprintf<fp3,"%d\t",jk3>; } } printf<"\n">; fprintf<fp3,"\n">; } free<p>; fclose<fp1>; fclose<fp2>; fclose<fp3>; printf<"****************按任意鍵繼續*****************\n">; getch<>; } elseexit<0>;}voidTranspose<>{ FILE*fp1,*fp2; printf<"請輸入一個源矩陣所在文件名:\n">; charfilename1[15],filename2[15]; scanf<"%s",filename1>; if<<fp1=fopen<filename1,"r">>==NULL>//判斷是否能打開文件 { printf<"cannotopenfile">; exit<0>; } printf<"請輸入結果矩陣所在名:\n">; scanf<"%s",filename2>; fp2=fopen<filename2,"w">; int**p,C=0,R=0,t=0,i,j,jk1; printf<"\n">; charch; ch=fgetc<fp1>; while<!feof<fp1>>//算出矩陣的行列數 { ch=fgetc<fp1>; if<ch==''> C++; if<ch=='\n'> R++; } C=C/<R+1>+1; R=R+1;rewind<fp1>;p=<int**>malloc<R*sizeof<int*>>;//申請動態內存分配 for<i=0;i<R;i++> {p[i]=<int*>malloc<C*sizeof<int>>; for<j=0;j<C;j++> {fscanf<fp1,"%d",&jk1>;if<<jk1!=''>&&<jk1!='\n'>> p[i][j]=jk1; } } for<i=0;i<C;i++> { for<j=0;j<R;j++> { printf<"%d\t",p[j][i]>; fprintf<fp2,"%d\t",p[j][i]>; } printf<"\n">; fprintf<fp2,"\n">; } for<i=0;i<R;i++>{free<p[i]>;}free<p>; fclose<fp1>; fclose<fp2>; printf<"****************按任意鍵繼續*****************\n">; getch<>;}voidMultiply<>{ FILE*fp1,*fp2,*fp3; printf<"請輸入兩個院矩陣所在文件名:\n">; charfilename1[15],filename2[15],filename3[15]; scanf<"%s%s",filename1,filename2>; if<<fp1=fopen<filename1,"r">>==NULL||<fp2=fopen<filename2,"r">>==NULL>//判斷矩陣是否能打開 { printf<"cannotopenfile">; exit<0>; } printf<"請輸入結果矩陣所在文件名:\n">; scanf<"%s",filename3>; fp3=fopen<filename3,"w">; int**p1,**p2,C=0,R=0,l=0,r=0,sum=0,a,i,j,jk1; printf<"\n">; charch; ch=fgetc<fp1>; while<!feof<fp1>>//算出矩陣的行列數 { ch=fgetc<fp1>; if<ch==''> C++; if<ch=='\n'> R++; } C=C/<R+1>+1; R=R+1;rewind<fp1>;ch=fgetc<fp2>; while<!feof<fp2>> { ch=fgetc<fp2>; if<ch==''> l++; if<ch=='\n'> r++; } l=l/<r+1>+1; r=r+1;rewind<fp2>;p1=<int**>malloc<R*sizeof<int*>>;//申請動態內存分配for<i=0;i<R;i++> {p1[i]=<int*>malloc<C*sizeof<int>>; for<j=0;j<C;j++> {fscanf<fp1,"%d",&jk1>;if<<jk1!=''>&&<jk1!='\n'>> p1[i][j]=jk1; } }p2=<int**>malloc<r*sizeof<int*>>;for<i=0;i<r;i++> {p2[i]=<int*>malloc<l*sizeof<int>>; for<j=0;j<l;j++> {fscanf<fp2,"%d",&jk1>;if<<jk1!=''>&&<jk1!='\n'>> p2[i][j]=jk1; } } for<i=0;i<R;i++> { for<a=0;a<l;a++> { sum=0; for<j=0;j<C;j++> sum+=p1[i][j]*p2[j][a]; printf<"%d\t",sum>; fprintf<fp3,"%d\t",sum>; } printf<"\n">; fprintf<fp3,"\n">; } for<i=0;i<R;i++>{free<p1[i]>;}free<p1>;for<i=0;i<r;i++>{ free<p2[i]>;}free<p2>; fclose<fp1>; fclose<fp2>; fclose<fp3>; printf<"****************按任意鍵繼續*****************\n">; getch<>;}voidmain<>{ chari;loop: system<"cls">; printf<"****************************************\n">; printf<"╔═══╧╧矩陣運算╧╧════════════╗\n">; printf<"║*******請輸入運算方式*******║\n">; printf<"║※1:加法║\n">; printf<"║※2:轉置║\n">; printf<"║※3:乘法║\n">; printf<"║※4:退出║\n">; printf<"╚═════════════════════════════╝\n">; printf<"請輸入選項[1\\2\\3\\4]:\n">; while<i=getch<>> { switch<i> { case'1':Plus<>;gotoloop; case'2':Transpose<>;gotoloop; case'3':Multiply<>;gotoloop; case'4':exit<0>; } } gotoloop; { for<j=0;j<C;j++> { fscanf<fp1,"%d",&jk1>; fscanf<fp2,"%d",&jk2>; if<jk1!=''&&jk1!='\n'> { jk3=jk1+jk2; printf<"%d\t",jk3>; fprintf<fp3,"%d\t",jk3>; } } printf<"\n">; fprintf<fp3,"\n">; } free<p>; fclose<fp1>; fclose<fp2>; fclose<fp3>; printf<"****************按任意鍵繼續*****************\n">; getch<>; }}} l=l/r+1; printf<"r=%d,l=%d\n",r,l>;rewind<fp2>; if<l==C&&r==R> {p=<int*>calloc<R,C*sizeof<int>>; for<i=0;i<R;i++> { for<j=0;j<C;j++> { fscanf<fp1,"%d",&jk1>; fscanf<fp2,"%d",&jk2>; if<j==C-1> { printf<"%d",jk1+jk2>; fprintf<fp3,"%d",jk1+jk2>; continue; }if<jk1!=''&&jk1!='\n'> { jk3=jk1+jk2; printf<"%d",jk3>; fprintf<fp3,"%d",jk3>; } } printf<"\n">; fprintf<fp3,"\n">; } free<p>; fclose<fp1>; fclose<fp2>; fclose<fp3>; printf<"****************按任意鍵繼續*****************\n">; getch<>; } else {printf<"兩個矩陣不能相加">; exit<0>; }}voidTranspose<>voidTranspose<>{ FILE*fp1,*fp2; printf<"請輸入一個源矩陣所在文件名:\n">; charfilename1[15],filename2[15]; scanf<"%s",filename1>; if<<fp1=fopen<filename1,"r">>==NULL> { printf<"can'topenfile">; exit<0>; } printf<"請輸入結果矩陣所在名:\n">; scanf<"%s",filename2>; fp2=fopen<filename2,"w">; int**p,C=0,R=0,t=0,i,j,jk1; printf<"\n">; charch; ch=fgetc<fp1>; while<!feof<fp1>> { ch=fgetc<fp1>; if<ch==''> C++; if<ch=='\n'> R++; } C=C/R+1;rewind<fp1>;p=<int**>malloc<R*sizeof<int*>>; for<i=0;i<R;i++> {p[i]=<int*>malloc<C*sizeof<int>>; for<j=0;j<C;j++> {fscanf<fp1,"%d",&jk1>;if<<jk1!=''>&&<jk1!='\n'>> p[i][j]=jk1; } }for<i=0;i<C;i++>for<i=0;i<C;i++> { for<j=0;j<R;j++> { if<j==R-1> { printf<"%d",p[j][i]>; fprintf<fp2,"%d",p[j][i]>; continue; }printf<"%d",p[j][i]>; fprintf<fp2,"%d",p[j][i]>; } printf<"\n">; fprintf<fp2,"\n">; } for<i=0;i<R;i++>{free<p[i]>;}free<p>; fclose<fp1>; fclose<fp2>; printf<"****************按任意鍵繼續*****************\n">; getch<>;}voidMultiply<>{ FILE*fp1,*fp2,*fp3; printf<"請輸入兩個源矩陣所在文件名:\n">; charfilename1[15],filename2[15],filename3[15]; scanf<"%s%s",filename1,filename2>; if<<fp1=fopen<filename1,"r">>==NULL||<fp2=fopen<filename2,"r">>==NULL> { printf<"can'topenfile">; exit<0>; }printf<"printf<"請輸入結果矩陣所在文件名:\n">; scanf<"%s",filename3>; fp3=fopen<filename3,"w">; int**p1,**p2,C=0,R=0,l=0,r=0,sum=0,a,i,j,jk1; printf<"\n">; charch; ch=fgetc<fp1>; while<!feof<fp1>> { ch=fgetc<fp1>; if<ch==''> C++; if<ch=='\n'> R++; } C=C/R+1;rewind<fp1>;ch=fgetc<fp2>; while<!feof<fp2>> { ch=fgetc<fp2>; if<ch==''> l++; if<ch=='\n'> r++; } l=l/r+1;rewind<fp2>;if<C==r>//判斷兩個矩陣能否相乘{ p1=<int**>malloc<R*sizeof<int*>>;for<i=0;i<R;i++> {p1[i]=<int*>malloc<C*sizeof<int>>; for<j=0;j<C;j++> {fscanf<fp1,"%d",&jk1>;if<<jk1!=''>&&<jk1!='\n'>> p1[i][j]=jk1; } }p2=<int**>malloc<r*sizeof<int*>>;for<i=0;i<r;i++>for<i=0;i<r;i++> {p2[i]=<int*>malloc<l*sizeof<int>>; for<j=0;j<l;j++> {fscanf<fp2,"%d",&jk1>;if<<jk1!=''>&&<jk1!='\n'>> p2[i][j]=jk1; } } for<i=0;i<R;i++> { for<a=0;a<l;a++> { sum=0; for<j=0;j<C;j++> sum+=p1[i][j]*p2[j][a];if<a==l-1> { printf<"%d\t",sum>; fprintf<fp3,"%d\t",sum>; continue; }printf<"%d",sum>; fprintf<fp3,"%d",sum>; } printf<"\n">; fprintf<fp3,"\n">; } for<i=0;i<R;i++>{free<p1[i]>;}free<p1>;for<i=0;i<r;i++>{ free<p2[i]>;}free<p2>; fclose<fp1>; fclose<fp2>; fclose<fp3>; printf<"****************按任意鍵繼續*****************\n">; getch<>;}else{ printf<"兩個矩陣不能相乘">; exit<0>;}}getch<>;getch<>;}else{ printf<"兩個矩陣不能相乘">; exit<0>;}}voidmain<>{ chari;loop: system<"cls">; printf<"****************************************\n">; printf<"╔═══╧╧矩陣運算╧╧═══════════╗\n">; printf<"║*******請輸入運算方式*******║\n">; printf<"║※1:加法║\n">; printf<"║※2:轉置║\n">; printf<"║※3:乘法║\n">; printf<"║※4:退出║\n">; printf<"╚═══════
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 業務委托代理合同協議書
- 私人荒地轉讓合同協議書
- 熱力管道維修合同協議書
- 修房合同協議書怎么寫
- 2025建筑工程項目技術咨詢合同范本
- 多人入伙協議書范本合同
- 農村租房合同和協議書
- 2025勞動合同概述及法律屬性
- 2025【經管勵志】合作合同
- 2025合同范本食品供應合同協議書樣本
- 工會文體活動管理制度范文
- 二年級平行四邊形的初步認識
- 第6章_射線與物質的相互作用
- 3D打印介紹PPT精選文檔課件
- DC-DC變換器電力電子課程設計報告
- 鋼結構吊裝施工方案-
- 銀發【2007】246號
- 【機械畢業設計全套含CAD圖論文】麥田免耕施肥播種機設計
- (完整word版)后進生轉化檔案
- 工信部聯通【2010】99號鐵路共建共享文件
- (中建一局)建筑裝飾裝修專項施工方案
評論
0/150
提交評論