【数据结构课程设计】文章编辑系统剖析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》课程设计说明书
文章编辑
班级计科卓越1401 组别: 4
指导老师:彭代文完成时间:2016年6月15日组长:李光耀学号:14020340316 组员1:李达学号:1460140311 成绩:
目录
1系统需求分析 (5)
2系统设计 (6)
2.1输入模块 (6)
2.2统计模块 (6)
2.3删除模块 (6)
3程序设计流程图 (7)
4测试结果及运行效果 (9)
5测试过程中的问题及注意事项 (13)
5.1问题 (13)
5.2注意事项 (13)
总结 (14)
参考文献 (15)
1系统需求分析
本实验所要实现的功能:输入一页文字,程序可以统计出文字、数字、空格的个数。静态存储一页文章,每行最多不超过80个字符,共N行;
要求:
(1)分别统计出其中英文字母数和空格数及整篇文章总字数;
(2)统计某一字符串在文章中出现的次数,并输出该次数;
(3)删除某一子串,并将后面的字符前移。
存储结构使用线性表,分别用几个子函数实现相应的功能;
输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:
(1)分行输出用户输入的各行字符;
(2)分4行输出"全部字母数"、"数字个数"、 "空格个数"和"文章总字数" 输出删除某一字符串后的文章;
用链表存放数据非常灵活,只要内存足够大,对链表可以做任意扩充和修改。主要的手段为链表的遍历。定义一个头指针head,每个结点的数据域存放数据本身,指针域存放下一个结点地址,所以,我们只要知道head,就可以遍历整个链表,找到我们所需要的字符(串),进行相应的操作。
2 系统设计
2.1输入模块
存储结构:采用单链表结构存储文章,每个结点存储一行,每行最长不超过80个字符。
结构定义:
typedef struct line{
char *data; //字符串指针需要时动态分配内存
struct line *next;
}LINE;
算法描述:用gets函数接收输入,每遇到一个回车换行就新建一个结点,将当前行存入其data域。当发现输入为^E时,在Data的最后加上字符串结束标志,并置当前结点的Next指针域为NULL。
2.2统计模块
统计模块包括统计全部字母数,统计数字个数,统计空格个数,以及统计文章总字数,这四个部分的实现算法大体相同,四者的关系是:全部字母数+数字个数+空格个数=文章总字数,也就是说可以在统计出其中三者的前提下计算出第四个的数量。
另外一个重要的统计功能是统计某一字符串在整篇文章中出现的次数,这个需要用到串的模式匹配算法来实现。
2.3删除模块
删除模块的算法思想类同统计字符串的算法思想,由于采用了链表的存储结构,使得删除算法的时间复杂度大大减少。
void Del_String(LINE * &head,char *sch){ //删除指定的字符串
LINE *p=head;
do{
while(strstr(p->data,sch)!=NULL)del_string_word(p->data,sch); } while((p=p->next)!=NULL); //遍历链表
3程序设计流程图
根据题目与上述分析,可得主程序设计流程图如下所示:
图3-1 主程序设计流程图
文章输入、浏览、统计串、统计及删除的详细流程如图1—2所示:
图3-2 详细流程图
4测试结果及运行效果
程序运行,首先显示选择菜单,如图示:
图4-1 选择菜单选择1,输入文章,界面运行结果如下:
图4-2 输入界面
按回车,调出开始菜单,输入2,选择浏览,可以原样显示出刚才输入的文本:
图4-3 文章浏览界面
回车后输入3,可以看到文章统计信息结果:
图4-4 统计结果界面
根据页面提示,回车
统计字符串模块,输入要统计的字符串,可以查找出该字符串在文章中出现过的次数。运行情况如下图示:
图4-5 统计字符串出现次数界面
根据页面提示,回车
删除模块,输入要删除的字符串,执行删除后可以显示删除后的文本。界面如下:
图4-6 删除字符串后的界面
根据页面提示,回车:
退出页面,执行后的结果如下:
图4-7 退出界面
5测试过程中的问题及注意事项
5.1 问题
1 . 主流程进入死循环。.
解决方案:每个循环都加break,每跳出一个模块,opt重新赋值为0。
2输入多个变量,需要空格间隔时,程序只读空格前的变量
解决方案:输.入函数用get( )函数,形式为:get(tmp),即可解决着个问题。
3.不识别自定义函数。
解决方案:函数定义前要函数声明,若不声明,则调用函数必须在函数定义之后,否则不识别。
4,程序结束之后,链表仍占空间。
解决方案:在建立链表是所申请的内存空间在程序结束之前用free_link(LINE *&head)函数释放,即删除链表中的全部结点,且将链表头指针置为空。
5.2注意事项
(1) opt代表选项(共六个,多于六个显示“不可识别选项”)。
(2)建立文章,用链表存储,p=p->next=new LINE,即文章的每一行存储在一个结点中。
(3)Ctrl+E为结束标志。
(4)了解常用ASⅡ码。