汉字行编辑程序的设计.DOC

上传人:国*** 文档编号:2019991 上传时间:2019-03-28 格式:DOC 页数:33 大小:398KB
下载 相关 举报
汉字行编辑程序的设计.DOC_第1页
第1页 / 共33页
汉字行编辑程序的设计.DOC_第2页
第2页 / 共33页
汉字行编辑程序的设计.DOC_第3页
第3页 / 共33页
汉字行编辑程序的设计.DOC_第4页
第4页 / 共33页
汉字行编辑程序的设计.DOC_第5页
第5页 / 共33页
点击查看更多>>
资源描述

1、汉字行编辑程序的设计1 设计规格说明正文编辑语言决定了正文编辑程序,本设计中正文编辑语言包括外部编辑命令,编辑命令和输出信息。我们组所设计的这个汉字行编辑程序有输入和编辑两种模式1.1 外部编辑命令 外部行是指用户在输入或编辑模式时打入的字符串。一个外部行定义为一个字符串,这个字符串又可以打字的字符组成。在换行之前输入的字符串长度不允许超过预定的固定长度,在本例中不允许超过 80。命令 含义 字符删除命令# 行删除命令! 换行空行注 1 转到编辑模式1.2 编辑命令本例中共有 12 个编辑命令,见下表名字 命令 编辑操作TOP T 使当前指针 BPTR 指向虚拟行UP U N 当前指针上移 N

2、 行NEXT N N 当前指针下移 N 行ENTER E 进入输入模式LIST L N 输出当前行开始 N 行正文DELETE D N 删除当前行开始 N 行正文REPLACE R /STR1/STR2/ N 从当前行开始的 N 行中将 STR2 替换 STR1FIND F /STRING/ 扫描正文,并将指针指向第一个 STRING 位置COPY C N 将当前行开始的 N 行复制到工作链尾部但并不把这些行从工作链中删除STORE S N 将当前行开始的 N 行复制到工作链尾部INSERT I 将工作链中的所有正文行插入到当前行的后面QUIT Q 退出当前编辑程序的运行1.3 输出信息输出信

3、息表输出信息 含义EDIT! 指出已经进入编辑模式INPUT! 指出已经进入输入模式?! 错误提示TOF 已经到达正文链顶EOF 已经到达正文链底NOTEXT 正文链为空NOFREE 自由链中没有空间2 概要设计概要设计给出这个汉字行编辑程序的概貌。它描述了该编辑系统的正文文件,工作模式,当前行指针以及正文文件的虚拟行等。2.1 正文文件2.1.1 正文链TPTRBPTR 图 1对正文文件的一种看法字符串字符串U(BPTR ) S(BPTR)N(BPTR)字符串字符串 TPTRBPTR图 2对正文文件的另一种看法N(BPTR ):字块中的一个指针,指向下一个字块U(BPTR ):字块中的一个指

4、针,指向前一个字块S(BPTR):字块中的一个指针,指向当前一个字块:零指针2.1.2 工作链工作链是双链结构的先进先出队列,编辑命令 COPY,STORE,INSERT 使用工作链。2.1.3 自由链自由链也是双链结构,在正文编辑期间,编辑程序动态的分配和释放字块。2.1.4 当前行指针当前行指针和 BPTR 和正文链有关,它指向正文链中当时正被处理的那一行。编辑命令的一个功能就是移动这个当前指针。2.1.5 虚拟行正文链第一行前有一个虚拟行,在当前行指针 BPTR 为 的时候,当前行就是虚拟行,在执行 TOP 后,或者某些情况下(UP 或者 DELETE 之后)BPTR 将指向虚拟行。2.

5、2 两个工作模式2.2.1 输入模式为了输入一行正文而使用输入模式。用户输入 ENTER 命令,即“E!” 注 2 EDITOR 回答“INPUT!” ,用户即可开始输入正文。2.2.2 编辑模式为了进入编辑模式(也就是离开输入模式) ,用户打进一个空行,然后编辑程序在终端显示“EDIT!” ,告诉用户已经进入编辑模式,编辑模式中才可以使用编辑命令,如果输入的编辑命令为无效的编辑命令,则 EDITOR 将忽略这个命令,并给出错误提示,显示 “!?”,并且等待下一个编辑命令输入。2.3 数据元素数据元素及它们之间的关系如下图所示终端BUFINCHARIND缓冲器 开关0:编辑模式1 或 2:输入

6、模式缓冲器缓冲器TPTR正文文件BPTR指 针缓冲器图编辑程序的数据元素(概要设计)2.4 过程所谓过程(Procedure ) ,就是本设计中的模块。正文编辑程序的主过程叫 EDITOR,它根据开关 IND 的状态,来决定是接收输入的正文还是执行编辑命令,并相应的完成下列步骤:步骤 1:从终端读入一行。步骤 2:根据开关 IND 确定模式。(1) 输入模式:转到步骤 3(2) 编辑模式:转到步骤 4 步骤 3:调用过程 INPUT,以处理输入的一行正文;转到步骤 5 。步骤 4:确定编辑命令,(1) 如果命令是“T” ,执行过程 TOP ;(2) 如果命令是“U” ,执行过程 UP ;(3)

7、 如果命令是“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。3 概要设计

8、结果通过概要设计得到的行编辑程序结构图如下MAINWRITE_LINETOP NEXTREAD_LINEINPUT ENTERREPLACELIST COPY FINDUP DELETE STORE INSERT图编辑程序的结构(概要设计)通过概要设计,把这个行编辑程序按照功能分解成 15 个模块(即过程)4 详细设计4.1 数据元素(1) 正文文件。(2) 输入字符串缓冲器 IN。(3) 匹配字符串缓冲器 MAT。(4) 替换字符串缓冲器 TMP。(5) 临时存储缓冲器。(6) 命令数缓冲器 NUMD 和 NUM。(7) 字符缓冲器 BUF 和 CHAR。(8) 计数器 CTR。(9) 行长

9、缓冲器 LINESIZE。(10) 指针缓冲器。4.2 控制数据元素选取四个开头CMP,CHG,ERR 和 IND作为控制数据元素。CMP:标志在一次比较操作中已经匹配;CHG:标志命令 REPLACE 规定的对一行正文的子串替换已经完成;ERR:指示已经发现一个错误;IND: 指示工作模式编辑或输入。4.3 编辑过程编辑程序共有 26 个过程,其中 EDITOR 是主过程。1.过程 MAIN;2.过程 INIT;3.过程 READ_LINE;4.过程 WTITE_LINE。4.4 输入模式的过程1. 过程 INPUT2. 其他过程4.5 编辑模式的过程1. 简单编辑过程2. 正文处理过程3.

10、 字符串编辑过程5 详细设计结果5.1 编辑程序的详细结构5.2 实现编辑程序的算法下面给出用 C 语言描述的编辑程序中每个过程的实现算法,已经测试通过#include “stdio.h“#include “stdlib.h“#include “string.h“#include “conio.h“#define len 4#define LINESIZE 80 /*每行长度为 80 个字符*/struct TEXTstruct TEXT *prior;char strLINESIZE+1; /*包括 0 在内,设置长度为 LINESIZE+1*/struct TEXT *next;struc

11、t TEXT *TPTR,*BPTR,*KPTR,*QPTR,*SPTR,*YPTR,*XPTR,*FPTR;struct TEXT *ptr,*work;int CHG,ERR,CMP,IND,CTR,i,NUM;char ch,BUF;char INLINESIZE+1,NUMDlen,MATLINESIZE,REPLINESIZE,tempLINESIZE;void main() /*#1 主要起调度作用 */void INIT();void READ_LINE();void INPUT();void TOP();void UP();void NEXT();void ENTER();vo

12、id LIST();void DELETE();void REPLACE();void FIND();void INSERT();void COPY();void STORE();void WRITE_LINE();clrscr();INIT();while(1)if(IND=0)printf(“n-“); /*命令提示符*/READ_LINE();i=0;if(IND!=0)INPUT();elsech=IN0;if(ch=T|ch=t)TOP();else if(ch=U|ch=u)UP();else if(ch=N|ch=n)NEXT();else if(ch=E|ch=e)ENTER(

13、);else if(ch=L|ch=l)LIST();else if(ch=D|ch=d)DELETE();else if(ch=R|ch=r)REPLACE();else if(ch=F|ch=f)FIND();else if(ch=I|ch=i)INSERT();else if(ch=C|ch=c)COPY();else if(ch=S|ch=s)STORE();else if(ch=Q|ch=q)exit(0);elsestrcpy(IN,“?!0“); /*不正确的编辑命令响应 */WRITE_LINE();void INIT() /*#2 初始化正文编辑程序*/void WRITE_

14、LINE();printf(“n _“);printf(“n | program for edit |“);printf(“n |T:TOP U N:UP N N:NEXT |“);printf(“n |E:ENTER L N:LIST D N:DELETE |“);printf(“n |R /STR1/STR2/ N:REPLACE F /SFTR1/:FIND |“);printf(“n |C N:COPY S N:STORE I:INSERT |“);printf(“n |Q:QUIT -: the sing of order |“);printf(“n -“);FPTR=(struct

15、 TEXT*)malloc(sizeof(struct TEXT);FPTR-prior=0;FPTR-next=0;CMP=CHG=ERR=0;IND=0;BPTR=TPTR=0; /*无正文链*/KPTR=QPTR=0; /*无工作链*/strcpy(IN,“EDIT!0“);WRITE_LINE();void READ_LINE() /*#3 从终端接收一行正文并且把它存到缓冲器 IN 中 */i=0;BUF=getchar();while(i=LINESIZE|BUF=n)if(i=0)INi+=n;INi=0;/*存入字符串结束标志 */fflush(stdin);void WRITE_LINE() /*#4 把 IN 中的内容输出到终端*/printf(“n%s“,IN);void INPUT() /*#5 从缓冲器 IN 取来一行正文放到正文文件中*/void GO_EDIT();void CONNECT();void INSERT_CHAIN();void WRITE_LINE();ch=IN0;if(IND=1) /*尚未接收到正文*/if(ch=n)GO_EDIT(); /*转到编辑模式*/elseif(FPTR=0)strcpy(IN,“NOFREE!0“);WRITE_LINE();else

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 医药卫生

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。