




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中 北 大 学课程设计说明书学 院、系:专 业:班 级:学 生 姓 名:学 号:设 计 题 目:简易文本编辑器 起 迄 日 期: 2016年12月16日2016年12月29日指 导 教 师:日期: 2016年12月29日1 设计目的 通过用户调查分析及实际需求,开发出一个文本编辑器,可以方便用户对文本进行编辑。系统需要实现如下基本功能:(1)具有图形菜单界面;(2)查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除;(3)可正确存盘、取盘;(4)正确显示总行数。2 任务概述要设计一简易的文本编辑器,要求有图形菜单界面,也就是菜单选择的界面,要实现的功能有对文本进行存盘,取盘,在某一个盘中新建一个TXT的文件,在里面输入内容,对这个文件进行取盘,显示出文本内容,并在显示的时候显示行数,具有对文本进行查找、替换、插入、移动、删除等功能。为实现数据的有序存储,该编辑器应该用顺序表来存储输入的信息。顺序表是数据结构中线性表的一种,它是用一块地址连续的存储空间依次存储线性表的元素。其特点为:在顺序表上逻辑关系相邻的两个元素在物理位置上也相邻;在顺序表上可以随即存取表中的元素。在编辑器的主界面中应有如下提示信息:显示当前文本信息:从文件中读出文本,在某一个盘中创建一个文本文件,所以要读出来,显示到显示器上,并统计出行数。查找文本信息:因为在下面做插入,删除,移动之类的都需用到查找,在查找的时候,也要调用一个字符匹配模式的程序,来判断查找的内容是否符合所要查找的内容。删除文本信息:首先在数组中查找要删除的信息,查找的时候调用匹配模式的子函数,如果找到该信息,提示是否确认删除该信息,通过确认来删除信息,如果未找到要删除的信息,提示未找到该信息;插入文本信息:首先调用字符匹配模式的子函数找到插入点,如果找到该插入点,提示输入插入信息,确认插入信息后,选择是否在这个位置插入,如果是的话执行插入,不是的话再往下查找下一个插入点。 替换文本信息:首先在数组中查找要被替换的信息,如果找到该信息,提示输入要替换的信息内容,否则提示未找到要被替换的信息; 保存文本信息:在这里使用文件写入读出的功能,把你修改完的内容保存到你所建立的文本中。 显示文本内容:读出文件中的所有字符,显示到显示器上。 退出3 模块划分 (1)系统主要包含主程序模块和其他操作模块。其调用关系如图(一)所示。 主函数 各操作模块 图(一) (2)文本编辑器的运行流程图如图(二)所示。 图(二)(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 textMAX=;/文本编辑域char name20=;/文件保存的位置int status=0;/显示是否保存过的状态int ntext;/文本编辑的位置(2)字符匹配在这个程序中要特别注意的是字符的匹配,因为查找、插入、替换都需要用到这一步设计。在这里我设计了一个子模块来实现匹配:int strindex(char text,char t,int i2,int l) /查找要操作的数据的位置(模式匹配)int i1=l,j=0;while (i1ntext&j=i2)return(i1-i2); /返回匹配的第一个字符的下标elsereturn(-1); /模式匹配不成功int i1=l,j=0;while (i1ntext&j=i2)TF return(i1-i2); return -1;(3)按行来实现查找而且程序中用的顺序表存储的形式,在执行的时候考虑到在查找时,要显示是在第几行第几列的位置,但是程序并不是用二维数组来实现的,并不记录文本中每一个字符的行列号,所以如果直接一下子统计出来的话,就会出现行列号上的错误,所以在程序中使用了一下LOOP语句,来让程序一行一行的统计与显示。当调用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 (texti=n)hs+;ls=0; if (a=-1)printf(查找到结尾没有找到n输入【R】将重头查找;);l=0;fflush(stdin);pd=getchar(); else printf(已经找到在第%d行第%d列,输入【R】继续查找下一处;,hs,ls); kk+=1;fflush(stdin);bd=getchar(); if (bd=R|bd=r) goto loop; a=strindex(text,str1,t,l);if (a!=-1)TFl=a+t; int hs=1,ls=0; printf(已经找到在第%d行第%的列for (i=0;i=a;i+) 输入【R】继续下一处;,hs,is);ls+; kk+=1; if (texti=n) fflush(stdin); T bd=getchar();hs+;ls=0; if(a=-1) if(bd=R|bd=r) T F TF printf(查找到结尾没有找到n输入【R】将重头查找;); goto loop;l=0; fflush(stdin); pd=getchar();5 程序运行数据及其结果(1)界面(2)打开已有文件(3)查找具体内容(4)删除内容(5)插入内容(6)替换内容(7)保存文件(8)退出6 课程设计心得 通过这次的实训,对之前所学的C语言与数据结构都在加深一下印象,也把之前学得不是很熟悉的数据结构都做了一次回顾。在程序中,我用到的数据结构是顺序表,顺序表是用一组地址连续的存储单元依次存储线性表的数据元素,这种表也称为顺序存储结构或顺序映像。在程序调试的时候,也遇到了许多问题,最严重的问题,就是程序并不是用二维数组来实现的,在文件中的字符定位问题时,我用的是先找到第一行,再使用LOOP语句来使用循环,再做下一行的定位,这样在查找的时候就是一行一行的显示的,不会出现行数与列数统计上出错的问题。有的时候做一个程序时,如果不会很好地使用一些特别深的方法的时候,那么可以换一种思考角度,就像上面的问题,用二维数组来实现虽然会很方便地进行行号列号地定位,但是在对后面的问题处理上就会又要涉及到别的处理方法,所以在这里可以换一种思维方式,用简单的方式来思考同一个问题,就会有不同的发现了。附录:#includestdio.h#includestdlib.h #includestring.hvoid 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 10000char textMAX=;/文本编辑域char name20=;/文件保存的位置int status=0;/显示是否保存过的状态int ntext; /文本编辑的位置void open(char text) / 文件的打开 system(cls); FILE *fp;char pd,ch;char name30;int i=0,ss=1;printf(输入A:确定打开文件 M:返回主菜单);fflush(stdin);pd=getchar();if (pd=A|pd=a)printf(请输入要打开文件名字(例如c:a.txt));scanf(%s,name);while (fp=fopen(name,r)=NULL)printf(n打开文件失败,请重新输入要打开的文件名:);scanf(%s,name);system(cls);while(!feof(fp)ch=fgetc(fp);if(ch=n) ss+; texti+=ch;texti=0; ntext=i; fclose(fp);printf(n文件读取成功n文件内容为n);output(text); printf(有%d行,ss);if (pd=M|pd=m)menu(); void save(char text) /文件的保存system(cls);FILE *fp;char pd;char tmp;int i;printf(n输入【A】保存;n); fflush(stdin);pd=getchar();if (!(pd=A|pd=a)menu();else if(name20=NULL)printf(n请输入保存文件名(例如: c:a.txt):);scanf(%s,name);while (fp=fopen(name,w+)=NULL)printf(文件不存在,请重新输入文件名:);scanf(%s,name);printf(nA:确定;B:取消:); while(scanf(%c,&tmp)!=EOF)if (tmp=A | tmp=a) for(i=0;intext;i+) fprintf(fp,%c,texti); fclose(fp);status=1;printf(n文件保存成功n);break;if (tmp=B | tmp=b)break; int strindex(char text,char t,int i2,int l) /查找要操作的数据的位置(模式匹配)int i1=l,j=0;while (i1ntext&j=i2)return(i1-i2); /返回匹配的第一个字符的下标elsereturn(-1); /模式匹配不成功void search(char text,int l) /查找文本system(cls);int i,t,a=-1,kk=0;char str120,bd,pd;printf(原文为:n); output(text);printf(请输入您要查找的内容);scanf(%s,str1);printf(您查找的内容是:%sn,str1);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 (texti=n)hs+;ls=0; if (a=-1)printf(查找到结尾没有找到n输入【R】将重头查找;);l=0;fflush(stdin);pd=getchar(); else printf(已经找到在第%d行第%d列,输入【R】继续查找下一处;,hs,ls); kk+=1;fflush(stdin);bd=getchar(); if (bd=R|bd=r) goto loop;printf(一共找到了%d次,kk); if (pd=R|pd=r) l=0;search(text,l); void output(char text) /文本的输出 system(cls);printf(现在文本的内容为:n);printf(%sn,text); int hs=1,i;for (i=0;intext;i+)if (texti=n)hs+; printf(n文本共有%d行n,hs);void Delete(char p,int l) /删除文本int i,a=-1,t2=0;char x20,px,pd,pdx,c;system(cls);printf(%s,p);printf(n输入A执行查找删除内容);fflush(stdin);px=getchar();if (px=a|px=A)printf(n输入您要删除的内容,以结束:);fflush(stdin);while (c=getchar()!=)if (c=)break;elsext2+=c;continue;loop:a=strindex(p,x,t2,l);int hs=1,ls=0;for (i=0;i=a;i+)ls+;if (pi=n)hs+; ls=0; if (a=-1) printf(已查找结束,您要删除的内容不存在n输入【R】重新输入要删除的内容; );l=0;fflush(stdin);pdx=getchar();else printf(你要删除的内容在第%d行第%d列n 输入【A】确定删除;输入【B】寻找下个词;,hs,ls);fflush(stdin);pd=getchar();l=t2+a;if (pd=a|pd=A)for(i=a;intext;i+)pi=pi+t2;ntext=ntext-t2;printf(删除成功,删除后的内容为:n%sn,text);else if (pd=b|pd=B)goto loop;if(pdx=r|pdx=R)Delete(text,l);void insert(char text,int l) /向文本中插入内容 system(cls);int i=0,t=0,t2=0,a=-1,b;char cr20=,pd,x500,c,d;printf(n当前文本信息为:n);printf(%s,text);printf(n输入您要在哪个内容前插入,以结束:);fflush(stdin);while (c=getchar()!=) /用一个数组接收要插入在哪个内容之前if (c=)break;elsecrt+=c;continue;loop:a=strindex(text,cr,t,l); /查找并返回要插入的位置点 int hs=1,ls=0;for (b=0;b=a;i-)texti+t2=texti;for (i=0;it2;i+)texti+a=xi;ntext=ntext+t2;printf(n当前文本信息为:n);for (i=0;i=ntext-1;i+)printf(%c,texti);printf(n文本插入成功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,th20,d,d1,bth20;int i2;system(cls);printf(n当前文本信息为:n);for (i2=0;i2=ntext-1;i2+)printf(%c,pi2);printf(n输入要被替换的内容,以结束:);fflush(stdin);while (c=getchar()!=) /t指替换前内容的长度if (c=)break;elsebtht+=c;continue;loop:a=strindex(p,bth,t,l); /查找要被替换的内容的位置int hs=1,ls=0;for (b=0;ba;b+)ls+;if (pb=n)hs+;ls=0;if (a=-1)printf(n查找到结尾没有找到要被替换的内容n输入【R】查找其他内容n);l=0;d=getchar();fflush(stdin); /用来清空输入缓存,以便不影响后面输入的东西 elseprintf(nn已经找到要查找的数据在第%d行第%d列n输入,hs,ls+1);printf(n【A】继续向后查找相同内容n输入其他键将进行替换操作n请选择:)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025商业电力供应合同模板
- 2025合同范本设备甲供分包合同样本
- 2024北京首师大附中高一(下)期中数学试题及答案
- 数字媒体设计原理与实践试题
- 生产设备维护管理作业指导书
- 法律学科知识产权法案例分析题库
- 卵石砼施工方案
- 20XX年度室内设计方案汇报
- 2025年消防员专业培训考试题库:消防法律法规精解及实战应用试题
- 2025年大数据分析师职业技能测试卷:Hadoop生态圈与Spark编程试题
- 梁板墙柱混凝土同时浇筑专项方案(专家论证)
- 数学探究:用向量法研究三角形的性质教学设计-2023-2024学年高一下学期数学人教A版(2019)必修第二册
- 2024年初级消防员职业技能鉴定考试复习题库(单选、多选题)
- 玉溪大红山铁矿二期北采区采矿施工组织设计
- 阳光心理-健康人生小学生心理健康主题班会课件
- 第9课资产阶级革命与资本主义制度的确立课件-高中历史统编版2019必修中外历史纲要下册
- 2024年共青团入团积极分子团校结业考试试题库及答案
- 高中英语语法-各种从句练习
- G -B- 43630-2023 塔式和机架式服务器能效限定值及能效等级(正式版)
- 《零碳建筑技术概论》 课件全套 郭春梅 第1-13章 绪论、零碳建筑碳排放核算方法- 典型零碳建筑案例
- 统编版六年级下册语文非连续性文本阅读小升初专项训练(含答案)
评论
0/150
提交评论