您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 文学研究助手的课程设计报告
文学研究助手的课程设计报告书题目:文学研究助手的程序设计班级:计算机0506班姓名:覃韩锋学号:0120510340622完成日期:2007-7-6一、问题描述:文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。试写一个实现这一目标的文字统计系统,称为“文学研究助手”。英文小说存于一个文本文件中。待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。二、需求分析:1、文本串非空且以文件形式存放,统计匹配的词集非空。文件名和词集均由用户从键盘输入;2、“单词”定义:由字母构成的字符序列,中间不含空格字符且区分大小写;3、待统计的“单词”在文本串中不跨行出现,它或者从行首开始,或者前置若干空格字符;4、在计算机终端输出的结果是:单词,出现的次数,出现的位置所在行的行号,同一行出现两次的只输出一个行号;5、测试数据:将实验的源程序作为测试文件,从中任意选取“单词”作为测试的词集。三、概要设计:采用截取字符串、比较字符串的模式来完成“单词匹配比较”,从而统计出其出现的位置和次数。1、数据结构定义:程序将涉及到如下两个线性表结构的数据类型,用类C语言描述如下:(1)定义从文本读取的“单词串”类型:ADTFileString{数据对象:D={Si|Si∈标准c++字符串集合,i=1,2,3,…….,n,n≥0};数据关系:R1={Si-1,Si}|Si-1,Si∈D,i=1,2,3,…..,n}基本操作:createFileString(FSList&FSL);初始条件:已知一个空的“文本单词串表头”;操作结果:生成一个空的“文本单词串序列”;insertFileString(FSList&FSL,stringstr,introw);初始条件:FSL为文本字符串序列的表头str为一个标准的c++字符串,row代表了字符串出现的行数;操作结果:将str插入到文本字符串序列中,不需要排序;若FSL为空表头,则创建一个字符串序列;否则插在字符串序列尾部;getFSLength(FSListFSL);初始条件:FSL为文本字符串序列的表头;操作结果:获取以FSL为表头的文本字符串的长度printFileString(FSListFSL);初始条件:FSL为文本字符串序列的表头;操作结果:打印以FSL为表头的文本字符串中的所有字符串;readFile(FSList&FSL);初始条件:FSL为文本字符串序列的表头;操作结果:从文件中读取字符串序列,并将其保留在以FSL为表头的字符串序列中;clearFileString(FSList&FSL);初始条件:FSL为文本字符串序列的表头;操作结果:以FSL为表头的文本字符串序列被清空;}ADTFileString(2)定义从键盘读取的“单词串”类型:ADTKeyString{数据对象:D={Si|Si∈标准c++字符串集合,i=1,2,3,…….,n,n≥0};数据关系:R1={Si-1,Si}|Si-1,Si∈D,i=1,2,3,…..,n}基本操作:createKeyString(KSList&KSL);初始条件:已知一个空的“键盘单词串表头”;操作结果:生成一个空的“键盘单词串序列”;insertKeyString(KSList&KSL,stringstr,introw);初始条件:KSL为键盘字符串序列的表头str为一个标准的c++字符串,row代表了字符串出现的行数;操作结果:将str插入到键盘字符串序列中,不需要排序;若KSL为空表头,则创建一个字符串序列;否则插在字符串序列尾部;getKSLength(KSListKSL);初始条件:KSL为键盘字符串序列的表头;操作结果:获取以KSL为表头的键盘字符串的长度printKeyString(KSListKSL);初始条件:KSL为键盘字符串序列的表头;操作结果:打印以KSL为表头的键盘字符串中的所有字符串;readKey(KSList&KSL);初始条件:KSL为文本字符串序列的表头;操作结果:从键盘中读取字符串序列,并将其保留在以KSL为表头的字符串序列中;clearKeyString(KSList&KSL);初始条件:KSL为文本字符串序列的表头;操作结果:以KSL为表头的文本字符串序列被清空;}ADTKeyString2、模块设计:1)主程序模块:主函数设计如下intmain(){登陆界面和使用提示;构建文本字符串序列;构建键盘字符串序列;构建模式匹配排除符集合;字符串模式匹配,统计单词;结束一轮工作,提示是否继续操作;}2)文本字符串模块-------构建文本字符串序列;3)键盘字符串模块--------实现键盘字符串数据类型;4)模式匹配模块------实现文本字符串和键盘字符串的匹配统计;5)登陆界面模块--------提示用户程序使用方法3、各模块间的调用关系:四、详细设计1、主程序用到的宏定义:#defineMAX_WORD_LENGTH1000//最大字符串长度#defineMAX_MODELEXCEPTION_LENGTH50#defineFILE_NAME_LENGTH100//文件名长度2、存储结构设/***从文件读取的字符串集合*/typedefstructFileString{stringname;//字符串名称introw;//字符串所在的行FileString*next;//邻接字符串}FileString,*FSList;/***从键盘读取的字符串集合*/typedefstructKeyString{stringname;//字符串名称int*rows;//字符串所在行向量intcount;//字符串出现的次数KeyString*next;//邻接字符串}KeyString,*KSList;主程序模块登录模块模式匹配模块文本字符串模块键盘字符串模块/***匹配文本字符串和键盘字符串的模式匹配排除符集合*/typedefchar*Model;3、主要算法设计:/***在文件字符串集合中插入新的字符串*/intinsertFileString(FSList&FSL,stringstr,introw){if(!FSL)//如果是空表,则创建集合createFileString(FSL);FSListsp,tp;sp=tp=FSL;while(sp=sp-next)tp=sp;FSLists=newFileString;//插在既有的集合中if(!s){coutoverflow!\n;}s-name=str;s-row=row;s-next=NULL;tp-next=s;//顺序插入return1;}/***从文件中读取串*/intreadFile(FSList&FSL){charurl[FILE_NAME_LENGTH];//指向文件路径的const指针coutEnterthefiletoread:;gets(url);while(url[0]=='\0'){//保证文件名不为空coutThefile'snamecannotbenull!endl;gets(url);}ifstreamfs=ifstream(url);//打开文件读取字符串if(!fs){coutFilereadswrong!\n;return0;}introwLine=1;strings;while(fs.peek()!=EOF){//遇到文件尾符,结束读取getline(fs,s,'\n');//依行读取sinsertFileString(FSL,s,rowLine++);//将获取的字符串插入文件字符串集合}return1;}/***统计模式匹配排除字符*/intgetModelException(Model&model){model=newchar[MAX_MODELEXCEPTION_LENGTH];//集合model能统计除了默认匹配字符外的所有客户指定的排除字符charmatch;coutPress'y'toaddtheModel-Exception-Character-Set\n;cinmatch;cin.ignore();//避免其他方法的流操作带来负面影响inti=0;while(match=='y'){if(!i){coutBegintoreceive:;}if(cin.peek()=='\n'){if(!i){coutNocharacterreceivedendl;}coutEndreceivingendl;break;}cin.get(model[i++]);}//默认的模式匹配排除符model[i]='';model[i+1]=',';model[i+2]='.';model[i+3]='\'';model[i+4]='\';model[i+5]='\';model[i+6]='*';model[i+7]='#';model[i+8]='!';model[i+9]='$';model[i+10]='%';model[i+11]='^';model[i+12]='&';model[i+13]='(';model[i+14]=')';model[i+15]='-';model[i+16]='+';model[i+17]='_';model[i+18]='|';model[i+19]='\\';model[i+20]='{';model[i+21]='}';model[i+22]='[';model[i+23]=']';model[i+24]=':';model[i+25]=';';model[i+26]='';model[i+27]='';model[i+28]='?';model[i+29]='/';model[i+30]='~';model[i+31]='\t';model[i+32]='\0';//串尾标志return1;}/***模式匹配方法*/boolmodelMatch(strings,Modelmodel,intpos){for(inti=strlen(model)-1;i=0;i--){if(s[pos]==model[i])returntrue;}returnfalse;}/***查找模式串T在主串S中出现的次数*/intcount(stringS,conststringT,Modelmodel){intcount=0;constchar*tc=T.c_str();inti=0;while(iS.length()){//定义模式匹配规则----扫描排除字符if(modelMatch(S,model,i)){//遇到模式匹配规则所定义的字符,则忽略读取i++;continue;}else{//至此,S[i]肯定不是模式匹配的排除字符char*sc=newchar[MAX_WORD_LENGTH];char*sp=sc;//此处的while循环保证了在读取过程中始终保证不遇到模式匹配的排除字符while(S[i]!='\0'&&!modelMatch(S,model,i)){//未至行尾并且没有遇到//模式匹配规则所定义//的排除字符,则读取*sp=S[i];//读取子串sp++,i++;}*sp='\0';//结束子串读取if(!strcmp(sc,tc)){//比较模式串和子串count++;//相等则增加计数}deletesc;}}returncount;}/***定位KSL中字符串在FSL中的位置*/voidlocate(FSList&FSL,KSList&KSL,Modelmodel){if(!FSL&&!KSL){cout空字符串集合\n;//exit(-1);return;}KSListkp=KSL;/inti=1;while(kp=kp-next){FSListfp=FSL;//sp是SL的副本
本文标题:文学研究助手的课程设计报告
链接地址:https://www.777doc.com/doc-4402231 .html