《2023年简单行编辑程序实验报告.docx》由会员分享,可在线阅读,更多相关《2023年简单行编辑程序实验报告.docx(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、简朴行编辑程序课程设计一.设计规定.问题描述文本编辑程序是运用计算机进行文字加工的基本软件工具,实现对文本文献 的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑 程序。被编辑的文本文献也许很大,所有读入编辑程序的数据空间(内存)的做法即 不经济,又不总能实现。一种解决方法是逐段的编辑。任何时刻只把待编辑文献 的一段放在内存,称为活区。试按这种方法实现一个简朴的行编辑程序,设文献 每行不超过320个字符,很少超过8 0个字符。1 .需求分析该程序要实现以下4条基本的编辑命令:(1)行插入。格式:i行号X回车X文本).V回车)将文本插入活区中第行号 行之后。(2)行删除。格式
2、:d行号1 空格行号2.回车例如删除活区中第行号1 行(到第行号2行)。(3)活区切换。格式:n回车)将活区写入输出文献,并从输入文献中读入下一段,作为新的活区。(4)活区显示。格式:P回车;逐页地(每页20行)显示活区内容,在每显示的 一页之后请用户决定是否继续显示以后各页(假如存在)。印出的每一行要前置行 号和一个空格符,行号固定占4位,增量为1。各条命令中的行号均须在活区中各行号范围之内,只有插入命令的行号可以 等于活区第一行行号减一,表达插入当前的屏幕中第一行之前,否则命令参数非 法。fr e e( i nfo);pa t c h u p(l i n enum+1,-1);)/*查找一
3、行文本*/s truct line *f i nd( i n t linenum)(stru c t 1 ine *i n fo;info=start;wh i le(inf o )(i f (linenum=in f o-n u m) retur n (inf o ); in f o =info-next;)r e turn(NULL);)/*显示文本*/vo i d list ()(stru c t li n e * i n f o;info= s ta r t;while(i n fo)p r i n tf( %d: %s n M,info-num,info- t ext); info=
4、i n fo-next;)p r i nt f ( nn );/ *存文献*/void save(c har *f n am e )stru c t1 in e *inf o ;charF I LEF I LE*fp;i f( f p= f open(fname,uwu) )=NULL)p r intf( t Can t o pen the file ! n );e x it( 0 );)pr i n t f(M t S a ved : n H);in f o=sta r t;while (i n f o )p =i n fo-lext;while (*p)putc(*p+, f p);put
5、c(rn, f p);i n f o=i n f o-next;f close(fp);/*读取文献*/void load (char *f n a m e )(struc t li n e * i n fo,*temp;char*p;FILE * fp;i ntsize, i n c t ;if(fp=fope n (f n ame, r+n) )=NULL)(p r in t f (H t Cant op e n t h e f i le !n );e xit (0);1whilc(s t art)(temp=st a rt;s t art=s t ar t -n ext;fre e (
6、t e mp);)print f (Mn t Re a d i n g. . n H );size=size o f(s t ruct line);slart=(struct 1 i ne*) mal 1 o c(s i z e);i f (! s tart)pr i ntf(nnt内存己经用完!);return;)info=s t art;p=info- t e xt;i n c 1=1;wh i le(*p= g e t c (fp) )! =EOF)(p+;w h ile ( *p=getc( f p )!-n) P+;*p=,0,;in f o -num= i net +;i n f
7、o-n e xt= (st r uc t 1 i ne*)mal 1 o c (size); if ( ! i n f onext)(p r i n t f (”nt内存已经用完!);ret u r n;)info- p ri o r =tem p ;temp二info;i n f o= i nfo- n ext;p= i n fo-text;Itemp- n ex t =NU L L ;la s t=temp;f ree(in f o);start p r ior=NUL L;i close( fp);五.测试分析1.主菜单序程辑编行 不方 单入除显文文存 用L1I仃 12 3 4 5 6迎
8、欢串 U 选 请2.行插入行 示加 单人除显文文存事 使 1 2 3 4 5 6 迎欧请选择:i 行号角1:hello2:world3:hello world3.行删除及文本显示序 程 辑 编行 不& 单人除显文文存事 用Lff仃文使1 .2.3.4.5.6.迎请选择:2请选择:31:hello2:hello uorld.保存及读取文献请选择:4 文件:占Jtello .txt Saved.欢迎使用1234单行编辑程序A请选择:5 文件名:D:hello.txtReading.4 .退出主菜单下输入5并回车即退出“简朴行编辑程序”。六.源程序清单# i nclude #include # in
9、cl u d e st r u c t 1 i n e cha r text8 1 1;int num;/*行号* /struct li n e * next;/*指向下一个输入项目的指针*/struct line *prior; /*指向前一个项目的指针 */;s truct li n e * s tart;/*指向表中第一个项目的指针*/str u ct 1 i ne last;/*指向表中最后一个项目的指针*/st r uct 1 ine * f ind(in t ) ,*dls_stor e ( s tru c t line *);v oid patchu p ( i nt,int),
10、 d elete_ t ext(), 1 i s t (),sa v e(ch a r*), load(char *);me n u_s elec t();en t e r ( i nt li n en u m);v o id main (int arg c ,ch a r *argv)(char s80, c ho i ce, f n a me 80;int li n enum=1;s tart = NULL;last=NULL;if( a r gc=2)1 o ad ( a rg v 1) ;/*读取命令行上的文献* /do (choic e =men u _sel e ct();s w
11、i tc h ( c h oice)casecase1: p rintf(行号:”);gets (s);linenum =atoi(s);e n t e r( 1 in e n u m);bre a k;case 2 : de 1 e t e _ text break;c a se 3 :list();break;case 4 :prin t f (”t 文献名gets( f name);save (fnam e );break;case 5:printf (”t 文献名:);ge t s(fname);load( f name);bre a k;case 6 : e x i t(0);)w
12、h i 1 e(l);/* 显示菜单,供用户选择*/menu_ s e lect()c har s80;in t c ;p rint f ( *欢迎使用简朴行编辑程序* * * * * * *nu);prin t f(ttttl.行插入 n);printf(”tttt2.行删除n,1);p r intf (nt t tt3.文本显示n);printf( n t lZ4.保存文献n”);prin tf(ntt t t 5 .读取文献 n );printf(tt tt6.退出 n”);p rintf(,t* * * * * * * * * * * * * * * * * * *n );doprin
13、tf( n n t t 请选择 gets(s);c =a t oi(s);while( c 6);rcturn(c);)/*将文本插在指定行端部*/ent e r( i n t 1 in e num) (line *inf o ;line *inf o ;struc tinf o =(st r u c t 1 ine *)mall o c ( s i ze o f(struct tin e );i f(! info)(printf ( l!内存不够! nu);return (NULL);)p r intf(% d :n linen u m);g ets(i n f o - text);i nf
14、o n um= 1 incnum;if (*in f o-text)(if ( f in d (lin e num) ) p a tchup (1 i n e n u m,l);if(* in f otext)s t art = dis_store (inf o );1else b re a k;linen u m+ + ;)return (linenum);)/*当文本内容插在文献中间时其下面的内容的行号必须增长1 ,而删除时,被删除的文本后面的行号必须减1*/v oid patchup(int n,i n t incr)(struct 1 in e *i;i= f i nd (n);二.概
15、要设计1 .主界面设计为了实现简朴行编辑程序,设计一个具有多个菜单项的主控菜单子程序以链接系统的各项子功能。主控菜单运营如下:串 U 选 请使 12 3 4 5 6迎行单入除显文文2 .存储结构设计该系统采用串的顺序存储结构。3 .系统功能设计(1)行插入(2)行删除(3)文本显示(4)保存文献(5)读取文献(6)退出系统三.模块设计1.模块设计木程序包含主程序模块、菜单选择模块和串操作模块。调用关系如下主程序模块菜单选择模块串操作模块whi 1 e (i)i-n u m = i-n u m+i n c r;i=i-next;I/*按行号排序后插入*/s t r u c t 1 i ne *d
16、ls_sto r e (struc t 1 i ne * i ) (s t r u ct li n e *old, *p;i f (las t =NULL)i-ne x t =NULL ;i-prior=NULL;1 a s t =i;r e t u rn (i);1p =st a rt;old=NULL;while(p)if (p- num)(ol d =p;p=p- n ex t ;)els eif( p -prior)p-prior- n ext=i;i -next=p;p- P rior=i;retu r n s tart;)i-ncxt=p:i- p rior=NULL;p p r
17、i o r=i; ret u r n (i);)ol d -next=i;i-next=N ULL;i- prior=o 1 d ;last= i ;retur n s tar t ;I/*删除一行*/voi d delete_ t ext ()t line * i n f o ;c ha rsf8 0;int linenum;primf(行号:,);gets(s);linenum=alo i (s);i n fo=fi n d(li n e num);i f ( i nfo)if(st a r t=inf o )(s t ar t = i nfo-nex t ;if(s tart) sta
18、r t- p r ior=NU L L ; else 1 a st= N ULL;)else(info-prio r - n ext= i nfo- n ext;i f( i n fo!=la s t)info- n e x t- p rior=infoprio r ;els e 1 as t =info- p rio r ;1f r ee(info);patchup( 1 i n en u m+1,- 1);)/*杳找一行文本*/struct1 i ne *find(i n t 1 i nenum)str u ct li n e * i nf o ;info= s t a rl;w h il
19、 e ( i nfo)(if(l i n enum= = in f o-n u m) r e tu r n (in f o );i n fo=info-nex t ;1retu r n (NULL);)/*显示文本*/v oid 1 i st()(stru c t line * in f o;info=s t ar t ;wh i 1 e (i n fo)(pr i ntf (%d: % s n,in f o-num,i nfo -tex t ); info=i n f o-n ext;)pri n t f(nn);)/*存文献* /v o id save(ch a r *fn a me)st
20、ruct line * i nfo;cha r * p ;F I LE * fp;if (fp= f open(fname, w H )=NULL)(pr i n t f (t Can t o pen th e file ! n );ex i t(0);1prin t f( n t Sav ed : nn);info=sta r t ;w h il e ( i nf o )(p =i n fb- t ext;while(* p ) putc(*p+, f p);P utc( n f p);info=inf o -next;fclose ( f p);/*读取文献 */v o id lo a d
21、 (ch a r *fname)str u c tstr u c tline *info,*t e mp;char *p;FILE*fp;in tsize, i n ct;i f (fp=fo pen ( f name/,r+ )=NULL)(pri ntf (Ht C a n *t ope n the file ! n );e xit(O);)whilc( start)(temp =start;start = st a rt-next;f r ee(temp);)printf ( n t Reading. .An *);s ize= s i zeof(stru c t 1 i ne);sla
22、rt=(stru c t line*) ma 1 1 o c(size);i f(! star t )P rintf(n t内存已经用完!);re t u rn;1info=start;p=info- text;inct=l;while( (*p=g e t c( f p) )!= E OF)P+;w h ile(* p=getc(fp)! =n)p+;*p=0;in f o- n u m= i n c t+;inf o -n e x l = (struc t 1 ine*)m a lloc(size);i f (!infon e xt)(printf(”nt内存已经用完! ”);re t u
23、rn;1i n fo-p r ior=tem p ;tcmp=info;info=in f o next;p=inf o -tex t ;t e mp-n e xt=NUL L ;last=temp;f r e e ( i nfb);start p r ior=NULL;fclose (f p);1a2.系统子程序及功能设计e nle r (in t li n e n um)行插入/行删除(3 ) void li s t () 0。文本显示(1) v oi d delete, t e x t()保存文献(4 ) v o id save(char *fname)(5) void loa d (c
24、ha r *fname)。读取文献四.具体设计.数据结构设计ADT 1 in e 基本操作:ent e r (line num)初始条件:有内存。操作结果:1 inenum + 1.del e t e _tc x t ( 初始条件:line 存在。操作结果:若删除的最后一行,则直接删除。若删除中间一行,则后面的li nenum -1。L o ad()初始条件:存在文献f i 1 e操作结果:打开文献。 ADT 1 ine.系统重要子程序具体设计(1)主程序模块设计void main(i n t arg c , c har * a rg v 口)chars 80,c h oic e , fnam
25、e80;1 ine n um=1;s t art = NULL;la st=NULL;if(ar g c= 2 )1 oad (arg v 1);doc hoice=men u _select();switch(choi c e)(ca s e l:print f (行号:);ge t s( s );li n e n u m = a t o i (s);e n t e r( 1 ine n um);break;case 2: d e lete_text();break;c ase 3: 1 ist ();br e ak;ca se 4: p rin t f(”t 文献名:”);g e ts(f
26、n a me);save (fnam e );b r eak;case5:pr inlf (、文献名门);gets( f n a me);1 o ad( f name);break;case6 :ex i t (0); while ( 1 );me n u_ s el e c t ()i nt c;printf(M t * * * * * * *欢迎使用简朴行编辑程序* * * * * * *n”);prin t f1 .行插入 n );print f ( ” ttZ2.行删除n”);pri n tf( t t N3.文本显示n);prin t f ( tttt4.保存文献n”);prin t
27、 f (nt t t t 5.读取文献 n”);pri n tf ( , t tt t 6 .退出 n);o p r intf( t * * * * * * * * 火 * * * * * * * * * * * * * * n”ydo printf(Hnnt t 请选择:);gets (s);c = al o i(s);wh i le( c 6 );r et u rn(c);1(2)重要工作函数/*将文本插在指定行端部*/e nter( i nt lincnum)(stru c t lin e *info;for(;;)(in f o =(st r uc t line *) m a 1 1
28、o c(s i z e o f( s t ru c t 1 ine);i f (!info)(pr i nt f (t! 内存不够! n ”);return( NULL);)prin t f ( %d:, linenum);gets( i nf o -text);i nf o -num= 1 i ncn u m;i f (*i n fo-text)(if(find(linenum) pa t ch u p ( 1 i n enum, 1 );if (*i n fo-t ext) s tart=dl s _ s tore (info);)els e brea k ;linen u m+;retu
29、r n (linen u m);/*当文本内容插在文献中间时其下面的内容的行号必须增长1,而删除时,被删除的文本后面的行号必须减1* /void p a tchup(int n ,i n t incr)(s t r u ct ii n e *i;i= f i n d( n );while(i)i -n u m=i -num+ incr;i =i-next;1/ *按行号排序后插入* /st r uc t line * d ls_s tor e(struct line * i )(s t rue t 1 inc *old,*p;if( 1 a st=NULL)(i -next=NULL;i-pr
30、 i o r =NULL;last=i;r etu r n(i);p=sta r t; old=NU LL;w h i 1 e(p)if (p- n um)ol d =p;p =p-n e xt;)e I se(i f ( p p r i o r )(p-prior-ne x t= i ;i next= p ;p- p r i or=i;r e tur n start;)i -next= p ;i- p rio r =NULL;p - p rior=i;re t u r n(i);)Iold-next=i;i-ne x t =N U L L;i -p r ior=ol d ;last= i ;
31、ret urnstar t ;/*删除一行 */v o i d d e 1 et e _ t ex t ()(struct 1 i ne * i n f o ;char s8 0 ;int li n e n u m;print f ( u 行号:);gets(s);lin e n u m=atoi(s);i nfo= f in d ( 1 i n enum);if ( i nfo)i f ( start=i nfo)(s tar t =i n fo-next;i f ( s tart) star t - p r ior=NUL L ;else1 a s t=NULL;else i n fo p rior-n e xt=inf o -ne x t;i f(in f o!= last)info-nextp r ior=info- p r i or;else 1 a s t=inf o -pr i o r ;