软件体系结构上机实验报告书中国石油大学(北京)信息学院计算机科学与技术系制订人:周新学号:2008082207指导教师:朱雪峰博士2011年10月27日软件体系结构实验报告书周新:200808220721、课程实验目的通过KWIC(KeyWordinContext)检索系统,对软件体系结构有更加深入的了解和认识。通过运用几种体系结构,熟悉常见的软件体系结构,并对这几种结构有进一步了解。2、任务概述用管道过滤器,主程序、子程序,抽象数据类型,隐式调用这四种结构来分别实现KWIC检索系统。3、实现方法用C++主要实现了两种结构:主程序、子程序结构,抽象数据类型。(1)KWIC1工程的入口函数int_tmain(intargc,_TCHAR*argv[]){//界面,结构选择coutInputaabsolutefilename:;charfilename[30];cinfilename;coutChooseKWICfunctionendl1isMainProgram/SubroutinewithSharedDataendl2isAbstractDataTypesendl;intchoose=0;cinchoose;if(1==choose)//主程序和子程序{MainSubroutinemainSub;软件体系结构实验报告书周新:20080822073vectorvectorstringlines=mainSub.readLines(filename);vectorLINElineIndex=mainSub.shiftString(lines);lineIndex=mainSub.firstAlphaSort(lineIndex,lines);mainSub.outPut(lineIndex,lines);}else//抽象收据类型{Lines*lines=newLines;Inputinput;Shift*shift=newShift;FirstAlphaSortalphaSort;Outputoutput;input.readLines(filename,*lines);shift-circularShift(*lines);alphaSort.alphaSort(*shift);output.print(alphaSort);deleteshift;deletelines;}return0;}(2)主程序、子程序结构实现类//从文件中按行读取vectorvectorstringMainSubroutine::readLines(char*filename){软件体系结构实验报告书周新:20080822074vectorvectorstringdst;ifstreaminfile(filename,ios::in);if(!infile){coutopenerror!endl;exit(0);}chartemp[100]=;//存储从文件中读取的行的临时变量//按行读取while(infile.getline(temp,100)){intk=0,j=0;vectorstringline;line.swap(vectorstring());chars[20]=;//存储从行中取字符串的临时变量while(temp[k]!=0){//每个单词的截取条件为下一个字符为空格或者为行的末尾if((temp[k+1]==''||temp[k+1]==0)&&temp[k]!=''){s[j]=temp[k];s[j+1]='\0';软件体系结构实验报告书周新:20080822075stringss=s;line.push_back(ss);j=0;}elseif(temp[k]==''){j=0;}else{s[j]=temp[k];j++;}k++;}dst.push_back(line);//将从文件中中读出的行加入到dst中}infile.close();for(inti=0;idst.size();i++){for(intj=0;jdst.at(i).size();j++){coutdst[i][j];}coutendl;软件体系结构实验报告书周新:20080822076}coutendlendl;returndst;}//循环左移vectorLINEMainSubroutine::shiftString(vectorvectorstringsrcLines){vectorLINEshiftLines;for(introw=0;rowsrcLines.size();row++){intcolnum=srcLines[row].size();//获取每一行的字符串个数//对第row行循环colnum(字符串个数)次,生成循环移位后的colnum行for(intcol=0;colcolnum;col++){LINElinePos;//声明存放一行的行标以及各列的列表的结构体linePos.rowIndex=row;//给行标赋值//循环生成一行的列标for(intcolshift=0;colshiftcolnum;colshift++){linePos.colIndex.push_back((col+colshift)%colnum);//取软件体系结构实验报告书周新:20080822077模运算}shiftLines.push_back(linePos);}}returnshiftLines;}//字母排序vectorLINEMainSubroutine::firstAlphaSort(vectorLINElineIndex,vectorvectorstringsrcLines){vectorvectorcharfirstChar;vectorLINEdstIndex;for(introw=0;rowsrcLines.size();row++){vectorcharfirstCharLine;//逐行提取各个字符串的首字母for(intcol=0;colsrcLines[row].size();col++){firstCharLine.push_back(srcLines[row][col][0]);}firstChar.push_back(firstCharLine);//}introwPos=0;intcolPos=0;软件体系结构实验报告书周新:20080822078//外面的两层for循环是控制循环次数的//内部的两层for循环是遍历所有的字符串首字母,寻找最小的字母for(introw=0;rowfirstChar.size();row++){for(intcol=0;colfirstChar[row].size();col++){charmin='z';for(introw=0;rowfirstChar.size();row++){for(intcol=0;colfirstChar[row].size();col++){if(min=firstChar[row][col]&&''!=firstChar[row][col]){rowPos=row;colPos=col;min=firstChar[row][col];}}}firstChar[rowPos][colPos]='';intlinePos=0;//在原行矩阵中的位置for(intline=0;linerowPos;line++){linePos+=srcLines[line].size();}软件体系结构实验报告书周新:20080822079linePos=linePos+colPos;dstIndex.push_back(lineIndex[linePos]);}}returndstIndex;}//按照lineIndex中的字符串的行标和列标输出所有字符串voidMainSubroutine::outPut(vectorLINElineIndex,vectorvectorstringsrcLines){for(introw=0;rowlineIndex.size();row++){for(intcol=0;collineIndex[row].colIndex.size();col++){coutsrcLines[lineIndex[row].rowIndex][lineIndex[row].colIndex[col]];}coutendl;}coutendl;}(3)抽象数据类型结构实现行存储类软件体系结构实验报告书周新:200808220710//增加行//参数:line字符串向量列表voidLines::addLine(vectorstringline){lines.push_back(line);}//从存储结构中获取某一行//参数:lineIndex为获取的行的序号,从0开始//返回获取的行vectorstringLines::getLine(intlineIndex){returnlines[lineIndex];}//增加字符串//参数:instring为所添加字符串,lineIndex为字符串所在行的序号(从0开始)voidLines::addString(stringinstring,intlineIndex){lines[lineIndex].push_back(instring);}//获取字符串//参数:lineIndex为行序号,stringIndex为字符串在行中的序号//返回获取的字符串软件体系结构实验报告书周新:200808220711stringLines::getString(intlineIndex,intstringIndex){returnlines[lineIndex][stringIndex];}//增加字符//参数:inchar为增加的字符,stringIndex为增加的字符所在的字符串的序号,lineIndex为增加的字符所在的行的序号voidLines::addChar(charinchar,intstringIndex,intlineIndex){lines[lineIndex][stringIndex].push_back(inchar);}//获取字符//参数:lineIndex为行序号,stringIndex为字符串的序号,charIndex为字符的序号//返回获取的字符charLines::getChar(intlineIndex,intstringIndex,intcharIndex){returnlines[lineIndex][stringIndex][charIndex];}//获取总的行数intLines::getLineNum(void){returnlines.size();软件体系结构实验报告书周新:200808220712}//获取特定行的字符串个数intLines::getStringNum(intlineIndex){returnlines[lineIndex].size();}输入类voidInput::readLines(char*filename,Lines&readLines){//vectorvectorstringdst;ifstreaminfile(filename,ios::in);if(!infile){coutopenerror!endl;exit(0);}chartemp[100]=;//存储从文件中读取的行的临时变量intlineIndex=0;//行序号//按行读取while(infile.getline(temp,100)){intk=0,j=0;软件体系结构实验报告书周新:200808220713vect