1、文字编辑摘要设计一个文字编辑程序,用来实现以下功能:分别统计出其中英文字母和空格数及整篇文章总字数;统计某一字符串在文章中出现的次数,并输出该次数;删除某一子串,并将后面的字符前移;插入一子串,并输出插入子串后的文章。用线性表实现存储。关键词:文字编辑、线性表、串目 录1问题描述 12需求分析 13概要设计 13.1抽象数据类型定义 132模块划分 24详细设计 34.1函数定义 34.2主要算法的描述 45测试分析 76课程设计的总结与体会 8参考文献 9附录(源程序清单) 101问题描述输入一页文字,程序可以统计出文字、数字、空格的个数。(1) 分行输出用户输入的各行字符;(2) 分4行输
2、出全部字母数、数字个数、空格个数、文章总字数;(3) 输出删除某一字符串后的文章。2需求分析(1)静态存储一页文章,每行最多不超过80个字符,共N行(2)分别统计出其中英文字母数和空格数及整篇文章总字数;(3)统计某一字符串在文章中出现的次数,并输出该次数;(4)删除某一子串,并将后面的字符前移;(5)插入一子串,并输出插入子串后的文章;(6)存储结构使用线性表,分别用几个子函数实现相应的功能。3概要设计3.1抽象数据类型定义(1)定义最大行数为10#define LINK_INIT_SIZE 10 ;(2)定义全局变量,Num用来记录行号,C用来记录子串在主串中出现的总次数int NUM,C
3、,N; (3)线性表的定义typedef struct _list char s80; int length; struct _list *next; struct _list *pre; int row; linklist; linklist *head; (4)定义子函数Get(),用来输入文章 linklist * Get() 接收输入字符 ch=getchar();(5)定义子函数out,用来输出文章void Out()。32模块划分本程序包括四个模块:(1)主程序模块int main()欢迎使用简易文本编辑器系统;所输入要编译的文章为;显示文章并且输出所有统计项目;请输入要查找的字符
4、串;请输入要删除的子串;删除子串后的文章为;请输入要插入的子串;请输入要插入的行;请输入要插入的列;插入子串后的文章;再见;错误选择,重新开始;(2)线性表定义实现线性表的定义(3)输入函数实现文章的输入(4)输出函数实现文章的输出4详细设计4.1函数定义(1)主函数运用switch语句来实现选择菜单,同时实现了各个结果的输出。(2)线性表的定义运用了结构体:typedef struct _list /行表结构 char s80; /记录一行字符 int length; /记录一行字符长度 struct _list *next; / 后继指针 struct _list *pre; /前趋指针
5、int row; /记录整篇文章的行数linklist; linklist *head; /定义全局变量*head,文章首行头指针(3)输入文章的函数 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; /没输入字符时文章长度为0for(i = 0; i si = 0; /初始
6、化为字符串结束标志,防止出现乱码printf(请输入文章(#结束输入):n);(4)输出文章的函数t=head-next; for(j=0;j=NUM & t != NULL;j+) for(i=0;(isi)!=#;i+) printf(%c,t-si); /输出整个文章 printf(n); t=t-next; /指向下一行 4.2主要算法的描述(1) 主函数如图4.2.1所示, 实现了各个结果的输出。图4.2.1(2)子函数Get()如图4.2.2所示,实现文章的输入。图4.2.2(3)子函数Out()如图4.2.3所示,实现文章的输出。图4.2.35测试分析文章输入如图5.1,输入一段
7、文字。图5.1文章输出如图5.2,将前面输入的文章输出。图5.26课程设计的总结与体会通过这次课程设计使我充分的理解了用线性表实现文字编辑的基本原理,知道了线性表链式存储的定义,以及链表的一些基本操作算法的描述,同时也学会一些简单文字编辑的程序。虽然此次的程序我没能全部都参与,而只是完成了其中的几个部分,但是我的能力还是得到了提升。当然,我完成的那些部分还不是很完备,但是总体还是一个比较能体现数据结构知识点能力的程序了,当然只是相对于我这个初学者来说。在刚开始编程的时候,我感到很茫然,几天下来我没有半点头绪,于是我开始有了一个错误的想法,在网上下载一个程序浑水摸鱼,或者找朋友帮忙完成。但是在成
8、老师以及同组成员的热情帮助和讨论下,我查找资料,参考教材,花费俩天将程序编写了出来,在经过成老师的认真批改,源程序诞生了。之后,我一步一步将其他剩余的部分也完成了。看着自己的成果,真的很高兴,很有成就感。在此我非常要感谢的是我的指导老师李首洪老师,感谢老师的细心认真的辅导,让我对数据结构这门课程有了更新的认识和理解。这次课程设计能够顺利的完成,当然有我个人的努力,但同时也离不开指导老师的答疑解惑,以及同组成员的帮助与合作。在此我再次向成老师以及其他两位组员表示诚挚感谢。参考文献1 严蔚敏,吴伟民. 数据结构(C语言版)M. 北京:清华大学出版社,20022 刘振鹏,张晓莉,郝杰数据结构M北京:
9、中国铁道出版社,20033 李春葆数据结构习题与解析(C语言篇)M北京:清华大学出版社,2000附录(源程序清单)源程序#include #include #include #include using namespace std;#define LINK_INIT_SIZE 10 /定义最大行数为10int NUM,C,N; /定义全局变量,Num用来记录行号,C用来记录子串在主串中出现的总次数typedef struct _list /行表结构 char s80; /记录一行字符 int length; /记录一行字符长度 struct _list *next; / 后继指针 struct
10、 _list *pre; /前趋指针 int row; /记录整篇文章的行数linklist; linklist *head; /定义全局变量*head,文章首行头指针linklist * Get() /子函数Get(),用来输入文章 linklist *temp; char ch; int i,j; head-next=(linklist *)malloc(sizeof(linklist); /申请内存空间 head-pre = NULL; /首行头指针的前驱指针为空 temp=head-next; /首行指针 temp-pre = NULL; /首行指针的前驱指针也为空 temp-leng
11、th = 0; /没输入字符时文章长度为0 for(i = 0; i si = 0; /初始化为字符串结束标志,防止出现乱码 printf(请输入文章(#结束输入):n); for(j=0;jLINK_INIT_SIZE;j+)/ 控制一页 for(i=0;isi=ch; /给temp指向的行赋值 temp-length +;/行中字符长度加1 if(ch=#) NUM=j;break; /文章结束时,Num来记录整个文章的行数 if(ch=#) temp-length = i;temp-next=NULL;break;/结束时,最后一行长度是i,temp是最后一行 temp-next=(li
12、nklist *)malloc(sizeof(linklist); /输入字符数大于80,重新分配空间建立下一行 temp-next-pre = temp;/给temp的前驱指针赋值 temp=temp-next;/temp指向当前行 for(i = 0; i si = 0; temp-row = NUM + 1;/记录整个文章的行数 return temp;/返回指向最后一行指针 void Out() /子函数out,用来输出文章 int i,j; linklist *t; t=head-next; /t指向文章首行 for(j=0;j=NUM & t != NULL;j+) for(i=0
13、;(isi)!=#;i+) printf(%c,t-si); /输出整个文章 printf(n); t=t-next; /指向下一行 void WorldNum() /子函数WorleNum,用来统计字符数 linklist *temp; char ch; int i,j,Eworld=0,num=0,space=0,world=0,build=0; temp=head; for(j=0;jnext; /t指向文章首行 for(i=0;(isi!=#);i+) ch=temp-si; if(ch=a)&(ch=A)&(ch=0)&(chnext; strcpy(aa,ss); for(i=0;
14、i=NUM;i+) for(j=0;jsj)=aak) k+;/找第一个相同字母 else if(aak!=0) j=j-k;k=0; /从主串第j-k个位置重新查找 if(aak=0) sum+;/出现次数加1 j=j-k+1;/j记录下该字符串出现的位置 printf(第%d次出现在第%d行第%d列n,l,i+1,j+1); l+; k=0; continue; temp=temp-next; /指向下一行 printf(字符串总共出现次数为:%dnn,sum); C=sum; /全局变量C用来记录子串在主串中出现的总次数 N=i*80+j;/记录字符串出现的行号 void Aftdel(
15、char *ss) /子函数Aftdel,用来删除子串 char aa20; linklist *temp,*term; int i,j,k,m,y,num; strcpy(aa, ss); for(y=0;yC;y+) num=80; k=0,m=0; temp=head; for(i=0;inext; for(j=0;jsj)=aak) k+; else if(aak!=0) j=j-k;k=0; if(aak=0) num=j;break; if(num80) break; for(;i=NUM;i+) for(;j80;j+) if(j+1s80-k+num=temp-sj+1; /删
16、除的字符串不在最后一行,将下一行的字符(由temp指向)前移到前行 else temp-sj-k+1=temp-sj+1; /当要删除的字符串在最后一行只要将最后一行的字符前移。 term=temp; /指针后移 temp=temp-next;j=0; linklist * Insert(linklist *temp,char *ss,int i) linklist* cur; int n=strlen(ss); int m ; int insertRow = i / 80 + 1; int row = temp-row; int j; if(insertRow = row) /插入的位置在最
17、后一行 for(m=temp-length-1; m = (i % 80) & n 0; m -) temp-sm + n = temp-sm; /最后一行插入位置后面的字符全部向后移n位 for(m = (i % 80), j = 0; m sm = ssj; /将要插入的字符串赋值到插入的位置。 else /插入的位置不在最后一行 int o = 0; for(int p = insertRow; p length - 1 - o; m = 0 & n 0; m -) temp-sm + n = temp-sm; /将最后一行整体后移n位 cur = temp;/cur指向当前行 temp
18、 = temp-pre;/temp指向前一行 temp-length = 80; for(m = temp-length - n, j = 0; m length; m +, j +) cur-sj = temp-sm;/将前一行后n个字符移到下一行前n个字符 for(m = temp-length - n - 1; m = (i % 80); m -) temp-sm + n = temp-sm;/插入行插入位置后的字符后移n位 for(m = (i % 80), j = 0; m sm = ssj;/要插入的字符赋值到插入位置 return temp; int main() int b,p
19、,q;bool stop=0;char y;int i; char ss20;char a10; printf(*n); printf(欢迎使用简易文本编辑器系统n); printf(*n); head=(linklist *)malloc(sizeof(linklist); linklist *temp=Get(); do printf(*n); printf(1 显示文章并且输出所有统计项目n); printf(2 查找字符串n); printf(3 删除子串n); printf(4 插入子串n); printf(5 结束程序n); printf(*n); printf( 请选择:); c
20、ina; if(strcmp(a,1)=0) b = 1; else if(strcmp(a,2)=0) b = 2; else if(strcmp(a,3)=0) b = 3; else if(strcmp(a,4)=0) b = 4; else if(strcmp(a,5)=0) b = 5; else b=6; switch(b) case 1: printf(所输入要编译的文章为:n); Out(); WorldNum(); printf(继续? 请选择:); getchar(); if(getchar()=n) stop=1; break; case 2: printf(请输入要查找
21、的字符串:n); getchar(); gets(ss); Compare(ss, temp); printf(继续? 请选择:); scanf(%s,&y); if(y=n) stop=1; break; case 3: printf(请输入要删除的子串:n); scanf(%s,ss); Compare(ss, temp); Aftdel(ss); printf(删除子串后的文章为:n); Out(); printf(继续? 请选择:); getchar(); if(getchar()=n) stop=1; break; case 4: printf(请输入要插入的子串:n); scanf(%s,ss); printf(请输入要插入的行:n); scanf(%d,&p); printf(请输入要插入的列:n); scanf(%d,&q); i=(p-1)*80+q; Insert(temp,ss,i); printf(插入子串后的文章为:n); Out(); printf(继续? 请选择:); getchar(); if(getchar()=n) stop=1; break; case 5: stop=1;printf(t再见!n) ;break; case 6: printf(错误选择,重新开始n); break; while(!stop);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1