*****工学院数据结构课程设计报告选题名称:文章编辑系(院): ***工程学院专业:班级:姓名: ** 学号:指导教师:学年学期:2009 ~ 2010 学年第 2 学期2010 年 6 月16 日设计任务书摘要:随着社会的高速发展,现在人们对信息的处理要求越来越高,使得文章内容、数量也越变庞大,所以,随之而来的就是对文章的处理变得越来越复杂。
设计此程序以方便人们对文章的处理。
此程序的功能有查找文章中某个字符串出现的次数,统计文章中数字,字母,空格等信息出现的次数,分行显示用户输入的文章,输入一字符串并删除文章中所有该字符串,最后,此程序功能简单,操作方便,所以,试验证明,本程序是一款很实用的程序。
关键字:文章编辑;字符查找;统计;删除目录1需求分析 (5)2概要设计 (5)2.1主要模块的描述 (5)2.2程序流程框图如图1所示 (6)2.3各功能函数描述 (6)3详细设计和实现 (7)3.1存储结构设计 (7)3.2主要算法设计 (7)3.3程序运行流程说明 (9)4调试与操作说明 (9)1需求分析这一次数据结构课程设计,我做的课题是文章编辑。
任务与要求包括:输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行;要求:(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。
存储结构使用线性表,分别用几个子函数实现相应的功能;void InitList(wzbj *L) //查找文章结尾有无结束符“#”void StrNo(wzbj *L) //统计某一字符串出现的次数wzbj *DelStr(wzbj *L) //删除某一字段void print1(wzbj *L) //分行输出用户的输入的各行字符void print2(wzbj *L, int &p1, int &p2, int &p3, int &n) //统计字符信息输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章;运行环境包括: Windows2000以上操作系统、Visual C++6.0以上编译环境。
2概要设计对于文章的处理,我用的是for语句查找,即将符合条件的字符查找出来,然后通过函数实现字符的统计,删除等操作。
同时,存储用线性表的链表结构,然后通过设计四个函数,实现设计要求的4个基本功能。
2.1主要模块的描述while(L->next){for (p = L, q = s; *q != '\0' && p->next; p = p->next, q++) if (p->wz!= *q) break;if (*q == '\0') n++;L = L->next;}将链表指针指向输入的字符串开始字符,和文章中字符的首位,然后使用循环语句,将字符串的每一个字符依次比较,判断相同的字符,以便实现其他的查找,统计,删除等功能。
2.2 程序流程框图如图1所示图1 流程图2.3各功能函数描述本次设计共分为四个函数,分别实现四个功能:分行输出用户的输入的各行字符,函数为:void print1(wzbj *L);文章中的字符数,空格数,数字等统计,函数为:void print2(wzbj *L, int &p1, int &p2, int &p3, int &n);字符串删除,函数为: wzbj *DelStr(wzbj *L);统计某一字符串出现的次数,函数为:void StrNo(wzbj *L)3详细设计和实现3.1存储结构设计线性表是最基本、最简单、也是最常用的一种数据结构。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
线性表的逻辑结构简单,便于实现和操作。
因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。
在实现线性表数据元素的存储方面,一般可用顺序存储结构和链式存储结构两种方法。
本程序中采用链式存储结构。
3.2 主要算法设计本课程设计中用指针链表,配合循环语句,完成字符串比较功能,从而完成统计字符串,删除字符串,统计字符信息的功能。
字符串删除:如果,输入字符的第一个字母与文本中的元字符有相同的时候,执行第一个for循环语句,对原文中的字符依次和输入的字符串比较,有不相同的跳出,如果完全相同,则将P指针给H指针,从而达到删除的作用。
然后,进行上述操作,完成删除操作。
wzbj *DelStr(wzbj *L) // 删除某一字段{wzbj *H = L;char s[80], *q;wzbj *p;cout<<"输入一子串: ";cin>>s;if (H->wz == *s){for (p=H->next, q=s+1; *q!='\0' && p->next; p=p->next,q++) if (p->wz!=*q) break;if (*q=='\0') H=p; // 删除}while(L->next){for (p=L->next,q=s;*q!='\0' && p->next;p=p->next,q++)if (p->wz!=*q) break;if (*q=='\0') L->next=p;else L=L->next;}return H;}统计某一字符,操作也是如此,两个字符比较,如果发现字符相同时统计数字N就加1函数为:void StrNo(wzbj *L) // 统计某一字符串出现的次数{int n = 0;char s[80], *q;wzbj *p;cout<<"输入一字符串: ";cin>>s;while(L->next) {for (p = L, q = s; *q != '\0' && p->next; p = p->next, q++) if (p->wz != *q) break;if (*q == '\0') n++;L = L->next;}cout<<"字符串 "<<s<<" 出现 "<<n<<" 次\n";}统计字符信息用循环语句,如果有信息符合就让统计数字叠加,最后得出统计的字符数。
函数为: void print2(wzbj *L, int &p1, int &p2, int &p3, int &n)// 统计字符信息{ n=p1=p2=p3=0;for( ; L->next; L=L->next,n++)if(isalpha(L->wz)) p1++;else if(isdigit(L->wz)) p2++; // 统计数字else if(L->wz!='\n ') p3++; // 统计空格else if(L->wz=='\n') n--; // 统计文章总字数cout<<"\n全部字母数: "<<p1;cout<<"\n数字个数: "<<p2;cout<<"\n空格个数: "<<p3;cout<<"\n文章总字数: "<<n<<endl;}同时在其中引用了两个函数进行数字和字符的统计,分别为isalpha isdigit3.3程序运行流程说明程序运行时首先从主函数开始,先判断选择的操作。
然后根据要求进行相应的查找、删除、统计、显示等操作,一次操作完之后,会回到开始的选择界面,用户可重新选择操作,如果用户选择退出,程序就停止。
4调试与操作说明首先,在程序中输入一段文字,以“#”符做结尾。
按回车enter显示选择操作,便实现统计这段文字中英文字符,空格,数字,和文章总字数的功能,如下图4-1和4-2所示:图4-1图4-2接着,选择1—回车enter出现文章中全部字母数、数字个数、空格个数及文章总字数,如下图4-3所示:图4-3按选择2—回车enter 输入一字符串:you 统计其在文章中出现的次数,如图4-4所示:图4-4对文字的输出处理,按选择4—回车enter 分行显示用户输入的各行字符,如下图4-5所示:图4-5按选择3—回车enter 实现对输入的某一子串进行删除并将其后面字符前移,输出删除后的文章,如下图4—6所示:图4-6按选择0—回车enter 出现 Press any key to continue 结束程序图4-7总结致谢参考文献1 苏仕华.数据结构课程设计.北京:机械工业出版社,20052 王红梅,胡明,王涛,数据结构(C++版)学习辅导与实验指导.北京:清华大学出版社,20053 数据结构(用面向对象方法与C++语言描述)4 丁有和,郑进,周怡君.VC++实用教程(第3版).北京:电子工业出版社,20075 于永彦,王志坚,娄渊胜.C++程序设计基础案例教程.北京:北京大学出版社,20096 Adam Drozdek.数据结构与算法,北京:清华大学出版社,2006指导教师评语。