#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define IN 1
#define OUT 0
struct record_word
{
char c[30];
int n;
} w[10000];
int main()
{
FILE *fp;
int ch;
int i, j, n = 0, t;
int word = OUT; // OUT表示现在读取的字符不属于一个单词, IN表示正在读取一个单词
char s[30], lastc = ' '; // lastc保存读取的前一个字符, 当现在的字符不是字母, 前一个是字母, 表示一个单词结束
fp = fopen("case1.txt", "r");
if (fp == NULL)
exit(1);
while ((ch = fgetc(fp)) != EOF) {
if (isalpha(ch)) {
ch = tolower(ch);
if (word == OUT) { // 当读取一个字母时, 判断是一个新单词的开始, 还是旧单词的一部分
i = 0;
word = IN;
}
s[i++] = ch;
}
else if (ch == '\n' && lastc == '-')
continue; // 读取连字符后面的回车符, 如果后面没有回车符的, 可以删除这句
else if (isalpha(lastc)) { // 如果读取的不是字母, 而前一个字符是字母, 表示一个单词结束, 则处理这个单词, 否则,不操作
word = OUT;
s[i] = '\0';
for (j = 0; j <= n; j++)
if (strcmp(s, w[j].c) == 0) {
w[j].n++;
break;
}
if (j > n) {
n = j;
w[j].n++;
strcpy(w[j].c, s);
}
}
lastc = ch;
}
for(i=0; i<n&&i<5; i++)
{
t=0;
for(j=1; j<=n; j++)
{
if(strcmp(w[j].c,"\0")!=0)
{
if(w[j].n>w[t].n) t=j;
else if(w[j].n==w[t].n)
if(strcmp(w[j].c,w[t].c)<0)
t=j;
}
}
printf("%s %d\n",w[t].c,w[t].n);
w[t].n=0;
}
fclose(fp);
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
测试数据用例 No.2
标准输入数据:
I am a student. My school is SCAU. It is a beau-
tiful university. I like it.
I am a student. My school is SCAU. It is a i-
s university. I like it.
1 2 3 4 5 6 7 8 9
12 12 12 12
II I
标准输出答案:
1|i 5
2|is 5
3|a 4
4|it 4
5|am 2
你的错误输出结果:
1|i 6
2|a 4
3|is 4
4|it 4
5|am 2
~~~~~~~~~~~~~~~~~~~~~~~~~~
[ 本帖最后由 qq471402415 于 2014-3-6 18:55 编辑 ]