版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 課程 數(shù)據(jù)結(jié)構(gòu) </p><p> 題目 3、三元組表相加 </p><p> 1 問題要求及任務描述</p><p><b> 1.1 題目要求</b></p><p> 3、三元組表相加(2人)</p><
2、p> [問題描述] 利用數(shù)組的順序存儲結(jié)構(gòu),實現(xiàn)特殊矩陣的壓縮存儲和稀疏矩陣的三元組存儲和加法實現(xiàn)</p><p><b> [基本要求]</b></p><p> 利用稀疏矩陣的三元組存儲,來實現(xiàn)兩矩陣相加</p><p> 兩個希疏矩陣分別用兩個文件存放,相加后的矩陣存入一個文件后在屏幕上顯示</p><p
3、><b> [測試數(shù)據(jù)]</b></p><p> 文件A: 文件B:</p><p> 11 11</p><p> 10
4、 10</p><p> 11,0,0,0,3,0,0,123,0,0 0,0,0,23,3,0,0,0,0,0</p><p> 0,0,0,5,56,0,0,0,0,0 0,0,111,0,6,0,0,78,0,0</p><p> 0,1,0,0,67,0,0,222,
5、0,0 0,0,0,67,0,0,0,0,0,0</p><p> 0,0,0,0,0,0,0,0,567,0 0,0,84,99,0,0,0,0,0,1</p><p> 55,0,0,4,0,0,0,0,0,0 0,0,0,0,0,42,0,0,0,0</p><p> 5
6、6,21,0,0,03,0,0,0,0,0 66,0,0,0,0,0,32,0,0,0</p><p> 0,0,0,0,0,0,0,67,0,23 0,0,0,0,0,0,0,0,0,345</p><p> 0,0,0,0,55,0,0,0,0,0 88,0,0,0,0,0,0,0,0,0</
7、p><p> 0,0,23,0,0,0,0,0,234,0 0,0,0,0,0,0,0,0,0,0</p><p> 0,0,0,0,6,0,0,123,0,0 0,0,0,11,0,0,0,0,0,0</p><p><b> 1.2 主要任務</b></p><p&
8、gt; 矩陣從文件中讀取,并轉(zhuǎn)化為稀疏矩陣的三元組存儲。</p><p> 相加后的矩陣存入一個文件,從文件中讀取矩陣在屏幕上顯示。</p><p> 2 解決問題的主要思路和方法</p><p><b> 2.1 關(guān)鍵問題</b></p><p> 矩陣的從文件當中讀取,并轉(zhuǎn)化為稀疏矩陣的三元組存儲。<
9、;/p><p> 稀疏矩陣的三元組的加法實現(xiàn)。</p><p> 相加后的矩陣存入文件。</p><p> 2.2 擬采用解決問題的方法</p><p> 利用fgetc()函數(shù)讀取文件信息,并將讀取到的矩陣轉(zhuǎn)化為稀疏矩陣。程序中的void pp(FILE *fp, TriType *A) 函數(shù);</p><p&g
10、t; void AddMatrix(TriType a,TriType b,TriType *c)實現(xiàn)稀疏矩陣的三元組相加;</p><p> void pull(FILE *fp,TriType &C)將矩陣C存入到文件中!期間用了fputc();fprintf()函數(shù)。</p><p> 2.3 主要算法和處理流程圖</p><p><b&g
11、t; 3 程序?qū)崿F(xiàn)</b></p><p> 3.1 程序?qū)崿F(xiàn)時應考慮的問題</p><p> 3.2 主要源代碼及說明</p><p> #include<stdio.h></p><p> #include<string.h></p><p> #include &
12、lt;stdlib.h> </p><p> #define MAX_SIZE 100</p><p> typedef struct</p><p><b> {</b></p><p><b> int i;</b></p><p><b> i
13、nt j;</b></p><p><b> int d;</b></p><p> }DataType;</p><p> typedef struct</p><p><b> {</b></p><p><b> int rn;</
14、b></p><p><b> int cn;</b></p><p><b> int tn;</b></p><p> DataType Data[MAX_SIZE];</p><p><b> }TriType;</b></p><p&g
15、t; void pp(FILE *fp, TriType *A) //文件中矩陣轉(zhuǎn)化為三元組表</p><p><b> {</b></p><p><b> char ch;</b></p><p> char a[10];</p><p> int i=1,j=1,k=0,
16、t=0,n=0;</p><p> while((ch=fgetc(fp))!=EOF) </p><p><b> {</b></p><p> if((ch!='\n')&&(ch!=','))</p><p><b> {</b>
17、;</p><p><b> a[k]=ch;</b></p><p><b> k++;</b></p><p><b> }</b></p><p><b> else </b></p><p><b> {
18、</b></p><p> a[k]='\0';</p><p><b> k=0;</b></p><p> if((t=atoi(a))!=0) //t=atoi(a)把字符串a(chǎn)轉(zhuǎn)換成整型數(shù)并賦值給t</p><p><b> {</b></p>
19、;<p> A->Data[n].d=t;</p><p> A->Data[n].i=i;</p><p> A->Data[n].j=j;</p><p><b> n++;</b></p><p><b> }</b></p><p
20、> if(ch==',') j++;</p><p> else if(ch=='\n')</p><p><b> {</b></p><p><b> i++;</b></p><p><b> A->rn=j;</b>
21、</p><p><b> j=1;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> A->cn=i-1;</p>
22、;<p><b> A->tn=n;</b></p><p><b> }</b></p><p> void AddMatrix(TriType a,TriType b,TriType *c) //實現(xiàn)a,b相加</p><p><b> {</b><
23、/p><p> int i=0,j=0,k=0; //下標置初始值</p><p> while(i<a.tn&&j<b.tn) //a,b均未超出有效數(shù)!</p><p><b> {</b></p><
24、p> if(a.Data[i].i==b.Data[j].i) //a的行號等于b的行號</p><p><b> {</b></p><p> if(a.Data[i].j==b.Data[j].j) //a的列號等于b的列號</p><p><b> {</b><
25、;/p><p> c->Data[k].i=a.Data[i].i;</p><p> c->Data[k].j=a.Data[i].j;</p><p> c->Data[k].d=a.Data[i].d+b.Data[j].d; //此時將他們的數(shù)據(jù)直接相加</p><p><b> i++;</b
26、></p><p><b> j++;</b></p><p><b> k++; </b></p><p><b> }</b></p><p> else if(a.Data[i].j<b.Data[j].j) //a的列號小于b的列號</p
27、><p><b> {</b></p><p> c->Data[k].i=a.Data[i].i;</p><p> c->Data[k].j=a.Data[i].j;</p><p> c->Data[k].d=a.Data[i].d; //如果行號相等,則相加后的值等于列號更小的矩陣</
28、p><p><b> //中對應元素的值</b></p><p><b> i++;</b></p><p><b> k++;</b></p><p><b> }</b></p><p> else if(a.Data[i
29、].j>b.Data[j].j) //a的列號大于b的列號</p><p><b> {</b></p><p> c->Data[k].i=b.Data[j].i;</p><p> c->Data[k].j=b.Data[j].j;</p><p> c->Data[k].d=b.
30、Data[j].d; //如果行號相等,則相加后的值等于列號更小的矩//陣中對應元素的值</p><p><b> j++;</b></p><p><b> k++;</b></p><p><b> }</b></p><p><b> }</b
31、></p><p> else if(a.Data[i].i<b.Data[j].i) //a的行號小于b的行號</p><p><b> {</b></p><p> c->Data[k].i=a.Data[i].i;</p><p> c->Data[k].j=a.Data[i]
32、.j;</p><p> c->Data[k].d=a.Data[i].d; //如果列號相等,則相加后的值等于行號更小的矩陣//中對應元素的值</p><p><b> i++;</b></p><p><b> k++;</b></p><p><b> }<
33、;/b></p><p> else if(a.Data[i].i>b.Data[j].i) //a的行號大于b的行號</p><p><b> {</b></p><p> c->Data[k].i=b.Data[j].i;</p><p> c->Data[k].j=b.Data
34、[j].j;</p><p> c->Data[k].d=b.Data[j].d; //如果列號相等,則相加后的值等于行號更小的矩//陣中對應元素的值</p><p><b> j++;</b></p><p><b> k++;</b></p><p><b>
35、 }</b></p><p><b> }</b></p><p> while(i>=a.tn&&j<=b.tn)//a超出a的有效數(shù)個數(shù),而b未超出,直接把b中超出部分復制到c</p><p><b> {</b></p><p> c->D
36、ata[k].i=b.Data[j].i;</p><p> c->Data[k].j=b.Data[j].j;</p><p> c->Data[k].d=b.Data[j].d; </p><p><b> j++;</b></p><p><b> k++;</b>
37、</p><p><b> }</b></p><p> while(j>=b.tn&&i<=a.tn) //超出b的有效數(shù)個數(shù),而a未超出,直接把a中超出部分復制給c</p><p><b> {</b></p><p> c->Data[k].i=a.D
38、ata[i].i;</p><p> c->Data[k].j=a.Data[i].j;</p><p> c->Data[k].d=a.Data[i].d; </p><p><b> i++;</b></p><p><b> k++;</b></p>&
39、lt;p><b> }</b></p><p> c->rn=a.rn;</p><p> c->cn=a.cn;</p><p><b> c->tn=k;</b></p><p><b> }</b></p><p>
40、; void pull(FILE *fp,TriType &C) //將C存入fp所指向的文件</p><p><b> {</b></p><p> int ch1=0;</p><p> char ch2=',' ,ch3='\n';</p><p&g
41、t; int i=1,j=1,k=0;</p><p> for(i=1;i<=C.cn;i++) </p><p> for(j=1;j<=C.rn;j++)</p><p><b> {</b></p><p> if(j==C.Data[k].j&&i==C.Dat
42、a[k].i) //如果i,j分別等于C中元素的行和列!寫入C</p><p> //中的第k個元素!否則寫入'0,'</p><p><b> {</b></p><p> fprintf(fp,"%4d",C.Data[k].d);</p><p> if(j!=C.rn
43、)fputc(ch2,fp);</p><p><b> k++;</b></p><p><b> } </b></p><p><b> else </b></p><p><b> {</b></p><p> fp
44、rintf(fp,"%4d",ch1);</p><p> if(j!=C.rn)fputc(ch2,fp);</p><p><b> }</b></p><p> if(j==C.rn) fputc(ch3,fp);</p><p><b> }</b></p&
45、gt;<p> fclose(fp);</p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> TriType A;</p><p> TriType B;</p
46、><p> TriType C;</p><p> FILE *fp1;</p><p> if((fp1=fopen("A.txt","r"))==NULL) //只讀方式打開A.txt</p><p><b> {</b></p><p
47、> printf("文件A.txt不能打開!\n");</p><p><b> return;</b></p><p><b> }</b></p><p> FILE *fp2;</p><p> if((fp2=fopen("B.txt"
48、,"r"))==NULL) //只讀方式打開B.txt</p><p><b> {</b></p><p> printf("文件B.txt不能打開!\n");</p><p><b> return;</b></p><p>&l
49、t;b> }</b></p><p> FILE *fp3;</p><p> if((fp3=fopen("C.txt","w+"))==NULL) //讀寫方式打開C.txt</p><p><b> {</b></p><p>
50、 printf("文件C.txt不能打開!\n");</p><p><b> return;</b></p><p><b> }</b></p><p> pp(fp1, &A); //文件A.txt中矩陣轉(zhuǎn)化為三元組表A</p
51、><p> pp(fp2, &B); //文件B.txt中矩陣轉(zhuǎn)化為三元組表B</p><p> if(A.cn==B.cn&&A.rn==B.rn) //判斷A,B是否是相同類型的矩陣</p><p><b> {</b></p&g
52、t;<p> AddMatrix(A,B,&C); //矩陣相加后存入C</p><p> pull(fp3,C); //C存入到文件C.txt</p><p> printf("矩陣相加后結(jié)果如下:\n");</p><p><b&g
53、t; char ch; </b></p><p> if((fp3=fopen("C.txt","r"))==NULL) //只讀方式打開C.txt</p><p><b> {</b></p><p> printf("文件C.txt不能打開!\n"
54、;);</p><p><b> return;</b></p><p><b> }</b></p><p> ch=fgetc(fp3); //從文件C.txt中輸出矩陣C</p><p> while(ch!=EOF)</p><p><b&
55、gt; {</b></p><p> putchar(ch);</p><p> ch=fgetc(fp3);</p><p><b> }</b></p><p> fclose(fp3);</p><p> printf("有效數(shù)字共:%d\n行數(shù):%d\n列
56、數(shù):%d\n",C.tn,C.cn,C.rn);</p><p><b> }</b></p><p> else printf("A,B不是同種類型矩陣,即矩陣行數(shù)或列數(shù)不相等??!\n");</p><p><b> }</b></p><p><b&g
57、t; 4 測試</b></p><p> 4.1 測試結(jié)果及分析</p><p><b> 程序結(jié)果如下:</b></p><p><b> 5 小結(jié)</b></p><p> 5.1本問題解決方法及程序?qū)崿F(xiàn)小結(jié)</p><p> 程序中對A,B文件的
58、存儲方式有嚴格要求,不允許多出回車或少回車。對于文件的讀取和寫入,主要是參考“譚浩強.C程序設計(第三版).清華大學出版社 . 2005(2007重印)”這本書,并經(jīng)過自己組織函數(shù)寫出代碼解決!</p><p> 5.2 尚未解決的問題及下一步工作思路</p><p> 程序中對A,B文件的存儲方式有嚴格要求,不允許多出回車或少回車。這是已知的本程序缺點,也是尚未解決的問題。有待進一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)-基于三元組表的存儲結(jié)構(gòu)實現(xiàn)稀疏矩陣的應用-課程設計-實驗報告
- 基于三元組表的存儲結(jié)構(gòu)實現(xiàn)稀疏矩陣的應用課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計-一元多項式的表示及相加
- 基于三元組圖模型的數(shù)據(jù)拓撲結(jié)構(gòu)研究.pdf
- 數(shù)據(jù)結(jié)構(gòu)課程設計三
- 數(shù)據(jù)結(jié)構(gòu)課程設計--數(shù)據(jù)結(jié)構(gòu)課程設計----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設計參考答案a組
- 數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計--數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)
- 經(jīng)典型勒納德三元組.pdf
評論
0/150
提交評論