文本编辑器.docx
《文本编辑器.docx》由会员分享,可在线阅读,更多相关《文本编辑器.docx(41页珍藏版)》请在冰点文库上搜索。
文本编辑器
《高级语言程序设计》
课程设计报告
题目:
文本编辑器
专业:
班级:
姓名:
指导教师:
成绩:
计算机与信息工程系
2014年6月20日
目录
1设计内容与要求1
1.1目的和任务1
2功能设计2
2.1实现功能2
3设计过程3
3.1程序框架3
3.2模块功能说明5
4设计结果10
参考文献13
源程序14
1设计内容与要求
1.1目的和任务
1巩固和加深学生对C语言、数据结构课程的基本知识的理解和掌握
2掌握C语言编程和程序调试的基本
3利用C语言进行基本的软件设计
4掌握书写程序设计说明文档的能力
5提高运用C语言、数据结构解决实际问题的能力
1.2文本编辑器
文本编辑器(或称文字编辑器)是用作编写普通文字的应用软件,它与文档编辑器(或称文字处理器)不同之处在于它并非用作桌面排版(例如文档格式处理)它常用来编写程序的源代码,可以记录字母个数、删除操作等
2功能设计
2.1实现功能
要实现如下功能:
1.分别统计出其中英文字母数和空格数及整篇文章总字数;
2.统计某一字符串在文章中出现的次数,并输出该次数;(采用模式匹配算法)
3.删除某一子串,并将后面的字符前移;
4.实现某一个字符的替换;
5.实现某一个字符串的替换。
3设计过程
3.1程序框架
图1简单的文本编辑器主框架
两个子菜单:
如选择上图中功能3,则有:
图2简单的文本编辑器----文本内容统计菜单
如选择功能4,则有:
图3简单的文本编辑器-----文本内容处理菜单
3.2模块功能说明
1.Creat()文本内容输入函数
具体创建过程如下:
定义文件变量*sfp:
FILE*sfp;
打开文件:
if((sfp=fopen("d:
//0.txt","a+"))==NULL)
{
printf("打开文件失败");
exit(0);
}
使用循环操作进行输入操作:
while(c!
=EOF)
{
fputc(c,sfp);
c=getchar();
}
fclose(sfp);
2.List()当前文本输出函数
本子函数功能为将当前存储在链表中的文本信息输出在屏幕上,具体伪码算法如下:
定义文本行数变量n,每行字符数i:
inti,j;
利用循环输出信息:
for(i=0;i{
printf("%d:
",i+1);
StrPrint(T[i]);
}
getchar();文本输出函数到此结束。
3.CountWord()文本内容统计函数
本子函数是对文本中内容进行统计。
具体伪码算法如下:
定义记录文本大写字母数、小写字母数、空格数、数字数、标点数和总字数的变量:
intWORD=0,word=0,space=0,num=0,punct=0,sum=0;
利用循环对链表中信息进行匹配判断,将大写字母数、小写字母数、空格数、数字数、标点数和总字数统计出来:
for(i=0;i{
for(j=0;j{
ch=T[i].ch[j];
if((ch>='A')&&(ch<='Z'))
WORD++;
elseif((ch>='a')&&(ch<='z'))
word++;
elseif((ch>='0')&&(ch<='9'))
num++;
elseif(ch=='')
space++;
elseif(ch==33||ch==34||ch==39||ch==44||ch==46||ch==58||ch==59||ch==63)
{punct++;}
}
}
sum=WORD+word+num;本程序对统计项目设计了菜单提供给用户选择。
4.Search()文本内容查找函数
本子函数是对文本内容进行查找并且对查找的内容进行统计其出现的次数。
具体伪码算法如下:
inti,k,f=1;charb;HStrings;//f为继续查找标志定i
利用循环进行查找操作,核心算法为:
for(i=0;i{
k=1;//由每行第1个字符起查找
while(k)
{
k=Index(T[i],s,k);//由本行的第k个字符开始查找
if(k)//找到
{
printf("第%d行:
",i+1);
StrPrint(T[i]);
printf("第%d个字符处找到。
继续查找吗(Y/N)?
",k);
b=getchar();
getchar();
if(b!
='Y'&&b!
='y')//中断查找
{
f=0;
break;
}
else
k++;
对文本内容查找的部分完成。
5.Delete()文本内容删除函数
此子函数是对文本内容进行删除。
具体伪码算法如下:
定义变量来确定删除位置inti,l,m;
使用循环进行删除操作:
if(n>=l+m-1&&l>0)
{
for(i=l-1+m;iT[i-m]=T[i];
for(i=n-m;iInitString(T[i]);
n-=m;
}删除部分到次完成。
6.Insert()文本内容插入函数
此函数为向文本中插入字符或者字符串。
具体伪码如下:
定义变量,确定插入位置inti,l,m;
进行判断,是否超出范围
if(n+m>MAX_LEN)
{
printf("插入行太多\n");
return;
};
对输入的字符进行插入操作,具体核心算法如下:
for(i=n-1;i>=l-1;i--)
T[i+m]=T[i];
n+=m;
printf("请顺序输入待插入内容:
\n");
for(i=l-1;i{
gets(str);
InitString(T[i]);
StrAssign(T[i],str);
}
Bmenu()文本内容处理菜单
本函数为文本内容处理菜单,即使用循环语句对文本内容处理部分的子函数集中在此函数中。
7.About()输出信息函数
这两个子函数为本人自己另加的输出程序信息的函数;
About()是显示作者信息;
main()
本人将主菜单单独创建为一个子函数,方便观看。
仍然是很简单的循环语句实现。
主函数为:
for(i=0;iInitString(T[i]);
while(s)
Hollow();
4设计结果
根据程序的提示即可完成文本编辑器的各项功能。
1.首先打开程序,截图如下:
2.按要求输入文本,截图如下:
3.打开文件,截图如下:
4.显示内容,截图如下:
5.进入统计菜单界面:
6.进入内容处理菜单界面:
参考文献
[1]C程序设计(第三版谭浩强著清华大学出版社)
源程序
#include
#include
#include//malloc()等
#include//INT_MAX等
#include//EOF(=^Z或F6),NULL
#include//atoi()
#include//eof()
#include//floor(),ceil(),abs()
#include//exit()
#include//cout,cin
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
//#defineOVERFLOW-2因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedefintStatus;//Status是函数的类型,其值是函数结果状态代码,如OK等
typedefintBoolean;//Boolean是布尔类型,其值是TRUE或FALSE
//c4-2.h串的堆分配存储
structHString
{
char*ch;//若是非空串,则按串长分配存储区,否则ch为NULL
intlength;//串长度
};
//bo4-2.cpp串采用堆分配存储结构(由c4-2.h定义)的基本操作(15个)
//包括算法4.1、4.4
StatusStrAssign(HString&T,char*chars);
StatusStrCopy(HString&T,HStringS);
StatusStrEmpty(HStringS);
intStrCompare(HStringS,HStringT);
intStrLength(HStringS);
StatusClearString(HString&S);
StatusConcat(HString&T,HStringS1,HStringS2);
StatusSubString(HString&Sub,HStringS,intpos,intlen);
voidInitString(HString&T);
intIndex(HStringS,HStringT,intpos);//算法4.1
StatusStrInsert(HString&S,intpos,HStringT);//算法4.4
StatusStrDelete(HString&S,intpos,intlen);
StatusReplace(HString&S,HStringT,HStringV);
voidDestroyString();
voidStrPrint(HStringT);
#defineMAX_LEN2500//文件最大行数
#defineLINE_LEN75//每行字符数最大值+1
#defineNAME_LEN20//文件名最大长度(包括盘符、路径)+1
HStringT[MAX_LEN];
charstr[LINE_LEN],filename[NAME_LEN]="";
FILE*fp;
intn=0;//文件行数
voidEdit();
voidOpen();
voidList();
voidCountWord();
voidInsert();
voidAbout();
voidDelete();
voidCopy();
voidModify();
voidSearch();
voidReplace();
voidSave();
voidBmeun();
voidHollow();
intmain()
{
Statuss=TRUE;
system("color75");
inti;
for(i=0;iInitString(T[i]);
while(s)
{
Hollow();
}
}
StatusStrAssign(HString&T,char*chars)
{//生成一个其值等于串常量chars的串T
inti,j;
if(T.ch)
free(T.ch);//释放T原有空间
i=strlen(chars);//求chars的长度i
if(!
i)
{//chars的长度为0
T.ch=NULL;
T.length=0;
}
else
{//chars的长度不为0
T.ch=(char*)malloc(i*sizeof(char));//分配串空间
if(!
T.ch)//分配串空间失败
exit(OVERFLOW);
for(j=0;j
T.ch[j]=chars[j];
T.length=i;
}
returnOK;
}
StatusStrCopy(HString&T,HStringS)
{//初始条件:
串S存在。
操作结果:
由串S复制得串T
inti;
if(T.ch)
free(T.ch);//释放T原有空间
T.ch=(char*)malloc(S.length*sizeof(char));//分配串空间
if(!
T.ch)//分配串空间失败
exit(OVERFLOW);
for(i=0;iT.ch[i]=S.ch[i];
T.length=S.length;
returnOK;
}
StatusStrEmpty(HStringS)
{//初始条件:
串S存在。
操作结果:
若S为空串,则返回TRUE,否则返回FALSE
if(S.length==0&&S.ch==NULL)
returnTRUE;
else
returnFALSE;
}
intStrCompare(HStringS,HStringT)
{//若S>T,则返回值>0;若S=T,则返回值=0;若Sinti;
for(i=0;iif(S.ch[i]!
=T.ch[i])
returnS.ch[i]-T.ch[i];
returnS.length-T.length;
}
intStrLength(HStringS)
{//返回S的元素个数,称为串的长度
returnS.length;
}
StatusClearString(HString&S)
{//将S清为空串
if(S.ch)
{
free(S.ch);
S.ch=NULL;
}
S.length=0;
returnOK;
}
StatusConcat(HString&T,HStringS1,HStringS2)
{//用T返回由S1和S2联接而成的新串
inti;
if(T.ch)
free(T.ch);//释放旧空间
T.length=S1.length+S2.length;
T.ch=(char*)malloc(T.length*sizeof(char));
if(!
T.ch)
exit(OVERFLOW);
for(i=0;iT.ch[i]=S1.ch[i];
for(i=0;iT.ch[S1.length+i]=S2.ch[i];
returnOK;
}
StatusSubString(HString&Sub,HStringS,intpos,intlen)
{//用Sub返回串S的第pos个字符起长度为len的子串。
//其中,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1
inti;
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
returnERROR;
if(Sub.ch)
free(Sub.ch);//释放旧空间
if(!
len)//空子串
{
Sub.ch=NULL;
Sub.length=0;
}
else
{//完整子串
Sub.ch=(char*)malloc(len*sizeof(char));
if(!
Sub.ch)
exit(OVERFLOW);
for(i=0;i<=len-1;i++)
Sub.ch[i]=S.ch[pos-1+i];
Sub.length=len;
}
returnOK;
}
voidInitString(HString&T)
{//初始化(产生空串)字符串T。
另加
T.length=0;
T.ch=NULL;
}
intIndex(HStringS,HStringT,intpos)//算法4.1
{//T为非空串。
若主串S中第pos个字符之后存在与T相等的子串,
//则返回第一个这样的子串在S中的位置,否则返回0
intn,m,i;
HStringsub;
InitString(sub);
if(pos>0)
{
n=StrLength(S);
m=StrLength(T);
i=pos;
while(i<=n-m+1)
{
SubString(sub,S,i,m);
if(StrCompare(sub,T)!
=0)
++i;
else
returni;
}
}
return0;
}
StatusStrInsert(HString&S,intpos,HStringT)//算法4.4
{//1≤pos≤StrLength(S)+1。
在串S的第pos个字符之前插入串T
inti;
if(pos<1||pos>S.length+1)//pos不合法
returnERROR;
if(T.length)//T非空,则重新分配空间,插入T
{
S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char));
if(!
S.ch)
exit(OVERFLOW);
for(i=S.length-1;i>=pos-1;--i)//为插入T而腾出位置
S.ch[i+T.length]=S.ch[i];
for(i=0;iS.ch[pos-1+i]=T.ch[i];//插入T
S.length+=T.length;
}
returnOK;
}
StatusStrDelete(HString&S,intpos,intlen)
{//从串S中删除第pos个字符起长度为len的子串
inti;
if(S.lengthexit(ERROR);
for(i=pos-1;i<=S.length-len;i++)
S.ch[i]=S.ch[i+len];
S.length-=len;
S.ch=(char*)realloc(S.ch,S.length*sizeof(char));
returnOK;
}
StatusReplace(HString&S,HStringT,HStringV)
{//初始条件:
串S,T和V存在,T是非空串(此函数与串的存储结构无关)
//操作结果:
用V替换主串S中出现的所有与T相等的不重叠的子串
inti=1;//从串S的第一个字符起查找串T
if(StrEmpty(T))//T是空串
returnERROR;
do
{
i=Index(S,T,i);//结果i为从上一个i之后找到的子串T的位置
if(i)//串S中存在串T
{
StrDelete(S,i,StrLength(T));//删除该串T
StrInsert(S,i,V);//在原串T的位置插入串V
i+=StrLength(V);//在插入的串V后面继续查找串T
}
}while(i);
returnOK;
}
voidDestroyString()
{//堆分配类型的字符串无法销毁
}
voidStrPrint(HStringT)
{//输出T字符串。
另加
inti;
for(i=0;iprintf("%c",T.ch[i]);
printf("\n");
}
voidEdit()
{
FILE*sfp;
if((sfp=fopen("d:
//0.txt","a+"))==NULL)
{
printf("打开文件失败");
exit(0);
}
printf("请输入文本(默认存储地址为d:
//0.txt):
");
charc;
c=getchar();
while(c!
=EOF)
{
fputc(c,sfp);
c=getchar();
}
fclose(sfp);
}
voidOpen()
{system("cls");//打开文件(新或旧)
intk;
if(filename[0])//文件已打开
printf("已存在打开的文件\n");
else
{
printf("请输入文件名(可包括盘符、路径,不超过%d个字符):
",NAME_LEN-1);
scanf("%s",filename);
fp=fopen(filename,"r");
if(fp)//已存在此文件
{
while
(1)
{
fgets(str,LINE_LEN,fp);
if(feof(fp))
{
break;
}
k=strlen(str);
str[k-1]=0;//将10强制改为0
if(k>0)
{
StrAssign(T[n],str);
n++;
if(n>MAX_LEN)
{
printf("文件太大\n");
return;
}
}
}
fclose(fp);
}
else
printf("新文件\n");
}
}
voidList()
{system("cls");//显示文件内容
inti;
for(i=0;i{
printf("%d:
",i+1);
StrPrint(T[i]);
}
getchar();
}
voidCountWord()
{system("cls");
intWORD=0,word=0,space=0,num=0,punct=0,sum=0;
inti,j;
charch;
for(i=0;i{
for(j=0;j{
ch=T[i].ch[j];
if((ch>