简易文本编辑器说明书Word格式.doc
《简易文本编辑器说明书Word格式.doc》由会员分享,可在线阅读,更多相关《简易文本编辑器说明书Word格式.doc(30页珍藏版)》请在冰点文库上搜索。
![简易文本编辑器说明书Word格式.doc](https://file1.bingdoc.com/fileroot1/2023-4/30/f553b886-352d-44ca-8253-097462fed821/f553b886-352d-44ca-8253-097462fed8211.gif)
⑻退出
3模块划分
(1)系统主要包含主程序模块和其他操作模块。
其调用关系如图
(一)所示。
主函数
各操作模块
图
(一)
(2)文本编辑器的运行流程图如图
(二)所示。
图
(二)
(3)系统子模块及其功能设计:
1.文件的打开:
voidopen(chartext[]);
2.文件的保存:
voidsave(chartext[]);
3.查找文本:
voidsearch(chartext[],intl);
4.字符的匹配:
intstrindex(chartext[],chart[],inti2,intl);
5.文本的输出:
voidoutput(chartext[]);
6.删除文本:
voidDelete(charp[],intl);
7.插入文本:
voidinsert(chartext[],intl);
8.替换文本:
voidReplace(intstatus);
4主要函数说明及其N-S图
(1)对于文本内容的处理,查找部分仍是使用循环对已存储的文章进行匹配,判断需要查找的字符或者字符串是否与文章中某部分内容相同,在程序的执行中,先是进入的主函数,在主函数中调用了菜单函数,进行功能的选择,各个模块分为多个函数来实现。
在程序中,设置了几个全局变量,来记录文本的内容等信息:
chartext[MAX]="
"
;
//文本编辑域
charname[20]="
//文件保存的位置
intstatus=0;
//显示是否保存过的状态
intntext;
//文本编辑的位置
(2)字符匹配
在这个程序中要特别注意的是字符的匹配,因为查找、插入、替换都需要用到这一步设计。
在这里我设计了一个子模块来实现匹配:
intstrindex(chartext[],chart[],inti2,intl)//查找要操作的数据的位置(模式匹配)
{
inti1=l,j=0;
while(i1<
ntext&
&
j<
i2)
{
if(text[i1]==t[j]) //继续匹配下一个字符
{
j++;
i1++;
}//主串和子串依次匹配下一个字符
else //主串、子串指针回溯重新开始下一次匹配
i1=i1-j+1;
//主串从下一个位置开始匹配
j=0;
} //子串从头开始匹配
}
if(j>
=i2)
return(i1-i2);
}//返回匹配的第一个字符的下标
else
return(-1);
//模式匹配不成功}
inti1=l,j=0;
while(i1<
T if(text[i1]==t[j]) F
j++;
i1++;
i1=i1-j+1;
j=0;
if(j>
T F
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;
}
inths=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】继续查找下一处;
hs,ls);
kk+=1;
bd=getchar();
if(bd=='
R'
||bd=='
r'
gotoloop;
a=strindex(text,str1,t,l);
if(a!
=-1)
l=a+t;
inths=1,ls=0;
printf("
已经找到在第%d行第%的列
for(i=0;
i++)输入【R】继续下一处;
hs,is);
ls++;
kk+=1;
if(text[i]=='
)fflush(stdin);
T bd=getchar();
hs++;
if(a==-1)if(bd=='
)
T F T F
printf("
查找到结尾没有找到\n输
入【R】将重头查找;
gotoloop;
l=0;
fflush(stdin);
pd=getchar();
5程序运行数据及其结果
(1)界面
(2)打开已有文件
(3)查找具体内容
(4)删除内容
(5)插入内容
(6)替换内容
(7)保存文件
(8)退出
6课程设计心得
通过这次的实训,对之前所学的C语言与数据结构都在加深一下印象,也把之前学得不是很熟悉的数据结构都做了一次回顾。
在程序中,我用到的数据结构是顺序表,顺序表是用一组地址连续的存储单元依次存储线性表的数据元素,这种表也称为顺序存储结构或顺序映像。
在程序调试的时候,也遇到了许多问题,最严重的问题,就是程序并不是用二维数组来实现的,在文件中的字符定位问题时,我用的是先找到第一行,再使用LOOP语句来使用循环,再做下一行的定位,这样在查找的时候就是一行一行的显示的,不会出现行数与列数统计上出错的问题。
有的时候做一个程序时,如果不会很好地使用一些特别深的方法的时候,那么可以换一种思考角度,就像上面的问题,用二维数组来实现虽然会很方便地进行行号列号地定位,但是在对后面的问题处理上就会又要涉及到别的处理方法,所以在这里可以换一种思维方式,用简单的方式来思考同一个问题,就会有不同的发现了。
附录:
#include"
stdio.h"
stdlib.h"
string.h"
voidmenu();
#defineMAX10000
//文本编辑的位置
voidopen(chartext[])//文件的打开
{
system("
cls"
FILE*fp;
charpd,ch;
charname[30];
inti=0,ss=1;
printf("
输入A:
确定打开文件M:
返回主菜单"
fflush(stdin);
pd=getchar();
if(pd=='
A'
||pd=='
a'
请输入要打开文件名字(例如c:
\\a.txt)"
scanf("
%s"
name);
while((fp=fopen(name,"
r"
))==NULL)
\n打开文件失败,请重新输入要打开的文件名:
scanf("
}
system("
while(!
feof(fp))
ch=fgetc(fp);
if(ch=='
)ss++;
text[i++]=ch;
text[i]='
\0'
ntext=i;
fclose(fp);
\n文件读取成功\n文件内容为\n"
output(text);
有%d行"
ss);
if(pd=='
M'
m'
menu();
voidsave(chartext[])//文件的保存
{
charpd;
chartmp;
inti;
\n输入【A】保存;
\n"
if(!
(pd=='
))
menu();
if(name[20]==NULL)
\n请输入保存文件名(例如:
c:
\\a.txt):
w+"
文件不存在,请重新输入文件名:
\nA:
确定;
B:
取消:
while(scanf("
%c"
&
tmp)!
=EOF)
{
if(tmp=='
||tmp=='
)
{
for(i=0;
ntext;
i++)
fprintf(fp,"
text[i]);
fclose(fp);
status=1;
printf("
\n文件保存成功\n"
break;
}
B'
b'
}
}
intstrindex(chartext[],chart[],inti2,intl)//查找要操作的数据的位置(模式匹配)
if(text[i1]==t[j]) //继续匹配下一个字符
} //主串和子串依次匹配下一个字符
else //主串、子串指针回溯重新开始下一次匹配
//主串从下一个位置开始匹配
} //子串从头开始匹配
} //返回匹配的第一个字符的下标
//模式匹配不成功
voidsearch(chartext[],intl)//查找文本
inti,t,a=-1,kk=0;
charstr1[20],bd,pd;
原文为:
output(text);
请输入您要查找的内容"
scanf("
str1);
您查找的内容是:
%s\n"
t=strlen(str1);
inths=1,ls=0;
for(i=0;
{
ls++;
if(text[i]=='
hs++;
if(a==-1)
l=0;
kk+=1;
一共找到了%d次"
kk);
if(pd=='
{
l=0;
search(text,l);
}
voidoutput(chartext[])//文本的输出
{
现在文本的内容为:
text);
inths=1,i;
\n文本共有%d行\n"
hs);
voidDelete(charp[],intl)//删除文本
inti,a=-1,t2=0;
charx[20],px,pd,pdx,c;
p);
\n输入A执行查找删除内容"
px=getchar();
if(px=='
||px=='
\n输入您要删除的内容,以@结束:
while((c=getchar())!
='
@'
if(c=='
break;
else
x[t2++]=c;
continue;
a=strindex(p,x,t2,l);
{
ls++;
if(p[i]=='
ls=0;
if(a==-1)
{
已查找结束,您要删除的内容不存在\n输入【R】重新输入要删除的内容;
"
fflush(stdin);
pdx=getchar();
else
你要删除的内容在第%d行第%d列\n输入【A】确定删除;
输入【B】寻找下个词;
pd=getchar();
l=t2+a;
if(pd=='
for(i=a;
p[i]=p[i+t2];
ntext=ntext-t2;
printf("
删除成功,删除后的内容为:
\n%s\n"
elseif(pd=='
gotoloop;
if(pdx=='
||pdx=='
Delete(text,l);
voidinsert(chartext[],intl)//向文本中插入内容
inti=0,t=0,t2=0,a=-1,b;
charcr[20]="
pd,x[500],c,d;
\n当前文本信息为:
\n输入您要在哪个内容前插入,以@结束:
while((c=getchar())!
)//用一个数组接收要插入在哪个内容之前
if(c=='
break;
else
cr[t++]=c;
continue;
a=strindex(text,cr,t,l);
//查找并返回要插入的位置点
inths=1,ls=0;
for(b=0;
b<
a;
b++)
if(text[b]=='
ls=0;
\n查找到结尾没有找到插入点,输入【R】查找其他;
d=getchar();
\n您要插入的位置是第%d行,第%d列之前\n"
hs,ls+1);
\n【A】.不是此位置向后继续找插入点\n【B】.在此位置插入\n按其他键返回菜单\n请选择:
if(pd=='
l=a+t;
gotoloop;
elseif(pd=='
\n\n输入您要插入的内容,以@结束:
while((c=getchar())!
if(c=='
{break;
else
x[t2++]=c;
continue;
for(i=ntext;
i>
i--)
text[i+t2]=text[i