题目描述:做一个词频统计程序,该程序具有以下功能:
(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;
}
文本文件