版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、軟件體系結(jié)構(gòu)上機(jī)實(shí)驗(yàn)報(bào)告書中國(guó)石油大學(xué)(北京)信息學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系制 訂 人:周新學(xué)號(hào): 2008082207指導(dǎo)教師:朱雪峰博士2011年 10月 27日軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 20080822071、課程實(shí)驗(yàn)?zāi)康耐ㄟ^ KWIC(Key Word in Context )檢索系統(tǒng),對(duì)軟件體系結(jié)構(gòu)有更加深入的了解和認(rèn)識(shí)。通過運(yùn)用幾種體系結(jié)構(gòu),熟悉常見的軟件體系結(jié)構(gòu), 并對(duì)這幾種結(jié)構(gòu)有進(jìn)一步了解。2、任務(wù)概述用管道過濾器,主程序、子程序,抽象數(shù)據(jù)類型,隱式調(diào)用這四種結(jié)構(gòu)來分別實(shí)現(xiàn) KWIC 檢索系統(tǒng)。3、實(shí)現(xiàn)方法用 C+主要實(shí)現(xiàn)了兩種結(jié)構(gòu):主程序、子程序結(jié)構(gòu),抽象數(shù)據(jù)類型。( 1)
2、KWIC1 工程的入口函數(shù)int _tmain(int argc, _TCHAR* argv)/界面,結(jié)構(gòu)選擇coutfilename;coutChooseKWICfunctionendl1is MainProgram/SubroutinewithShared Dataendl2 is Abstract Data Typeschoose;if(1=choose)/ 主程序和子程序MainSubroutine mainSub;2軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207vectorvector lines=mainSub.readLines(filename);vector lineIn
3、dex=mainSub.shiftString(lines);lineIndex=mainSub.firstAlphaSort(lineIndex,lines);mainSub.outPut(lineIndex,lines);else/抽象收據(jù)類型Lines *lines=new Lines;Input input;Shift *shift=new Shift;FirstAlphaSort alphaSort;Output output;input.readLines(filename,*lines);shift-circularShift(*lines);alphaSort.alphaSor
4、t(*shift);output.print(alphaSort);delete shift;delete lines;return 0;2)主程序、子程序結(jié)構(gòu)實(shí)現(xiàn)類從文件中按行讀取vectorvector MainSubroutine:readLines(char* filename)3軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207vectorvector dst;ifstream infile(filename,ios:in);if(!infile)coutopen error!endl;exit(0);char temp100=;/存儲(chǔ)從文件中讀取的行的臨時(shí)變量按行讀取while(i
5、nfile.getline(temp,100)int k=0,j=0;vector line;line.swap(vector();char s20=;/存儲(chǔ)從行中取字符串的臨時(shí)變量while(tempk!=0)每個(gè)單詞的截取條件為下一個(gè)字符為空格或者為行的末尾if(tempk+1= |tempk+1=0)&tempk!= )sj=tempk;sj+1=0;4軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207string ss=s;line.push_back(ss);j=0;else if(tempk= )j=0;elsesj=tempk;j+;k+;dst.push_back(line);
6、/將從文件中中讀出的行加入到dst 中infile.close();for(int i=0;idst.size();i+)for(int j=0;jdst.at(i).size();j+)coutdstij ;coutendl;5軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207coutendlendl;return dst;循環(huán)左移vectorMainSubroutine:shiftString(vectorvectorsrcLines)vector shiftLines;for(int row=0;rowsrcLines.size();row+)int colnum=srcLinesrow
7、.size();/獲取每一行的字符串個(gè)數(shù)/對(duì)第 row 行循環(huán) colnum(字符串個(gè)數(shù)) 次,生成循環(huán)移位后的colnum行for(int col=0;colcolnum;col+)LINE linePos;/聲明存放一行的行標(biāo)以及各列的列表的結(jié)構(gòu)體linePos.rowIndex=row;/給行標(biāo)賦值循環(huán)生成一行的列標(biāo)for(int colshift=0;colshiftcolnum;colshift+)取6軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207模運(yùn)算shiftLines.push_back(linePos);return shiftLines;字母排序vectorMainSu
8、broutine:firstAlphaSort(vectorlineIndex,vectorvector srcLines)vectorvector firstChar;vector dstIndex;for(int row=0;rowsrcLines.size();row+)vector firstCharLine;逐行提取各個(gè)字符串的首字母for(int col=0;colsrcLinesrow.size();col+)firstCharLine.push_back(srcLinesrowcol0);firstChar.push_back(firstCharLine);/int rowPo
9、s=0;int colPos=0;7軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207外面的兩層 for 循環(huán)是控制循環(huán)次數(shù)的內(nèi)部的兩層 for 循環(huán)是遍歷所有的字符串首字母,尋找最小的字母for(int row=0;rowfirstChar.size();row+)for(int col=0;colfirstCharrow.size();col+)char min=z;for(int row=0;rowfirstChar.size();row+)for(int col=0;col=firstCharrowcol&!=firstCharrowcol)rowPos=row;colPos=col;
10、min=firstCharrowcol;firstCharrowPoscolPos= ;int linePos=0;/在原行矩陣中的位置for(int line=0;linerowPos;line+)linePos+=srcLinesline.size();8軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207linePos=linePos+colPos;dstIndex.push_back(lineIndexlinePos);return dstIndex;按照 lineIndex 中的字符串的行標(biāo)和列標(biāo)輸出所有字符串voidMainSubroutine:outPut(vectorlineIn
11、dex,vectorvector srcLines)for(int row=0;rowlineIndex.size();row+)for(int col=0;collineIndexrow.colIndex.size();col+)coutsrcLineslineIndexrow.rowIndexlineIndexrow.colIndexcol ;coutendl;coutendl;3)抽象數(shù)據(jù)類型結(jié)構(gòu)實(shí)現(xiàn)行存儲(chǔ)類9軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207增加行參數(shù): line 字符串向量列表void Lines:addLine(vector line)lines.push_back
12、(line);從存儲(chǔ)結(jié)構(gòu)中獲取某一行/ 參數(shù): lineIndex為獲取的行的序號(hào),從0 開始返回獲取的行vector Lines:getLine(int lineIndex)return lineslineIndex;增加字符串/ 參數(shù):instring為所添加字符串, lineIndex為字符串所在行的序號(hào)(從 0 開始)void Lines:addString(string instring, int lineIndex)lineslineIndex.push_back(instring);獲取字符串/ 參數(shù): lineIndex為行序號(hào), stringIndex為字符串在行中的序號(hào)返回
13、獲取的字符串10軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207string Lines:getString(int lineIndex,int stringIndex)return lineslineIndexstringIndex;增加字符參數(shù): inchar 為增加的字符, stringIndex 為增加的字符所在的字符串的序號(hào),lineIndex為增加的字符所在的行的序號(hào)void Lines:addChar(char inchar, int stringIndex, int lineIndex)lineslineIndexstringIndex.push_back(inchar);獲
14、取字符/ 參數(shù): lineIndex為行序號(hào), stringIndex為字符串的序號(hào),charIndex為字符的序號(hào)返回獲取的字符char Lines:getChar(int lineIndex, int stringIndex, int charIndex)return lineslineIndexstringIndexcharIndex;獲取總的行數(shù)int Lines:getLineNum(void)return lines.size();11軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207獲取特定行的字符串個(gè)數(shù)int Lines:getStringNum(int lineIndex)r
15、eturn lineslineIndex.size();輸入類void Input:readLines(char* filename, Lines &readLines)vectorvector dst;ifstream infile(filename,ios:in); if(!infile)coutopen error!endl; exit(0);char temp100=;/ 存儲(chǔ)從文件中讀取的行的臨時(shí)變量 int lineIndex=0;/ 行序號(hào)/按行讀取while(infile.getline(temp,100)int k=0,j=0;12軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082
16、207vector line;line.swap(vector();readLines.addLine(line);char s20=;/ 存儲(chǔ)從行中取字符串的臨時(shí)變量int stringIndex=0;/ 字符串序號(hào)readLines.addString(s,lineIndex);while(tempk!=0)if(tempk!= )readLines.addChar(tempk,stringIndex,lineIndex);/每個(gè)單詞的截取條件為下一個(gè)字符為空格或者為行的末尾if(tempk= &tempk+1!= )readLines.addChar(tempk,stringIndex,
17、lineIndex);/ 將該字符串加入到指定行的指定字符串中readLines.addChar(0,stringIndex,lineIndex); s0=0;/ 清空字符串readLines.addString(s,lineIndex);stringIndex+;/ 字符串序號(hào)加1k+;13軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207lineIndex+;/dst.push_back(line);/ 將從文件中中讀出的行加入到dst 中infile.close();for(int i=0;ireadLines.getLineNum();i+)for(int j=0;jreadLines
18、.getStringNum(i);j+)coutreadLines.getString(i,j) ;coutendl;coutendlendl;循環(huán)左移類/實(shí)現(xiàn)所有行的循環(huán)移位void Shift:circularShift(Lines srcLines)int lineIndex=0;for(int row=0;rowsrcLines.getLineNum();row+)int cols=srcLines.getStringNum(row);for(int col=0;colcols;col+)14軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207vector newLine;lineShi
19、ft.addLine(newLine);for(int newcol=0;newcolcols;newcol+)lineShift.addString(srcLines.getString(row,(col+newcol)%cols),lineIndex);lineIndex+;/獲取所有行Lines Shift:getLines(void)return lineShift;/獲取某一行vector Shift:getLine(int lineIndex)return lineShift.getLine(lineIndex);15軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207/獲取某一行中
20、某一位置的字符串string Shift:getString(int lineIndex,int stringIndex)return lineShift.getString(lineIndex,stringIndex);/獲取某一行中某一個(gè)字符串中的某一位置的字符char Shift:getChar(int lineIndex, int stringIndex, int charIndex)return lineShift.getChar(lineIndex,stringIndex,charIndex);/獲取行數(shù)int Shift:getLineNum(void)return lineSh
21、ift.getLineNum();/獲取某一行的字符串個(gè)數(shù)int Shift:getStringNum(int lineIndex)return lineShift.getStringNum(lineIndex);排序類16軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207/實(shí)現(xiàn)按首字母排序void FirstAlphaSort:alphaSort(Shift srcShiftLines)shiftLines=srcShiftLines;/ 將傳進(jìn)得Shift 對(duì)象賦值給成員變量vector firstChar;for(int row=0;rowshiftLines.getLineNum();
22、row+)firstChar.push_back(shiftLines.getChar(row,0,0);/獲取首字母/首字母排序for(int loop=0;loopfirstChar.size();loop+)char min=z;int rowIndex=0;for(int row=0;row=firstCharrow& !=firstCharrow)min=firstCharrow;rowIndex=row;charSort.push_back(rowIndex);firstCharrowIndex= ;/將找到的最小的字母置為,以便在下一次查找時(shí)不再保留17軟件體系結(jié)構(gòu)實(shí)驗(yàn)報(bào)告書周新: 2008082207/首字母排序vector FirstAlphaSort:getCharSort()return charSort;/獲取行數(shù)int FirstAlphaSort:getLineNum(void)return shiftLines.getLineNum();/按行的序號(hào),將各字符串合并成一個(gè)字符串,然后獲取一行/lineIndex 為行序號(hào)string FirstA
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版現(xiàn)代化辦公室租賃場(chǎng)地合同樣本3篇
- 二零二五版精制粉原料供應(yīng)鏈風(fēng)險(xiǎn)管理合同3篇
- 二零二五版地震監(jiān)測(cè)基站場(chǎng)地租賃與應(yīng)急救援合同3篇
- 2025年度醫(yī)療健康產(chǎn)業(yè)園區(qū)承包經(jīng)營(yíng)合同范本3篇
- 二零二五版溫泉度假酒店SPA服務(wù)人員勞動(dòng)合同3篇
- 二零二五年度離婚經(jīng)濟(jì)補(bǔ)償協(xié)議范本及調(diào)解服務(wù)合同3篇
- 二零二五年度能源項(xiàng)目合作開發(fā)PPP模式合同范本3篇
- 物業(yè)管理公司2025年度招投標(biāo)代理合同3篇
- 二零二五年度車位租賃合同:住宅小區(qū)車位使用權(quán)協(xié)議2篇
- 2025廠房買賣合同模板:高端裝備制造廠房交易3篇
- 100個(gè)超高難度繞口令大全
- 《鄭伯克段于鄢》-完整版課件
- (日文文書模板范例)請(qǐng)求書-請(qǐng)求書
- 土壤肥料全套課件
- 畢業(yè)生延期畢業(yè)申請(qǐng)表
- 學(xué)校6S管理制度
- 肽的健康作用及應(yīng)用課件
- T.C--M-ONE效果器使用手冊(cè)
- 8小時(shí)等效A聲級(jí)計(jì)算工具
- 人教版七年級(jí)下冊(cè)數(shù)學(xué)計(jì)算題300道
- 社會(huì)實(shí)踐登記表
評(píng)論
0/150
提交評(píng)論