数据结构上机实验作业:模式匹配

一个用来检测文章中单词数,并统计出每个单词在文章中出现的位置,并格式化输出(文章从文件读入)。
不伦不类的程序,记录了文章中出现的单词,但却没记录单词出现的位置,一个纯粹为了输出的程序。
本来是想用结构体的,但是实验的标题是数组与串的运用,所以就做成了这样,完全没考虑执行效率,凑合用吧。
编译环境为VC++6.0
MAXN和MAXM分别限制了文章最大字数和单词数。

演示图(局部):
[img][attach]157[/attach][/img]

[mycode=c]//Code By PenguinOL@2009.04.05
#include “stdio.h”
#include “ctype.h”
#include “string.h”

#define MAXN 1000
#define MAXM 100

void simple_match(char words[],char file_con[],int word_len,int file_len)
{
  int i,j,k,flag;
  flag=0;
  for (i=0;i<=file_len-word_len;i++)
  {
    for (j=0,k=i;j    if (j==word_len && !isalpha(file_con[k]))
    {
      if (flag) printf(“,”);
      printf(“%d”,i+1);
      i+=word_len;
      flag=1;
    }
  }
  printf(“\n”);
}

int strequ( char s1[],char s2[])
{
  int i;
  i=0;
  while(s1[i]==s2[i]&&s1[i]!=’\0’&&s2[i]!=’\0′) i++;  
  if(s1[i]==’\0’&&s2[i]==’\0′)
    return(1);
  else
    return(0);
}

int main(int argc, char* argv[])
{  
  FILE *fp;
  char file_adr[MAXM],file_con[MAXN],words[MAXM][30];
  int file_len,word_len,i,j,k,m,longest;
  
  k=0,longest=0;

  printf(“请输入文件的位置:”);    //读入文件开始
  gets(file_adr);
  fp=fopen(file_adr,”r”);
  if (!fp)
  {
    printf(“错误:文件打开失败!”);
    return(0);
  }    
  else
    fgets(file_con,MAXN,fp);  //读入文件结束
  
  file_len=strlen(file_con);
  file_con[file_len]=’\0′;  //添加结束符
  printf(“原文如下:\n%s\n”,file_con);
  strlwr(file_con);      //大写转换为小写

  for (i=0;i  {
    j=0;
    while (isalpha(file_con[i]))
      words[k][j++]=file_con[i++];
    if (j)
    {
      words[k++][j]=’\0′;
      if (j>longest) longest=j;  //记录最长单词,用于格式化输出
    }
    for (m=0;m      if (strequ(words[m],words[k-1]))
      {
        k–;
        break;
      }
  }    //单词载入结束
  
  printf(“文章长度为:%d,共有%d个单词,最长单词有%d个字母。\n”,file_len,k,longest);

  for (i=0;i  {
    word_len=strlen(words[i]);
    printf(“%-*s:”,longest+5,words[i]);
    simple_match(words[i],file_con,word_len,file_len);
  }
}[/mycode]

源码下载(请使用VC++6.0进行编译):
[file][attach]158[/attach][/file]

Posted in 未分类

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注