📄 function.h
字号:
////////////////-----------该头文件用来包含主要功能子函数----------/////////////////
int depth=0;//用户实际输入的文本的行数
int * next=NULL;//KMP算法当中的求得NEXT值
int strl;//用户输入传的长度
typedef struct row
{
char *data;
struct row *nextrow;
}row, *rowType;//存储结构的定义
typedef struct
{
int scount;
int position[10];
}Reco, *record;
///////////////////------函数声明部分--------//////////////////////////////////
void InputInfo(row *&);//提示用户输入文本
int SpaceC(row *&);//统计文本中的空格数目
int NumC(row *&);//统计文本中的数字数目
int CharC(row *&);//统计文本中的字母数目
int SumC(row *&);//统计文本中的字母数目
int SCharC(row *&);//统计文本中的特殊字符数目
void handle(row *&);//字符串综合处理入口函数
void seaStr(row *&,char *,record);//计算存储模式串信息
int findString(char *,char *,int);//KMP模式匹配
void getNext(char *);//求KMP算法的NEXT函数值
int outTCout(record);//输出模式串出现的次数
void delStr(row *&,record Rec);//删除操作入口函数
void Delete(char *,record,int);//删除特定行中的模式串
void IniMenu(row *head);//串处理之后的菜单控制程序
void ShowBackInfo(row *&);//回显用户输入的文本于屏幕
void ShowGlobal(row *&);//显示统计信息
void aboutAuthor();//显示制作人信息
int Break();//返回确认函数
int Exit();//退出确认函数
/////////////////////////////--用户数据输入--//////////////////////////////////
void InputInfo(row *& head)
{
welcome(0);
cout<<" 请输入文章,每行最长80个字符.\n"<<endl;
cout<<" 回车结束一行的输入并以连续两个回车结束文章的输入。"<<endl;
welcome(1);
rowType p=new row;
p->nextrow=NULL;
head=p;
char rowTemp[80];
while(TRUE)
{
gets(rowTemp);
if(rowTemp[0]==NULL)//如果用户什么都没输入则退出输入文本模式
break;
depth++;//用于监视用户实际输入的文本的行数,不允许有空行存在
p=p->nextrow=new row;
p->data=new char[strlen(rowTemp)];
strcpy(p->data,rowTemp);
}
p->nextrow=NULL;
}
/////////////////////////////---统计空格个数---/////////////////////////////
int SpaceC(row *& head)
{
if(rowType p=head)
{
int count=0;
while((p=p->nextrow)!=NULL)
{
int Len=strlen(p->data);
for(int i=0;i<Len;i++)
if(p->data[i]==32)
count++;
}
return count;
}
else return 0;
}
/////////////////////////////---统计数字数---/////////////////////////////
int NumC(row *& head)
{
if(rowType p=head)
{
int count=0;
for(;(p=p->nextrow)!=NULL;)
{
int Len=strlen(p->data);
for(int i=0;i<Len;i++)
if(p->data[i]>=48 && p->data[i]<=57)
count++;
}
return count;
}
else return 0;
}
/////////////////////////////---统计字母数---/////////////////////////////
int CharC(row *& head)
{
if(rowType p=head)
{
int count=0;
for(;(p=p->nextrow)!=NULL;)
{
int Len=strlen(p->data);
for(int i=0;i<Len;i++)
if((p->data[i]>=65 && p->data[i]<=90)||(p->data[i]>=97 && p->data[i]<=122))
count++;
}
return count;
}
else return 0;
}
/////////////////////////////---所有字符统计---/////////////////////////////
int SumC(row *&head)
{
if(rowType p=head)
{
int count=0;
for (;(p=p->nextrow)!=NULL;)
{
count+=strlen(p->data);
}
return count;
}
else return 0;
}
/////////////////////////////---特殊字符统计---/////////////////////////////
int SCharC(row *& head)
{
if(rowType p=head)
{
int count=SumC(p);
int spaceCount=SpaceC(p);
int numCount=NumC(p);
int charCount=CharC(p);
return count-spaceCount-numCount-charCount;
}
else return 0;
}
/////////////////////////////---字符串综合处理入口函数---///////////////////////////
void handle(row *& head)
{
if(rowType p=head)
{
system("cls");
record Recor=new Reco[depth];
////////////////////////////////////////////////////
for(int k=0;k<depth;k++)
{
Recor[k].scount=0;
for(int m=0;m<10;m++)
Recor[k].position[m]=0;
}
///////////////////////////////该模块对Recor进行初始化,没有该过程将出错
char tempString[20]="";
char tStr[21]="";
cout<<endl;
welcome(0);
cout<<endl;
cout<<" 请输入您要操作的字串,20字符以内,回车结束:"<<endl;
gets(tempString);
strl=strlen(tempString);
*tStr=strl;
strcat(tStr,tempString);
getNext(tStr);
while(TRUE)
{
system("cls");
showMenu2();
char f;//哨兵,作用于页面跳转
int a;
cin>>a;
switch (a)
{
case 1:
{
system("cls");
seaStr(p,tStr,Recor);
welcome(0);
cout<<" 该字符串在文章出现的数为: "<<outTCout(Recor)<<endl;
welcome(1);
cout<<" 请按任意键继续程序('Q'退出):";
cin>>f;
if(f=='q'||f=='Q')
exit(0);
else break;
}
case 2:
{
system("cls");
seaStr(p,tStr,Recor);
welcome(0);
delStr(p,Recor);
system("cls");
cout<<endl<<endl;
cout<<" -------------------删除操作完成!-----------------"<<endl<<endl;
cout<<" 请按任意键继续程序('Q'退出):";
cin>>f;
if(f=='q'||f=='Q')
exit(0);
else break;
}
case 3:
{
system("cls");
ShowBackInfo(head);
cout<<" 请按任意键继续程序('Q'退出):";
cin>>f;
if(f=='q'||f=='Q')
exit(0);
else break;
}
case 4:
{
system("cls");
IniMenu(p);
}
case 5:
exit(0);
}
}
}
else
cout<<"\n Error,不能进行该操作,请先输入一篇文章!\n\n";
}
/////////////////////////////---计算存储模式串信息---/////////////////////////////
void seaStr(row *& head,char *Tstring,record rec)
{
int i=0;
rowType p=head;
record Reco=rec;
char *Tstr=Tstring;
int len,po,pos;//len为数据域长度,po为模式串的上一个位置pos为一个位置
for(;(p=p->nextrow)!=NULL;)
{
pos=0;
len=strlen(p->data)-strl;
for(int j=0;pos<len;j++)
{
po=findString((p->data),Tstr,pos);
if(po)
{
Reco[i].position[j]=po;
Reco[i].scount++;
pos=findString((p->data),Tstr,pos)+strl;
}
else break;
}
i++;
}
}
/////////////////////////////---求KMP算法的NEXT函数值---/////////////////////////////
void getNext(char * Tstring)
{
char * p=Tstring;
int i=1,j=0;
next=new int[strl+1];
next[1]=0;
while(i<strl)
{
if(j==0||p[i]==p[j])
{
++i;++j;
if(p[i]!=p[j])
next[i]=j;
else
next[i]=next[j];
}
else j=next[j];
}
}
/////////////////////////////---KMP算法实现---/////////////////////////////
int findString(char *Sstring,char *Tstring,int pos)
{
int i=pos;
int j=1;
char *Tstr=Tstring;
char *Sstr=Sstring;
int len=strlen(Sstr);
while(i<len&&j<=strl)
{
if(j==0||Sstr[i]==Tstr[j])
{
++i;
++j;
}
else
j=next[j];
}
if(j>strl)
return i-strl;
else return 0;
}
/////////////////////////////---输出模式串出现的次数---/////////////////////////////
int outTCout(record reco)
{
record rec=reco;
int count=0;
for(int i=0;i<depth;i++)
count=count+rec[i].scount;
return count;
}
/////////////////////////////---删除用户输入的字符串---/////////////////////////////
void delStr(row *& head,record Rec)//删除操作入口函数
{
rowType p=head;
record rec=Rec;
int flag;
showMenu3();//删除操作菜单
cin>>flag;
switch (flag)
{
case 1:
{
p=p->nextrow;
for(int i=0;i<depth;i++)//循环删除每一行中的模式串
{
Delete(p->data,rec,i);
p=p->nextrow;
}
break;
}
case 2:
{
system("cls");
welcome(1);
cout<<" 请输入您要删除模式串的行数:";
int row;
cin>>row;
p=p->nextrow;
Delete(p->data,rec,row-1);
break;
}
}
}
/////////////////////////////---删除特定行中的模式串---//////////////////////////
void Delete(char * Sstring,record Rec,int Line)
{
int line=Line;
record rec=Rec;
char *sstr=Sstring;
char tstring[80],*loc;
int catlo,l;
for(l=0;l<rec[line].scount;l++)
{
catlo=rec[line].position[l]-l*strl;//第几个位置就得减去相应倍数的模式串长
loc=&sstr[catlo];
int Tlen=strlen(sstr);
int i=Tlen-strlen(loc);
int j=i+strl;
int num=0;
for(int m=0;m<i;m++)
{
tstring[num]=sstr[m];
num++;
}
for(m=j;m<Tlen;m++)
{
tstring[num]=sstr[m];
num++;
}
tstring[num]=0;//强制tsring结尾
strcpy(sstr,tstring);
}
}
/////////////////////////////---用户输入的文本回显---/////////////////////////////
void ShowBackInfo( row *& head)
{
if(rowType p=head)
{ welcome(0);
for(;(p=p->nextrow)!=NULL;)
cout<<p->data<<endl;
}
else
cout<<"\n Error:无法回显数据,您并没有输入什么字串!\n\n";
}
////////////////////////////--菜单控制程序--/////////////////////////////////
void IniMenu(row *head)//串处理之后的主菜单程序
{
rowType p=head;
char menu;
while(TRUE)
{
showMenu4();
char f;//哨兵,起到中断作用
cin>>menu;
switch(menu)
{
case 'A':
case 'a':
{
system("cls");
ShowGlobal(head);
cout<<" 请按任意键继续程序('Q'退出)";
cin>>f;
if(f=='q'||f=='Q')
exit(0);
else break;
}
case 'B':
case 'b':
{
system("cls");
cout<<endl;
aboutAuthor();
cout<<" 请按任意键继续程序('Q'退出)";
cin>>f;
if(f=='q'||f=='Q')
exit(0);
else break;
}
case 'Q':
case 'q':
exit(0);
default:
{
system("cls");
cout<<endl;
welcome(0);
cout<<" 对不起,您的输入有误,请重新输入!\n";
cout<<" 请按任意键继续程序('Q'退出)";
cin>>f;
if(f=='q'||f=='Q')
exit(0);
else break;
}
}
}
system("cls");
}
/////////////////////////////---所有统计信息回显---/////////////////////////////
void ShowGlobal(row *& head)
{
if(rowType p=head)
{
welcome(0);
cout<<" ※ 文章统计信息结果如下:※\n";
cout<<endl;
welcome(1);
cout<<" 文章总行数为: "<<depth<<endl;
welcome(1);
cout<<" 英文字母数为: "<<CharC(p)<<endl;
welcome(1);
cout<<" 文章空格数为: "<<SpaceC(p)<<endl;
welcome(1);
cout<<" 文章数字数为: "<<NumC(p)<<endl;
welcome(1);
cout<<" 特殊字符数为: "<<SCharC(p)<<endl;
welcome(1);
cout<<" 文章的总字数: "<<SumC(p)<<endl;
welcome(1);
cout<<endl;
}
else
cout<<"\n Error(-_-)!!!:无效数据统计,您并没有输入什么字串!\n\n";
}
/////////////////////////////---制作人信息函数---/////////////////////////////
void aboutAuthor()
{
welcome(0);
cout<<" 本系统信息如下:\n";
welcome(1);
cout<<" 版本信息:Version 1.0 "<<endl;
welcome(1);
cout<<" 制作单位:山东理工大学计算机学院 "<<endl;
welcome(1);
cout<<" 班级:计科0402班 "<<endl;
welcome(1);
cout<<" 制作人:王栋栋,刘海潮 "<<endl;
welcome(1);
cout<<endl;
}
/////////////////////////////---中断确认---/////////////////////////////
int Break()
{
cout<<" ------ 键入字母 m 继续程序!键入其余信息退出系统!-----\n";
cout<<endl;
char flag;
cin>>flag;
if(flag=='m')
return TRUE;
else return FALSE;
}
int Break(int fl)//返回确认
{ int i=fl;
if(i==1)
cout<<" ------ 键入字母 m 继续程序!键入其余信息退出系统!-----"<<endl;
else
cout<<" -------确认退出吗?[N]返回,任意键退出!--------"<<endl;
cout<<endl;
switch (char flag=getch())
{
case 'M':
case 'm':
return TRUE;
default: exit(FALSE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -