简易文本编辑器说明书
更新时间:2024-01-01 10:00:01 阅读量: 教育文库 文档下载
中 北 大 学
课程设计说明书
学 院、系: 专 业: 班 级: 学 生 姓 名: 设 计 题 目:
学 号: 简易文本编辑器
起 迄 日 期: 2016年12月16日~2016年12月29日 指 导 教 师:
日期: 2016年12月29日
1 设计目的
通过用户调查分析及实际需求,开发出一个文本编辑器,可以方便用户对文本进行编辑。系统需要实
现如下基本功能: (1)具有图形菜单界面;
(2)查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除; (3)可正确存盘、取盘; (4)正确显示总行数。
2 任务概述
要设计一简易的文本编辑器,要求有图形菜单界面,也就是菜单选择的界面,要实现的功能有对文本进行存盘,取盘,在某一个盘中新建一个TXT的文件,在里面输入内容,对这个文件进行取盘,显示出文本内容,并在显示的时候显示行数,具有对文本进行查找、替换、插入、移动、删除等功能。
为实现数据的有序存储,该编辑器应该用顺序表来存储输入的信息。顺序表是数据结构中线性表的一种,它是用一块地址连续的存储空间依次存储线性表的元素。其特点为:在顺序表上逻辑关系相邻的两个元素在物理位置上也相邻;在顺序表上可以随即存取表中的元素。在编辑器的主界面中应有如下提示信息:
⑴显示当前文本信息:从文件中读出文本,在某一个盘中创建一个文本文件,所以要读出来,显示到显示器上,并统计出行数。
⑵查找文本信息:因为在下面做插入,删除,移动之类的都需用到查找,在查找的时候,也要调用一个字符匹配模式的程序,来判断查找的内容是否符合所要查找的内容。
⑶删除文本信息:首先在数组中查找要删除的信息,查找的时候调用匹配模式的子函数,如果找到该信息,提示是否确认删除该信息,通过确认来删除信息,如果未找到要删除的信息,提示未找到该信息;
⑷插入文本信息:首先调用字符匹配模式的子函数找到插入点,如果找到该插入点,提示输入插入信息,确认插入信息后,选择是否在这个位置插入,如果是的话执行插入,不是的话再往下查找下一个插入点。
⑸ 替换文本信息:首先在数组中查找要被替换的信息,如果找到该信息,提示输入要替换的信息内容,否则提示未找到要被替换的信息;
⑹ 保存文本信息:在这里使用文件写入读出的功能,把你修改完的内容保存到你所建立的文本中。
⑺ 显示文本内容:读出文件中的所有字符,显示到显示器上。 ⑻ 退出
3 模块划分
(1)系统主要包含主程序模块和其他操作模块。其调用关系如图(一)所示。
主函数 图(一)
各操作模块 (2)文本编辑器的运行流程图如图(二)所示。
startmainmenuopensavestrindexoutput insert Replace Deleteend 图(二) (3)系统子模块及其功能设计:
1.文件的打开:void open(char text[]);
2.文件的保存:void save(char text[]); 3.查找文本:void search(char text[],int l);
4.字符的匹配:int strindex(char text[],char t[],int i2,int l); 5.文本的输出:void output(char text[]); 6.删除文本:void Delete(char p[],int l); 7.插入文本:void insert(char text[],int l); 8.替换文本:void Replace(int status);
4 主要函数说明及其N-S图
(1)对于文本内容的处理,查找部分仍是使用循环对已存储的文章进行匹配,判断需要查找的字符或者字符串是否与文章中某部分内容相同,在程序的执行中,先是进入的主函数,在主函数中调用了菜单函数,进行功能的选择,各个模块分为多个函数来实现。 在程序中,设置了几个全局变量,来记录文本的内容等信息: char text[MAX]=\ char name[20]=\ int status=0; int ntext; (2)字符匹配
在这个程序中要特别注意的是字符的匹配,因为查找、插入、替换都需要用到这一步设计。在这里我设计了一个子模块来实现匹配:
int strindex(char text[],char t[],int i2,int l) //查找要操作的数据的位置(模式匹配) {
int i1=l,j=0;
while (i1 if (j>=i2) { return(i1-i2); } //返回匹配的第一个字符的下标 if (text[i1]==t[j]) //继续匹配下一个字符 { j++; i1++; //文本编辑域 //文件保存的位置 //显示是否保存过的状态 //文本编辑的位置 } //主串和子串依次匹配下一个字符 else { i1=i1-j+1; j=0; //主串从下一个位置开始匹配 //主串、子串指针回溯重新开始下一次匹配 } //子串从头开始匹配 else return(-1); //模式匹配不成功} int i1=l,j=0; while (i1 当调用strindex(text,str1,t,l)函数时,得到返回值,如果a!=-1时,得到返回的是查找的字符串的第一字符的下标,l=a+t;t是字符的长度,hs,ls,分别记录行号与列号。 loop: a=strindex(text,str1,t,l); if (a!=-1) { l=a+t;} int hs=1,ls=0; for (i=0;i<=a;i++) { ls++; if (text[i]=='\\n') { } hs++;ls=0; } if (a==-1) { printf(\查找到结尾没有找到\\n输入【R】将重头查找;\ l=0; fflush(stdin); pd=getchar(); } else { printf(\已经找到在第%d行第%d列,输入【R】继续查找下一处;\ kk+=1; fflush(stdin); bd=getchar(); if (bd=='R'||bd=='r') } if (a!=-1) T F l=a+t; int hs=1,ls=0; printf(\已经找到在第%d行第%的列 for (i=0;i<=a;i++) 输入【R】继续下一处;\ls++; kk+=1; a=strindex(text,str1,t,l); goto loop; if (text[i]=='\\n') fflush(stdin); T bd=getchar(); hs++;ls=0; if(a==-1) if(bd=='R'||bd=='r') T F T F printf(\查找到结尾没有找到\\n输 入【R】将重头查找;\l=0; fflush(stdin); pd=getchar(); 5 程序运行数据及其结果 (1)界面 (2)打开已有文件 (3)查找具体内容 (4)删除内容 (5)插入内容 (6)替换内容 (7)保存文件 (8)退出 6 课程设计心得 通过这次的实训,对之前所学的C语言与数据结构都在加深一下印象,也把之前学得不是很熟悉的数据结构都做了一次回顾。在程序中,我用到的数据结构是顺序表,顺序表是用一组地址连续的存储单元依次存储线性表的数据元素,这种表也称为顺序存储结构或顺序映像。在程序调试的时候,也遇到了许多问题,最严重的问题,就是程序并不是用二维数组来实现的,在文件中的字符定位问题时,我用的是先找到第一行,再使用LOOP语句来使用循环,再做下一行的定位,这样在查找的时候就是一行一行的显示的,不会出现行数与列数统计上出错的问题。有的时候做一个程序时,如果不会很好地使用一些特别深的方法的时候,那么可以换一种思考角度,就像上面的问题,用二维数组来实现虽然会很方便地进行行号列号地定位,但是在对后面的问题处理上就会又要涉及到别的处理方法,所以在这里可以换一种思维方式,用简单的方式来思考同一个问题,就会有不同的发现了。 附录: #include\#include\#include\void open(char text[]); void save(char text[]); void search(char text[],int l); int strindex(char text[],char t[],int i2,int l); void output(char text[]); void Delete(char p[],int l); void insert(char text[],int l); void Replace(int status); void menu(); #define MAX 10000 char text[MAX]=\ char name[20]=\ int status=0; int ntext; //文本编辑域 //文件保存的位置 //显示是否保存过的状态 //文本编辑的位置 void open(char text[]) // 文件的打开 { system(\FILE *fp; char pd,ch; char name[30]; int i=0,ss=1; printf(\输入A:确定打开文件 M:返回主菜单\fflush(stdin); pd=getchar(); } if (pd=='A'||pd=='a') { printf(\请输入要打开文件名字(例如c:\\\\a.txt)\ scanf(\ while ((fp=fopen(name,\ { } system(\ while(!feof(fp)) { } text[i]='\\0'; ntext=i; fclose(fp); printf(\文件读取成功\\n文件内容为\\n\ output(text); printf(\有%d行\} if (pd=='M'||pd=='m') menu(); ch=fgetc(fp);if(ch=='\\n') ss++; text[i++]=ch; printf(\打开文件失败,请重新输入要打开的文件名:\scanf(\ void save(char text[]) //文件的保存 { system(\ FILE *fp; char pd; char tmp; int i; printf(\输入【A】保存;\\n\fflush(stdin); pd=getchar(); if (!(pd=='A'||pd=='a')) { menu(); } else { if(name[20]==NULL) { } while ((fp=fopen(name,\ { } printf(\确定;B:取消:\ while(scanf(\{ if (tmp=='A' || tmp=='a') { printf(\文件不存在,请重新输入文件名:\scanf(\ printf(\请输入保存文件名(例如: c:\\\\a.txt):\scanf(\ } } } for(i=0;i fprintf(fp,\ fclose(fp); } if (tmp=='B' || tmp=='b') { break; status=1; printf(\文件保存成功\\n\break; } int strindex(char text[],char t[],int i2,int l) //查找要操作的数据的位置(模式匹配) { int i1=l,j=0; while (i1 if (text[i1]==t[j]) { j++; i1++; //主串和子串依次匹配下一个字符 //主串、子串指针回溯重新开始下一次匹配 //主串从下一个位置开始匹配 //继续匹配下一个字符 } else i1=i1-j+1; j=0; } //子串从头开始匹配 } if (j>=i2) { return(i1-i2); } else return(-1); } void search(char text[],int l) //{ system(\ int i,t,a=-1,kk=0; char str1[20],bd,pd; printf(\原文为:\\n\ output(text); printf(\请输入您要查找的内容\ scanf(\ printf(\您查找的内容是:%s\\n\ t=strlen(str1); loop: a=strindex(text,str1,t,l); if (a!=-1) { l=a+t;} int hs=1,ls=0; for (i=0;i<=a;i++) { //返回匹配的第一个字符的下标 //模式匹配不成功 查找文本 } ls++; if (text[i]=='\\n') { } } if (a==-1) { printf(\查找到结尾没有找到\\n输入【R】将重头查找;\ l=0; fflush(stdin); pd=getchar(); } else { printf(\已经找到在第%d行第%d列,输入【R】继续查找下一处;\ kk+=1; fflush(stdin); bd=getchar(); hs++;ls=0; if (bd=='R'||bd=='r') goto loop; } printf(\一共找到了%d次\ if (pd=='R'||pd=='r') { l=0;search(text,l); } void output(char text[]) //文本的输出 { system(\ printf(\现在文本的内容为:\\n\ printf(\ int hs=1,i; for (i=0;i } } printf(\文本共有%d行\\n\ } void Delete(char p[],int l) //{ int i,a=-1,t2=0; char x[20],px,pd,pdx,c; system(\ printf(\ printf(\输入A执行查找删除内容\ fflush(stdin); px=getchar(); if (px=='a'||px=='A') { 删除文本 printf(\输入您要删除的内容,以@结束:\ fflush(stdin); while ((c=getchar())!='@') { } if (c=='@') { } else { } x[t2++]=c; continue; break; loop: a=strindex(p,x,t2,l); int hs=1,ls=0; for (i=0;i<=a;i++) { } if (a==-1) { printf(\已查找结束,您要删除的内容不存在\\n输入【R】重新输入要删除的内容; \ls++; if (p[i]=='\\n') { } hs++; ls=0; } l=0; fflush(stdin); pdx=getchar(); else { printf(\你要删除的内容在第%d行第%d列\\n 输入【A】确定删除;输入【B】寻找下个 词;\ } void insert(char text[],int l) //向文本中插入内容 } if(pdx=='r'||pdx=='R') } Delete(text,l); fflush(stdin); pd=getchar(); l=t2+a; if (pd=='a'||pd=='A') { } else if (pd=='b'||pd=='B') goto loop; for(i=a;i ntext=ntext-t2; printf(\删除成功,删除后的内容为:\\n%s\\n\ p[i]=p[i+t2]; { system(\ int i=0,t=0,t2=0,a=-1,b; char cr[20]=\printf(\当前文本信息为:\\n\printf(\ printf(\输入您要在哪个内容前插入,以@结束:\fflush(stdin); while ((c=getchar())!='@') //用一个数组接收要插入在哪个内容之前 { if (c=='@') { } else { } } cr[t++]=c; continue; break; loop: a=strindex(text,cr,t,l); //查找并返回要插入的位置点 int hs=1,ls=0; for (b=0;b if (text[b]=='\\n') { } } hs++; ls=0; if (a==-1) { printf(\查找到结尾没有找到插入点,输入【R】查找其他;\\n\ l=0; fflush(stdin); d=getchar(); fflush(stdin); } else { printf(\您要插入的位置是第%d行,第%d列之前\\n\ printf(\【A】.不是此位置向后继续找插入点\\n【B】.在此位置插入\\n按其他键返回菜单\\n请选择:\ fflush(stdin); pd=getchar(); if (pd=='a'||pd=='A') { } else if (pd=='b'||pd=='B') { printf(\输入您要插入的内容,以@结束:\fflush(stdin); l=a+t; goto loop; } } while ((c=getchar())!='@') { } for (i=ntext;i>=a;i--) { } for (i=0;i ntext=ntext+t2; printf(\当前文本信息为:\\n\for (i=0;i<=ntext-1;i++) printf(\text[i+a]=x[i]; text[i+t2]=text[i]; if (c=='@') {break;} else { } x[t2++]=c; continue; printf(\文本插入成功\\n\fflush(stdin); getchar(); if (d=='r'||d=='R') } { l=0; insert(text,l); } status=0; void Replace(char p[],int l) //内容替换 { int t=0,t1=0,i,a,b; char c,th[20],d,d1,bth[20]; int i2; system(\ printf(\当前文本信息为:\\n\for (i2=0;i2<=ntext-1;i2++) printf(\ printf(\输入要被替换的内容,以@结束:\fflush(stdin); while ((c=getchar())!='@') //t指替换前内容的长度 { if (c=='@') {break; } else { } } bth[t++]=c; continue; loop: a=strindex(p,bth,t,l); //查找要被替换的内容的位置 int hs=1,ls=0; for (b=0;b if (p[b]=='\\n') { } } if (a==-1) { printf(\查找到结尾没有找到要被替换的内容\\n输入【R】查找其他内容\\n\ l=0; d=getchar(); fflush(stdin); //用来清空输入缓存,以便不影响后面输入的东西 } else { printf(\已经找到要查找的数据在第%d行第%d列\\n输入\ printf(\【A】继续向后查找相同内容\\n输入其他键将进行替换操作\\n请选择:\ fflush(stdin); l=t+a; char pd; pd=getchar(); if (pd!='a'&&pd!='A') { hs++; ls=0; printf(\是否要替换该内容?\\nA:替换给内容;其他键返回主菜单\\n请选择:\ fflush(stdin); d1=getchar(); if (d1=='a'||d1=='A') { printf(\输入要替换的内容,以@结束:\ fflush(stdin); while ((c=getchar())!='@') //t1 { if (c=='@') { break; } else { th[t1++]=c; continue; } } if (t==t1) // { for (i=0;i p[i+a]=th[i];} else if (t>t1) { for (i=0;i { 指替换后的内容长度 将要被替换的内容和替换后的内容进行长度比较 } } } p[i+a]=th[i];} for (i=a+t1;i ntext=ntext+t1-t; p[i]=p[i+t-t1]; else { } for (i=ntext;i>=a;i--) { } for (i=0;i ntext=ntext+t1-t; p[i+a]=th[i]; p[i+t1-t]=p[i]; printf(\替换成功\ printf(\当前文本信息为:\\n\for (i2=0;i2<=ntext-1;i2++) printf(\ getchar(); status=0; } else goto loop; } if(d=='r'||d=='R') Replace(text,l); } void menu() { system(\ loop: system(\ printf(\ printf(\ printf(\欢迎使用简易文本编辑器 ****\\n\ printf(\ printf(\ printf(\、打开文件\\n\printf(\、查找\\n\printf(\、删除\\n\printf(\、插入\\n\printf(\、替换\\n\printf(\、保存\\n\printf(\、显示内容\\n\printf(\、退出 ****\\n\printf(\printf(\请选择(1~8):\char c; fflush(stdin); } c=getchar(); if(c>='0'&&c<='9') { switch (c) { case '1':open(text);break; case '2':search(text,0);break; case '3':Delete(text,0);break; case '4':insert(text,1);break; case '5':Replace(text,0);break; case '6':save(text);break; case '7':output(text);break; case '8':exit(0); default : break; } else { } system(\ goto loop; printf(\输入有误,请重新输入:\fflush(stdin); c=getchar(); } int main() { menu(); } return (0);
正在阅读:
简易文本编辑器说明书01-01
你是我最欣赏的人作文500字07-14
老师的笑脸作文500字06-28
初中语文学科能力竞赛文学文化必背知识07-17
尴尬的跑步比赛作文450字07-13
网院北语18秋《人力资源统计学》作业 - 1(满分)05-15
广东省第十三届运动会04-03
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 编辑器
- 说明书
- 简易
- 文本
- 松江工业区公司名单1
- 大学生心理健康教育(2017版)期末考试答案
- ch2 - 符号计算
- 道路景观调研报告 - 图文
- 国际法司考真题
- 先进班组事迹材料
- 砌块及抹灰施工工艺
- 市南区人力资源市场高校毕业生就业服务专场11月24日现场招聘信息 - 图文
- 1计算机网络第五版答案
- 记叙文人物形象分析教学设计 张瑛
- 蒙牛的营销渠道
- 中国钉珠晚礼服行业市场前景分析预测年度报告(目录) - 图文
- 贵州省道真自治县隆兴中学2015-2016学年八年级上学期期末考试试题(英语 无答案)(DOC)
- 新环境下如何开展班主任工作
- 一级建造师 公路实务11
- 四年级上品德与社会教学反思塑料与我们的生活 - 苏教版
- 2017年度共青团系统学雷锋志愿服务季活动方案
- (精编)六年级奥数分册第1周定义新运算
- 第八届兵团青少年科技创新大赛少年儿童科学幻想绘画作品 - 图文
- 精选2019-2020年人教版语文必修一1 沁园春长沙练习题三十五