




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、摘 要文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑程序。行编辑器只能从事最简单的输入输出。输入、编辑、文档显示并不能同步地进行。编辑的文本文件可能很大,全部读入内存的做法既不经济也不总能实现。一种解决办法是逐行地编辑,任何时刻只把待编辑文件的一行放在内存,称为活区。允许输入出错时发现错误并及时更正。一般而言,用户无法直接输入文本,而只能在文本终端上通过简要的命令,对已有的文档进行添加或编写。现利用字符串来定义,设计并实现了一个简单行编辑程序,具备行编辑器的行插入,行删除等基本功能。关键词:行编辑器;文本
2、;字符串Abstract文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑程序。行编辑器只能从事最简单的输入输出。输入、编辑、文档显示并不能同步地进行。一般而言,用户无法直接输入文本,而只能在文本终端上通过简要的命令,对已有的文档进行添加或编写。现利用字符串来定义,设计并实现了一个简单行编辑程序,具备行编辑器的行插入,行删除等基本功能。Text editor is the basic software tools, the use of computers for word processing, to ac
3、hieve the insertion of text files, delete modify operation. Restrictions on these operating units to conduct the editor called line editing process. Line editor can be engaged in the input and output of the most simple. The input, editing, document display can not synchronously. Edit text files can
4、be quite large, all read into memory is neither economic nor can always achieve. One solution is to edit line by line, any moment only put a line to edit the file in memory, known as the living area. Allow the discovery of the error input errors and corrected in time. In general, the user cannot ent
5、er text directly, but only through the brief commands in the text terminal, the document may be added or write. We use the string to define, design and realize a simple line editor, with the line editor row insert, delete and other basic functions.Keywords: line editor; text; string目 录1.概述11.1设计背景11
6、.2内容21.3要求22.概要设计32.1程序模块图32.2 存储结构的定义42.3功能函数42.4主函数53.详细设计53.1数据结构设计53.2程序说明73.3主要函数设计7行删除函数del()子程序设计7行插入行数insert()子程序的设计10活区切换函数saveanddisplay(20)子函数设计12显示函数display()子程序设计134.调试过程及实验结果164.1调试过程165总结21参考文献22致 谢231.概述1.1设计背景行编辑器是文本编辑器的一种,针对行进行编辑。现在看来当然非常地老式,这种编辑器起源于操作员还使用电传打字机的年代,也就是一个打印机连着键盘,因为没有
7、显示器,也就无法在文档中移动光标。行编辑器只能从事最简单的输入输出。输入、编辑、文档显示并不能同步地进行。一般而言,用户无法直接输入文本,而只能在文本终端上通过简要的命令,对已有的文档进行添加或编写。命令和文本,以及编辑器的相应输出,会根据他们的输入顺序,从底部开始逐一显示。虽然命令一般会显示被修改的行,但如果要将行连同文档中的上下文显示,则需要另外单独的命令。现在常见的编辑器,都是通过移动光标,来选取要编辑的文本段落,与此不同的是,行编辑只能对“当前行”进行编辑。一般也可以在行内进行上下文匹配,或者选择特定行,以决定哪部分文档将被编辑或显示。当然,这些编辑每次都只能针对一行。行编辑器就只能一
8、行一行的编辑,不能出错,一出错就得重来。因此我们用字符串来定义,可以增强行编辑器的应用,增强可读性,加快人们的编辑文本的效率,从而推进社会的发展。这就是其重要意义。1.2内容本课程设计主要解决在文本编辑中,对行编辑的问题,通过字符串完善对文本的编辑,实现对文本的查找、替换、和修改数据。在本课程设计中,系统开发平台为Windows2000,程序设计语言为C语言,程序运行平台为Windws 98/2000/XP。在程序设计中采用了字符串的方法实现对简单的行编辑器。程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可以应用在实际中解决问题。用字符串实现一个简单的行编辑器,其中包括字符的按行
9、录入、修改、替换、查询。用栈实现简单的行编辑程序,文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑程序。被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法即不经济,又不总能实现。一种解决方法是逐段的编辑。任何时刻只把待编辑文件的一段放在内存,称为活区。试按这种方法实现一个简单的行编辑程序,设文件每行不超过320个字符,很少超过80个字符。1.3要求(1)用栈实现简单的行编辑程序,主要功能有:行插入(格式:i<行号><回车><文本><回车>,即&
10、#160;将<文本>插入活区中的第<行号>行之后);行删除(格式:d<行号1> <行号2><回车>, 删除活区中第<行号1>行(到第<行号2>行),两种格式的例子是:“d10 ”和“d10 14 ”);活页切换(格式:n<回车>, 将活区写入输出文件,并从输入文件中读入下一段,作为新的活区); 活区显示(格式:p<回车>, 逐页地(每页20行)显示活区内容,每显示一页之后由用户决定是否继续显示以后各页(如果存在)。印出的每一
11、行要前置行号和一个空格符,行号固定占4位,增量为1); (2)设文件每行不超过320个字符,很少超过80个字符,由学生依据软件工程的测试技术自己确定,注意测试边界数据,如首行、尾行。算法对于合法的输入数据都能产生满足规格说明要求的结果;(3)算法对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果;对算法实现过程中的异常情况能给出出错信息;(4)较高要求:加入复杂操作,如对某行进行串替换等;2.概要设计该程序采用模块化设计,主要分为字符串显示模块,字符串插入模块,字符串删除模块,帮助信息模块。用户通过主模块对其余各模块进行调用,实现程序功能。2.1程序模块图行编辑器
12、字符串显示模块字符串插入模块字符串删除模块帮助信息模块图1.1程序模块图2.2 存储结构的定义typedef struct text char string80;/存储每一行的元素 struct text *next;/指向后一个节点的指针 int flat;/确定此行是否被删除的标志text,*textp;2.3功能函数Status Createlist(textp &head);功能:建立一个80个节点的链表,是整个活区的大小int del(textp head);功能:删除显示的活区的任意一行。int display(textp &head);功能:按照每页20行的规格显
13、示活区的内容。void freemem(textp &head);功能:销毁链表,释放内存。int insert(textp &head);功能:在显示的活区插入一行内容。 Status SaveFile(textp head,FILE *out);功能:将活区的内容保存到输出文件。 Status LoadFile(textp head,FILE *fp);功能:从输入文件读取内容到活区。 void HELP();功能:提供命令的格式。2.4主函数void main()初始化; 输入命令;Switch(c)case e: 退出并保存编辑的内容case p: 显示活区 case
14、n: 活区切换case d: 删除一行case i: 插入一行case c: 清屏case h: 获得帮助功能:进行初始化,调用其它函数,实现功能。3.详细设计3.1数据结构设计 栈是一种先进后出的线性表,为了能按照原来的输入顺序输出元素,我在程序中设计了两个栈,第一个栈用来存储输入的字符,然后把第一个栈的元素出栈,并且把出栈的元素放入第二个栈中,这样就实现了出栈是元素的顺序和最开始输入的顺序是一致的了。首先,构造一个空栈函数InitStack(SqStack &S);然后设计输入函数push(SqStack &S,char e)和出栈函数pop(SqStack &S,
15、char &e);在这两个函数里,我们通过顶指针的增加(*S.top+=e)和指针的减少来实现元素的进栈和出栈(e=*-S.top)。我们通过设计函数DestroyStack(SqStack &S)来清空栈中所有的元素,通过使用free()函数来释放*S.top的地址。通过函数PrintStack(SqStack &S)输出显示输入的所有元素。程序运行时,其运行流程如下图所示:输入初始化命令i命令d命令n命令p命令c命令h命令e插入一行删除一行切换活区显示活区清屏帮助信息退出开始程序图3.1 行编辑器流程图3.2程序说明主要功能函数:Status Createlist(
16、textp &head);int del(textp head);int display(textp &head);void freemem(textp &head);int insert(textp &head); Status SaveFile(textp head,FILE *out); Status LoadFile(textp head,FILE *fp); void HELP();3.3主要函数设计行删除函数del()子程序设计在函数的开始定义了三个指向struct text结构体的指针变量p1,p2,p3。输入要删除的两个行号(比如1 3),表示删
17、除从第1行到第3行的数据。程序流程图如图3.2所示。输出要删除的行 返回定义指针变量text *p1,*p2,*p3给min和max赋初值定义整型变量min,max,i通过指针变量p1,找到min行在活区中的位置通过指针变量p1找到max行在活区中的位置删除行min到max的内容保存显示删除后的内容saveanddisplay() 开 始图3.2行删除流程图函数实现:执行行删除功能时,由主函数调用删除函数删除所需删除行,再调用显示函数,显示执行行删除后的文本。int del(textp head)/删除d命令对应的函数,用来删maxmin中的行,用结构体中的flat表示是否被删除 text *
18、p1,*p2; int min,max,i; scanf("%d %d",&min,&max); if(head=NULL) printf("nlist null!n"); return OK; p1=p2=head; for(i=0;i<min-1;i+)/*找到要删除的第一行*/ p1=p1->next; for(i=0;i<max;i+)/*找到要删除的最后一行*/ p2=p2->next; for(;p1!=p2;p1=p1->next)/*删除中间的节点,将flat赋值0*/ p1->flat
19、=0; return OK;行插入行数insert()子程序的设计行插入函数的开始定义了三个指向struct text结构体的指针变量p,p1,p2,在给hang赋初值后使p1指向头结点,利用for循环,找到要插入行的前一行hang-1,然后给插入的行分配内存空间。输入文本内容并连入链表。行程序流程图如3.3所示。定义三个类型的指针变量p,p1,p2开 始输出“请输入要插入的行”给变量行赋初始值令p1=头结点,找到行插入要插入的文本内容输出修改后的链表(文本内容)将修改后的链表存盘(savveandedisplay)返 回图3.3 行插入函数流程图 函数实现int insert(textp &
20、amp;head)/插入i命令对应的函数 int hang,i; textp p,p1; scanf("%d",&hang); p=(textp)malloc(sizeof(text);/为插入行分配空间 p->flat=1; fflush(stdin); fgets(p->string,80,stdin); /*输入插入行的内容*/ p1=head; if(hang=1) if(!head->flat) /*头结点已被删除*/ for(;p1&&!p1->flat;p1=p1->next); /*找到第一个flat=1
21、的点*/ p->next=p1->next; p1->next=p; else for(i=1,p1=head;i<hang;p1=p1->next)/找到要插入行的后一行 if(p1->flat=1)i+; p->next=p1->next;/从此行向下将插入行插入到链表中 p1->next=p; return OK;Status LoadFile(textp head,FILE *fp) /*从文件读内容到活区*/ textp p; for(p=head;p&&(!feof(fp);p=p->next) if(!f
22、gets(p->string,80,fp)break; p->flat=1; return 0;Status SaveFile(textp head,FILE *out) /*存储活区的函数*/ textp p; for(p=head;p;p=p->next)if(p->flat=1)fputs(p->string,out); /*输出活区的内容到指定的文件*/ p->flat=0; return OK; 3.3.3活区切换函数saveanddisplay(20)子函数设计 活区切换函数实现活区之间的切换,把文本的每一页(20行)作为一个活区,可以逐页的把活
23、区内容显示出来。在活区切换函数中定义了一个指向struct text结构体的指针变量p赋初值*p=NULL,当i小于20时,如果行没有被删除(flag=1)就通过fputs函数把活区内容写入到文件(out).YNYNYYN 定义变量 i行没有被删除p-flat=1判断文件是否存在 非空输出活区内容输出file end!返 回1利用指针变量p到hang 的具体位将行的内容写入到文件outN返回 0 返 回1 返 回0开 始图3.4活区切换函数save()流程图 函数实现void HELP()/帮助函数,显示一些命令的格式 printf("nt *n"); printf(&qu
24、ot;t * 行插入格式: i<行号><回车><文本><回车> *n"); printf("t * 行删除格式: d<回车><行号1><空格><行号2><回车> *n"); printf("t * 活区切换格式: n<回车> *n"); printf("t * 活区显示格式: p<回车> *n"); printf("t * 清屏格式: c<回车> *n"); pr
25、intf("t * 帮助格式: h<回车> *n"); printf("t * 串替换: t<回车><文本> *n"); printf("t * 退出程序: e<回车> *n"); printf("t *n");显示函数display()子程序设计显示函数display()在程序运行过程中经常得以调用,是行编辑程序中极其重要的一个函数。行编辑程序通过对显示函数display()的调用,在程序执行行插入、行删除等编辑功能后,输出编辑后的文本。在活区显示中首先把文本内容链
26、入链表,函数中用page来实现页码的自增。函数种定义了一个指向struct text结构体的指针变量p ,在文件fp非空和行号小于20的情况下,利用fgets函数使p->string从打开的文件fp中得到字符的值,然后输出每一行的行号和每一行的内容。其程序流程图如图3.5所示。开 始定义变量i,coint,text *p打开的文件fp非空且coint=y|coint=Y定义page(页数 )输出页数从文件中读入数组元素p->string输出行号和行的内容判断文件是否非空输出file end!返 回YYNN图3.5显示函数流程图int display(textp &head)
27、/显示P命令对应的函数,用来显示活区的内容 int i; textp p; for(i=1,p=head;i<=20&&p;p=p->next)if(p->flat=1)printf("%2d",i); /*输出每一行的行号*/i+; printf(" %s",p->string);head=p;return 0;void freemem(textp &head)/释放链表所占的内存 text *p; for(p=head;head!=NULL;) head=p->next; free(p); p=h
28、ead;4.调试过程及实验结果4.1调试过程 测试数据:任意的TXT文件,只要每行不超过80个字符。进入程序的界面,出现命令的帮助信息,按任意键开始程序编辑。输入INPUT文件与OUTPUT文件的名字打开相应的文件 。输入P命令显示活区的内容。 其它的命令操作如下: 行插入格式: i<行号><回车><文本><回车> 行删除格式: d<回车><行号1><空格><行号2><回车> 活区切换格式: n<回车> 清屏格式: c<回车> 帮助格式: h<回车>
29、最后输入e命令退出程序。 在程序编写好之后,便开始在VC中编译执行程序,虽然程序没有错误,但是执行过程中插入可以实现,删除却实现不了,在仔细检验程序后,发现在执行过程中没有先打开文件,因此无法继续执行。再改正之后便可以得到正确的运行结果了。 在程序运行初始状态,界面显示如下。提示用户输入任意键进行其他功能。 图4.1程序初始化界面输出提示信息 开 始 返 回输出提示信息 开 始 返 回输入任意键后,用户可根据自己的要求,在输入文件名的情况下输入其他命令。下图是显示文件函数display()执行后的界面。输出提示信息 开 始 返 回输出提示信息 开 始 返 回 图4.2显示文本行插入执行过程。在
30、键盘上输入i2回车12345后,在文本第二行插入12345字符串。 图4.3执行行插入输入行删除命令d后,用d1 1便可删除第一行。而原来状态下的第二行变为第一行显示。 图4.4执行行删除输入活动区切换等指令后,便会出现以下界面。 图4.5执行活区切换此文本为该程序的输入文件a.txt,储存文本文档于计算机D盘,将其用于程序执行。 图4.6储存文本文档计算机中存储的文本b.txt本是一个空文本文档,但在执行完程序后,文本中出现了程序运行的最终结果。这是在退出后的最终结果。在文本每行中添加了标号。 图4.7输出文本文档 程序调试总结:通过对该题目的编写调试以及结果显示可以看出,本程序可以满足任务书的要求,实现了对行的插入、删除、活区显示、活区切换等各项要求。在执行插入命令的过程中,要检验活区的大小,如果插入这一行之后,仍保持不超的话,就将其插入。在输入未读完时,可将未读完的内容保持在活区的顶部。此外,也实现了一些简单的操作,例如,创建了一个链表,实现文本文件的打开,实现以行为单位是很合理的。通过这次课设,了解简单行编辑程序应用的广泛性。本课程设计的简单行编辑程序各功能的运行操作十分快捷,能满足用户的需要。5总结通过这次数据结构的课程设计,我了解了很多调试程序的方法,并且学会了一些处理错误
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纱线生产过程中的设备维护与管理考核试卷
- 躺式旅行悠闲享受度假时光考核试卷
- 轻质高强泡沫塑料的研究与发展考核试卷
- 航天器空间碎片监测与预警系统考核试卷
- 通风电器具物联网技术应用考核试卷
- 蔬菜加工企业品牌国际化战略考核试卷
- 管道工程法律法规政策学习、运用与实施考核试卷
- 玻璃保温容器耐压性能研究考核试卷
- 甲状腺患者的护理
- 智能停车项目投资建设与回报协议
- 2025年小升初语文第一次全真模拟试卷(1)(统编版+含答案解析)
- 06竣工财务决算审计工作底稿(试行)
- 工伤保险医疗费用智能审核系统建设
- 农作物品种(玉米)区域试验技术规程
- 2022年江苏省卫生系统事业单位招聘考试(护理学)参考题库汇总(含答案)
- 造林工程模式典型设计图文版
- WST 661-2020静脉血液标本采集
- 乙型肝炎病毒表面抗原诊断试剂盒(酶联免疫法)说明书
- 资料员岗位知识与专业技能ppt课件
- 校本教材毽球
- ASYMTEK S2900 快速操作手册
评论
0/150
提交评论