数据结构实验之串模式匹配问题

简介: 本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。


  • 实验目的

熟练掌握串模式匹配问题

  • 实验内容和代码

①建立文本文件——文件名由用户用键盘输入;建立一个用户名自己命名的文件,用来存放文本内容

②给定单词的计数;给定一个单词,查找在文本内出现几次

③检索单词出现在文本文件中的行号、次数及其位置;给定一个单词查找在文本内的位置

④主控菜单程序的结构:头文件包含;菜单选项包含(建立文件、单词定位、单词计数、退出程序);选择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;

}

  • 实验小结

image.gif 编辑

四、教师评语

目录
相关文章
|
7月前
|
机器学习/深度学习 算法 搜索推荐
数据结构实验之排序六:希尔排序
数据结构实验之排序六:希尔排序
|
1月前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
58 4
|
1月前
|
算法
数据结构实验之最长公共子序列
本实验旨在通过编程实践帮助学生理解串的基本概念及求解最长公共子序列的算法。实验内容包括使用动态规划方法设计并实现算法,以找出给定两序列的最大公共子序列。示例代码展示了如何通过构建状态矩阵和回溯路径来找到解决方案。实验总结指出,`memset()`函数用于内存初始化,且对于特定输入,程序能正确输出最长公共子序列之一。
54 4
|
1月前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
42 4
|
1月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
57 4
|
1月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
82 4
|
1月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
54 4
|
6月前
|
存储 算法 数据安全/隐私保护
【Python学习篇】Python实验小练习——高级数据结构(五)
【Python学习篇】Python实验小练习——高级数据结构(五)
76 1
|
6月前
|
存储 算法 数据挖掘
数据结构实验||约瑟夫环
数据结构实验||约瑟夫环
|
2月前
|
算法
计科一二班算法数据结构实验9答案
计科一二班算法数据结构实验9答案
20 0