用字符串实现一个简单的行编辑器.docx
《用字符串实现一个简单的行编辑器.docx》由会员分享,可在线阅读,更多相关《用字符串实现一个简单的行编辑器.docx(16页珍藏版)》请在冰豆网上搜索。
用字符串实现一个简单的行编辑器
用字符串实现一个简单的行编辑器
学生姓名:
刘慧指导老师:
易建勋
摘要本课程设计主要解决在文本编辑中,对行编辑的问题,通过字符串完善对文本的编辑,实现对文本的查找、替换、和修改数据。
在本课程设计中,系统开发平台为Windows2000,程序设计语言为C语言,程序运行平台为Windws98/2000/XP。
在程序设计中采用了字符串的方法实现对简单的行编辑器。
程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可以应用在实际中解决问题。
关键词程序设计;行编辑器;C语言;
1引言
对于日常生活中的文本编辑来说,行编器是一个很重要的问题,文本的完善关系到文件做出的完美,决定了人们在编辑文本的时效率。
一个好的用字符串实现的行编辑可以大大的提高人们办公效率。
1.1课题背景
行编辑器是文本编辑器的一种,针对行进行编辑。
现在看来当然非常地老式,这种编辑器起源于操作员还使用电传打字机的年代,也就是一个打印机连着键盘,因为没有显示屏,也就无法在文档中移动光标。
行编辑器只能从事最基本的文本输入与输出。
输入、编辑、文档显示并不能同步地进行。
一般而言,用户无法直接输入文本,而只能在文本终端上通过简要的命令,对已有文档进行添加或编写。
命令和文本,以及编辑器的相应输出,会根据他们的输入顺序,从底部开始逐一显示。
虽然命令一般会显示被修改的行,但如果要将行连同文档中的上下文一起显示,则需要另外单独的命令。
现在常见的编辑器,都是通过移动光标,来选取要编辑的文本段落,与此不同的是,行编辑器只能对“当前行”进行编辑。
一般也可在行内进行上下文匹配,或者选择特定行,以决定哪部分文档将被编辑或显示。
当然,这些编辑每次都只能针对一行。
行编辑器就只能一行一行的编辑,不能出错,一出错就得重来。
因此我们用字符串来定义,可以增强行编辑器的应用,增强可读性,加快人们编辑文本的效率,从而推进社会的发展。
这就是其重要意义。
1.2课程设计目的
数据结构是在整个计算机科学与技术领域上广泛被使用的术语。
它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。
数据结构有逻辑上的数据结构和物理上的数据结构之分。
逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。
数据结构是数据存在的形式。
数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
数据结构课程的主要目的是介绍一些常用的数据结构,阐明数据结构内在的逻辑关系,讨论它们在计算机中的存储表示,并结合各种数据结构,讨论对它们实行的各种运算的实现算法。
生活中的例子,比如现在要做一个考试系统,要描述每个考生的信息,有姓名、性别、考号等,全部这些信息就构成一个小数据结构,每个考生有他自己的数据结构,这些结构要如何存放在计算机中,各个结构之间是什么关系,对整体需要哪些操作,比如查询、删除,怎样存储会使这样的操作效率更高,这些就是数据结构要解决的问题。
如图1所示(下同)。
图1-1
1.3课程设计内容
本课程设计是用字符串实现一个简单的行编辑器,其中包括字符的按行录入及储存、文件内容的显示、文件内容的查找、文件内容的替换、文件的修改。
如图2所示:
图1-2用字符串实现行编辑器
2设计思路与方案
2.1设计思路
字符串数据类型是建模在形式字符串的想法上的数据类型。
字符串是几乎在所有编程语言中可以实现的非常重要和有用的数据类型。
在某些语言中它们可作为基本类型获得,在另一些语言中作为复合类型获得。
多数高级语言的语法允许通常用某种方式引用起来的字符串来表示字符串数据类型的实例;这种元字符串叫做“文本”或“字符串文本”。
封装在一起。
尽管形式字符串可以有任意有限的长度,实际语言的字符串的长度经常被限制到一个人工极大值。
一般的说,有两种类型的字符串数据类型:
“定长字符串”,它有固定的极大长度并且不管是否达到了这个极大值都使用同样数量的内存;和“变长字符串”,它的长度不是专断固定的并且依赖于实际的大小使用可变数量的内存。
在现代编程语言中的多数字符串是变长字符串。
尽管叫这个名字,所有变长字符串还是在长度上有个极限,一般的说这个极限只依赖于可获得的内存的数量。
一个简单的字符串操作是“连接”:
也就是说先写一个字符串S,随后在后面再写一个T得到ST这样一个过程。
其它的常见操作包括在一个长字符串中搜索一个子串,排列一组字符串以及分析一个字符串。
因为存在如此多的字符串应用方式,所以相应地有许多权衡了不同应用的相关算法。
高级的字符串算法通常使用包括后向树和有限状态机在内的复杂机制和数据结构。
因此我们使用字符串思想简单的行编辑器,更好地实现其可读性,从而使工作学习中更快捷更方便实现文本的编辑。
行编辑器只能从事最基本的文本输入与输出。
输入、编辑、文档显示并不能同步地进行。
一般而言,用户无法直接输入文本,而只能在文本终端上通过简要的命令,对已有文档进行添加或编写。
命令和文本,以及编辑器的相应输出,会根据他们的输入顺序,从底部开始逐一显示。
虽然命令一般会显示被修改的行,但如果要将行连同文档中的上下文一起显示,则需要另外单独的命令。
现在常见的编辑器,都是通过移动光标,来选取要编辑的文本段落,与此不同的是,行编辑器只能对“当前行”进行编辑。
一般也可在行内进行上下文匹配,或者选择特定行,以决定哪部分文档将被编辑或显示。
当然,这些编辑每次都只能针对一行。
2.2设计方案
为了编辑的方便,我们可以利用换页行和换行浮把文本划分成若干页,每页有若干行.我们可以把文本看成是一个字符串,称为文本串.页则是文本串的子串,行又是页的子串.比如有下列的一段源程序:
Main(){
Floata,b,max;
Scanf(“%f,%f”,&a,&b);
Ifa>bmax=a;
Elsemax=b;
};
我们可以把此程序看成是一个文本串.
为了管理文本串的页和行,再进入文本编辑的时候,编辑程序先为文本串建立相应的页表和行表,即建立各子串的储存映像。
页表的每一项给出了页号和该页的起始行号。
而行表的每一项则指示每一行的行号、起始地址和该行子串的长度。
文本编辑器中设立页指针、行指针和字符指针,分别指示当前操作的页、行和字符。
如果在某行内插入或删除若干字符,则要修改行表中该行的长度。
3详细实现
3.1输入文本
定义行插入格式、行删除格式、活区切换格式以及活区显示格式,在执行命令前必须用o命令打开文件,并用p命令显示出来。
3.2编辑文本
charstring[80];//存储每一行的元素
structtext*next;//指向后一个节点的指针
structtext*pre;//指向前一个节点的指针
intnum;//每一行元素的长度
intflat;//确定此行是否被删除的标志
}text;
FILE*fp,*out;
text*head;
intn=0,sum,delnum,xiugai=0,page=0;
操作的流程图如下图所示:
图3-1编辑文本流程图
3.3文档显示
本操作的流程图如下所示:
图3-2文档的显示流程图
3.4输出文本
调用单链表中的Find函数,查找该文件内容在单链表中的位置,如果位置异常,输出提示信息”没有该文件”,否则,调用单链表中的Get函数,找出该文件并输出。
操作流程图如下所示:
图3-3输出文本流程图
4运行环境与结果
4.1运行环境
在本课程设计中,系统开发平台为Windows2000,程序设计语言为VisualC++6.0,程序的运行环境为VisualC++6.0。
VisualC++一般分为三个版本:
学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。
实验中可以使用这三个版本的任意一种,在本课程设计中,以VisualC++6.0为编程环境。
MicrosoftVisualC++6.0是Microsoft公司的MicrosoftVisualStudio6.0开发工具箱中的一个C++程序开发包。
VisualC++包中除包括C++编译器外,还包括所有的库、例子和为创建Windows应用程序所需要的文档。
自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。
VisualC++从最早期的1.0版本,发展到最新的7.0版本,VisualC++已经有了很大的变化,在界面、功能、库支持方面都有许多的增强。
最新的7.0版本在编译器、MFC类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。
虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用的很大的局限性,只适用于Windows2000,WindowsXP和WindowsNT4.0。
所以实际中,更多的是以VisualC++6.0为平台。
VisualC++6.0是Microsoft公司推出的目前使用最广泛的基于Windows平台的可视化编程环境。
VisualC++6.0是在以往版本不断更新的基础上形成的,由于其功能强大,灵活性好,完全课扩展以及具有强大的Internet支持,因而在各种C++语言开发工具中脱颖而出,成为目前最为流行的C++语言集成开发环境。
VisualC++6.0秉承VisualC++以前版本的优异特性,为用户提供了一套良好的可视化开发环境:
主要包括文本编辑器、资源编辑器、工程创建工具、Debugger调试器等等。
用户可以在集成开发环境中创建工程、打开工程、建立、打开和编辑文件、编译、链接、运行、调试应用程序。
4.2运行结果
(1)在程序开始运行时,就会显示出提示语,提示“请输入字符串”,如下图所示。
.
图4-1显示最初运行的页面
(2)输入字符串。
结果如下图所示:
图4-2输入字符串
(3)当输入#则可以消去一个字符,如图所示
图4-3输入#后的运行图
(3)当输入@则可以消去一个字符,如图所示
图4-4输入@后的运行图
(5)提示语“Pressanykeytocontinue”退出程序。
如下图12所示:
图4-5退出程序
5结束语
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处在。
回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,今后一定好好学习.。
与其临渊羡鱼,不如退而结网。
这次数据结构课程设计给我的最大的印象就是如果自己有了兴趣,就动手去做,困难在勇气和毅力下是抬不了头的。
从做这个数据结构课程设计开始,无论遇到什么困难,我都没有一丝的放弃的念头。
出于对知识的渴望,出于对新技术的好奇,出于对一切未知的求知。
我完成了这次数据结构课程设计,不过这只是我学习路上的驿站,语言并不重要毕竟它仅仅是工具,用好一个工具并不是一件值得为外人道的事情,主要是了解学习思想。
在今后的日子里,我会好好学习专业知识,不断进步。
参考文献
[1]麻志毅,(原书第4版)机械工业出版社2002
[2]徐宝文李志谭浩强《C程序设计语言》(第二版·新版)C++程序设计机械工业出版社2004
[3]Pascal之父NiklausWirth《算法+数据结构=程序》科学出版社2001
[4]苏运霖《数据结构与算法》中南工业大学出版社2002
[5]Shaffer《数据结构与算法分析》(C++版、JAVA版)电子工业出版社1999
[6]粟利民,孙强.如何用VC++和VisualFoxpro进行ActiveX数据通讯.
[7]谭浩强.计算机C语言教程[M].北京:
电子工业出版,2001
[8]陈向阳.网络工程规划与设计[M].北京:
清华大学出版社,2007
附录:
源程序代码
//程序功能:
用字符串实现一个简单的编辑器
//程序作者:
刘慧
//最后修改日期:
2009-3-2
#include\study\c\head.h>
#include
#include
#include
#include
#include
#defineLISTSIZE80
typedefstructtext
{
charstring[80];//存储每一行的元素
structtext*next;//指向后一个节点的指针
structtext*pre;//指向前一个节点的指针
intnum;//每一行元素的长度
intflat;//确定此行是否被删除的标志
}text;
FILE*fp,*out;
text*head;
intn=0,sum,delnum,xiugai=0,page=0;
voidbyebye()
{
puts("\t\t\t******** * * ********");
puts("\t\t\t* * * * * ");
puts("\t\t\t* * * * * ");
puts("\t\t\t* * ** * ");
puts("\t\t\t******** * ********");
puts("\t\t\t* * * * ");
puts("\t\t\t* * * * ");
puts("\t\t\t* * * * ");
puts("\t\t\t******** * ********");
}
voidHELP()
{
printf("\n\t**********************************************************\n");
printf("\t** 打开文件:
o<行号><文件名><回车> **\n");
printf("\t** 行插入格式:
i<行号><回车><文本><回车>**\n");
printf("\t** 行删除格式:
d<行号1>[<空格><行号2>]<回车>**\n");
printf("\t** 活区切换格式:
n<回车> **\n");
printf("\t** 活区显示格式:
p<回车> **\n");
printf("\t** 注意:
在执行所有命令前必须先用o命令打开文件,并**\n");
printf("\t** 用p命令显示出来 **\n");
printf("\t**********************************************************\n");
system("pause");
printf("\n\n\n");
}
voidABOUT()
{
printf("\n\t\t*****************************************\n");
printf("\t\t**作者:
BLACKCAT **\n");
printf("\t\t**单位:
ZZU **\n");
printf("\t\t**E-mail:
********************* **\n");
printf("\t\t*****************************************\n");
system("pause");
system("cls");
printf("\n\n\n");
}
voidCreatelist()
{
text*p1,*p2;
p1=p2=(text*)malloc(sizeof(text));
head=NULL;
while(n<10)
{
n=n+1;
if(n==1)head=p1;
else
{
p2->next=p1;
p1->pre=p2;
p1->flat=0;
}
p2=p1;
p1=(text*)malloc(sizeof(text));
}
p2->next=NULL;
}
voidfreemem()
{
text*p;
for(p=head;head!
=NULL;)
{
head=p->next;
free(p);
p=head;
}
}
intEDIT()
{
charcmd;
do
{
cmd=getchar();
printf("\n请输入命令(按E键退出):
");
cmd=getchar();
switch(cmd)
{
case'e':
case'E':
if(xiugai==1)
saveall();
freemem();
system("cls");
return0;
case'o':
case'O':
Openfiles();
break;
case'p':
case'P':
Createlist();
display();
break;
case'n':
case'N':
saveanddisplay(10);
break;
case'd':
case'D':
del();
break;
case'i':
case'I':
insert();
break;
default:
printf("\n\n\n输入错误");
}
}while(cmd!
='e'&&cmd!
='E');
return0;
}
intOpenfiles()
{
charname[30],outname[30];
puts("请输入要打开的文件名:
");
scanf("%s",name);
if((fp=fopen(name,"r+"))==NULL)
{
printf("打不开原文件!
\n");
exit(0);
}
puts("请输入要写入的文件名:
");
scanf("%s",outname);
if((out=fopen(outname,"w+"))==NULL)
{
printf("打不开目标文件!
\n");
exit(0);
}
return0;
}
intdisplay()
{
inti;
charconti='y';
text*p;
while((!
feof(fp))&&(conti=='y'||conti=='Y'))
{
page++;
printf("\t\t第%d页\n",page);
for(i=0,p=head,sum=0;(i<10)&&(!
feof(fp));i++,p=p->next)
{
fgets(p->string,sizeof(p->string),fp);
puts(p->string);
p->flat=1;
p->num=strlen(p->string);
sum=sum+p->num;
}