數(shù)據(jù)結(jié)構(gòu)(Java語言) 課件 項(xiàng)目六 矩陣-核算產(chǎn)品費(fèi)用_第1頁
數(shù)據(jù)結(jié)構(gòu)(Java語言) 課件 項(xiàng)目六 矩陣-核算產(chǎn)品費(fèi)用_第2頁
數(shù)據(jù)結(jié)構(gòu)(Java語言) 課件 項(xiàng)目六 矩陣-核算產(chǎn)品費(fèi)用_第3頁
數(shù)據(jù)結(jié)構(gòu)(Java語言) 課件 項(xiàng)目六 矩陣-核算產(chǎn)品費(fèi)用_第4頁
數(shù)據(jù)結(jié)構(gòu)(Java語言) 課件 項(xiàng)目六 矩陣-核算產(chǎn)品費(fèi)用_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

項(xiàng)目六矩陣---核算產(chǎn)品費(fèi)用目錄項(xiàng)目六5123

典型工作任務(wù)6.1矩陣項(xiàng)目需求分析典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)典型工作任務(wù)6.4矩陣軟件測試執(zhí)行典型工作任務(wù)6.5矩陣軟件文檔編寫46典型工作任務(wù)6.6矩陣項(xiàng)目驗(yàn)收交付知識(shí)目標(biāo)掌握數(shù)組的概念與性質(zhì)掌握數(shù)組的邏輯結(jié)構(gòu)及存儲(chǔ)結(jié)構(gòu)掌握矩陣的壓縮存儲(chǔ)掌握矩陣的基本運(yùn)算技能目標(biāo)能進(jìn)行項(xiàng)目需求分析能進(jìn)行矩陣的算法分析及編程能用矩陣的知識(shí)編程解決問題能進(jìn)行軟件測試及項(xiàng)目功能調(diào)整能撰寫格式規(guī)范的軟件文檔思政目標(biāo)掌握數(shù)組順序存儲(chǔ),樹立規(guī)矩意識(shí)掌握稀疏矩陣特殊處理,培養(yǎng)善于思考創(chuàng)新意識(shí)鍛煉發(fā)現(xiàn)問題分析問題解決問題的邏輯思維編寫算法細(xì)致嚴(yán)謹(jǐn),養(yǎng)成科學(xué)嚴(yán)謹(jǐn)?shù)膶W(xué)習(xí)習(xí)慣總體要求

有一家光明食品廠,它們的產(chǎn)品包括罐頭、糖果、巧克力、飲料、啤酒。為了核算各類產(chǎn)品在一年中的成本費(fèi)用,我們可以按月統(tǒng)計(jì)每類產(chǎn)品的成本,然后把一年12個(gè)月的統(tǒng)計(jì)表累加起來,就可以核算出各類產(chǎn)品的成本以及企業(yè)一年的生產(chǎn)成本。

為了分類統(tǒng)計(jì),我們可以設(shè)計(jì)如表6-1所示的產(chǎn)品成本月統(tǒng)計(jì)表。

表6-1產(chǎn)品成本月統(tǒng)計(jì)表(單位:萬元)典型工作任務(wù)6.1矩陣項(xiàng)目需求分析產(chǎn)品名稱材料成本人工成本制造成本罐頭1.451.230.35糖果0.980.870.65巧克力1.430.940.89飲料0.870.650.35啤酒0.840.610.56

有為了便于核算產(chǎn)品費(fèi)用,本項(xiàng)目以光明食品廠的產(chǎn)品各項(xiàng)成本為例,使用數(shù)組對(duì)各類產(chǎn)品的各項(xiàng)費(fèi)用進(jìn)行輸入及計(jì)算,具體需求如下:(1)使用數(shù)組存儲(chǔ)每個(gè)月產(chǎn)品成本;(2)顯示每個(gè)月的產(chǎn)品成本矩陣;(3)產(chǎn)品成本矩陣可進(jìn)行轉(zhuǎn)置;(4)產(chǎn)品成本矩陣可進(jìn)行加法;(5)輸出矩陣操作后結(jié)果。典型工作任務(wù)6.1矩陣項(xiàng)目需求分析6.2.1數(shù)組的概念

數(shù)組是相同類型的數(shù)據(jù)有序的集合,數(shù)組中每一個(gè)數(shù)據(jù)通常稱為數(shù)組元素,數(shù)組元素用下標(biāo)識(shí)別,下標(biāo)的個(gè)數(shù)取決于數(shù)組的維數(shù)。

如果是一個(gè)下標(biāo)確定一個(gè)元素,就是一維數(shù)組;如果是兩個(gè)下標(biāo)能確定一個(gè)元素,就是二維數(shù)組?!咎崾尽可鲜鰹閙×n階矩陣是個(gè)二維數(shù)組,其中每個(gè)元素都可以用下標(biāo)變量aij來表示,i為元素的行下標(biāo),j為元素的列下標(biāo)典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)6.2.2數(shù)組結(jié)構(gòu)具有的性質(zhì)1.?dāng)?shù)組元素?cái)?shù)目固定。一旦說明了一個(gè)數(shù)組結(jié)構(gòu),其元素不再有增減變化;

2.?dāng)?shù)組中數(shù)據(jù)元素具有相同的數(shù)據(jù)類型;3.?dāng)?shù)組元素的下標(biāo)關(guān)系具有上下界的約束且下標(biāo)有序;4.數(shù)組元素的值由數(shù)組名和下標(biāo)唯一確定;5.數(shù)組名是數(shù)組的首地址,每個(gè)元素是連續(xù)存放的。對(duì)數(shù)組可以施加的操作主要有以下兩種:取值操作:給定一組下標(biāo),讀其對(duì)應(yīng)的數(shù)據(jù)元素。賦值操作:給定一組下標(biāo),存儲(chǔ)或修改與其相對(duì)應(yīng)的數(shù)據(jù)元素。典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)6.2.3數(shù)組的順序存儲(chǔ)

一般采用順序存儲(chǔ)結(jié)構(gòu)表示數(shù)組。順序存儲(chǔ)結(jié)構(gòu)即用一塊連續(xù)的存儲(chǔ)空間存儲(chǔ)數(shù)組元素。(1)按行優(yōu)先存儲(chǔ):一行分配完了接著分配下一行。如前面的m×n階矩陣的二維數(shù)組,按行存儲(chǔ)數(shù)據(jù):a11,a12,…,a1n,a21,a22,…,a2n,…,am1,am2,…,amn(2)按列優(yōu)先存儲(chǔ):一列一列地存放。如前面的m×n階矩陣的二維數(shù)組,按列存儲(chǔ)數(shù)據(jù):a11,a21,…,am1,a12,a22,…,am2,…,a1n,a2n,…,amn典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)對(duì)于一維數(shù)組A[n],數(shù)據(jù)元素的存儲(chǔ)地址為LOC(i)=LOC(1)+i×L(1≤i≤n),其中,LOC(i)是第i個(gè)元素的存儲(chǔ)地址,LOC(1)是數(shù)組的首地址,L是每個(gè)數(shù)據(jù)元素占用的字節(jié)數(shù)。對(duì)于一個(gè)m×n的二維數(shù)組A[m][n],以行為主序存儲(chǔ)時(shí),數(shù)組元素aij的存儲(chǔ)地址為:LOC(aij)=LOC(a11)+((i-1)×n+j-1)×L(0≤i≤m,0≤j≤n)其中,LOC(aij)是第i行第j列數(shù)組元素的存儲(chǔ)地址,LOC(a11)是數(shù)組的首地址,L是每個(gè)數(shù)據(jù)元素占用的字節(jié)數(shù)。若以列為主序存儲(chǔ)二維數(shù)組A[m][n],則數(shù)組元素aij的存儲(chǔ)地址為:LOC(aij)=LOC(a11)+((j-1)×m+i-1)×L(1≤i≤m,1≤j≤n)典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

將計(jì)算數(shù)組元素存儲(chǔ)地址的公式推廣到一般情況,可以得到n維數(shù)組A[m1][m2]…[mn]的數(shù)據(jù)元素a[i1][i2]…[in]的存儲(chǔ)地址:LOC(i1,i2,…,in)=LOC(0,0,…,0)+(i1×m2×…mn+i2×m3×…×mn+…+in-1×mn+in)×L典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

6.2.4特殊矩陣的壓縮存儲(chǔ)

特殊矩陣是具有很多相同數(shù)據(jù)元素或者零元素且數(shù)據(jù)元素的分布具有一定規(guī)律的矩陣。m×n矩陣用二維數(shù)組存儲(chǔ)時(shí),最少需要m×n個(gè)存儲(chǔ)單元。當(dāng)矩陣的階數(shù)比較大時(shí),會(huì)浪費(fèi)大量的存儲(chǔ)空間,顯然是不合適的。

1.對(duì)稱矩陣若n階矩陣滿足性質(zhì):aij=aji

,則稱為對(duì)稱矩陣。為每一對(duì)對(duì)稱元素分配一個(gè)存儲(chǔ)空間,因此可以將n×n個(gè)元素存儲(chǔ)到n(n+1)/2個(gè)存儲(chǔ)單元中。典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

對(duì)于任意給定的一組下標(biāo)(i,j),均可以在S中找到矩陣元素aij,反之,對(duì)于所有的k=1,2,…,n(n+1)/2,都能確定s中的元素在矩陣中的位置(i,j)。

典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)a00a01a02…a0n-1a11…an-1,0…an-1,n-12.三角矩陣

三角矩陣分為上三角矩陣和下三角矩陣。下三角矩陣是指矩陣的主對(duì)角線(不包括主對(duì)角線)上方的元素的值均為0;上三角矩陣是指矩陣的主對(duì)角線(不包括主對(duì)角線)下方的元素的值均為0。

下三角矩陣上三角矩陣典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)3.對(duì)角矩陣

對(duì)角矩陣是指矩陣的所有非零元素都集中在以主對(duì)角線為中心的帶狀區(qū)域中,即除去主對(duì)角線上和直接在主對(duì)角線上、下方若干條對(duì)角線上的元素之外,其余元素皆為零。若以一維數(shù)組進(jìn)行存儲(chǔ),則存儲(chǔ)形式如下:典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)123456789101112a12a21a22a23a32a33a34a43a44a45a54a55

6.2.4特殊矩陣的壓縮存儲(chǔ)矩陣階數(shù)比較大,零元素個(gè)數(shù)比較多,非零元素個(gè)數(shù)比較少,且分布無規(guī)律,這類矩陣就是稀疏矩陣。設(shè)矩陣A是一個(gè)m×n的矩陣,其中有t個(gè)非零元素,設(shè)稱為稀疏因子,如果<=0.05,矩陣A就是稀疏矩陣。典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

1.三元組表存儲(chǔ)對(duì)于稀疏矩陣中的每個(gè)元素,都由行下標(biāo)、列下標(biāo)和數(shù)值三個(gè)部分唯一確定,因此,可以用這三項(xiàng)內(nèi)容表示稀疏矩陣中的元素,這就是三元組表示法,如下形式:(i,j,value)i表示非零元素的行下標(biāo),j表示非零元素的列下標(biāo),value表示非零元素的值。典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)行下標(biāo)列下標(biāo)元素值13315221152611352254763321)三元組順序表的定義publicclassTripleNode//三元組結(jié)點(diǎn)類{ publicintrow;//行號(hào) publicintcol; //列號(hào) publicdoublevalue; //元素值

publicTripleNode(introw,intcol,doublevalue)//有參構(gòu)造函數(shù){ this.row=row; this.col=col; this.value=value;}publicTripleNode()//無參構(gòu)造函數(shù){this(1,1,0);}}典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)稀疏矩陣的三元組順序表類定義:publicclassSparseMatrix{ publicTripleNodedata[]; //三元組表 publicintrows; //行數(shù) publicintcols; //列數(shù) publicintnums; //非零元素個(gè)數(shù) publicSparseMatrix(intmaxSize){ //構(gòu)造方法 data=newTripleNode[maxSize];//為順序表分配maxSize個(gè)存儲(chǔ)單元 for(inti=0;i<data.length;i++){

data[i]=newTripleNode(); } rows=0; cols=0; nums=0; } publicvoidprintMatrix()//打印輸出稀疏矩陣 { System.out.println("稀疏矩陣的三元組存儲(chǔ)結(jié)構(gòu)"); System.out.print("行數(shù):"+rows+",列數(shù)"+cols+",非零元素個(gè)數(shù):"+nums+"\n");for(inti=0;i<nums;i++) System.out.print(data[i].row+"\t"+data[i].col+"\t"+data[i].value+"\n");} }典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)2)三元組表的基本操作

初始化三元組順序表publicSparseMatrix(doublemat[][]) { inti,j,k=0,count=0; rows=mat.length; cols=mat[0].length; for(i=0;i<rows;i++) //統(tǒng)計(jì)非零元素的個(gè)數(shù) for(j=0;j<mat[i].length;j++) if(mat[i][j]!=0) count++; nums=count; //非零元素的個(gè)數(shù) data=newTripleNode[nums];//申請(qǐng)三元組結(jié)點(diǎn)空間 for(i=0;i<rows;i++) for(j=0;j<mat[i].length;j++) if(mat[i][j]!=0) { data[k]=newTripleNode(i,j,mat[i][j]); //建立三元組 k++; } }典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

矩陣轉(zhuǎn)置矩陣轉(zhuǎn)置是一種簡單的矩陣運(yùn)算,指的是把矩陣中每個(gè)元素的行號(hào)和列號(hào)互換。

轉(zhuǎn)置-------

矩陣A’轉(zhuǎn)置矩陣A’的三三元組表元組表(按行優(yōu)先)典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)行下標(biāo)列下標(biāo)元素值3135121215621153224573632行下標(biāo)列下標(biāo)元素值1215313363245751253226211矩陣轉(zhuǎn)置算法:publicSparseMatrixtran() { SparseMatrixtr=newSparseMatrix(nums); tr.cols=rows; tr.rows=cols; tr.nums=nums; intn=0; for(intcol=0;col<cols;col++) for(intm=0;m<nums;m++) if(data[m].col==col) { tr.data[n].row=data[m].col; tr.data[n].col=data[m].row; tr.data[n].value=data[m].value; n++; } returntr; }典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)(3)矩陣快速轉(zhuǎn)置快速轉(zhuǎn)置算法的思想為:按三元組表A的次序進(jìn)行轉(zhuǎn)置,轉(zhuǎn)置后直接放到三元組表B的正確位置上。轉(zhuǎn)置過程中的元素并不連續(xù)放入到B.data,而是直接放到B.data中應(yīng)有的位置上,只需對(duì)A.data掃描一次。因?yàn)锳中第一列的第一個(gè)非零元素一定存儲(chǔ)在B.data[1]中,如果還不知道第一列非零元素的個(gè)數(shù),那么第二列的第一個(gè)非零元素在B.data中的位置便等于第一列的第一個(gè)元素在B.data中的位置加上第一列的非零元素的個(gè)數(shù),依次類推,因?yàn)锳中三元組的存放順序是先行后列,對(duì)同一行來說,必定先遇到列號(hào)小的元素,這樣只需要掃描一遍A.dta即可。典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

矩陣快速轉(zhuǎn)置算法:publicSparseMatrixfasttran(){

SparseMatrixtr=newSparseMatrix(nums);//創(chuàng)建矩陣對(duì)象

tr.cols=rows; //行數(shù)變列數(shù) tr.rows=cols; //列數(shù)變行數(shù) tr.nums=nums; //非零元素個(gè)數(shù) inti,j=1,k=0; int[]num,cpos; if(nums>0) { num=newint[cols+1]; cpos=newint[cols+1]; for(i=1;i<=cols;i++) { num[i]=0; } for(i=1;i<=nums;i++) { j=data[i].col; num[j]++; } cpos[1]=1;典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

for(i=2;i<=cols;i++){ cpos[i]=cpos[i-1]+num[i-1];}//執(zhí)行轉(zhuǎn)置操作for(i=1;i<=nums;i++) //掃描整個(gè)三元組順序表{ j=data[i].col; k=cpos[j]; tr.data[k].row=data[i].col; tr.data[k].col=data[i].row; tr.data[k].value=data[i].value; cpos[j]++;

}}}典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)(4)矩陣的加法

當(dāng)兩個(gè)矩陣進(jìn)行加法運(yùn)算時(shí),要求兩個(gè)矩陣的大小必須相同,即行數(shù)和列數(shù)分別對(duì)應(yīng)相等,且結(jié)果仍為一個(gè)具有相同大小的矩陣,并且其三元組線性表仍然是有序線性表,即三元組是按照行、列號(hào)升序排列的。2.十字鏈表存儲(chǔ)

十字鏈表是稀疏矩陣的另一種存儲(chǔ)結(jié)構(gòu),在十字鏈表中矩陣的每一個(gè)非零元素用一個(gè)結(jié)點(diǎn)表示,每個(gè)結(jié)點(diǎn)由5個(gè)域組成。row域存放該元素的行號(hào),col域存放該元素的列號(hào),value域存放該元素的值,此外還有兩個(gè)鏈域:right域用于鏈接同一行中的下一個(gè)非零元素,down域用以鏈接同一列中的下一個(gè)非零元素。典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)rowcolvaluedownright典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)稀疏矩陣的十字鏈表表示的結(jié)點(diǎn)結(jié)構(gòu)類定義:publicclassOLnode{ //十字鏈表結(jié)點(diǎn)類 publicintrows; //元素的行號(hào) publicintcols; //元素的列號(hào)publicintvalue; //元素的值 publicOLnoderight; //行鏈表指針 publicOLnodedown; //列鏈表指針publicOLnode(){this(0,0,0); //無參構(gòu)造方法}publicOLnode(introws,intcols,intvalue) //有參構(gòu)造方法 { this.rows=rows; this.cols=cols; this.value=value; right=null; down=null; }}典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)稀疏矩陣的十字鏈表類定義:publicclassCrosslist{ //十字鏈表 publicintmu,nu,tu; //行數(shù)、列數(shù)、非零元素個(gè)數(shù) publicOLnode[]rhead,chead; //行、列指針數(shù)組 publicCrosslist(intm,intn) { mu=m; nu=n; rhead=newOLnode[m]; chead=newOLnode[n]; tu=0; for(inti=0;i<m;i++) rhead[i]=newOLnode(); for(inti=0;i<n;i++) chead[i]=newOLnode(); }…}典型工作任務(wù)6.2矩陣數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)以光明食品廠每月產(chǎn)品成本統(tǒng)計(jì)表的處理為主,設(shè)計(jì)本系統(tǒng)的程序,系統(tǒng)由兩部分組成,第1部分為矩陣的6種操作算法,包含矩陣三元組結(jié)點(diǎn)的無參初始化、有參初始化、元組順序表的兩個(gè)有參初始化、三元組順序表輸出、矩陣相加,第2部分為主程序Test,該程序?qū)崿F(xiàn)矩陣操作算法的調(diào)用及數(shù)據(jù)輸出及顯示。程序框圖如圖6-10所示。

圖6-10核算產(chǎn)品成本程序框圖

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)本系統(tǒng)均未使用數(shù)組0下標(biāo)元素,因此數(shù)組大小均多申請(qǐng)1個(gè)空間,核算產(chǎn)品成本系統(tǒng)源代碼如下publicclassTripleNode//三元組結(jié)點(diǎn)類{ publicintrow;//行號(hào) publicintcol; //列號(hào) publicdoublevalue; //元素值//1.無參構(gòu)造方法publicTripleNode(){this(0,0,0);} //2.有參構(gòu)造方法publicTripleNode(introw,intcol,doublevalue)//行,列,元素值{ this.row=row; this.col=col; this.value=value;}}

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)publicclassSparseMatrix//三元組類{ publicTripleNodedata[];//三元組表 publicintrows; //行數(shù) publicintcols; //列數(shù) publicintnums; //非零元素個(gè)數(shù)//3.有參構(gòu)造方法

publicSparseMatrix(intmaxSize){ data=newTripleNode[maxSize+1];//為順序表分配maxSize個(gè)存儲(chǔ)單元 for(inti=1;i<=data.length;i++)//創(chuàng)建三元組表{ data[i-1]=newTripleNode();} rows=1; cols=1; nums=0;}

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)//4.有參構(gòu)造方法

publicSparseMatrix(doublemat[][])//稀疏矩陣{inti,j,k=1,count=0;rows=mat.length;//矩陣行數(shù)cols=mat[1].length;//矩陣列數(shù)for(i=1;i<=rows;i++)//統(tǒng)計(jì)非零元素的個(gè)數(shù) for(j=1;j<=mat[i-1].length;j++) if(mat[i-1][j-1]!=0) count++; nums=count; data=newTripleNode[nums+1]; //申請(qǐng)三元組結(jié)點(diǎn)空間 for(i=1;i<=rows;i++) for(j=1;j<=mat[i-1].length;j++) if(mat[i-1][j-1]!=0) { data[k]=newTripleNode(i,j,mat[i-1][j-1]); //建立三元組 k++; } }

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)//5.打印輸出矩陣三元組表publicvoidprintMatrix() { System.out.println("矩陣的三元組存儲(chǔ)結(jié)構(gòu)"); System.out.print("行數(shù):"+rows+",列數(shù)"+cols+",非零元素個(gè)數(shù):"+nums+"\n"); for(inti=1;i<=nums;i++) System.out.print(data[i].row+"\t"+data[i].col+"\t"+data[i].value+"\n"); }//6.矩陣加法publicstaticSparseMatrixSpareAdd(SparseMatrixam,SparseMatrixbm) //矩陣am+bm {SparseMatrixsm=newSparseMatrix(am.rows*am.cols);//矩陣sm存和 inti=1,j=1,k=1; doubletemp; if(am.rows!=bm.rows||am.cols!=bm.cols)//判斷am與bm矩陣大小 { System.out.print("兩個(gè)矩陣大小不同,無法進(jìn)行加法運(yùn)算"); System.exit(1); } sm.rows=am.rows; sm.cols=am.cols;

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)while(i<=am.nums&&j<=bm.nums)//當(dāng)am和bm矩陣三元組表均未掃描結(jié)束{ if(am.data[i].row==bm.data[j].row){if(am.data[i].col<bm.data[j].col)//am元素在bm前面,先存am的元素 { sm.data[k].row=am.data[i].row; sm.data[k].col=am.data[i].col; sm.data[k].value=am.data[i].value;k++;i++; } elseif(am.data[i].col>bm.data[j].col)//bm元素在am前,先存bm的元素{ sm.data[k].row=bm.data[j].row; sm.data[k].col=bm.data[j].col; sm.data[k].value=bm.data[j].value; k++;j++; }

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)else//兩個(gè)元素在同一個(gè)位置,兩者相加{temp=am.data[i].value+bm.data[j].value; if(temp!=0) { sm.data[k].row=am.data[i].row; sm.data[k].col=am.data[i].col; sm.data[k].value=temp; i++;j++;k++; }else{i++;j++;}//相加元素為0,各自取下一個(gè)元素 } } elseif(am.data[i].row<bm.data[j].row)//兩個(gè)元素不在同一行,am在bm前面 { sm.data[k].row=am.data[i].row; sm.data[k].col=am.data[i].col; sm.data[k].value=am.data[i].value; k++;i++; }

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)else //bm在am的前面{ sm.data[k].row=bm.data[j].row; sm.data[k].col=bm.data[j].col; sm.data[k].value=bm.data[j].value; k++;j++;} }while(i<=am.nums)//bm先結(jié)束,把a(bǔ)m剩余插入三元組表{ sm.data[k].row=am.data[i].row; sm.data[k].col=am.data[i].col; sm.data[k].value=am.data[i].value; k++;i++; }

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)while(j<=bm.nums)//am先結(jié)束,把bm剩余插入三元組表 { sm.data[k].row=bm.data[j].row; sm.data[k].col=bm.data[j].col; sm.data[k].value=bm.data[j].value; k++;j++; }sm.nums=k-1;//非零元素個(gè)數(shù) returnsm; }//7.主程序importjava.util.Scanner;publicclasstest{ staticdoubleJan[][]=newdouble[5][3];//1月成本統(tǒng)計(jì) staticdoubleFeb[][]=newdouble[5][3];//2月成本統(tǒng)計(jì)

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)

staticdoubleadd[][]=newdouble[5][3];//成本求和 staticSparseMatrixsum;//sum和矩陣三元組 staticSparseMatrixtran;//tran轉(zhuǎn)置矩陣三元組staticSparseMatrixfirst;//1月成本矩陣 staticSparseMatrixsecond;//2月成本矩陣 publicstaticvoidmain(String[]args) { intflag=1; intchoice; while(flag==1) { menu(); System.out.print("請(qǐng)輸入您的選擇:"); Scannersc=newScanner(System.in);choice=sc.nextInt(); switch(choice){ case0:flag=0;break;case1:input();break;//輸入月統(tǒng)計(jì)表 case2:output();break;//輸出月成本矩陣及三元組表 case3:transpose();break;//輸出月成本矩陣轉(zhuǎn)置及三元組表case4:add();break;//1月和2月成本求和 default:System.out.println("輸入有誤,請(qǐng)重新輸入!"); } } System.out.println("感謝您的使用!"); } }

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)publicstaticvoidmenu(){//系統(tǒng)主菜單 System.out.println("************************************"); System.out.println("**********核算產(chǎn)品成本系統(tǒng)*********"); System.out.println("*****1.輸入月統(tǒng)計(jì)數(shù)據(jù)****"); System.out.println("*****2.查看月統(tǒng)計(jì)三元組表****"); System.out.println("*****3.月統(tǒng)計(jì)矩陣轉(zhuǎn)置****"); System.out.println("*****4.產(chǎn)品成本核算矩陣****"); System.out.println("*****0.退出****");System.out.println("************************************");}publicstaticvoidinput()//輸入指定月數(shù)據(jù){ System.out.print("請(qǐng)輸入月份(1或2):"); Scannerm=newScanner(System.in); intchoicemonth=m.nextInt(); Scannerinm=newScanner(System.in); System.out.println("請(qǐng)輸入5行3列數(shù)據(jù):"); for(inti=0;i<5;i++) for(intj=0;j<3;j++) {

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)

if(choicemonth==1)//1月份數(shù)據(jù)存入Jan數(shù)組 Jan[i][j]=inm.nextDouble(); if(choicemonth==2)//2月份數(shù)據(jù)存入Feb數(shù)組 Feb[i][j]=inm.nextDouble(); } System.out.println(choicemonth+"月數(shù)據(jù)輸入完成");}publicstaticvoidoutput()//輸出指定月數(shù)據(jù){ System.out.print("請(qǐng)選擇查看月份(1或2):"); Scannerm=newScanner(System.in); intmonth=m.nextInt(); System.out.println(month+"月統(tǒng)計(jì)數(shù)據(jù)矩陣"); if(month==1) { for(inti=0;i<5;i++) { for(intj=0;j<3;j++) { System.out.print(Jan[i][j]+"");//輸出選擇月份的矩陣 first=newSparseMatrix(Jan);//生成1月份矩陣三元組表 } System.out.print("\n"); } first.printMatrix(); }

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)if(month==2) { for(inti=0;i<5;i++) { for(intj=0;j<3;j++) { System.out.print(Feb[i][j]+"");//輸出選擇月份的矩陣 second=newSparseMatrix(Feb);//生成1月份矩陣三元組表 } System.out.print("\n"); } second.printMatrix(); }}publicstaticvoidtranspose()//轉(zhuǎn)置指定月成本矩陣 { System.out.print("請(qǐng)輸入月份(1或2):"); Scannerscan=newScanner(System.in); intm=scan.nextInt(); if(m==1) tran=first.tran();//1月份矩陣轉(zhuǎn)置

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì) if(m==2) tran=second.tran();//2月份矩陣轉(zhuǎn)置 tran.printMatrix();//輸出轉(zhuǎn)置后矩陣三元組表}publicstaticvoidadd()//1,2月份成本矩陣求和{ sum=SparseMatrix.SpareAdd(first,second); System.out.println("1,2月份成本核算矩陣"); for(inti=0;i<5;i++) { for(intj=0;j<3;j++) {add[i][j]=Jan[i][j]+Feb[i][j]; System.out.print(add[i][j]+"");//輸出求和矩陣 } System.out.print("\n"); } sum.printMatrix();}}

典型工作任務(wù)6.3矩陣軟件代碼設(shè)計(jì)使用數(shù)據(jù)結(jié)構(gòu)中的數(shù)組編寫核算產(chǎn)品費(fèi)用的程序,通過Eclipse編譯和運(yùn)行,選擇輸入1月統(tǒng)計(jì)表數(shù)據(jù),測試結(jié)果如圖6-11所示。輸入菜單“2”及月份“1”,查看1月統(tǒng)計(jì)矩陣三元組表,測試結(jié)果如圖6-12所示。

圖6-111月份統(tǒng)計(jì)數(shù)據(jù)圖

圖6-121月統(tǒng)計(jì)矩陣的三元組表

典型工作任務(wù)6.4矩陣軟件測試執(zhí)行通過Eclipse編譯和運(yùn)行,選擇菜單“3”及輸入月份“1”,查看1月統(tǒng)計(jì)矩陣的轉(zhuǎn)置三元組表,測試結(jié)果如圖6-13所示。繼續(xù)選擇菜單“1”及輸入月份“2”,查看2月統(tǒng)計(jì)數(shù)據(jù)表,如圖6-14所示。

圖6-131月統(tǒng)計(jì)矩陣轉(zhuǎn)置后的三元組表

圖6-14輸入2月統(tǒng)計(jì)數(shù)據(jù)

典型工作任務(wù)6.4矩陣軟件測試執(zhí)行通過Eclipse編譯和運(yùn)行,選擇菜單“2”及輸入月份“2”,查看2月統(tǒng)計(jì)矩陣的轉(zhuǎn)置三元組表,測試結(jié)果如圖6-15所示。選擇菜單“4”,核算1月和2月產(chǎn)品成本,測試結(jié)果如圖6-16所示。

圖6-152月統(tǒng)計(jì)矩陣三元組表

圖6-161月和2月產(chǎn)品成本核算矩陣

典型工作任務(wù)6.4矩陣軟件測試執(zhí)行

為了構(gòu)造出稀疏矩陣,系統(tǒng)以表6-6、表6-7所示兩個(gè)月的產(chǎn)品成本統(tǒng)計(jì)表數(shù)據(jù)為例,進(jìn)行系統(tǒng)功能測試。

表6-61月份產(chǎn)品成本統(tǒng)計(jì)表(單位:萬元)

表6-72月份產(chǎn)品成本統(tǒng)計(jì)表(單位:萬元)

典型工作任務(wù)6.5矩陣軟件文檔編寫產(chǎn)品名稱材料成本人工

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論