词频统计

题目描述:做一个词频统计程序,该程序具有以下功能:

(1)可倒入任意英文文本文件

(2)统计该英文文件中单词数和各单词出现的频率(次数),并能将单词按字典顺序输出。

(3)可能的话可否将单词及频率写入数据库(文件)

思想:1.使用文件操作。

      2.将英文文章先读到一个字符串中。

      3.将英文文章中的单词分离时,主要使用strtok函数。

      4.将英文单词排序时使用strcmp函数。

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#define MAX_NUM 100000
#define bool int
struct
{
	int count;//单词出现的次数
	char ch[20];
}word[MAX_NUM];
void read(char *Book, int *total_ch, char *ch)//导入英文文本文件
{

	FILE *fp;
	int i;
	fp = fopen("EnglishBook.txt", "r");
	if (!fp)
	{
		printf("\n打开文件EnglishBook.txt失败!");
		exit(0);
	}
	//获取文章及总字符数
	(*ch) = fgetc(fp);//ch为文章第一个字符,判断文章文件是否为空。
	if (*ch != EOF)
	{
		Book[0] = (*ch);
		for (i = 1; !feof(fp); i++)
		{
			Book[i] = fgetc(fp);//获取文章,将文章中的各个字符放到Book数组中
			Book[i] = '\0';//在读取文章时,并没有将字符串的结束标志读进去,为了后面使用strtok等字符串的相关函数,加上’\0’。
			(*total_ch) = strlen(Book);
		}
	}
	fclose(fp);
}
void show(char *Book, int *total_ch, char *ch)//显示文章
{
	if ((*ch) == EOF)
	{
		printf("\n文件为空,请选择文章续写!");
	}
	else
	for (int i = 0; i<MAX_NUM; i++)
	{
		printf("%s", Book);
		printf("\n");
	}

}
void sort(int* kind)//按照字典排序
{
	int n, j, t;
	char tempt[MAX_NUM];
	for (n = 0; n<(*kind) - 1; n++)
	{
		for (j = 0; j<(*kind) - n - 1; j++)
		{
			if (strcmp(word[j].ch, word[j + 1].ch)>0)
			{
				strcpy(tempt, word[j].ch);//交换单词
				strcpy(word[j].ch, word[j + 1].ch);
				strcpy(word[j + 1].ch, tempt);
				t = word[j].count;//交换单词频数
				word[j].count = word[j + 1].count;
				word[j + 1].count = t;
			}
		}
	}
}
void dep_show(char *Book, char *b)
{
	int i=0, j;//i记录有多少不同的单词,j记录相同单词出现的次数
	char* tok;
	bool judge = 0;
	int sum = 0;
	FILE *fp;
	for (tok = strtok(Book, b); tok != NULL; tok = strtok(NULL, b))
	{

		//利用strtok函数将文章中的单词分离开。
		sum++;//单词总数
		strcpy(word[i].ch, tok);
		(word[i].count) = 1;
		for (j = 0; j<i; j++)

		if (strcmp(word[i].ch, word[j].ch) == 0)
		{
			(word[j].count)++;
			judge = 1;
		}

		if (judge)
			i--;
		j++;
		judge = 0;
	}

	//  i=i-1;
	sort(&i);
	printf("单词总数为:%d\n", sum);
	fp = fopen("count.txt", "w");
	if (!fp)
	{
		printf("\n打开文件count.txt失败!");
		exit(0);
	}
	fprintf(fp, "单词总数为:%d\n", sum);将单词总数读到文件中
	for (j = 0; j<i; j++)
	{
		fprintf(fp, "%-16s\t%d\t\n", word[j].ch, word[j].count);//将单词、单词频数读到文件中
		printf("%-16s\t%d\t\n", word[j].ch, word[j].count);//将单词、单词频数打印到屏幕上
	}
	fclose(fp);
}

void add(char *Book, int *total_ch, char *ch)

{
	char Book_write[MAX_NUM];
	FILE *fp;
	char str = ' ';
	getchar();
	fp = fopen("EnglishBook.txt", "a+");
	if (!fp)
	{
		printf("\n打开文件EnglishBook.txt失败!");
		exit(0);
	}
	printf("请输入:");
	gets(Book_write);
	if ((*ch) != EOF)
		fputc(str, fp);
	fputs(Book_write, fp);//将新增的文章读到文件上
	strcat(Book, Book_write);
	read(Book, total_ch, ch);

	printf("添加成功");
	printf("\n");
	fclose(fp);
}

void menu(int *select)

{
	int item, total_ch = 0;//total_ch记录文章中的总字符数
	char b[] = { ',', '.', '?', ':', '-', ' ', '  ' }, Book[2 * MAX_NUM], ch;
	printf("\n");
	printf("*************************************************\n");
	printf("                 词频统计                        \n");
	printf("                1.文章续写                       \n");
	printf("                2.显示英文文本                   \n");
	printf("                3.显示单词总数、全部单词及频数   \n");
	printf("                4.退出                           \n");
	printf("*************************************************\n");
	printf("请选择您需要的操作序号(1-5)按回车确认:");
	scanf("%d", &item);
	printf("\n");
	read(Book, &total_ch, &ch);
	switch (item)
	{
	case 1:add(Book, &total_ch, &ch); break;
	case 2:show(Book, &total_ch, &ch); break;
	case 3:dep_show(Book, b); break;
	case 4:select = 0; break;
	default:printf("请在0-5之间选择\n"); break;
	}
}


int main()
{
	int select = 1;
	while (select)
	{
		menu(&select);
	}
	system("pause");
	return 0;
}

文本文件

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值