求c语言数据结构上机题代码(用数组来做)

编写程序来统计一个英文文本文件中每个单词出现的频率,并且将统计后的结果按字典序输出到屏幕上

#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的行下标;

追问

为什么我这里输出是一行空格?

哦哦可以了就是好像输出没有按照字典序排序

就是先按照首字母排序

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答