*Description
在當(dāng)前目錄中存在文件名為"case1.in"(其中case后為數(shù)字1,不是字母l,寫錯(cuò)提交后會判錯(cuò))的文本文件,
其內(nèi)容為一篇英文文章(以EOF作為結(jié)束標(biāo)志)。現(xiàn)要求讀取該文本文件內(nèi)容,統(tǒng)計(jì)文章中每個(gè)單詞出現(xiàn)的次數(shù),
并輸出出現(xiàn)次數(shù)最多的前5個(gè)單詞及其出現(xiàn)次數(shù)(按出現(xiàn)次數(shù)由多到少的順序輸出,次數(shù)相同時(shí)按字典順序輸出,
不足5個(gè)單詞時(shí),按序輸出全部單詞)。程序中注意如下細(xì)節(jié):
(1) 空格、標(biāo)點(diǎn)符號與回車符起到分隔單詞的作用。
(2) 文章一行的末尾可能有連字符,出現(xiàn)連字符時(shí),該行最末的字符串與下行最先出現(xiàn)的字符串構(gòu)一個(gè)單詞;
(3) 名詞縮寫算一個(gè)單詞;
(4) 數(shù)字不算單詞;
(5) 單詞不區(qū)分大小寫;
(6) 輸出時(shí)單詞全使用小寫;

OJ截圖
//代碼片段。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
//定義結(jié)構(gòu)體。
struct list
{
int time;
char words[21];
}word[10001];
int main()
{
//聲明變量。
FILE *fp;
fp=fopen("case1.in","r");
int count=0,num=0,q=0,i;
char ch,temp[21];
//初始化結(jié)構(gòu)體數(shù)組
for(num=0;num<10001;num++)
{
word[num].time=1;//次數(shù)歸一
memset(word[num].words,0,sizeof(word[num].words));
}
//重做文件讀取操作。更簡!更簡!更簡?。。?!
while((ch=fgetc(fp))!=EOF)
{
if(ch>='a'&&ch<='z')
word[count].words[q++]=ch;
//大小寫轉(zhuǎn)換
else if(ch>='A'&&ch<='Z')
word[count].words[q++]=ch+32;
//分頁符轉(zhuǎn)換
else if(ch=='-')
{
ch=fgetc(fp);
if(ch=='\n')
continue;
else
{
count++;
q=0;
if(ch>='a'&&ch<='z')
word[count].words[q++]=ch;
else if(ch>='A'&&ch<='Z')
word[count].words[q++]=ch+32;
}
}
else
{
count++;
q=0;
}
}
//對比相同 加次數(shù) 清同串。
for(num=0;num<count;num++)
{
for(i=num+1;i<count;i++)
if(!strcmp(word[num].words,word[i].words))
{
word[num].time++;
memset(word[i].words,0,sizeof(word[i].words));
}
}
//清其他字符干擾。
for(i=0;i<count;i++)
{
if(word[i].words[0]<'a'||word[i].words[0]>'z')
{
word[i].time=0;
}
}
//重做排序 更快!更快!更快?。。?!
for(i=1;i<count;i++)
for(num=0;num<count-i;num++)
{
if(word[num].time<word[num+1].time)
{
//次數(shù)排序
int t=word[num].time;
word[num].time=word[num+1].time;
word[num+1].time=t;
strcpy(temp,word[num].words);
strcpy(word[num].words,word[num+1].words);
strcpy(word[num+1].words,temp);
}
else if(word[num].time==word[num+1].time)
{
//字母順序
if(strcmp(word[num].words,word[num+1].words)>0)
{
strcpy(temp,word[num].words);
strcpy(word[num].words,word[num+1].words);
strcpy(word[num+1].words,temp);
}
}
}
//輸出方法。
for(i=0;i<5;i++)
{
printf("%s %d\n",word[i].words,word[i].time);
}
//關(guān)閉文件
fclose(fp);
return 0;
}