数据结构课设——文章编辑.doc_第1页
数据结构课设——文章编辑.doc_第2页
数据结构课设——文章编辑.doc_第3页
数据结构课设——文章编辑.doc_第4页
数据结构课设——文章编辑.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

课程设计报告课程设计题目:文章编辑 专 业:信息工程班 级: 1720601学生姓名 : 指导教师 : 、实验目的及要求:任务:输入一页文字,程序可以统计出文字、数字、空格的个数。静态存储一页文章,每行最多不超过80个字符,共N行; 要求:(1)分别统计出其中英文字母数和空格数及整篇文章总字数; (2)统计某一字符串在文章中出现的次数,并输出该次数; (3)删除某一子串,并将后面的字符前移。存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。 输出形式:(1)分行输出用户输入的各行字符; (2)分4行输出全部字母数、数字个数、空格个数、文章总字数(3) 输出删除某一字符串后的文章;实验时间、地点: 2013.6.16至6.20于软件楼301一、概要设计(实验思路)1.问题分析本程序是对一段英文文章的内容进行处理,存储方式采用链式存储。对于文本的输入,采用头插法将文本信息存储到链表已申请好的存储空间中,在此部分设计中最大的问题在于输入文章过程中输入的字符数大于80时如何换行;对于文本内容的统计,使用循环对已存储的文章进行匹配,字母数、空格数、数字数直接通过比较即可得到;对于文本内容的处理,查找部分仍是使用循环对已存储的文章进行匹配,判断需要查找的字符或者字符串是否与文章中某部分内容相同,如果存在相同的记录相同的个数及位置并输出个数及位置。删除部分先使用程序的查找功能对文章中需要删除的字符或者字符串进行查找,然后对其进行删除。2. 数据结构选择本程序是对输入的文字进行操作,故使用的数据结构为单链表操作。根据第一部分的问题分析有该链表操作有3部分:另有全局变量 *head,作为文章的头指针。创建结构体: typedef struct list char data80;/记录一行字符int length;/记录一行字符长度 struct _list *next;/后继指针struct _list *pre;/前趋指针int row;/记录整篇文章的行数LinkList;在文章内容创建部分中使用线性表的链式存储,并使用全局变量对文本的各种信息进行存储;文章的读取、内容统计、删除、查找都采用链表操作完成。3.流程图(1)主框架:(2)文章内容统计子菜单(3) 文章内容处理子菜单文章内容处理子菜单SearchWord()函数实现查找DeleteWord()函数内容删除Printword()显示当前内容返回主菜单退出程序(4)使用函数列表及关系图函数名:1、CreatWord() 文本输入函数,对文本的内容进行输入2、PrintWord() 当前文本内容输出函数,将当前存储在链表中的文本内容输出5、CountWord() 文章内容统计函数,对存储在链表中文本内容进行统计6、SearchWord() 文章内容查找函数7、DeleteWord() 文章内容删除函数8、Bmenu() 文本内容处理菜单函数9、AboutWord() 显示作者信息的函数10、menu() 主菜单函数11、main() 主函数关系图:二、详细设计(实验过程)1、数据结构定义typedef struct list char data80;/*记录一行字符*/ int length;/*记录一行字符长度*/ struct list *next;/*后继指针*/ struct list *pre;/*前趋指针*/ int row;/*记录整篇文章的行数*/LinkList;2、全局变量定义LinkList *head;/*定义全局变量*head,文章首行头指针*/int NUM,C,N;/*定义全局变量,Num用来记录行号,C用来记录子串在主串中出现的总次数*/3、函数说明(1)CreatWord() 文本创建函数LinkList *CreatWord() LinkList *temp; char ch; int i,j; head-next=(LinkList *)malloc(sizeof(LinkList); / head-pre=NULL; temp=head-next; / temp-pre=NULL; temp-length=0; for(i=0;idatai=0;printf(tt*n);printf(tt* 创建文本 *n);printf(tt*n);printf(tt请输入文章(输入#号结束):nn);for(j=0;jLink_Size;j+)for(i=0;idatai=ch;temp-length+;if(ch=#)NUM=j;break;if(ch=#)temp-length=i;temp-next=NULL;break;temp-next=(LinkList *)malloc(sizeof(LinkList) ;temp-next-pre=temp;temp=temp-next;for(i=0;idatai=0;temp-row=NUM+1;system(cls);return (temp);说明:a、 定义LinkList指针变量*temp: LinkList *temp;b、 定义文本输入变量ch,记录文本行数变量j,记录每行字符数变量i;c、 申请动态存储空间:head-next=(LinkList *)malloc(sizeof(LinkList);d、 首行头指针的前驱指针为空:head-pre=NULL;首行指针: temp=head-next;首行指针的前驱指针也为空: temp-pre=NULL;定义没输入字符时文章长度为0: temp-length=0;初始化为字符串结束标志,防止出现乱码: for(i=0;idatai=0;e、 利用循环进行文本输入for(j=0;jLINK_INIT_SIZE;j+)/ 控制一页 for(i=0;idatai=ch; /给temp指向的行赋值 temp-length+;/行中字符长度加1 if(ch=#) NUM=j; break; /文章结束时,Num来记录整个文章的行数 在字符输入的过程中,如果在单行输入的字符超过了80个字符,则需要以下操作 :输入字符数大于80,重新分配空间建立下一行:temp-next=(LinkList *)malloc(sizeof(LinkList) ;给temp的前驱指针赋值:temp-next-pre=temp;temp指向当前行: temp=temp-next;将下一行初始化为字符串结束标志,防止出现乱码:for(i=0;idatai=0;记录整个文章的行数:temp-row=NUM+1;返回指向最后一行指针:return temp;文本输入部分到此结束。(2)PrintWord() 文章显示函数void PrintWord()int i,j;LinkList *p;p=head-next;system(cls);printf(n);printf(tt*n);printf(tt* 文本显示 *n);printf(tt*n);printf(n当前文章的内容是:n);for(j=0;j=NUM&p!=NULL;j+)for(i=0;(idatai)!=#;i+)printf(%c,p-datai);p=p-next;说明:a、 定义文本行数变量j,每行字符数i:int i,j;b、 定义指针变量:LinkList *p;c、 将指针p指向链表表头:p=head-next;d、 利用循环输出链表中信息: for(j=0;j=NUM&p!=NULL;j+)=for(i=0;(idatai)!=#;i+)=printf(%c,p-datai);p=p-next; 文本显示部分到此结束。(3)CountWord() 文章内容统计函数void CountWord()LinkList *temp;char ch;int i,j,t;int WORD=0,word=0,space=0,num=0,sum=0;temp=head-next;for(j=0;j=NUM;j+)for(i=0;(idatai)!=#;i+)ch=temp-datai;if(ch=A)&(ch=a)&(ch=0)&(chnext;利用循环对链表中信息进行匹配判断,将大写字母数、小写字母数、空格数、数字数和总字数统计出来:for(j=0;j=NUM;j+)for(i=0;(idatai)!=#;i+)ch=temp-datai;if(ch=A)&(ch=a)&(ch=0)&(chnext; strcpy(Data,str1); for(i=0;i=NUM;i+) for(j=0;jdataj)=Datak) k+; else if(Datak!=0)j=j-k;k=0; if(Datak=0) sum+;j=j-k+1;printf(ttt第%d次出现在第%d行第%d列n,l,i+1,j);l+;k=0;continue; temp=temp-next; printf(nttt字符串总共出现次数为:%dnn,sum); C=sum;N=i*80+j;说明:a、 定义一个数组,用来记录需要查找的字符内容:char Data20;b、 定义定义文本行数变量j,每行字符数i,记录字符出现的次数变量:int i,j,m=0.,sum=0;c、 对形参中定义的指针变量进行操作,使其指向链表表头:temp=head-next;d、 使用拷贝函数,将形参中str1的值赋给Data:strcpy(Data,str1);e、 利用循环进行查找操作:for(i=0;i=NUM;i+) /*利用循环进行查找操作*/ for(j=0;jdataj)=Datak) k+;/*将输入的查找字符与链表中信息比较,找到第一个相同的字符*/ else if(Datak!=0)j=j-k;/*从主串第j-k个位置重新查找*/k=0; if(Datak=0) sum+;/*此字符出现的次数加1*/j=j-k+1;/*j记录下该字符串出现的位置*/printf(ttt第%d次出现在第%d行第%d列n,l,i+1,j);l+;k=0;continue; temp=temp-next;/*指向下一行*/ 文本内容查找部分到此结束。(5)DeleteWord() 文章内容删除函数void DeleteWord(char *str2) char Data20; LinkList *temp,*term; int i,j,a,k,m,y,num; strcpy(Data,str2); for(y=0;yC;y+) num=80;k=0,m=0; temp=head; for(i=0;inext; for(j=0;jdataj)=Datak) k+; else if(Datak!=0) j=j-k;k=0; if(Datak=0) num=j;break; if(num80) break; for(;i=NUM;i+) for(;j80;j+) if(j+1data80-k+num=temp-dataj+1; elsetemp-dataj-k+1=temp-dataj+1; term=temp; temp=temp-next; j=0; 说明:a、定义一个数组用来存储需要删除的字符或者字符串:char Data20;b、定义指针变量:LinkList *temp,*term;c、定义整形变量用来控制行数、字符数:int i,j,k,m,y,num;d、使用拷贝函数讲形参中需要删除的字符或字符串赋值给已定义的数组:strcpy(Data,str2);f、 使用循环进行删除操作:for(y=0;yC;y+) num=80;k=0,m=0; temp=head; for(i=0;inext; for(j=0;jdataj)=Datak) k+; else if(Datak!=0) j=j-k;k=0; if(Datak=0) num=j;break; if(num80) break; /*首先是使用循环查找到需要删除字符或者字符串的字符数以及字符或者字符串的位置,以便于删除*/for(;i=NUM;i+) for(;j80;j+) if(j+1data80-k+num=temp-dataj+1;/*删除的字符串不在最后一行,将下一行的字符(由temp指向)前移到前行*/ elsetemp-dataj-k+1=temp-dataj+1;/*当要删除的字符串在最后一行只要将最后一行的字符前移*/ term=temp; temp=temp-next;/*在使用循环,从查找到的字符或者字符串开始进行删除,在一行删除完毕之后,转至下一行进行删除*/ j=0; 文本内容删除部分到此完成。(6)Bmenu() 文章内容处理菜单函数void Bmenu(LinkList *temp) char str120;char str220;int t;do /*利用do while 循环来控制主菜单显示*/ printf(n);printf(ntt*n);printf(tt* 文章内容处理子菜单 *n);printf(tt*n);printf(tt* 1、查找文章中的字符或者字符串 *n);printf(tt* 2、删除文章中的字符或者字符串 *n);printf(tt* 3、显示当前文章内容 *n);printf(tt* 4、返回主菜单 *n);printf(tt* 5、直接退出系统 *n);printf(tt*n);printf(tt 请选择:);scanf(%d,&t);if(t5)|(t6)|(t1) printf(tt 对不起,无此功能!请回车重新选择!.n);printf(tt);fflush(stdin);getchar();elseswitch(t) case 1: system(cls); printf(n);temp=CreatWord();break; case 2: system(cls); PrintWord();printf(n);printf(n);printf(ntt按回车键继续);getchar();getchar();system(cls);break;case 3:system(cls);CountWord();break;case 4: system(cls); Bmenu(temp);break;case 5:system(cls); AboutWord();printf(ntt按回车键继续);getchar();getchar();system(cls);break;if(t=6) break;while(1);说明:用do-while 语句来制作文章内容处理菜单,用switch 语句来选择实现功能。(9)main() 主函数void main()head=(LinkList *)malloc(sizeof(LinkList);menu();说明:/*先为head申请存储空间,然后创建指针变量temp,然后直接在主菜单函数中进行其他操作*/三、上机调试上机调试过程中遇到的问题及解决方法:a)由于本程序的操作大部分都为经常使用的查找、删除,基本的算法及代码都可以通过查找资料得到,故没有出现多大的问题。错误主要是在于删除等子函数中复杂操作过程中出现的小问题。b)删除及查找过程中需要在子函数中定义一个数组变量,用来存储输入的信息,然后用来与链表中的信息进行比较以达到删除或者查找。另为达到将输入的信息赋值给子函数中定义的数组,特使用了strcpy()函数。c)为了将程序界面更加的完美,做了3个菜单。清屏函数使用system(“cls”),背景字体颜色编写了一个color函数。d)一开始编写程序时,在保存、读取这一部分考虑到方便就采用了以节点为单位来存储。由于文件存储的局限性,以节点存储发生错误。后来采用了单个字符存储和读取来保证文本的保存和读取。e)在程序中为了方便采用了全局变量来做头结点,同时还定义了几个全局变量。在考虑到全局变量的稳定性,建议采用局部变量。通过不断调用头结点来实现函数功能。四、测试结果及分析测试文章:Good evening,London.Allow me first to apologize I do,like many of you,appreciate the comforts of the everyday routine the security of the familiar,the tranquility of repetition.I enjoy them as much as any bloke.There are,of course,those

温馨提示

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

评论

0/150

提交评论