资源描述
海南大学信息科学技术学院
数据构造课程设计报告
设计题目:简易文本编辑器
专业班级:通信三班
姓 名:代亮亮
学 号:
指引教师:吴哲晖
目 录
一、 需求分析
二、 设计规定
三、 概要设计
四、 详细设计
五、 运营成果
六、 心得体会
七、 参照文献
1.需求分析:
在当今消息迅速发展年代,运用网络来传递消息已经是消息传播唯一途径,而对一种文本修改是咱们每天都在做事,在这广域消息里迅速提取出对自己有用某些,因而我设计了一种简易文本编辑器,可以提供查找功能,替代功能。
2.概要设计:
为了更有效进行查找功能,该编辑器运用了链式存储,该存储构造特点是逻辑关系相邻两个元素在物理位置上并不相邻,并将输入文本分为一种一种链块,这样,就能大大加快了查找元素速度。
(1) 输入并显示文本信息。
(2) 在文本中对某些元素进行查找,
(3) 对查找元素替代。
(4) 显示替代元素位置。
(5) 显示元素替代后文本。
(6) 退出。
3.详细设计:
3. 1 程序模块阐明
3. 1.1 程序模块
为了更以便地完毕字符串查找,此程序采用串块链式存储构造存储方式。通过主模块调用四个小模块完毕文本编辑各种功能。顾客可在主模块上循环对程序进行操作。
主模块
查
找
模
块
替
换
模
块
编
辑
文
本
信
息
退
出
模
块
3.1.2 模块功能阐明
1.主模块:顾客可编辑任一文档,输入要在文本中查找信息。初始化一种字符串,并用串块链式存储构造存储。
2. 编辑文本信息:将顾客编辑文本信息分行输出来,并输出字符串长度和行数。
3.查找模块:遍历整个文本,查找字符串在串中位置,并输出其所在位置,直到遍历完整个文本结束。
4.替代模块:先查找你要替代字符所在位置,然后依照顾客选取与否替代该字符。
5.退出模块:退出程序,等待顾客下次重行运营该程序。
3.2程序流程图阐明
3.2.1 主函数流程图
开始
输入命令
命令
替代
退出
查找
结束
图2.1.主程序流程图
顾客可依照此函数输入想要进行操作来实现其相应编辑文本信息、查找字符在文本中所在位置、替代文本中字符串及查看当前文本字符数以及行数信息等一系列功能。
开始
3.2.2 显示模块流程图
输出文档长度和行数并输出字符串
记录文档长度和行数
初始化该文档用块链
储存构造储存
输入一种新文档
结束
图2.2 显示模块流程图
此模块重要实现顾客所编辑文本信息行数和字符总个数,以及输出文本字符信息。显示出顾客所编辑文本信息,并输出到屏幕上,为满足顾客需求,此模块可循环操作。
3.2.3 查找模块流程图
图2.3 查找流程图
此模块重要是完毕字符串查找以及替代文本中字符信息等功能。查找字符串重要是通过将所查找字符串和主串开始从第一种字符开始比较,如果相似,比较下一种字符,否则将指向当前字符串中字符指针向前移动已比较字符个数个单位,并且在想后移一种字符,然后再从头开始和和所查找字符穿一一比较。查找成功则返回字符所在位置并输出,接着继续进行下一轮查找,始终循环到将文本中信息读完为止,详见流程图2.3。
3.2.4 替代模块流程图.
图2.4. 替代流程图
此模块重要是完毕字符串查找以及替代文本中字符信息等功能。查找字符串重要是通过将所查找字符串和主串开始从第一种字符开始比较,如果相似,比较下一种字符,否则将指向当前字符串中字符指针向前移动已比较字符个数个单位,并且在想后移一种字符,然后再从头开始和和所查找字符穿一一比较。查找成功则返回字符所在位置并输出,接着继续进行下一轮查找,始终循环到将文本中信息读完为止。替代功能是在查找基本上进行,即也就是先查找到要替代词位置,然后依照顾客选取在此位置与否替代,同样也是始终循环到读完整个文本信息为止。详见流程图2。4。
3.2.5 将文本初始化
图2.5 初始化文本信息
将文本信息初始化到用块链式存储串中
4 函数描述
4.1 串初始化
初始化一种空串,然后将输入文本信息存储到此串中,由于这是采用块链式存储,顾客可以自定义行大小即一种节点存储字符串个数,所申请总节点数也就是字符行数。
4.2 查找函数
查找字符串重要是通过将所查找字符串和主串开始从第一种字符开始比较,如果相似,用for循环比较下一种字符,不同则将指向当前字符串中字符指针向前移动已比较字符个数个单位,并且再向后移一种字符,然后再从头开始和和所查找字符穿一一比较。查找成功则返回字符所在位置并输出,接着继续进行下一轮查找,始终循环到将文本中信息读完为止。
4.3 替代函数
替代功能是在查找基本上进行,即也就是先查找到要替代词位置,然后依照顾客选取在此位置与否替代,若需替代,则进入for循环完毕替代,然后再通过比较查找到下一种需替代位置,同样也是始终循环到读完整个文本信息为止。
4.4 串块链存储
采用串块链式存储长处是顾客可依照自已实际需要来定义每个节点大小,这样可减少空间挥霍,除此之外,链式存储还以便查找。
5 程序测试和运营成果
为以便查阅,因此选一串比较短字符串为例,以英文字符“ABCDEFGHIJKLMN1234567”为例,来实现下面所有功能
5.1 初始化一种串
5.1.1一方面顾客可输入顾客所需要文本信息,如“ABCDEFGHIJKLMN1234567”
程序开始运营界面如图4.1.1所示。
5.1.2.初始化“ABCDEFGHIJKLMN1234567”后,成果如下图4.1.2所示,分行输出文本字符信息以及文本长度和行数。
初始化一字符串
5.2 查找与替代字符串
4.2.1.编辑完文本后,顾客可自定义查找和替代字符,选取查找和替代选项(即第二个选项),;如下图4.2.1所示。依照阐明输入指令2进行查找
5.2.2输入你要查找字符串,以回车结束。如图4.2.2所示。依照提示,输入你要查找字符,如“D”
查找字符串
5.2.3输入你需要替代后字符,如“L”
5.2.4查找出所查找词在串中第一种位置,输出该位置并弹出指令顾客与否需要替代此位置词.
5.2.5依照顾客选取,如输入Y;则替代掉该位置词并接着查找下一种所查找字符所在位置或查找结束。
5.2.6若顾客不需要替代该位置字符,输入“N”程序将跳过该位置替代直接进入下一轮查找。
回到主程序,查找下一种字符,或继续进行下一轮操作。
6.设计心得体会:
在这学期里咱们学习了数据构造这门课程,由于这次课程设计没有详细实验题目规定,人们自由发挥,通过在网上查找资料和自己在本学期学习状况,我选取设计一种简易文本编辑器。通过这次课程设计我结识到了知识学习不能只局限于课本知识,更使我明白了编码能力和实践能力重要性,而咱们后来编码将会有更高规定,将会有更多设计规定,不能仅仅是从自身考虑出发,这将大大提高编码困难限度。而通过这次课程设计,也让我更加纯熟掌握了Visual C 环境和语法,熟悉了其构造,提高了自身分析能力和编码能力。同步,通过这次课程设计,我也对大一学习C语言进行了一次复习,再次复习了C语言编程语法。在编码与调试过程中,我也遇到了诸多问题,有诸多问题也是由于自己粗心而使调试时候耗费了诸多不必要世界,例如有地方少了分号,冒号,有地方忘掉了定义,有时候虽然没有浮现错误但是运营成果是错误,通过与同窗交流沟通,和在书上查看有关资料,最后解决了这些问题。
总之,通过这次课程设计不但锻炼了我实际操作能力,并且培养了严密思维能力和严谨态度,本次课程设计让我受益匪浅,并且加深了我对编程兴趣。
参照文献
1].王昆仑、李红。《数据构造与算法》。北京:中华人民共和国铁道出版社。
附 录(核心某些程序清单)
查找和替代函数
void chazhao(LString *T,char *chars,char *chars1)//所查找字符和替代后字符
{
Chunk *p,*q;
int m=0,c=0,a=1,b=0,d=0,a1=0,c1=0,c2=0,x=0;
char u;
p=q=T->head;
while(1)
{
if(c==CHUNKSIZE)
{
q=q->next;
a++;
c=0;
}
for(x=0;q->ch[c]==chars[m];x++)
{
m++;c++;
if(x==0)
{
b=a;d=c-1; }
if(c==CHUNKSIZE)
{
q=q->next;c=0;
}
if(chars[m]=='\0')//字符查完
{
printf("所查字符所在行位置是%d,第%d个位置开始\n",b,d+1);
printf("若需替代该字符,输入Y,否则输入N\n");
scanf("%c",&u);
fflush(stdin);
if(u!='N')
{
p=T->head;
a=b;c=d;
for(a1=1;a1<a;a1++)
p=p->next;
q=p;
for(;c1<m;c1++)//替代后字符chars1
{
if(c==CHUNKSIZE)
{
q=q->next;
c=0;
}
q->ch[c]=chars1[c2];
c2++;c++;
}
c2=0;c1=0;
StrPrint(*T);
}//替代完毕
c=d;a=b;
}
}
if(!*(q->ch+c+1+m))//串查完/
{
printf("查找完毕,已无匹配字符\n");
break;
}
else
{
p=T->head;
for(a1=1;a1<a;a1++)
{
p=p->next;q=p;
}
c=c+1;m=0;
}
}
}
生成一种其值等于chars串T,成功返回1,否则返回0
int StrAssign(LString *T,char *chars)
{
int i,j,k,l,m=0;
Chunk *p,*q;
i=strlen(chars);// i为串长度
if(!i)
return 0;
(*T).curlen=i;
j=i/CHUNKSIZE; // j为块链结点数,块个数 ,即行数
if(i%CHUNKSIZE>0) //局限性一种块,当成一种块即块数加1
j++;
printf("长度是%d\n行数是%d\n",i,j);
for(k=0;k<j;k++)
{
p=(Chunk*)malloc(sizeof(Chunk));
if(!p)
return 0;
if(k==0)
(*T).head=q=p;
else
{
q->next=p;
q=p;
}
for(l=0;l<CHUNKSIZE&&*chars;l++)
{
q->ch[l]=chars[m];m++;}
if(!*chars)
{
(*T).tail=q;
q->next=NULL;
for(;l<CHUNKSIZE;l++)
*(q->ch+l)=blank;
}
}
return 1;
}
输出字符串T
void StrPrint(LString T)
{
int i=0,j;
Chunk *h;
h=T.head;
while(i<T.curlen)
{
for(j=0;j<CHUNKSIZE;j++)
if(*(h->ch+j)!=blank) // 不是弥补空余字符
{
printf("%c",*(h->ch+j));
i++;
}
printf("\n");
h=h->next;
}
printf("\n");
}
源代码
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define CHUNKSIZE 4
#define n 26
char blank = '#'; // 全局变量,用于弥补空余
typedef struct Chunk
{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct
{
Chunk *head,*tail;
int curlen;
}LString;
void InitString(LString *T)// 初始化(产生空串)字符串T。
{
(*T).curlen=0;
(*T).head=NULL;
(*T).tail=NULL;
}
int StrAssign(LString *T,char *chars)// 生成一种其值等于chars串T, 成功返回1,否则返回0
{
int i,j,k,l;
Chunk *p,*q;
i=strlen(chars);// i为串长度
if(!i||strchr(chars,blank)) // 串长为0或chars中包括弥补空余字符
return 0;
(*T).curlen=i;
j=i/CHUNKSIZE; // j为块链结点数,块个数
if(i%CHUNKSIZE) //局限性一种块,当成一种块即块数加1
j++;
printf("长度是%d\n行数是%d\n",i,j);
for(k=0;k<j;k++)
{
p=(Chunk*)malloc(sizeof(Chunk));
if(!p)
return 0;
if(k==0) // 第一种链块
(*T).head=q=p;
else
{
q->next=p;
q=p;
}
for(l=0;l<CHUNKSIZE&&*chars;l++)
*(q->ch+l)=*chars++;
if(!*chars) // 最后一种链块
{
(*T).tail=q;
q->next=NULL;
for(;l<CHUNKSIZE;l++)// 用弥补空余字符(blank=‘#’)填满链表
*(q->ch+l)=blank;
}
}
return 1;
}
int StrEmpty(LString S)
{
if(S.curlen)
return 0;
else
return 1;
}
void StrPrint(LString T)// 输出字符串T
{
int i=0,j;
Chunk *h;
h=T.head;
while(i<T.curlen)
{
for(j=0;j<CHUNKSIZE;j++)
if(*(h->ch+j)!=blank) // 不是弥补空余字符
{
printf("%c",*(h->ch+j));
i++;
}
printf("\n");
h=h->next;
}
printf("\n");
}
void chazhao(LString *T,char *chars,char *chars1)///查找和替代函数///
{
Chunk *p,*q;
int m=0,c=0,a=1,b=0,d=0,a1=0,c1=0,c2=0,x=0;
char u;
p=q=T->head;
while(1)
{
if(c==CHUNKSIZE)
{
q=q->next;
a++;
c=0;
}
for(x=0;q->ch[c]==chars[m];x++)
{
m++;c++;
if(x==0)
{
b=a;d=c-1; }
if(c==CHUNKSIZE)
{q=q->next;c=0;}
if(chars[m]=='\0')//字符查完
{
printf("所查字符所在行位置是%d,第%d个位置开始\n",b,d+1);
printf("若需替代该字符,输入Y,否则输入N\n");
scanf("%c",&u);
fflush(stdin);
if(u!='N')
{
p=T->head;
a=b;c=d;
for(a1=1;a1<a;a1++)
p=p->next;
q=p;
for(;c1<m;c1++)//替代后字符chars1
{
if(c==CHUNKSIZE)
{
q=q->next;
c=0;
}
q->ch[c]=chars1[c2];
c2++;c++;
}
c2=0;c1=0;
StrPrint(*T);
}//替代完毕
c=d;a=b;
}
}
if(!*(q->ch+c+1+m))//串查完/
{
printf("查找完毕,已无匹配字符\n");
break;
}
else
{
p=T->head;
for(a1=1;a1<a;a1++)
{p=p->next;q=p;}
c=c+1;m=0;
}
}
}
void main()
{
char s1[n],s2[n],s3[n];//char *s3="22",*s2="aa";
LString t1;
int k,meum=0,L,h;
printf("\t=========阐明:一方面持续输入几种字符初始化串,以回车结束.==== ==\n");
printf("\t=====================1:查看串信息=====================\n\n");
printf("\t=====================2:查找与替代=====================\n\n");
printf("\t=====================3:退 出=====================\n\n");
printf("请输入文本信息!\n");
scanf("%s",&s1);fflush(stdin);
L=strlen(s1);
h=L/CHUNKSIZE;h++;
InitString(&t1);printf("初始化串t1后, \n");
k=StrAssign(&t1,s1);
StrEmpty(t1);
if(k==1)
{
printf("串t1为:\n ");
StrPrint(t1);
}
else
printf("出错\n");// 不能生成空串
while(1)
{
printf("\t请输入命令!(参照阐明)\n");
scanf("%d",&meum);fflush(stdin);
switch(meum)
{
case 1:
{
printf("初始化串t1后, \n");
StrEmpty(t1);
k=StrAssign(&t1,s1);
if(k==1)
{
printf("串t1为:\n ");
StrPrint(t1);
}
else
printf("出错\n");// 不能生成空串
}break;
case 2:
{
printf("请输入查找字符!\n");
scanf("%s",&s2);
fflush(stdin);
printf("请输入替代后字符!\n");
scanf("%s",&s3);
fflush(stdin);
chazhao(&t1,s2,s3);
}break;
case 3:{exit(0);}break;
default:
printf("输入错误!!请重新输入!\n");
break;
}
}
}
展开阅读全文