简易文本编辑器

上传人:仙*** 文档编号:218113876 上传时间:2023-06-16 格式:DOC 页数:20 大小:66KB
返回 下载 相关 举报
简易文本编辑器_第1页
第1页 / 共20页
简易文本编辑器_第2页
第2页 / 共20页
简易文本编辑器_第3页
第3页 / 共20页
点击查看更多>>
资源描述
软件综合课程设计简易文本编辑器猴子吃桃子问题 二一四 年 六 月猴子吃桃子问题1问题陈述 有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。?要求:1)采用数组数据结构实现上述求解2)采用链数据结构实现上述求解3)采用递归实现上述求解如果用数组结构解决这个问题,把猴子吃桃的天数倒过来看的话,以天数作为数组的下标i,剩下桃子的个数ai的递推公式为ai=(ai-1+1)*2。ai实际代表了倒数第i天剩下的桃子数。所以可以求得此数组的通项公式为ai=3*2e(i-1)-2 (i=2)。如果用链结构解决这个问题,建立一个链表,根据每天桃子数与后一天桃子数的关系n=2*n+2,依次将每天的桃子数存进链表中,最后输出第一天的桃子数。首先是建立一个空链表,产生一个头结点,且将头结点的地址赋给L。 然后把每天的桃子数从链表的第一个结点插入链表。最后第一天的桃子数被最后一个插入链表,成为链表中第一个值,将其赋给e,最后只要输出e即得到第一天的桃子数。如果用递归结构解决这个问题,要求利用他们每天都吃当前桃子的一半且再多吃一个这一特点,设计一个递归算法。2程序代码#include#include#includeiostream#includestdlib.h#define TRUE 1#define FALSE 0#define ERROR 0#define OVERFLOW 0#define OK 1#define NULL 0typedef int Status;typedef int ElemType;struct LNodeElemType data;LNode *next;typedef LNode *LinkList;void InitList(LinkList &L)/构造一个空链链表L=(LinkList)malloc(sizeof(LNode);/产生头结点,并使L指向此头结点if(!L) exit(OVERFLOW);L-next=NULL;Status GetElem(LinkList L,int i,ElemType &e)/当第i个元素存在的时,将其值赋给eint j=1;/计数器初值为0LinkList p=L-next;/p指向第一个结点while(p&jnext;if(!p|ji)return ERROR;e=p-data;return OK;Status ListInsert(LinkList L,int i,ElemType e)/在第i个位置之前插入元素e int j=0;/计数器初值为0LinkList s,p=L;/p指向头结点while(p&jnext;if(!p|ji-1) return 0;s=(LinkList)malloc(sizeof(LNode);/生成新的结点s-data=e;s-next=p-next;/新结点指向原第i个结点p-next=s;/原第i-1个结点指向新结点return 1;void shuju()int da,tao11; /定义数组和下标tao0=0; /tao0赋值为0tao1=1; /倒数第一天的桃子数为1for(da=2;da0)n=sum_fan(n+1)*2,-i); /每一次都用(n+1)*2)的值去调用子函数本身return n; /返回结果void main()int sum;int day=9; /实现函数调用的次数int x=1; /最后一天还剩得一个桃子int t;LinkList L;int i,e,n;InitList(L);/初始化链表doprintf(n);printf(*n); printf(1、数组数据结构实现n); printf(2、链数据结构实现 n);printf(3、递归实现 n); printf(4、退出 n);printf(*n); printf(请选择(14):); scanf(%d,&t); if(t4)&(t1)printf(对不起,无此功能,请输入正确的功能序号!n); /getchar();elseswitch(t) case 2: sum=sum_fan(x,day); /调用子函数sum_fan,并把返回得结果赋给sum printf(%d,sum);break;case 1: shuju();break;case 3: for(i=1,n=1;i=10;i+)n=2*n+2;/将每一天的桃子数赋值给nListInsert(L,1,n);/将n的值输入链表GetElem(L,2,e);printf(最初的桃子数为%d,e);/输出桃子的数目break;if(t=4) break; while(1); 3运行结果(1)数组数据结构实现结果,如图3-1所示:图3-1(2)链数据结构实现结果,如图3-2所示:图3-2(3)递归实现结果,如图3-3所示:图3-3 简易文本编辑器1问题陈述(1)设计内容和要求1) 具有图形菜单界面;2) 查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除3) 可正确存盘、取盘;4) 正确显示总行数。2需求分析要设计一简易的文本编辑器,要求有图形菜单界面,也就是菜单选择的界面,要实现的功能有对文本进行存盘,取盘,在某一个盘中新建一个TXT的文件,在里面输入内容,对这个文件进行取盘,显示出文本内容,并在显示的时候显示行数,具有对文本进行查找、替换、插入、移动、删除等功能。为实现数据的有序存储,该编辑器应该用顺序表来存储输入的信息。顺序表是数据结构中线性表的一种,它是用一块地址连续的存储空间依次存储线性表的元素。其特点为:在顺序表上逻辑关系相邻的两个元素在物理位置上也相邻;在顺序表上可以随即存取表中的元素。在编辑器的主界面中应有如下提示信息:显示当前文本信息:从文件中读出文本,在某一个盘中创建一个文本文件,所以要读出来,显示到显示器上,并统计出行数。查找文本信息:因为在下面做插入,删除,移动之类的都需用到查找,在查找的时候,也要调用一个字符匹配模式的程序,来判断查找的内容是否符合所要查找的内容。删除文本信息:首先在数组中查找要删除的信息,查找的时候调用匹配模式的子函数,如果找到该信息,提示是否确认删除该信息,通过确认来删除信息,如果未找到要删除的信息,提示未找到该信息;插入文本信息:首先调用字符匹配模式的子函数找到插入点,如果找到该插入点,提示输入插入信息,确认插入信息后,选择是否在这个位置插入,如果是的话执行插入,不是的话再往下查找下一个插入点。 替换文本信息:首先在数组中查找要被替换的信息,如果找到该信息,提示输入要替换的信息内容,否则提示未找到要被替换的信息; 保存文本信息:在这里使用文件写入读出的功能,把你修改完的内容保存到你所建立的文本中。 显示文本内容:读出文件中的所有字符,显示到显示器上。 退出3概要设计(1)所用到的函数有: 文件的打开: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);(2)程序流程图:程序分为了多个子函数,程序中的子模块的分类图,总共分为了六个主要的模块,分别是否打开,保存,查找,删除,插入,替换,这六个模块的选择,在菜单的子程序中进行,在main函数中进入菜单选择,进行功能的选择。流程如图3-1所示:主函数菜单 替换文本插入文本删除文本查找文本打开文本保存文本图3-1在程序中,查找,删除,插入,替换的子程序都需要调用到int strindex(char text,char t,int i2,int l);的子程序,据此画出了程序的执行的流程图,程序的执行的简单的流程图,如图3-2所示:图3-24详细设计(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); /模式匹配不成功(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;(4)插入在插入的时候是先要调用上面的查找的子函数,在插入的时候也是考虑到行列号的问题,所以我在这里也是用LOOP语句,通过一行一行的查找,找到你所要插入的地方,就进行插入操作,如果不是这个地方要插入的话,就继续往下执行查找,查找完所有的符合的,显示完后,最后统计总共有多少次。在这个子程序中定义一个数组Cr来放置插入的位置点。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();(5)替换做替换的时候,定义一个数组来放替换的内容,另一个数组放替换后的内容,而且在做替换时也要调用字符匹配的子程序。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();elseprintf(nn已经找到要查找的数据在第%d行第%d列n输入,hs,ls+1);printf(n【A】继续向后查找相同内容n输入其他键将进行替换操作n请选择:);l=t+a;char pd;pd=getchar();if (pd!=a&pd!=A)printf(n是否要替换该内容?nA:替换给内容;其他键返回主菜单n请选择:);d1=getchar();if (d1=a|d1=A)printf(n输入要替换的内容,以结束:);while (c=getchar()!=) /t1指替换后的内容长度if (c=)break;elsetht1+=c;continue;if (t=t1) /将要被替换的内容和替换后的内容进行长度比较for (i=0;it1)for (i=0;it1;i+)pi+a=thi;for (i=a+t1;i=a;i-)pi+t1-t=pi;for (i=0;it1;i+)pi+a=thi;ntext=ntext+t1-t;printf(替换成功);printf(n当前文本信息为:n);for (i2=0;i2=ntext-1;i2+)printf(%c,pi2);getchar();status=0;elsegoto loop;(6)删除删除的时候,也需要调用字符匹配的子程序,找到了要删除的内容,再进行删除,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;5程序代码 来源于网络#includestdio.h#include stdlib.h #include string.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请选择:);fflush(stdin);l=t+a;char pd;pd=getchar();if (pd!=a&pd!=A)printf(n是否要替换该内容?nA:替换给内容;其他键返回主菜单n请选择:);fflush(stdin);d1=getchar();if (d1=a|d1=A)printf(n输入要替换的内容,以结束:);fflush(stdin);while (c=getchar()!=) /t1指替换后的内容长度if (c=)break;elsetht1+=c;continue;if (t=t1) /将要被替换的内容和替换后的内容进行长度比较for (i=0;it1)for (i=0;it1;i+)pi+a=thi;for (i=a+t1;i=a;i-)pi+t1-t=pi;for (i=0;it1;i+)pi+a=thi;ntext=ntext+t1-t;printf(替换成功);printf(n当前文本信息为:n);for (i2=0;i2=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;elseprintf(n输入有误,请重新输入:);fflush(stdin);c=getchar();system(pause);goto loop; int main()menu();return (0);6运行结果与测试(1)界面如图6-1所示: 图6-1(2)打开文件,是从盘中新建一个文本文件,在输入文件名打开文件,显示到显示器上,打开文件如图6-2,6-3所示: 图6-2 图6-3(3)查找文本如图6-4所示:图6-4(4)删除文本如图6-5所示:图6-5(5)插入文本如图6-6所示:图6-6(6)替换文本如图3-7所示:图3-77设计体会与总结通过这次的实训,对之前所学的C语言与数据结构都有了一定的认识,也把之前学得不是很熟悉的数据结构都做了一次回顾,把之前都不是很会的一些数据结构都有了一定的认识。这次的实训让我对数据结构有了更深刻的认识,数据结构是介于数学、计算机硬件和软件三者之间的一门核心课程。在第一个程序中,我用到的数据结构是顺序表,顺序表是用一组地址连续的存储单元依次存储线性表的数据元素,这种表也称为顺序存储结构或顺序映像。它的特点是:逻辑上相邻的数据元素,其物理上次序也是相邻。在这个程序中我使用的还是C语言来编写的,在设计的时候使用得是数组来实现,用子函数的调用来实现。在程序调试的时候,也遇到了许多问题,最严重的问题,就是程序并不是用二维数组来实现的,在文件中的字符定位问题时,我用的是先找到第一行,再使用LOOP语句来使用循环,再做下一行的定位,这样在查找的时候就是一行一行的显示的,不会出现行数与列数统计上出错的问题。有的时候做一个程序时,如果不会很好地使用一些特别深的方法的时候,那么可以换一种思考角度,就像上面的问题,用二维数组来实现虽然会很方便地进行行号列号地定位,但是在对后面的问题处理上就会又要涉及到别的处理方法,所以在这里可以换一种思维方式,用简单的方式来思考同一个问题,就会有不同的发现了,在这里,就是这样的。而在第二程序中,这是一个趣味性很强的程序,是猴子吃桃的问题,但是这个程序的要求是要用三种不同的数据结构来实现,第一种就是数组的数据结构,就是把猴子吃桃的天数倒过来看;用链表解决的话,每天桃子数与后一天的桃子数的关系n=2*n+2,依次将每天的桃子数存进链表中,最后输出第一天的桃子数。不同的数据结构来实现同一个问题,在这个程序中最难的是链表,用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!