如何统计一本书中出现最多的前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;
}