C语言 计算一篇英文文章中出现次数最多的前5个单词,按英文字典顺序输出.

代码如下#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main()
{
FILE * fp;
char s[10000][21]={'\0'};
int count[10000]={0};
char s2[10000][21]={'\0'};
char ch;
int i=0,j=0,flag=0,m=0,n=0,word=0,max,k=1; //flag (1)遇到不是单词 (0) 遇到单词或单词未结束;word 0 不重复 1重复;

if((fp=fopen("case1.in","r"))==NULL ) //打开文件
{printf("wrong");return 1;} //打开不了就输出 wrong
while((ch=fgetc(fp))!=EOF)
{
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||ch=='-'||ch=='\'') //遇到 字母, '-' , 缩写号 ' 时
{ if(flag==1) //判断flag直到遇到单词 i自增使指向下一个数组
i++;
if(ch>='A'&&ch<='Z') //大写换小写
{
ch=ch+32;
}
s[i][j]=ch;
j++;
flag=0; //单词未结束flag为0
}
else
{
flag=1; //遇到不是单词,标记为1
}
}
strcpy(s2[0],s[0]); //将s[0]复制到s2[0]中
for (m=1;m<=i;m++) //从s[1]开始 直到 s[i]
{
for(n=0;n<m;n++) //将s[m]跟他前面的比较.看看是否重复
{
if(strcmp(s[m],s[n])==0)
{
word=1;//重复 word标记为1
}

}
if(word==0) //不重复,将s[m]复制到s2[k]中
{
strcpy(s2[k],s[m]);
k++;
}
word=0;//比较完后将word重置
}
for(m=0;m<k;m++)
{
for(n=0;n<=i;n++)
{
if(strcmp(s2[m],s[n])==0)//s2[m]中的单词是不重复的.用s[n]里面的单词逐个对比.遇到相同count[m]自+1;
count[m]=count[m]+1;
}
}

for(m=0;m<=k&&m<5;m++) //单词数小于5个或k(k<5时)个执行循环
{
max=0;//重置max
for(n=1;n<=i;n++)
{
if(count[max]==count[n]) //若单词出现次数相同 .按字典顺序排
{
if(strcmp(s2[max],s2[n])>0)
max=n;
}
if(count[max]<count[n])
max=n;

}
printf("%s %d\n",s2[max],count[max]);
count[max]=0;//将输出过的单词出现次数清0;

}

return 0;

}

正常的结果是
i 10
and 4
my 4
but 3
in 3

但是我运行时.结果是
77
adminton 1
and 1
at 1
breakfast 1
之前用结构体数组还是可以做出来的.现在不知道为什么不行..?
求解..还有.我是c语言初学者.请讲得简单易懂一点..
还有我觉得我得程序好像有些多余的地方.请问如何精简?

其实用gets 读取整行再作处理比较容易的,在此用getc会让程序变得户复杂,容易出错

给你个例子作参考,也看看注释尝试了解吧:
#include <stdio.h>
#include <string.h>

struct WORD_FOUND //用来存放结果的结构
{
char szWord[256];
int nCount;
};

WORD_FOUND g_WordFound[100]={{"",0}};
int g_nMatch=0;

int main()
{
char szText[1024];
char szWord[512];
FILE * fp;
int i;
if ((fp=fopen("case1.in","r"))==NULL) //打开文件
{printf("wrong");return 1;} //打开不了就输出 wrong

while(fgets(szText,sizeof(szText)-1,fp)) //这里读整行,处理比较有效,不容易出错
{
char *tmp=szText,*end=szText+strlen(szText);
char *endChr;
while (tmp<end)
{
while (*tmp==' '||*tmp=='\n'||*tmp=='\t') tmp++; //这里跳过空格
endChr=tmp;
while (*endChr&&*endChr!='\n'&&*endChr!='\r'&&*endChr!=' ') endChr++;//这里寻找下个空格

memset(szWord,0,sizeof(szWord));
strncpy(szWord,tmp,endChr-tmp);//找到的字符,存在 szWord里
bool bFound=false;
for (i=0;i<g_nMatch;i++)//寻查已经找到的字符
{
if (strcmp(g_WordFound[i].szWord,szWord)==0)//如果相配
{
g_WordFound[i].nCount++;//加上1
bFound=true;
break;
}
}
if (!bFound&&strlen(szWord)>0)//如果没相配,把字符存在g_WordFound里
{
strcpy(g_WordFound[g_nMatch].szWord,szWord);
g_WordFound[g_nMatch].nCount++;
g_nMatch++;
}
tmp=endChr;
if (tmp>=end) break;
}
}

//此处打印结果
for (i=0;i<g_nMatch;i++)
{
printf("%s = %d\n",g_WordFound[i].szWord,g_WordFound[i].nCount);
}

return 0;

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-02-07
数组初始化不对啊,放到程序段中去声明。或者把整个c文件改为CPP后缀试下。追问

初始化不对?可以说具体点吗..真正的新手..学没2个月

追答

int count[10000]={0};这个只表示count[0]=0

追问

啊?是吗?哪我知道了..谢谢

第2个回答  2012-02-07
if(flag==1) //判断flag直到遇到单词 i自增使指向下一个数组
i++;

修改为:

if(flag==1)
{
i++;
j=0;
}
第3个回答  2012-02-07
可以把你用到的文件case1.in发给我吗?
邮箱:876142347@qq.com
我检查看看追问

发了..请帮忙检查检查

追答

这段程序中
while((ch=fgetc(fp))!=EOF)
{
if((ch>='A'&&ch='a'&&ch='A'&&ch<='Z') //大写换小写
{
ch=ch+32;
}
s[i][j]=ch;
j++;
flag=0; //单词未结束flag为0
}
else
{
j=0;//修改之处
flag=1; //遇到不是单词,标记为1
}
}
有问题,当一个单词完了后,j没有等于0。
导致之后的数组存储数据出现问题

本回答被提问者采纳

C语言 计算一篇英文文章中出现次数最多的前5个单词,按英文字典顺序输出...
if ((fp=fopen("case1.in","r"))==NULL) \/\/打开文件 {printf("wrong");return 1;} \/\/打开不了就输出 wrong while(fgets(szText,sizeof(szText)-1,fp)) \/\/这里读整行,处理比较有效,不容易出错 { char *tmp=szText,*end=szText+strlen(szText);char *endChr;while (tmp...

C语言:输入6个英文单词,要求按从小到大排序,并输出。如下图所示:
printf("输出排好序的6个单词:\\n"); for(int i = 0; i < 6; i++ ) puts(string[i]); return 0; }没改什么,就是多次声明了变量i,有些编译器不允许这么做 本回答由提问者推荐 举报| 答案纠错 | 评论(5) 11 7 283802332 采纳率:78% 来自:芝麻团 擅长: C\/C++ 汇编语言 Linux 工程技术科...

c语言 输入10个单词,按字典顺序输出 不要复制不对的过来啊
printf("这10个单词按照字典排序输出为:\\n"); for(i=0;i<10;i++)\/\/ 输出 { printf("%s\\n",str[tem[i]]); }}很明显不再对字符串进行复制或交换了,速度快多了。 ycsxm | 发布于2013-04-21 举报| 评论(2) 9 0 为您推荐: c语言逆序输出数字 c语言中如何顺序输出 c语言程序的顺序 c...

pythona的序列是多少个
maxsplit是最大分割次数,如果maxsplit被省略,则表示不限制分割次数。 2.4统计英文文章中单词出现的频率python基础数据结构:序列、映射、集合 参考资料: Python中常见的数据结构可以统称为容器(container)。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要的容器。 一、序列(列表、元组和字符串) 序列中的每...

电脑的背单词软件背单词软件哪个好
5、e时代英语 一个免费的背单词软件,有循环记忆管理系统和课程编辑系统。除了软件本身携带的课程外,用户还可以自己制作课程。 一个小时测试结果: 总学:108 词, 生词:92 词 测验结果:81词\/小时 正确率: 32% 测评:这个软件的核心是模拟遗忘曲线对记忆进行管理,但模拟效果一般,对单银举词复习的次数计...

我现在已经是一个大二的学生了,我的单词一直过不了关,谁能教教该怎么...
背字典的时候,按开头字母(Z,Y,X,Q,J,K,U)(V,W,N,O,L)(FG,IT,HM,BDE,R)(C,P,S,A)的顺序背,其中C,P,S,A每个都要分三部分背。这样背有几个好处:(一)能增加成就感,提高兴趣。至于为什么,您翻翻字典就明白了。(二)便于清楚地知道那些单词已经背过,那些还没背。(三)能先把最基本的词先掌握...

有什么比较好的英语学习方法?本人记英语单词一下忘了,英语听力很差.
在听、说、读、写出现疑问时,就要赶紧查词典,这时,你至少要通过查词典,知道这个单词的基本汉语意思。重要单词要全面把握:做练习、精读、写作、听力时,手边放一本字典,如《牛津高阶英汉双解词典》,遇到不懂的、掌握的不确切单词中的重要单词,如常用的、常考的重要单词,要仔细查阅词典,这时,不光要看音标、注释,...

相似回答