汉字行编辑程序开发文档最终文档格式.docx
- 文档编号:20411817
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:16
- 大小:160KB
汉字行编辑程序开发文档最终文档格式.docx
《汉字行编辑程序开发文档最终文档格式.docx》由会员分享,可在线阅读,更多相关《汉字行编辑程序开发文档最终文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
命令‘F’有一个字符串作为操作数;
命令‘R’有两个字符串和一个数(可任选)作为操作数。
名字
编辑操作
TOP
T
使当前行指针BPTR指向虚拟行
UP
UØ
N
把指针BPTR往上移N行
NEXT
NØ
把指针BPTR往下移N行
ENTER
E
进入输入模式
LIST
LØ
从当前行开始输出N行正文
DELETE
DØ
从当前行开始删除N行正文。
删掉的正文放在自由链前面
REPLACE
RØ
/STR1/STR2/Ø
在从当前行开始的N行正文中,用STR2替换每一个STR1
FIND
FØ
/STRING1/
从下一行开始扫描各行正文,使指针BPTR指向第一个包含字符串STRING1的正文行
COPY
CØ
从正文链中复制N行正文放到工作链的尾部,但并不把这些正文行从正文链中删掉
STORE
SØ
从正文链中把N行正文移到工作链的尾部
INSERT
I
把工作链中的所有正文行插到正文链中当前行的后面
QUIT
Q
停止编辑程序的运行
表1.2
注:
:
(1)N代表空格或十进制正整数(最多4位)。
STR1(或STRING1)代表需要在正文链中匹配的字符串,STR2代表替换字符串。
N是空格时为默认值1。
(2)BPTR代表正文链中的当前行指针。
(3)Ø
代表空格。
1.3输出信息
除了列出正文链中的正文外,正文编辑程序还应能输出下列7个信息:
‘EDIT!
’、‘INPUT!
’、‘?
’、‘TOF!
’、‘EOF!
’、‘NOTEXT!
’和‘NOFREE!
’:
(1)‘EDIT!
’响应。
当正文编辑程序处在输入模式时,对在终端上输入一个空行(‘!
’)所做的响应。
它指出已经进入了编辑模式,以后从终端输入的正文行将被解释为编辑命令。
(2)‘INPUT!
在编辑模式中给出ENTER命令‘E’之后,程序的响应。
它指出正文编辑程序已经进入输入模式,以后从终端输入的字符串将作为正文行加入到正文链中。
(3)‘?
对无效的编辑命令的响应。
正文编辑程序忽略无效的命令,并且仍处于编辑模式中,等待接收下一个编辑命令。
(4)‘TOF!
’命令。
对把当前行指针移到正文链中第一行前面去的UP命令的响应。
(5)‘EOF!
每当一个编辑命令试图把当前行指针移到正文链中最后一行的后面去的时候,正文编辑程序都显示这个信息。
在这种情况,当前行指针总是指向正文链中的最后一行(如果正文链是空的,则指向虚拟行)。
(6)‘NOTEXT!
当正文链是空的时候,正文编辑程序对于除ENTER和INSERT之外的所有编辑命令都回答‘NOTEXT!
(7)‘NOFREE!
.当在输入模式时这个响应指出,已经没有空闲的主存储块可以用来存放输入的正文行了。
当出现这种情况时,正文编辑程序忽略最后输入的正文行,并且自动进入编辑模式。
仍然可以命令它转回输入模式,但是如果试图往正文链中增加一行正文,它将再次给出‘NOFREE!
如果没有足够的存储块供COPY命令使用,在终端上也将显示‘NOFREE!
’,这时将忽略这个COPY命令并且不做任何改动。
第二章概要设计
2.1正文文件
正文文件由字块组成,每个字块有三个域:
N、U和S。
域N是一个指针,它指向下一个字块。
域U也是一个指针没,它指向前一个字块。
域S是一个固定长度的字符串(也就是一行正文)。
在正文编辑期间,这些字块由这些指针链接起来,最多可以形成三个双链结构,它们组成正文文件的三个部分:
正文链、工作链和自由链。
正文链中当前编辑的那行正文由当前行指针指定。
在正文链最前面还有一行事实上并不存在的正文,称为“虚拟行”。
1.正文链:
正文链是双链结构,由正文行组成,每行可以容纳固定数目的字符。
如图2.1所示,指针TPTR指向正文链的第一行,而指针BPTR指向当前行。
如果指针TPTR为空,则表明正文链中没有正文。
φ
字符串
U
S
图2.1正文文件的组织
2.工作链:
工作链是双链结构的先进先出队列。
编辑命令COPY、STORE和INSERT使用工作链。
3.自由链:
自由链也是一个双链结构,它链接所有自由的字块。
在正文编辑期间,编辑程序动态的分配和释放字块。
4.当前行指针:
当前行指针BPTR和正文链有关,它指向正文链中当时正被处理的那一行(或者正在产生这个当前行或者正在编辑这个当前行)。
编辑命令的一个功能就是移动这个当前行指针。
可以把这个指针从它的当前位置上移或下移给定的行数,也可以把它移到指向包含给定字符串的那一行。
应该注意,当工作模式改变之后,当前行指针的位置如下:
(1)当从输入模式改变到编辑模式时,当前行指针指向由终端输入的最后一行。
如果没有输入,那么它仍然保持指向进入输入模式时指向的那一行。
(2)当从编辑模式改变到输入模式时,当前行指针的位置不变。
随后在输入模式输入的正文行,将紧接在当前行后面插入到正文行中。
5.虚拟行:
在正文链第一行之前有一行虚拟行。
在当前指针BPTR是φ的时候,当前行即是这个虚拟行。
在TOP命令之后,或某些情况在UP或DELETE命令之后,BPTR将指向虚拟行。
2.2两个工作模式
本编辑程序有两个工作模式——输入模式和编辑模式。
当编辑程序的主程序EDITOR运行时,它或者处于输入模式中,或者处于编辑模式中。
1.输入模式
为了输入一行行的正文而使用输入模式。
当正文编辑程序处于输入模式时,它将把在终端打进的任何正文行加入到正文链中。
为了从编辑模式进入输入模式,用户打入ENTER命令‘E!
’(‘!
’代表终端上的换行符)。
EDITOR回答‘INPUT!
’,并且允许用户开始输入一行行正文。
注意,空行和空格行是不同的。
为了在正文链中插入一行空格,用户必须至少打进一个空格,随后再打一个换行符;
为了打进一个空行,仅需简单地打一个换行符。
2.编辑模式
为了进入编辑模式(也就是离开输入模式),用户打进一个空行,然后编辑程序在终端上显示‘EDIT!
’,告诉用户已进入编辑模式。
仅当处在编辑模式时,才能输入编辑命令。
如果在输入模式时打入编辑命令,那么这些编辑命令将成为正文链中的正文行。
如果输入一个无效的编辑命令,EDITOR将忽略这个命令,显示‘?
’,并且等待下一个编辑命令。
2.3数据元素
在此阶段选取一个表格、五个缓冲器和一个开关作为编辑程序的数据元素。
表格TEXT有三个域,用来存放正文文件:
域S存放一行正文,域U和域N存放指针。
五个缓冲器中有两个为指针缓冲器(TPTR和BPTR),另三个为输入输出缓(BUF,IN和CHAR)。
缓冲器BUF存放一个字符,这个字符是准备传送给终端的,或者是从终端输入进来的;
缓冲器IN存放一行输入的(或输出的)正文;
缓冲器CHAR存放一个从缓冲器IN取来的字符。
开关IND处于状态0时表明是在编辑模式,处于状态1或2时表明是在输入模式。
下图描绘了这些数据元素以及它们之间的关系:
2.4模块划分
正文编辑程序的主过程命名为EDITOR,它根据开关IND的状态,决定是接受输入的正文还是执行编辑命令,并相应的完成下述步骤:
步骤1:
从终端读入一行;
步骤2:
根据开关IND确定模式:
(1)输入模式,转到步骤3;
(2)编辑模式,转到步骤4;
步骤3:
调用过程INPUT,以处理输入的一行正文;
转到步骤5;
步骤4:
确定编辑命令:
(1)如果是命令'
T'
,执行过程TOP;
(2)如果是命令'
U'
,执行过程UP;
(3)如果是命令'
N'
,执行过程NEXT;
(4)如果是命令'
E'
,执行过程ENTER;
(5)如果是命令'
L'
,执行过程LIST;
(6)如果是命令'
D'
,执行过程DELETE;
(7)如果是命令'
R'
,执行过程REPLACE;
(8)如果是命令'
F'
,执行过程FIND;
(9)如果是命令'
C'
,执行过程COPY;
(10)如果是命令'
S'
,执行过程STORE;
(11)如果是命令'
I'
,执行过程INSERT;
(12)如果是命令'
Q'
,停止编辑程序的运行
(13)如果是其它字母,在终端上显示'
?
'
步骤5:
转到步骤1。
通过上述流程,把这个行编辑程序按照功能分解成十五个模块。
主过程EDITOR调用十四个下属过程,其中十一个下属过程与十一条编辑命令一一对应,每个过程完成一条编辑命令,其余三个下属过程分别完成处理一行正文输入(INPUT)、从终端读入一行正文(READ_LINE)和把一行正文显示在终端上(WRITE_LINE)的功能。
程序的层次结构图如下:
图2.2正文编辑程序层次结构图
第三章详细设计
3.1数据元素
数据元素的详细设计,其中有二十一个缓冲器和一个表格。
因为处理指针是这个编辑程序最经常的操作,所以在二十一个缓冲器中有十二个视为指针设立的。
表格TEXT用于存放正文文件。
下面详述这些数据元素:
(1)正文文件:
正文文件是一个表格,每个表格项是一个字块;
每个字块有三个域,分别是指向下一个字块的指针,指向前一个字块的指针和用来存放一行正文的固定长度的字符串。
用这些指针把字块链接成三个链——工作链、自由链和正文链。
(2)输入字符串缓冲器IN:
在其中构造内部行,这个缓冲器中的字符位置由指针I指定。
输出信息时也用此作为输出字符串的缓冲器。
(3)匹配字符串缓冲器MAT:
在其中存放REPLACE和FIND两个命令使用的匹配字符串。
指针J指向缓冲器MAT中的字符。
(4)替换字符串缓冲器REP:
在其中存放供REPLACE命令使用的替换字符串。
指针K指向这个缓冲器中的字符。
(5)临时存储缓冲器TMP:
在其中临时存放缓冲器IN或REP的内容。
(6)命令数缓冲器NUMD和NUM:
缓冲器NUMD存放使用数字的编辑命令的数域。
过程CONVERT把缓冲器NUMD中以字符形式编码的十进制数转变成数字编码的十进制数,并且放到缓冲器NUM中。
指针M指向缓冲器NUMD中的字符。
(7)字符缓冲器BUF和CHAR:
数据在终端和编辑程序之间以字符或汉字为单位传送。
在终端和缓冲器IN之间的传送用BUF做缓冲器。
缓冲器CHAR中存放一个从缓冲器IN取来的供处理的字符。
(8)计数器CTR:
在执行由数字作参数的编辑命令时,先把数从缓冲器NUM中传到CTR中,然后用CTR作为命令行数计数器。
(9)行长缓冲器LINESIZE:
这是一个只读缓冲器,它放一行正文的长度,这个长度在实现时决定。
(10)指针缓冲器:
共有十二个缓冲器用来存放指针。
缓冲器I、J、K和M中的指针分别指向缓冲器IN、MAT、REP和NUMD中的字符。
缓冲器TPTR和BPTR中的指针,分别指向正文链的第一行和当前行。
缓冲器KPTR和QPTR中的指针,分别指向工作链的第一行和最后一行。
缓冲器FPTR中的指针指向自由链的第一行。
缓冲器SPTR、XPTR和YPTR临时存放指针。
3.2控制数据元素
选取四个开关——CMP、CHG、ERR和IND,作为控制数据元素。
开关IND指示工作模式——编辑或输入;
开关CMP标志在一次比较操作中已经匹配;
开关ERR指出已发现了一个错误;
开关CHG标志命令REPLACE规定的对一行正文的子串替换已经完成。
3.3编辑过程
3.3.1主过程EDITOR
在初始化之后它从终端读入一行正文,由于初始化过程INIT把它置成编辑模式,因此读进的这一行正文应该包含一个编辑命令。
如果开关IND不是零,则EDITOR是在输入模式中。
EDITOR调用INPUT过程,从终端把一行正文输入到正文文件中。
它继续不断的调用INPUT,从终端接受一行行的正文,直到接收到一个空行为止。
空行——前面没有空格或其它字符的一个换行符——是从输入模式进入编辑模式的命令。
如果开关IND是零,则EDITOR是在编辑模式中。
它把从终端读进的一行字符解释为一个编辑命令,并且调用适当的过程来执行这个命令。
如果用户打进一个非法命令,它输出信息‘?
’,然后从终端读进另一行字符。
3.3.2初始化模块INIT
为主程序EDITOR做初始化工作。
把所有开关置零。
计数器CRR,缓冲器CHAR、IN、BUF、MAT、REP、UNMD、NUM和TMP,以及指针缓冲器XPTR、YPTR和SPTR的初始内容是无关紧要的。
正文链和工作链在开始时是空的,缓冲器BPTR、TPTR、KPTR和QPTR的初始内容为φ。
正文文件在开始是链接成自由链,指针FPTR指向自由链的第一行。
3.3.3读一行模块READ_LINE
1.功能设计:
利用读操作在缓冲器IN中一个字符一个字符地装配一行内部行。
读操作把一个字符或一个汉字从终端传送到缓冲器BUF,如果这个字符不是’@’、’#’或’!
’(外部编辑命令),那么过程READ_LINE把它装配到缓冲器IN中。
如果是外部编辑命令,则在缓冲器IN中做相应的处理。
当遇到换行符或输入的字符已经超过一行的固定长度时,过程READ_LINE结束。
2.程序流程图:
3.3.4写一行模块WRITE_LINE
该模块利用写操作输出缓冲器IN中的字符串,一次传送一个字符到缓冲器BUF,再从BUF传送到终端。
当达到行的固定长度时输出一个换行符到终端以结束这一行。
3.4输入模式的过程
3.4.1输入模块INPUT
1.功能设计:
该模块从缓冲器IN接收输入的一行正文,并且把这行正文放到自由链的第一个可用的字块中去。
在离开输入模式之前把新构造成的正文链与自由链分离开,并且把它紧接在原有正文链当前行的后面,从而与原有正文链合并。
当开关IND是1或2时,正文编辑器处在输入模式中,在接收到一行输入字符之前,开关IND是1;
一旦接收到一行输入字符之后,如果满足下述条件:
(1)缓冲器IN中的第一个字符不是‘!
’;
(2)开关IND是1;
(3)指针缓冲器FPTR中不是零指针φ,则把开关IND置为2。
当这个过程在缓冲器IN中发现一个空行(第一个字符是‘!
’的字符行)时,调用GO_EDIT模块把当时的输入模式(IND=1或2)转变成编辑模式(IND=0)。
如果这个空行不是输入的第一行,那么它在转变工作模式之前,先调用CONNECT和INSERT_CHAIN模块,以便把已经接收到的那些行正文从自由链转移到正文链中去。
2.程序流程图:
3.4.2其它过程
3.4.2.1转换为编辑模式模块GO_EDIT
把开关IND置为0,从而把正文编辑程序从输入模式转变到编辑模式,然后在终端打印出‘EDIT!
’,提醒用户现在已进入编辑模式。
3.4.2.2自由链处理模块CONNECT
该模块把指针缓冲器FPTR中的指针(指向目前仍然在自由链中的输入的第一行正文)临时存放到缓冲器YPTR中。
然后它把输入的最后一行正文(指针XPTR指向这一行)的下链指针(即指向下一个字块的指针)存到缓冲器FPTR中。
测试这个指针是否是零指针,如果不是零指针则把指针FPTR指定的那行的上链指针(即指向上一个字块的指针)置为φ。
3.4.2.3插入正文链模块INSERT_CHAIN
1.功能设计
有两个模块要调用该模块:
(1)INPUT模块调用时,把自由链中新构成的正文链与自由链分离开来,然后把新正文链合并到原有的正文链中去,紧接在原有正文链的当前行后面。
(2)INSERT模块调用时,它把指针缓冲器YPTR和XPTR所指定的工作链中的那些行正文分离下来,然后把它们插到正文链中去,紧接在由指针BPTR指定的当前行后面。
2.程序流程图
3.4编辑模式的过程
在编辑模式中,使用下述的简单编辑模式、正文加工过程和字符串编辑过程对正文进行编辑
3.4.1简单编辑过程
3.4.1.1TOP模块
使当前行指针BPTR指向虚拟行
3.4.1.2进入输入模式模块ENTER
把开关IND置为1,把正文编辑程序从编辑模式转变到输入模式,然后在终端打印出‘INPUT!
’,提醒用户现在已进入编辑模式。
3.4.1.3上移N行模块UP
将当前行指针BPTR往上移指定行数(N),然后打印出新的当前行。
但应注意下述几点:
(1)和所有用一个数作变元的编辑命令一样,如果命令中省掉了这个数,那么他的默认值是1
(2)如果把当前行指针移到了指向虚拟行的位置,或者要求该指针指向第一行前面的某个位置,那么把指针留在指向虚拟行的位置,并且打印出信息‘TOF!
’
(3)如果正文链是空的,那么打印出信息‘NOTEXT!
3.4.1.4获取操作数模块GET_NUMBER
从编辑命令中取来用数作变元的那些编辑命令中的数N,把用字符串形式表示的那个十进制数从缓冲器IN传送到缓冲器NUMD中。
如果省略掉了N则在CONVERT模块中把N置为默认值1。
3.4.1.5十进制数转换模块CONVERT
把缓冲器NUMD中用字符串形式表示的十进制数转变成数字编码的十进制数,并存放到NUM中。
如果发现错误,则把开关ERR置为1,并且输出信息‘?
’提醒用户。
3.4.1.6下移N行模块NEXT
把当前行指针BPTR从当前行往下移指定行数,然后输出新的当前行。
(1)如果命令要求当前行指针指向正文链中最后一行后面的某个位置,那么是该指针指向最后一行,并打印出信息‘EOF!
(2)如果当前行指针移是在指向虚拟行的位置,那么命令‘N1’将导致该指针指向正文链中的第一行
3.4.1.7输出N行正文模块LIST
输出正文链中给定行数的正文(其中包括当前行),然后使当前行指针指向输出的最后一行正文。
(1)如果命令要求列出的行数多于可以得到的行数,那么将仅列出能够列出的那些行正文,然后使当前行指针指向正文链中的最后一行正文,并打印出信息‘EOF!
(2)如果正文链是空的,那么打印出信息‘NOTEXT!
(3)如果当前行指针原来指向虚拟行,那么命令‘L1’将导致打印出正文链中的第一行正文
3.4.2正文处理过程
3.4.2.1DELETE和DELETE_LINK模块
这两个模块删除正文链中从当前行开始的N行正文,并把删掉的字块加到自由链的前面。
把当前行指针置成指向被删掉的那些行正文后面的第一行正文;
如果后面已经没有正文了,则把当前行指针置成指向正文链中剩余的最后一行正文(可能是虚拟行)。
(1)如果命令要求删掉的行数多于可以得到的行数,那么将仅删除能够删除的那些行。
在这种情况下,当前行指针将指向正文链中的最后一行正文(可能是虚拟行),并打印出信息‘EOF!
(3)如果当前行指针指向虚拟行,那么命令‘D1’将导致删掉正文链中的第一行正文
3.4.2.2COPY和COPY_LINK模块
这两个模块把正文链中从当前行开始的N行正文复制到自由链中,然后把它们同自由链分离开,并且连接到工作链的尾部。
(1)执行完一条COPY命令之后,如果被复制的正文后面还有正文,则把当前行指针置成指向被复制的正文后面的第一行正文,否则把它置成指向被复制的最后一行正文
(2)如果自由链中没有足够的字块,则忽略这个命令
(3)如果要求复制的行数多于可以得到的行数,将仅复制可以复制的那些行正文。
在这种情况下,当前行指针将指向被复制的最后一行正文,并且将打印出信息‘EOF!
(4)如果正文链是空的,那么打印出信息‘NOTEXT!
(5)如果当前行指针指向虚拟行,那么命令‘C1’将仅复制正文链中的第一行正文
3.4.2.3STORE模块
这个模块完成的操作实质上是COPY命令和DELETE命令完成的操作的组合。
除了删掉的行是链接到工作链的尾部而不是放回自由链之外,STORE命令和DELETE命令所做的动作完全相同。
当前行指针的位置以及输出的信息都和DELETE命令相同。
3.4.2.4INSERT模块
这个模块把工作链中所有正文都链接到正文链中,紧接在当前行的后面。
然后使当前行指针指向插入的最后一行正文。
如果工作链是空的,则忽略这个命令。
3.4.3字符串编辑过程
3.4.3.1FIND模块
这个模块扫描正文链并且使当前行指针指向包含最先出现字符串‘STRING1’的那一行正文。
扫描从当前行下面的那行正文开始,因该扫描所有字符。
紧接在当前行的后面。
(1)如果扫描完正文链中的最后一行正文仍然找不到给定的字符串,则使当前行指针指向正文链中最后一行正文,并打印出信息‘EOF!
(2)如果查找成功,则在终端上打印出找到的那一行正文
(3)如果正文链是空的,那么打印出信息‘NOTEXT!
’
3.4.3.2GET_STRING1模块
这个模块从缓冲器IN中取来字符串放到缓冲器MAT中,如果发现错误则打印出信息‘?
3.4.3.3COMP模块
这个模块一个字符一个字符地比较放在缓冲器IN和MAT中的两个字符串,用开关CMP的状态指示比较的结果,状态1和0分别表示“匹配”和“不匹配”(匹配是指所有字符串都相同)。
3.4.3.4FIND模块
这个模块用字符串‘STR2’代替从当前行开始的N行正文中的每一个字符串‘STR1’。
如果替换导致超过固定行长则进行截尾。
但
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汉字 编辑 程序 开发 文档 最终