#include <stdio.h>
#include"string.h"
#include <stdlib.h>
#define N 100000
#define M 10000
int fun(char a[])
{
int sum=0;
for(int i=0;i<strlen(a);i++)
sum+=a[i];//字符数字化→ACSII码之和是单词标志之一;
return sum;
}
int main() {
/*_________________________________________________*/
FILE *fp;
char b[N + 1];
//判断文件是否打开
if ( (fp = fopen("D:\\英语论文.txt", "rt")) == NULL )/*这里D:\\ 英语论文.txt 是路径;读取D盘下,名为(英语论文)的文本文件*/
{
puts("文件读取失败!\n");
exit(0);
}
else
{
puts("文件读取成功");
puts("开始计算");
}
//循环读取文件的每一行数据
while( fgets(b, N, fp) != NULL )
{
/*__________________________________________*/
int d[M]={0},x=0;
char a[111][11]={'\0'};
char t[11]={'\0'};
int k=0,j=0;
for(int i=0;i<strlen(b);i++)
{
if((b[i]>='a'&&b[i]<='z')||(b[i]>='A'&&b[i]<='Z'))//不是空格就储存在二维数组中,一行一个单词;
a[k][j++]=b[i];
if(b[i]==' ')//遇到下一个空格就换行,进而开始下一个单词的储存;
{
k++;
j=0;
}
}
int max=fun(a[0]);
for(int i=0;i<=k;i++)
{
d[fun(a[i])]++;//用每个单词的ASCII码之和桶排序,这也即是字典序;
if(fun(a[i])>max)
max=fun(a[i]);//找出最大的作为上限;
}
int name;
for(int i=0;i<=max;i++)
{
name=0;
for(int j=0;j<=k;j++)
{
if(fun(a[j])==i)/*a[j]的ASCII码之和等于i,说明d[i]是记录单词a[j]的,d[i]的数就是a[j]出现的频率;*/
{
name=j;//记录单词下标;
}
}
if(d[i]!=0)//d[i]!=0即i是某个单词的ASCII码之和;
{
printf("%s %d\n",a[name],d[i]);//输出
}
}
/*___________________________________________*/
}
//结束关闭文件
fclose(fp);
return 0;
}
这是修改过的,不过没太大变化,只是加了一个文件读取代码;
这里面要从文件中依次输入几行句子,该怎么写?
追答多组数据输入吗;
就是那种可以无限次的?
多组数据输入?
那种可以连续输入若干个字符串?
就是打开一个文件,统计文件中的单词频率
追答追答字数有限制,我在原回答上修改了;
如果单词数太多的话,你可以可以增大常量N的值,和增大二维数组char a[111][11]的行下标的值;
追答有字数限制,我在原回答上修改了;
如果读取的文本文件单词过多,你可以适当的增大(#define N 10000)常量N的值和二维数组(char a[111][11])a的行下标;
为什么我这里输出是一行空格?
哦哦可以了就是好像输出没有按照字典序排序
就是先按照首字母排序