⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 +-к

📁 c 的一些经典算法,满好的,适合初学者. 也可以当作小程序看,对初学者会很有帮助
💻
字号:
  
 
 
 
文学研究助手  
 

 
 


   这是清华大学出版社出版,严蔚敏编著的C语言题集实习中的一道,原题叫文学研究助手。
基本要求是:原文件存在于一个文本文件中,待统计的词汇集合一次输入完毕,统计工作
必须在程序一次运行之后全部完成。程序的输出结果是每个词的出现次数和出现的行号,
格式自行设定,约定原文件中的词汇一律不跨行,若某行中出现了不止一次,不必存多个
相同的行号。
   此题涉及到文件操作,结构体,函数调用,链表,指针等C语言知识的综合应用。
   我用了两天时间做了一下,基本思想是逐行读入原文件,进行字符串匹配时并没有使用
KMP算法,而是用了两个指针来定位目标字符串,然后进行匹配,用链表记录行号。不足之处
希望大家指正。
       

                         文学统计助手V1.O

# include "string.h"
# include "stdio.h"
# include "alloc.h"
# include "stdlib.h"
# define N 10        /*预定义关键字数目*/
 struct linelist{
       int linenum;
       struct linelist *next;
      };
 struct keyword{
      char* string;
      int num;
      struct linelist *head,*tail;
     };
struct keyword keyword[N];
FILE*fp;
int row;              /*全局变量*/
void init();          /*函数声明*/
FILE* openfile();
void input keyword();
void readline(FILE*)  /*调用loadcmp()函数*/
void loadcmp(Array)  /*定位单词并匹配的函数*/
  char Array[];     /*调用compare()函数*/
void compare(Array)
  char Array[];
void showresult();

void main()
{void init();
FILE*openfile();
void inputkeyword();
void readline(fp);
}

FILE*fileopen()
{ char filename[30];
scanf("%s",filename);
if((fp=fopen(filename,"r"))=NULL)
  {
   printf("\n can't open source file, \n
       press any key to exit \n");
      getchar();
      exit(1);
  }
}

void init()
{
   int i;
    for(i=0;i<=N;i++)
    {keyword[i].num=0;
     keyword[i].string=NULL;
     keyword[i].head=NULL;
     keyword[i].tail=NULL;
    }
}

void inputkeyword()
{int i;
 for(i=0;i<=N;i++)
 {
   char*str;
   scanf("%s\n",str);
   keyword[i].string=str;
 }
}

void readline(FILE*fp)
{
  char buffer[41];
  while(feof(fp))
   {row++;
    fgets(buffer,40,fp);
    loadcmp(buffer);
   }
}

void loadcmp(Array)
   char Array[];
{
   char*p,char*q;
   p=q=buffer;
   while(q!='\0')
    {
      if(q=='')
       { p++;
         q++;
       }
      if(q!='')
       q++;
      int m,i;
      m=q-p;
      char temp[m+1];
     for(i=0;i<m;i++)
      { temp[i]=*p;
        p++;
      }
      temp[m]='\0';
      compare(temp);
     }
}

void compare(Array)
    char Array[];
{   int  j ;
    for(j=0;j<=N;j++)
   {  if(!strcmp(temp,keyword[i].string)
      {keyword[i].num++;
        if(keyword[i].num==1)
         {   line*p;
             p=(linelist*)malloc(sizeof(linelist));
             p->linenum=row;
             p->next=NULL;
             keyword[i].head=p;
             keyword[i].tail=p;
         }
        else if(row!=keyword[i].tail->linenum)
         {linelist*q;
          q=(linelist*)malloc(sizeof(linelist));
          q->linenum=row;
          q->next=NULL;
          keyword[i].tail->next=q;
          q=keyword[i].tail;
         }
       }
    }
}
   
void showresult()
{
 int i;
 printf("\n\n\n");
 printf("according to the input keywords,
    the analyze result is as follows:\n");
 for(i=0; i<=N; i++)
  {
    printf("%s",keyword[i].string);
    printf("     ");
    printf("occur %d times",keyword[i].num);
    printf("     ");
    printf("they are in lines:");
    linelist*p;
    p=keyword[i].head;
    while(p!=NULL)
    { printf(" %d ",p.linenum);
      p=p->next;
    }
     printf("\n");
}

          

 

 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -