下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、简单行编辑程序课程设计一设计要求1 .问题描述文本编辑程序是利用计算机进行文字加工的基本软件工具, 实现对文本文件的插入、 删除等修改操作。 限制这些操作以行为单位进行的编辑程序称为行编辑程序。被编辑的文本文件可能很大, 全部读入编辑程序的数据空间 (内存) 的做法即不经济, 又不总能实现。 一种解决方法是逐段的编辑。 任何时刻只把待编辑文件的一段放在内存, 称为活区。 试按这种方法实现一个简单的行编辑程序, 设文件每行不超过320 个字符,很少超过80 个字符。2 .需求分析该程序要实现以下4 条基本的编辑命令:行插入。格式:i行号 回车文本. 回车将文本插入活区中第行号 行之后。(2)行删
2、除。格式:dwr号1空格行号2卜回车 例如删除活区中第行号1行(到第行号2行) 。(3)活区切换。格式:n回车,将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。活区显示。格式:p回车;逐页地(每页20行)显示活区内容,在每显示的一页之后请用户决定是否继续显示以后各页(如果存在) 。印出的每一行要前置行号和一个空格符,行号固定占 4 位,增量为 1 。各条命令中的行号均须在活区中各行号范围之内, 只有插入命令的行号可以等于活区第一行行号减一, 表示插入当前的屏幕中第一行之前, 否则命令参数非法。二概要设计1 .主界面设计为了实现简单行编辑程序, 设计一个含有多个菜单项的主控菜单子程序
3、以链接系统的各项子功能。主控菜单运行如下:行 示若 入除要文存事用杏文-BJ .请选择:.2 .存储结构设计该系统采用用的顺序存储结构3 .系统功能设计(1)行插入(2)行删除(3)文本显示(4)保存文件(5)读取文件(6)退出系统三.模块设计1 .模块设计本程序包含主程序模块、菜单选择模块和用操作模块。调用关系如下主程序模块菜单选择模块串操作模块2 .系统子程序及双希叶(1) enter(int linenum)据结构设计ADT line基本操作:enter(linenum)初始条件:有内存。操作结果:linenum +1.delete_text()初始条件:line存在。操作结果:若删除的
4、最后一行,则直接删除。若删除中间一行,则后面的linenum -1。Load ()初始条件:存在文件file操作结果:打开文件。 ADT line2.系统主要子程序详细设计( 1)主程序模块设计void main(int argc,char *argv) char s80,choice,fname80;int linenum=1;start=NULL;last=NULL;if(argc=2) load(argv1);dochoice=menu_select();switch(choice)case 1:printf(" 行号 :");gets(s);linenum=atoi
5、(s);enter(linenum);break;case 2:delete_text();break;case 3:list();break;case 4:printf("t 文件名 :");gets(fname);save(fname);break;case 5:printf("t 文件名 :");gets(fname);load(fname);break;case 6:exit(0);while(1);menu_select() char s80;int c;printf("t* 欢迎使用简单行编辑程序 *n");printf(
6、"tttt1. 行插入n");printf("tttt2. 行删除n");printf("tttt3.文本显示n");printf("tttt4.保存文件n");printf("tttt5.读取文件n");printf("tttt6.退出 n");printf("t*n");do printf("nntt 请选择 :");gets(s); c=atoi(s);while(c<0|c>6); return(c);( 2)主要工
7、作函数/* 将文本插在指定行端部*/enter(int linenum)struct line *info;for(;) info=(struct line *)malloc(sizeof(struct line);if(!info)printf("t! 内存不够! n");return(NULL);printf("%d:",linenum);gets(info->text);info->num=linenum;if(*info->text) if(find(linenum) patchup(linenum,1); if(*info-&
8、gt;text) start=dls_store(info);else break;linenum+; return(linenum);/* 当文本内容插在文件中间时其下面的内容的行号必须增加1,而删除时,被删除的文本后面的行号必须减1*/void patchup(int n,int incr)struct line *i;i=find(n);while(i)i->num=i->num+incr;i=i->next;/* 按行号排序后插入*/*i)struct line *dls_store(struct linestruct line *old,*p;if(last=NUL
9、L)i->next=NULL;i->prior=NULL;last=i;return(i);p=start;old=NULL;while(p)if(p->num)old=p;p=p->next;else if(p->prior)p->prior->next=i;i->next=p;p->prior=i;return start;i->next=p;i->prior=NULL;p->prior=i;return(i);old->next=i;i->next=NULL;i->prior=old;last=i;
10、return start;/* 删除一行*/void delete_text()struct line *info;char s80;int linenum;printf(" 行号 :");gets(s);linenum=atoi(s);info=find(linenum);if(info)if(start=info)start=info->next;if(start) start->prior=NULL;else last=NULL;elseinfo->prior->next=info->next;if(info!=last)info->
11、;next->prior=info->prior;else last=info->prior;free(info);patchup(linenum+1,-1);/* 查找一行文本*/struct line *find(int linenum)struct line *info;info=start;while(info)if(linenum=info->num) return(info); info=info->next;return(NULL);/* 显示文本*/void list()struct line *info;info=start;while(info
12、)printf("%d:%sn",info->num,info->text); info=info->next;printf("nn");/* 存文件 */void save(char *fname)struct line *info;char *p;FILE *fp;if(fp=fopen(fname,"w")=NULL)printf("t Can't open the file !n");exit(0);printf("t Saved :n");info=start
13、;while(info)p=info->text;while(*p) putc(*p+,fp);putc('n',fp);info=info->next;fclose(fp);/* 读取文件*/void load(char *fname)struct line *info,*temp;char *p;FILE *fp;int size,inct;if(fp=fopen(fname,"r+")=NULL)printf("t Can't open the file !n"); exit(0);while(start)tem
14、p=start;start=start->next;free(temp);printf("nt Reading.n");size=sizeof(struct line);start=(struct line*)malloc(size);if(!start)printf("nt 内存已经用完!");return; info=start; p=info->text; inct=1;while(*p=getc(fp)!=EOF) p+;while(*p=getc(fp)!='n') p+;*p='0'info->
15、;num=inct+;info->next=(struct line*)malloc(size);if(!info->next)printf("nt 内存已经用完!");return;info->prior=temp;temp=info;info=info->next;p=info->text;temp->next=NULL; last=temp;free(info);start->prior=NULL; fclose(fp);四.测试分析1.主菜单12 3 4 5 6行 示& 人除fl文文存事用-B 请选择:2.行插入行
16、一入除显存封 用蒋文蕾 使 L2.2.4.E.行号:1 l:hello 2 worldworld请选择;工3.行删除及文本显示请选择:2aK除显文文存事 用LU仃文-ft/ 1.12 3 4 5 6请选择:3L - helloQ:hello world4.保存及读取文件二 4 -txt请选择 文件名:D:xhello SavedBKMXMJCJOCNJitiMXJCJtJCJHM12 3 4 5 6行 示若单人萱文文存西用L1I仃文M MJCM; M.NMrM-4 请选择;5I: 1 牛名:D : he Ila . txtReading-«5退出主菜单下输入5并回车即退出“简单行编辑
17、程序”五.源程序清单#include <>#include <>#include <>struct linechar text81;int num;/* 行号*/struct line *next;/*指向下一个输入项目的指针*/struct line *prior; /*指向前一个项目的指针*/;struct line *start;/*指向表中第一个项目的指针*/struct line *last; /* 指向表中最后一个项目的指针 */struct line *find(int),*dls_store(struct line *);void patch
18、up(int,int),delete_text(),list(),save(char *),load(char *);menu_select();enter(int linenum);void main(int argc,char *argv)char s80,choice,fname80;int linenum=1;start=NULL;last=NULL;if(argc=2) load(argv1);/* 读取命令行上的文件*/dochoice=menu_select();switch(choice)case 1:printf(" 行号 :");gets(s);line
19、num=atoi(s);enter(linenum);break;case 2:delete_text();break;case 3:list();break;case 4:printf("t 文件名 :");gets(fname);save(fname);break;case 5:printf("t 文件名 :");gets(fname);load(fname);break;case 6:exit(0);while(1);/* 显示菜单,供用户选择*/menu_select()char s80;int c;printf("t* 欢迎使用简单行
20、编辑程序 *n");printf("tttt1.行插入n");printf("tttt2.行删除n");printf("tttt3.文本显示n");printf("tttt4.保存文件n");printf("tttt5.读取文件n");printf("tttt6.退出 n");printf("t*n");doprintf("nntt 请选择 :");gets(s);c=atoi(s);while(c<0|c>6);
21、return(c);/* 将文本插在指定行端部*/enter(int linenum)struct line *info;for(;)line);info=(struct line *)malloc(sizeof(struct if(!info)printf("t! 内存不够! n");return(NULL);printf("%d:",linenum);gets(info->text);info->num=linenum;if(*info->text)if(find(linenum) patchup(linenum,1);if(*in
22、fo->text) start=dls_store(info);else break;linenum+;return(linenum);/* 当文本内容插在文件中间时其下面的内容的行号必须增加1,而删除时,被删除的文本后面的行号必须减1*/void patchup(int n,int incr) struct line *i;i=find(n);while(i)i->num=i->num+incr;i=i->next;/* 按行号排序后插入*/struct line *dls_store(struct line *i) struct line *old,*p;if(la
23、st=NULL)i->next=NULL;i->prior=NULL;last=i;return(i);p=start;old=NULL;while(p)if(p->num)old=p;p=p->next; else if(p->prior)p->prior->next=i;i->next=p;p->prior=i;return start;i->next=p;i->prior=NULL;p->prior=i;return(i);old->next=i;i->next=NULL;i->prior=old;
24、last=i;return start;/* 删除一行*/void delete_text()struct line *info;char s80;int linenum;printf(" 行号 :");gets(s);linenum=atoi(s);info=find(linenum);if(info)if(start=info)start=info->next;if(start) start->prior=NULL;else last=NULL;elseinfo->prior->next=info->next;if(info!=last)i
25、nfo->next->prior=info->prior;else last=info->prior;free(info);patchup(linenum+1,-1);/* 查找一行文本*/struct line *find(int linenum)info=start;while(info)if(linenum=info->num) return(info); info=info->next; return(NULL);/* 显示文本*/void list()struct line *info;info=start;while(info)printf("%d:%sn",info->num,info->text); info=info->next;printf("nn");/* 存文件 */void save(char *fname)struct line *info;char *p;FILE *fp;if(fp=fopen(fname,"w")=NULL)printf("t Can't open the file !n");exit(0);printf("t Saved
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 混凝土协会保密协议书
- 渔船个人买卖合同范本
- 短解除合同协议书范本
- 申购合同转让协议模板
- 医患关系的性质界定
- 秋季安全简报模板讲解
- 2025年河北省安国市辅警招聘考试试题题库及参考答案详解(新)
- 2025年江苏省如皋市辅警招聘考试试题题库带答案详解(综合卷)
- 海洋经济计划:蓝图与行动
- 2025年中国农业银行招聘考试真题及答案
- 2025年10月广东深圳市大鹏新区群团工作部招聘编外人员1人考试模拟试题及答案解析
- GB/T 46401-2025养老机构认知障碍老年人照护指南
- 2025年中小学教师师德师风考试试题及答案
- HSF管理体系实施方案及操作指南
- 药企采购知识培训课件
- 脚手架工程监理实施细则(盘扣式脚手架)
- 建筑施工现场质量安全检查表模板
- 医院进修人员培训报告
- 2025-2030中国宠物经济市场现状分析与前景预测报告
- 员工自驾车安全培训课件
- 人工智能区块链技术体系研究报告
评论
0/150
提交评论