文章编辑课程设计报告_第1页
文章编辑课程设计报告_第2页
文章编辑课程设计报告_第3页
文章编辑课程设计报告_第4页
文章编辑课程设计报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.数据结构课程设计文章编辑一、目的数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。1 提高对数据逻辑结构的特点以及存储表示方式的认识,培养在具体应用中选择合适的数据结构和存储结构的能力。2熟悉软件开发的基本过程,初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等阶段基本任务和技能方法。3培养自己的算法设计和算法分析能力,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。4训练用系统的观点和软件开发一般规范进行软件开

2、发,培养软件工作者所应具备的工作方法、作风和相互合作的精神。5综合运用链表的查找、插入和删除,理论结合实际,将其运用到文章编辑这一实验中。使这些知识得到进一步巩固、加深和拓展。利用模块的思想,模块之间用指针连接,减少了不必要的麻烦。巩固加深指针的用途,理解模块的优点。加深对链表的理解,全面认识链表操作的字符串的模式匹配操作。二、需求分析 功能: 输入一页文字,程序可以统计出文字、数字、空格的个数。静态存储一页文章,每行 最多不超过80个字符,共N行; 要求:(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面

3、的字符前移。存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、 "空格个数"、"文章总字数"和输出删除某一字符串后的文章;用链表存放数据非常灵活,只要内存足够大,对链表可以做任意扩充和修改。主要的手段为链表的遍历。定义一个头指针head,每个结点的数据域存放数据本身,指针域存放下一个结点地址,所以,我们只要知道head,就可以遍历整个链表,找到我们所需要

4、的字符(串),进行相应的操作。三、概要设计1 本程序包含三大模块: 输入模块:存储结构:定义结构体 struct LINE,文本行采用顺序存储,行与行之间采用链式存储,采用单链表结构存储文章,每个结点存储一行,每行最长不超过80个字符。结构定义:typedef struct LINE char *data; /字符串指针需要时动态分配内存 struct LINE*next; LINE;算法描述:以文件输入的形式来读取字符,用in.getline()函数来接收输入,每遇到一个回车换行就新建一个结点,将当前行存入其data域。当发现输入为时,在Data的最后加上字符串结束标志,并置当前结点的Nex

5、t指针域为NULL。 统计模块: 统计模块包括统计全部字母数,统计数字个数,统计空格个数,以及统计文章总字数,这四个部分的实现算法大体相同,文章总字数的统计等于所有字符数的个数,其中特殊的中文字,一个中文字代表2个字数来统计,另外一个重要的统计功能是统计某一字符串在整篇文章中出现的次数,这个运用到链表的一个匹配问题。删除模块: 删除模块的算法思想类同统计字符串的算法思想,由于采用了链表的存储结构,使得删除算法的时间复杂度大大减少。void Del_String(LINE * &head,char *sch) /删除指定的字符串 LINE *p=head; do while(strstr

6、(p->data,sch)!=NULL)del_string_word(p->data,sch); while(p=p->next)!=NULL); /遍历链表四、详细设计1.主要子函数:(1)int FindString(LINE * &head,char *str) /*统计str在文章中出现的次数*/求在一行中str出现的次数流程图:开始count=0;h=0;len1=0; len2=strlen(str);p->datai=str0i+k=0;j=0;p->datai+j=strjk+;j+;k=len2count+;i=i+k-1;结束YNYN

7、NY;中南民族大学计算机科学学院计算机科学与技术专业 学号:10061065 姓名:徐丽 查找第一个字符,如果有第一个字符即p->datai=str0,设计数器k=0查找这个字符后面的字符与要查找的字符串是否匹配即p->datai+j=strj,如果匹配k+重复第二步,如果k=len2,则查找到,count+;如果没查找到,重新进行第一步。(2) void delstringword(char *s,char *str)/*删除字符串*s中的字符串*str*/ strpi jsfor(m=0;m<i;m+)tmpcount+=sm;for(n=j;n<len;n+)tm

8、pcount+=sn;tmp实现思想: 从字符串s中寻找str第一次出现的位置 *p=strstr(s,str); len=strlen(s);i=len-strlen(p)即前i项恰好不含要删除的字符串,将前i项复制到tmp中 j=i+strlen(str) 即要删除的字符串在i+1和j之间,将j之后的字符串复制到tmp中 将tmp赋给串s,返回s。(tmp是删除字符串str之后的字符串)(3)int CountLetter(LINE * &head) /*统计字母数*/p->datai>='a'&&p->datai<='

9、;z')|(p->datai>='A'&&p->datai<='Z'/*用来判断输入的字符是否是字母,从何统计计算字母数*/while(p=p->next)!=NULL); /*遍历 链表*/return count; /*返回文章的字母总数*/(4)int CountNumber(LINE * &head) /*统计数字数*/ int Len=strlen(p->data); /*计算当前 data 里的数据元素的个数*/if(p->datai>=48 && p-&

10、gt;datai<=57)count+;/*通过判断字符的ASCII值来统计数字个数*/(5)int CountSpace(LINE * &head)/*统计空格数*/ if(p->datai=32)count+; /*计算空格数,空格ASCII码为32*/(6)int CountAll(LINE * &head) /*统计文章总字数*/ LINE *p=head; /*保存链表的首地址*/ int count=0; do /*计算总字符数*/ count+=strlen(p->data); while(p=p->next)!=NULL); /*遍历 链

11、表*/ return count;注意:这里一个中文字代表两个字符数来统计。2.主函数伪代码:void main() LINE *head; int choice; ifstream in_stream; in_stream.open("d:input.txt"); if(in_stream.fail() cout<<endl<<"文件打开失败!"<<endl; exit(1); Create(head,in_stream); printf("输入的文章为:n"); OutPut(head); pr

12、intf("n"); printf("全部字母数:%d n",CountLetter(head); printf("数字个数:%d n",CountNumber(head); printf("空格个数: %d n",CountSpace(head); printf("文章总字数: %d n",CountAll(head); char str120,str220; printf("n");printf("*Menu*n");printf("*n&q

13、uot;);printf("* *1.统计字符串*n" ); printf("* 2删除字符串*n" ); printf("* 3.退出*n"); do printf(" 请输入你要选择的操作(1-3):n"); scanf("%d",&choice);switch(choice) case 1: printf("请输入要统计的字符串"); scanf("%s",&str1); printf("出现的次数:%d n",s

14、tr1,FindString(head,str1); printf("n"); CountAll(head); CountLetter(head); CountLetter(head); CountSpace(head); break; case 2: printf("请输入要删除的某一字符串:"); scanf("%s",str2); DelString(head,str2); printf("删除%s后的文章为:n",str2); OutPut(head); break; case 3: printf(&quo

15、t;退出");break;while(choice!=3); 其中采用一个菜单的形式来统计字符串和删除字符串,使得操作简便而且美观,用户进入菜单界面之后,根据相应的提示进行一步步的操作。该程序的详细流程图如下:五、调试分析1.该程序的关键是如何来建立和打开输入文件,如何来写菜单,如何来使程序的输入终止退出输入,如何来新建链表以及如何调用函数。首先要保证所写调用函数的正确性以及调用使得一些逻辑和细节问题,比如一些打开文件时的问题,要特别注意这样才可以省去很多时间,其次在调用函数时注意一些循环问题,有时候你利用调试键去找错误时可能会发现没错误,而只是逻辑上的一些很难看到的错误,这样的话就

16、得发费很多时间了,当时我就在这方面发费很多时间。以下是一个关于输入时的输入文件的读取,因为程序中的输入终止语句没有给定,导致读取文件出问题:2本次程序的调试采用循序渐进的策略。首先写好每一个模块的函数,然后再一个一个加入主函数中,一步一步进行,以保证整个程序的正确性,也便于随时调整,改正各种错误。调试该程序佷耗时间,比较麻烦,往往改动一个地方能影响到很多,从而在调试的时候学会了很多东西。下图为读取输入文件时的程序及一个小的显示菜单:六、测试结果1.测试数据及结果通过输入文件直接读取数据如图:其中字母个数,数字个数,空格个数及文章总字数均分行统计输出了,接下来出现一个小菜单,统计字符串模块,输入

17、要统计的字符串,可以查找出该字符串在文章中出现过的次数。选择1,界面运行如下:选择2,删除模块,输入要删除的字符串,执行删除后可以显示删除后的文本。界面如下:其中删除的那个字符串是全部删除的,在文章中出现的都会删除。退出页面,执行后的结果如下:2.输入文件3.问题思考:输入文章时,计算机怎样识别文章是否结束?输出文章时,怎样处理表示结束的字符?解决方案:输入文章时,以为结尾,当tmp0=64时,发现输入,则退出输入。输出时文章时,如果tmpstrlen(tmp)-1=5即发现表示结束的字符,用p->datastrlen(tmp)-1='0'除去最后一个控制符。注意事项:(

18、1)choice代表选项(共3个,多于3个,显示“不可识别选项”)。(2)建立文章,用链表存储,p=p->next=new LINE,即文章的每一行存储在一个结点中。(3)为结束标志。(4)了解常用AS码值。七、用户使用说明1、本程序可在VC环境下运行。2、程序运行后,先自动执行打开文件的部分,如果文件无法打开将有提示信息提示。同时将会自动执行统计数字、字符、空格、文章的总数,然后再调用显示菜单函数,屏幕上显示菜单,提示用户进行操作,如果用户选择1,则调用统计查找某一字符串函数,将有提示信息提示用户输入要统计的字符串,然后会在屏幕上显示要选择的操作。如果输入2,则调用删除函数,显示结果同时也会再次显示选择的操作;如果输入3则退出程序。以下为程序运行之后得到的画面,通过菜单方式,使用户能更好的使用该程序。下图为运行之后出现的画面:下图为输入1后出现的画面:下图为输入2、3后出现的画面;八、课程设计总结此次课程设计让我受益匪浅,可以总结为以下几点:1.采用链式顺序表结构实现了文章编辑的基本功能,实验过程中遇到了很多或大或小的问题,在这些问题的解决过程中,加深了对链表的理解,使我对链表操作的字符串的模式匹配有了更深更全面的认识。2.该课程设计提高

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论