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

📄 wenxue.cpp

📁 编制一个统计特定单词在文本串中出现的次数和位置的程序
💻 CPP
字号:
#define MAXSIZE 1000      //字符空间最大容量
#define MAXLEN  20        //单词最大长度
#define MAXNUM 16         //一行中单词最多个数
#include "stdio.h"
#include "stdlib.h"
typedef struct{         //单词类型
	char word[MAXLEN];  //生成单词的字符空间
	int len;    //单词长度
}WordType;       
struct {         //文章中一行单词组成的有序链表
     WordType data;
}Sequence[MAXNUM];   
struct Node {    //待查单词所在行号和指向下一个位置的指针
	int line;   
	struct Node *next;  
	}Node,*link[MAXNUM];
struct {          //待查单词组成的有序链表
	WordType data; 
    int count;   
    struct Node *next;   
}HeadNode[MAXNUM];  
int  ExtractWords(char s[MAXSIZE])
{     //从文章中提取一行单词并将其组成一有序单词链表,每个单词作为一个结点
	  //并返回该行单词个数
	int i,j,k;
	j=1;
     for(i=0;s[i]!='\0';)
         {for(;(!((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')))&&(s[i]!='\0');) 
         	i++;
	     for(k=1;((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))&&(s[i]!='\0');)
	        {Sequence[j].data.word[k]=s[i];
	        	k++;i++;}
	        Sequence[j].data.len=k-1;
		j++;}
		return(j-1);
		} 
int  InputWords()
{   //输入待查单词并组成有序链表,每个单词作为一个结点 
	//单词之间以任意非字母字符间隔,以“Enter”键结束,并返回输入单词个数
	int i,j,k;
	char s[MAXSIZE]={'\0','\0'};
	j=1;i=0;
	printf("请输入要查询的单词(以Enter结束):\n");
	s[i]=getchar();
	do{i++;
	   scanf("%c",&s[i]);
	   }while(s[i]!='\n');
	
  for(i=1;s[i]!='\0';i++)
         {for(;!((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'));) i++;
	     for(k=1;(s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z');)
	        {HeadNode[j].data.word[k]=s[i];
	        	k++;i++;}
	        HeadNode[j].data.len=k-1;
		    j++;}
		return(j-1);
		}
int WordCmp(WordType wd1,WordType wd2)   
{   //单词比较,若相等返回“0”
	int k=1;  
while(k<=wd1.len&&k<=wd2.len){
    if(wd1.word[k]==wd2.word[k])  k++;
	else if(wd1.word[k]<wd2.word[k]) return(-1);
	else  return(1);}
    if(wd1.len==wd2.len)  return(0);
	else if(wd1.len<wd2.len)  return(-1);
	else return(1);
}
void OutResult(int n)
{    //输出待查单词及其出现次数和所在行号
	int i,j;
	for(i=1;i<=n;i++){
		printf("单词");
		for(j=1;j<=HeadNode[i].data.len;j++)
		  printf("%c",HeadNode[i].data.word[j]);
		  printf("在文章中出现%d次 ",HeadNode[i].count);
	   if(HeadNode[i].count!=0){
		   printf("分别在第");
			for(link[i]=HeadNode[i].next;link[i]->next!=NULL;link[i]=link[i]->next)
			printf("%d ",link[i]->line);
	        printf("行");}
	   printf("\n");
	   }
}
void main()
{     //主函数
 int linenum=0;  
 int m,n,i,j;
 int num=0;
 char filename[10];
 char str[MAXSIZE];
 FILE *fp;
 printf("请输入文章名:");
 scanf("%s",filename);
 if((fp=fopen(filename,"r"))==NULL)
 {printf("cannot open the file!");
 exit(0);}
 for(i=1;i<=MAXNUM;i++){   //初始化
 	 link[i]=(struct Node *)malloc(sizeof(struct Node));              
	 HeadNode[i].next=link[i];    
     link[i]->next=NULL;
	 HeadNode[i].count=0;     
 }
 m=InputWords();     
 for(;!feof(fp);)
 {fgets(str,MAXSIZE,fp);
 	n=ExtractWords(str);  //从文章中提取一行单词,并组成有序链表
   linenum++;   //记录当前行号
   for(i=1;i<=m;i++){
   	  num=0;
	  for(j=1;j<=n;j++){
	  if((WordCmp(HeadNode[i].data,Sequence[j].data))==0)
	          {  HeadNode[i].count++;  //单词出现次数
	          	num++;}}
	  if(num!=0){  //记录待查单词出现的行号
		          link[i]->line=linenum;
		          link[i]->next=(struct Node *)malloc(sizeof(struct Node));
		          link[i]=link[i]->next;
				  link[i]->next=NULL;}}}
	OutResult(m);
	 fclose(fp);
   }










⌨️ 快捷键说明

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