如何统计一本英文书(比如简爱)中出现次数最多的前1000个单词

如何统计一本书中出现最多的前1000个单词,其实只要处理好新单词的储存,已经出现单词个数的统计,和根据出现次数的排序,就基本完成了这个项目。

思路:1、从文件中依次读取一个个字符,如果是字母字符就放到一个字符数组中,当读取的字符是空格或者标点符号时,则已经读取的字符串视为一个单词,将其储存起来。                                                                                                                                                  2、储存的话,我们可以定义一个新的结构体数据类型,里面就包含所要储存的单词和这个单词已经出现的次数。用新的结构体数据类型来动态创建一个数组来存储单词。                                                                                                                                              3、判断读取的单词是否已经储存过,有则把它的数量+1,没有就添加新的单词,添加新单词之后,就用realloc函数扩大数组的容量。                                                                                                                                                                                                         4、打印数组的前1000个元素。

typedef struct Find_word     //定义单词结构体
{
	char word[26];
	int number;

}fin;

char word[26]用来储存单词,int number用来储存单词的个数。

void Find()
{
	
	fin *arr=(fin *)calloc(1,sizeof(fin));
	char brr[26]="0";
	fin *crr;
	int i=0;
	int j=0;
	char p='0';
	FILE *fp=fopen("2.txt","r");
	while(!feof(fp))
	{
		p=fgetc(fp);
		if(Myisalpha(&p))
		{
		    if(isupper(p))
			{
				p=tolower(p);
			}
			brr[i]=p;
			brr[i+1]='\0';
			i++;
		}
		else
		{
			if(Find_index (arr,brr)==0)
			{
			
				crr=(fin *)realloc(arr,(j+2)*sizeof(fin));           //每次需要记录新单词时添加两个fin格子
				arr = crr;
				for(int i_a=j+1;i_a<j+2;i_a++)                    //将新添加的fin格子的number置为0
				{
					arr[i_a].number=0;
				}
				
				strcpy(arr[j].word,brr);
			    arr[j].number += 1;
		     	i = 0;
		     	j++;

			}
			else
			{
				arr[Find_index(arr,brr)].number++;
				i = 0;
			}
			 
			
		}
	}
	Sort(arr);
	Show(arr);
	fclose(fp);

	free(arr);

}

bool Myisalpha(char *p);                   //是一个判断是否为字母的函数

bool Myisalpha(char *p)      //判断字符是否为字母
{
	char arr[54]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'";
	for(int i=0;arr[i]!='\0';i++)
	{
		if(*p==arr[i])
		{
			return true;
		}
	}
	return false;
}

int Find_index(fin *arr,char *brr);        //找出已记录过单词的下标,通过这个下标将这个单词的出现次数+1

int Find_index(fin *arr,char *brr)         //找出已记录单词的下标
{
	for(int i=0;arr[i].number!=0;i++)
	{
		if(strcmp(arr[i].word,brr)==0)
		{
			return i;
		}
	}
	return 0;
}

void Sort(fin *arr);                       //按出现频率排序

void Sort(fin *arr)         //按出现频率排序
{
	int tmp=0;
	char stmp[26]="0";
	for(int i=0;arr[i].number != 0;i++)
	{
		for(int j=i+1;j>0;j--)
		{
			if(arr[j].number>arr[j-1].number)
			{
				tmp=arr[j].number;
				strcpy(stmp,arr[j].word);
				arr[j].number=arr[j-1].number;
				strcpy(arr[j].word,arr[j-1].word);
				arr[j-1].number=tmp;
				strcpy(arr[j-1].word,stmp);
			}
		}
	}
}

void Show(fin *arr) ;        //打印前1000个单词

void Show(fin *arr)         //打印前1000个单词
{
	for(int i=0;i<1000;i++)

	{
		printf("%d,  %s, %d",i+1,arr[i].word,arr[i].number);
		printf("\n");
	}
	printf("\n");
}

你也可以以单词表的形式排序,打印出来,项目完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>


typedef struct Find_word     //定义单词结构体
{
	char word[26];
	int number;

}fin;
void Show1(fin *arr);                      //打印全部单词
void Show(fin *arr);                       //打印前1000个单词
int Find_index(fin *arr,char *brr);        //找出已记录单词的下标
void Sort(fin *arr);                       //按出现频率排序
void Sort1(fin *arr);                      //按单词表排序
bool Myisalpha(char *p);                   //判断是否为字母



void Show1(fin *arr)      //打印全部单词
{
	for(int i=0;arr[i].number!=0;i++)
	{
		printf("%d,  %s, %d",i,arr[i].word,arr[i].number);
		printf("\n");
	}
	printf("\n");

}

void Show(fin *arr)         //打印前1000个单词
{
	for(int i=0;i<1000;i++)

	{
		printf("%d,  %s, %d",i+1,arr[i].word,arr[i].number);
		printf("\n");
	}
	printf("\n");
}

int Find_index(fin *arr,char *brr)         //找出已记录单词的下标
{
	for(int i=0;arr[i].number!=0;i++)
	{
		if(strcmp(arr[i].word,brr)==0)
		{
			return i;
		}
	}
	return 0;
}
void Sort(fin *arr)         //按出现频率排序
{
	int tmp=0;
	char stmp[26]="0";
	for(int i=0;arr[i].number != 0;i++)
	{
		for(int j=i+1;j>0;j--)
		{
			if(arr[j].number>arr[j-1].number)
			{
				tmp=arr[j].number;
				strcpy(stmp,arr[j].word);
				arr[j].number=arr[j-1].number;
				strcpy(arr[j].word,arr[j-1].word);
				arr[j-1].number=tmp;
				strcpy(arr[j-1].word,stmp);
			}
		}
	}
}
void Sort1(fin *arr)             //按单词表排序
{
	int tmp = 0;
	char stmp[26]="0";
	for(int i=0;arr[i].number != 0;i++)
	{
		for(int j=i+1;j>0;j--)
		{
			if(strcmp(arr[j-1].word,arr[j].word) < 0)
			{
				tmp=arr[j].number;
				strcpy(stmp,arr[j].word);
				arr[j].number=arr[j-1].number;
				strcpy(arr[j].word,arr[j-1].word);
				arr[j-1].number=tmp;
				strcpy(arr[j-1].word,stmp);

			}
		}
	}
}
bool Myisalpha(char *p)      //判断字符是否为字母
{
	char arr[54]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'";
	for(int i=0;arr[i]!='\0';i++)
	{
		if(*p==arr[i])
		{
			return true;
		}
	}
	return false;
}
void Find()
{
	
	fin *arr=(fin *)calloc(1,sizeof(fin));
	char brr[26]="0";
	fin *crr;
	int i=0;
	int j=0;
	char p='0';
	FILE *fp=fopen("2.txt","r");
	while(!feof(fp))
	{
		p=fgetc(fp);
		if(Myisalpha(&p))
		{
		    if(isupper(p))
			{
				p=tolower(p);
			}
			brr[i]=p;
			brr[i+1]='\0';
			i++;
		}
		else
		{
			if(Find_index (arr,brr)==0)
			{
			
				crr=(fin *)realloc(arr,(j+2)*sizeof(fin));           //每次需要记录新单词时添加两个fin格子
				arr = crr;
				for(int i_a=j+1;i_a<j+2;i_a++)                    //将新添加的fin格子的number置为0
				{
					arr[i_a].number=0;
				}
				
				if(strcmp("s",brr)!=0&&strcmp("t",brr)!=0)
				{
			     	strcpy(arr[j].word,brr);
			        arr[j].number += 1;
		         	i = 0;
		         	j++;
				}


			}
			else
			{
				arr[Find_index(arr,brr)].number++;
				i = 0;
			}
			 
			
		}
	}
	Sort(arr);
	Show(arr);
	fclose(fp);

	free(arr);

}

int main()
{
	Find();

	return 0;
}

猜你喜欢

转载自blog.csdn.net/Pluto_God/article/details/81942105