- 实验目的
熟练掌握串模式匹配问题
- 实验内容和代码
①建立文本文件——文件名由用户用键盘输入;建立一个用户名自己命名的文件,用来存放文本内容
②给定单词的计数;给定一个单词,查找在文本内出现几次
③检索单词出现在文本文件中的行号、次数及其位置;给定一个单词查找在文本内的位置
④主控菜单程序的结构:头文件包含;菜单选项包含(建立文件、单词定位、单词计数、退出程序);选择1-4执行相应的操作,其他字符为非法。
文件打开: fp=fopen("member.txt","rb");
#include<stdio.h>
#include<string.h>
#define MaxStrSize 256
typedef struct{
char ch[MaxStrSize];
int length;
}SeqString;
int SubPosition(SeqString s1,SeqString s2,int k){
int i,j;
i=k-1;
j=0;
while(i<s1.length && j<s2.length)
if(s1.ch[i]==s1.ch[j]){
i++;
j++;
}
else{
i=i-j+1;
}
if(j>=s2.length) return i+1-s2.length;
else return -1;
}
//建立文本文件
void CreatFile(){
SeqString S;
char fname[10],yn;
FILE *fp;
printf("请输入要建立的文件名:");
scanf("%s",fname);
fp=fopen(fname,"w");
yn='n';
while(yn=='n' || yn=='N'){
printf("输入一行文本:");
getchar();
gets(S.ch);
S.length=strlen(S.ch);
fwrite(&S,sizeof(S),1,fp);
printf("结束输入吗?y or n:");
yn=getchar();
}
fclose(fp);
printf("建立文件结束!\n");
}
//单词的计数
void SubStrCount(){
FILE *fp;
SeqString S,T;
char fname[10] ;
int i=0,j,k;
printf("输入文本文件名");
scanf("%s",fname);
fp=fopen(fname,"r");
printf("输入要统计计数的单词");
scanf("%s",T.ch);
T.length=strlen(T.ch);
while(!feof(fp)){
fread(&S,sizeof(S),1,fp);
if(feof(fp)) break;
k=1;
while(k<S.length){
j=SubPosition(S,T,k);
if(j<0) break;
else{
i++;
k=j+T.length;
}
}
}
printf("\n单词%s在文本文件%s中共出现%d次\n",T.ch,fname,i);
}
//单词的定位
void SubStrInd(){
FILE *fp;
SeqString S,T;
char fname[10];
int i,j,k,l,m;
int wz[20];
printf("输入文本文件名:");
scanf("%s",fname);
fp=fopen(fname,"r");
printf("输入需要检索的单词:");
scanf("%s",T.ch);
T.length=strlen(T.ch);
l=0;
while(!feof(fp)){
fread(&S,sizeof(S),l,fp);
if(feof(fp))break;
l++;
k=1;
i=0;
while(k<S.length){
j=SubPosition(S,T,k);
if(j<0)break;
else{
i++;
wz[i]=j;
k=j+T.length;
}
}
if(i>0){
printf("行号:%d,次数:%d,位置分别为:",l,i);
for(m=1;m<=i;m++) printf("%4d",wz[m]);
printf("\n");
}
}
}
int Menu(){
int xz;
do{
printf("***********************************\n");
printf("*文本文件的检索,子串的统计及定位 *\n");
printf("***********************************\n");
printf("* 1.建立文本文件 *\n");
printf("* 2.单词子串的计数 *\n");
printf("* 3.单词子串的定位 *\n");
printf("* 4.退出整个程序 *\n");
printf("***********************************\n");
printf("* 请选择:[1-4] *\n");
printf("**********************************\n"); scanf("%d",&xz);
switch(xz){
case 1:CreatFile();break;
case 2:SubStrCount();break;
case 3:SubStrInd();break;
case 4:return 0;
default: printf("选择错误!请重新选择!\n");
}
}while(1);
}
int main(void){
void CreatTextFile(),SubStrCount(),SubStrInd();
Menu();
return 0;
}
- 实验小结
编辑
四、教师评语