第二周 词频统计
Posted 悦然品茗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二周 词频统计相关的知识,希望对你有一定的参考价值。
原需求
1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符。
2.统计英文单词在本文件的出现次数
3.将统计结果排序
4.显示排序结果
新需求:
1.小文件输入. 为表明程序能跑
2.支持命令行输入英文作品的文件名
3. 支持命令行输入存储有英文作品文件的目录名,批量统计
4. 从控制台读入英文单篇作品,重定向输出
1.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char **string1, ch, *string;
int len, i, j, k;
int sign, same;
if((fp = fopen("c://special.txt", "rb")) == NULL)
{
printf("打不开\n");
return 0;
}
/*移到文件尾*/
if(!fseek(fp, 0, 2))// 找到为0 执行 未找到不执行
{
len = ftell(fp); // 获取文件长度
}
else
{
fclose(fp);
printf("找不到尾\n");
}
/*把文件指针移到文件头*/
if(fseek(fp, 0, SEEK_SET)) //找到不执行 未找到执行
{
fclose(fp);
printf("找不到头\n");
}
int number=0, num = 0;
if(string = (char *)malloc(sizeof(char) * (len+ 1))) // +1是为了把buf分配的足够大
{
memset(string, 0, (len + 1)); // 把buf清0
fread(string, 1, len, fp); // 把文件内容全部读到buf中
fclose(fp);
}
else
{
fclose(fp);
fprintf(stderr, "分配空间错误\n");
return 0;
}
/*统计总的单词个数*/
sign= 1;
for(i = 0; i < len; i++)
{
ch = *(string + i);
if((ch >= ‘A‘ && ch <= ‘Z‘) || (ch >= ‘a‘ && ch <= ‘z‘))
{
sign= 0;
}
else if(!sign)
{
number++;
sign= 1;
}
}
/*分配字符数组*/
string1 = (char **)malloc(number* sizeof(char *));
for(i = 0; i < number; i++)
{
string1[i] = (char *)malloc(20 * sizeof(char));
memset(string1[i], 0, 20);
}
/*获取所有单词*/
sign = 1;
k = 0;
j = 0;
for(i = 0; i < len; i++)
{
ch = *(string + i);
if((ch >= ‘A‘ && ch <= ‘Z‘) || (ch >= ‘a‘ && ch <= ‘z‘))
{
string1[k][j++] = ch;
sign= 0;
}
else if(!sign)
{
k++;
j = 0;
sign = 1;
}
}
free(string);
/*计算个数*/
for(i = 0; i < number; i++)
{
/*判断此单词是否和前面统计过的单词相同*/
same = 0;
for(j = 0; j < i; j++)
{
if(!strcmp(string1[i], string1[j]))
{
same = 1;
break;
}
}
/*统计单词个数*/
if(!same)
{
num = 0;
for(j = i; j < number; j++)
{
if(!strcmp(string1[i], string1[j]))
{
num++;
}
}
printf("%s : %d\n", string1[i], num);
}
}
free(string1);
return 1;
}
2、
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
char name[100];
printf("请输入");
gets(name);
strcat(name, ".txt");
FILE *fp;
char **string1, ch, *string;
int len, i, j, k;
int sign, same;
if((fp = fopen("c://special.txt", "rb")) == NULL)
printf("打不开\n");
/*移到文件尾*/
if(!fseek(fp, 0, 2))// 找到为0 执行 未找到不执行
{
len = ftell(fp); // 获取文件长度
}
else
{
fclose(fp);
printf("找不到尾\n");
}
/*移到文件头*/
if(fseek(fp, 0, SEEK_SET)) //找到不执行 未找到执行
{
fclose(fp);
printf("找不到头\n");
}
int number=0, num = 0;
if(string = (char *)malloc(sizeof(char) * (len+ 1))) // +1是为了把buf分配的足够大
{
memset(string, 0, (len + 1)); // 把buf清0
fread(string, 1, len, fp); // 把文件内容全部读到buf中
fclose(fp);
}
else
{
fclose(fp);
fprintf(stderr, "分配空间错误\n");
}
/*统计总的单词个数*/
sign= 1;
for(i = 0; i < len; i++)
{
ch = *(string + i);
if((ch >= ‘A‘ && ch <= ‘Z‘) || (ch >= ‘a‘ && ch <= ‘z‘))
{
sign= 0;
}
else if(!sign)
{
number++;
sign= 1;
}
}
string1 = (char **)malloc(number* sizeof(char *));
for(i = 0; i < number; i++)
{
string1[i] = (char *)malloc(20 * sizeof(char));
memset(string1[i], 0, 20);
}
sign = 1;
k = 0;
j = 0;
for(i = 0; i < len; i++)
{
ch = *(string + i);
if((ch >= ‘A‘ && ch <= ‘Z‘) || (ch >= ‘a‘ && ch <= ‘z‘))
{
string1[k][j++] = ch;
sign= 0;
}
else if(!sign)
{
k++;
j = 0;
sign = 1;
}
}
free(string);
/*计算每个单词的个数*/
for(i = 0; i < number; i++)
{
/*判断此单词是否和前面统计过的单词相同*/
same = 0;
for(j = 0; j < i; j++)
{
if(!strcmp(string1[i], string1[j]))
{
same = 1;
break;
}
}
/*统计单词个数*/
if(!same)
{
num = 0;
for(j = i; j < number; j++)
{
if(!strcmp(string1[i], string1[j]))
{
num++;
}
}
printf("%s : %d\n", string1[i], num);
}
}
free(string1);
return 1;
}
4.
#include<stdio.h>
#include<string.h>
#define max 100
int main()
{
char str[max][max];
char str1[max][max];
int num[max];
char string[max];
int i,j,k,l,n,m;
int t;
gets(string);
n = 0;
k = 0;
for(m = 1;m<strlen(string);m++)
{
if(string[m] ==‘ ‘)
{
strncpy(str[k++],string+n,m-n);
n = m+1;
}
}
strncpy(str[k++],string+n,m-n);
l = 0;
for(i=0;i<k;i++)
{
if(i==0)
{
strcpy(str1[l++],str[i]);
}
else
{
t = 0;
for(j=0;j<l;j++)
{
if(strcmp(str1[j],str[i])==0)
{
t = 1;
break;
}
}
if(t==0)
strcpy(str1[l++],str[i]);
}
}
for(i=0;i<l;i++)
{
num[i] = 0;
}
for(i=0;i<l;i++)
{
for(j=0;j<k;j++)
{
if(strcmp(str1[i],str[j])==0)
{
num[i]++;
}
}
}
for(i=0;i<l;i++)
{
printf("%s\n",str1[i]);
printf("%d\n",num[i]);
}
return 0;
}
https://github.com/brilliant100/wordcount.git
以上是关于第二周 词频统计的主要内容,如果未能解决你的问题,请参考以下文章