logo资料库

数据结构实验报告《三、串及其应用》.doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
中南大学物理学院 数据结构实验报告- - - - 串及其应用之文学研究助手 专业班级: 电信 0903 班 数据结构实验报告- - - - 时间:2011 年 11 月 11 日 串及其应用之文学研究助手
【问题描述】 文学研究人员需要统计某篇英文小说中某些单词(特别是形容词)的出现次 数和位置,甚至连数字和标点符号的个数也可以统计。试写一个实现这一目标的 文字统计系统,称为“文学研究助手”。 【基本要求】 1、输入一页文字,静态存储一页文章,每行最多不超过 80 个字符,共 N 行; 2、分别统计出其中英文字母数、空格数、标点符号及整篇文章总字数; 3、统计某一字符串在文章中出现的次数,并输出该次数; 4、删除某一子串,并将后面的字符前移。 【运用拓展】 1、保存输入文章到本地 text 文本中; 2、模式匹配基于 KMP 算法; 3、仿真友好界面显示: (1)、要求用菜单选择操作,分别用几个子函数实现相应的功能; (2)、输入数据的形式和范围:可以输入大写、小写的英文字母、任何数 字及标点符号。 (3)、输出形式:1)、分行输出用户输入的各行字符; 2)、分 5 行输出"全部字母数"、"数字个数"、"空格个 数"、“标点符号个数”"文章总字数"; 3)、输出删除某一字符串后的文章。 【涉及的知识点】 链串的插入,删除,查找,模式匹配(knp 算法)及文件的写入与写出,用 switch,case 语句进行菜单的选择,用 while 语句进行循环,用 if 语句进行条件的 判断等等。 【设计思路】 ○1 、总体思路:本文采用链式存储字符串,链串的插入采用后插法,以‘#’ 为字符串结束的标志。在插入字符串的同时用文件存储字符串。 ○2 、删除算法的基本思路:输入要删除的字符串,同样以‘#’结束, 然后在文中查找该字符串,若找到了则把它删除,同时长度要减少;否则,没找 到不能删除。 查找算法与删除算法类似;但也有不同之处,不同在于:这里是要查找某字符串 在文中出现的次数,因此,当找到该字符串后还要继续往后查找,并将次数加 1; 直到文章的末尾才结束查找。 ○3 、用菜单做选择:用 switch,case 语句进行选择判断,并用类的对象 调用类的成员函数以实现特定的功能。由于采用链式存储字符串,它是按一个一 个的字符进行存储的,当遇到空隔和换行符时它会忽略不计。为了解决这一问题,
本文采用替换的方法——当要输入空格时就输入‘:’,当要输入换行符时就输入’ \\’,在输出时,遇到‘:’就输出空格,遇到‘\\’就输出换行符。 ○4 、功能设计 根据提示选择是否开始 y n 退出 选择操作 调用相应函数 是否继续? ○5 、详细设计 Linklist 类中有一个保护成员 head(指针类型); 公有成员中包含一个整型变量 len,用于计算字符串的长度; 另外还包含 5 个子函数,分别是: 1,void rcreat()函数,用尾插法建立链串,并将字符串存入文件,遇到#时结束; 2,void print(link *head)函数,用于输出链串,当遇到的字符为冒号(:)时输出 空格,当遇到的字符为(\\)时输出换行,当遇到的字符大于等于 48 并且小于等 于 57 时,数字个数加 1,当遇到的字符为标点符号时,相应的标点符号数加 1, 并输出;判断完后指针后移。 3,void deletel(link *head,link * head2)为删除字符串的函数,其中 head 是指向输 入的文章的第一个字符,head2 是指向要删除的字符串的第一个字符,采用模式 匹配的算法进行查找,若在文中找到了一个字符与要删除的第一个字符相同,则 指针分别往后移,若文中的下一个字符与第二个字符不相同,则继续找文中的下 一个字符与要删除的字符从第一个字符开始从新匹配,直到要删除的字符都匹配 完;找到了要删除的字符串在文中的位置后,将文中与这串字符匹配的第一个字 符开始到最后一个匹配的这段字符删除;若没有找到该字符串则不能删除。 4,void print2(link *head2)函数,输出要删除的字符串,其中,head2 指向要删 除的字符串的第一个字符。 5,void *found(link *head,link *head2)函数用于查找字符串在文中出现的次数; 设置一个整型变量 num,用于统计出现次数,其初始值为 0。同样采用模式匹配 的算法,但不同的是,找到第一次在文中出现的位置后 num+1,并且还要继续找 文中的下一个,找到了又要 num+1,直到文章的末尾,然后输出 num 值。 ○6 、部分函数模块流程图: void *found(link *head,link *head2) int num=0; link *P,*Q,*R; P=head->next ; Q=head2->next ; R=P;
While (P!=NULL)&&(Q!=NULL) if(P->data==Q->data ) else R=R->next; P=R; Q=head2->next ; P=P->next ; Q=Q->next ; if(Q==NULL) num++; R=R->next; P=R; Q=head2->next 【运行环境】 电脑环境:Windows 7 & 软件环境:Visual C++ 6.0 & Windows XP & Windows vista Visual studio 2008 #include #include using namespace std; class bunch { //包含头文件
public: char data; bunch *next; };//bunch class bunchlist { protected: bunch *head; public: int len; bunch *creat() { ofstream SaveFile("cpp-home.txt",ios_base::binary);//创建本地文本文件 bunch *s,*p,*r; char ch; cout<<"输入多个字符(用冒号代替空格,用双杠(\\)代替换行符),为#是算法 结束"; cin>>ch; p=r=new bunch; p->next =NULL; while (ch!='#') { //申请新的空间 //后插法添加字符 //不为#时录入字符并保存在文本中 s=new bunch; s->data =ch; r->next =s; r=s; SaveFile<>ch; }//while r->next =NULL; SaveFile.close(); return p; }//*creat void print(bunch *head) { //写入文件 //结束输入并返回字符串数据 //输出文本 //赋初值 int num=0; int space=0; int len=0; int word=0; int douhao=0; int sentence=0; ifstream in("cpp-home.txt"); bunch *p; p=head->next ; //读入创建的 txt 文本文件
while(p->next!=NULL) { //不为空文件是扫描需要记录的信息 //长度先自加 1 len++; if(p->data==':')//将冒号改为空格输出 { cout<<' '; space++; word++; p=p->next ; //移动到下一位循环扫描信息 //碰到空格号,空格数目自加 1 //字符数目自加 1 }//if“:” if(p->data ==',')//逗号的形式和空格一致,不赘述 { word++; douhao++; cout<<','; p=p->next ; }//if“,” if(p->data =='.')//点的形式和空格一致,不赘述 { cout<<'.'; word++; sentence++; p=p->next ; }//if“.” if(p->data =='?')//问号的形式和空格一致,不赘述 { cout<<'?'; word++; sentence++; p=p->next ; }//if“?” if((p->data>=48)&&(p->data<=57))//当碰到的是数字 0~9 时记录 { cout<data ; num++; p=p->next ; //数字统计自加 1 //跳到下一位 }//if"0~9" if(p->data=='\\')//将双杠改为换行输出 { cout<<'\n'; p=p->next ; }//if"\\" else //其他情况就记录字母 cout<data;
p=p->next ; //单词数自加 1 //句子数自加 1 //换行输出所有统计信息 }//while word=word+1; sentence=sentence+1; cout<next; Q=HEAD->next; R=P; while((P!=NULL)&&(Q!=NULL))//不为空时再进行删除操作 { if(P->data==Q->data ) { P=P->next ; Q=Q->next ; } else { T=T->next; R=R->next; P=R; Q=HEAD->next ; } } if(Q==NULL) { cout<<" find the word"<next=P->next; } else { cout<<"the word hav't found!"<
} void PRINT(bunch *HEAD) {ifstream in("home.text"); bunch *q; q=HEAD->next ; while(q!=NULL) { cout<data ; q=q->next ; } } void *found(bunch *head,bunch *HEAD) { int num=0; bunch *P,*Q,*R; P=head->next ; Q=HEAD->next ; R=P; while((P!=NULL)&&(Q!=NULL)) { if(P->data==Q->data ) { P=P->next ; Q=Q->next ; } else { R=R->next; P=R; Q=HEAD->next ; } if(Q==NULL) { num++; R=R->next; P=R; Q=HEAD->next ; } } if(num>0) {cout<<"good!word have found."<
分享到:
收藏