C语言统计文章单词出现次数

一定要用C语言,不能使C++!!!

在当前目录中存在名为"words.in"(的文本文件,其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计文章中每个单词出现的次数,并输出出现次数最多的前10个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,不足10个单词时,按序输出全部单词)。
程序中注意如下细节:
(1)空格、标点符号与回车符起到分隔单词的作用。
(2)文章一行的末尾可能有连字符,出现连字符时,该行最末的字符串与下行最先出现的字符串构一个单词;
(3)名词缩写算一个单词;
(4)数字不算单词;
(5)单词不区分大小写;
(6)输出时单词全使用小写;
越详细越多注释越好,满意的话全副身家的分都给你了……感激!

第1个回答  2013-08-10
#include <stdio.h>#include <string.h>#include <malloc.h>
typedef struct pair{ char word[20]; int num;}pair;
typedef struct mylist{ pair *pairs; int pairnum; }mylist;
void *malloczero(int size){ void *p = malloc(size); memset(p, 0, size); return p;}
void *realloczero(int size){ void *p = realloc(size); memset(p, 0, size); return p;}
void memexch(pair *one, pair *two){ pair tmp; memcpy(&tmp, one, sizeof(pair)); memcpy(one, two, sizeof(pair)); memcpy(two, &tmp, sizeof(pair));}
wordlist wordlist = {NULL, 0, NULL, NULL};
void addpair(char *wordadd){ pair *pair1 = wordlist.pairs; int tmp = wordlist.pairnum; int i = 0; for(i = 0; i < tmp; i++) { if(stricmp(pair1[i].word, wordadd) == 0) { pair1[i].num++; return; } }
pair1 = wordlist.pairs = realloczero((tmp+1)*sizeof(pair)); tmp = ++wordlist.pairnum; strcpy(pair1[tmp-1].word, wordadd); pair1[tmp-1].num++; return;}
void sortpair(){ pair *pair1 = wordlist.pairs; int tmp = wordlist.pairnum; int i = 0; int j = 0;
for(i = 0; i < tmp - 1; i++) for( j = i+1; j < tmp; j++) { if(pair1[i].num < pair1[j].num) { memexch(pair+i, pair+j); } else if(pair1[i].num == pair[j].num) { if(stricmp(pair1[i].word, pair1[j].word) > 0) { memexch(pair+i, pair+j); } } }}
int isdelims(char ch){ if(isalnum(ch)) return 0; if(ch == '-') return 2; return 1;}
int isstrnum(char *str){ int i = 0; for(i = 0; i < strlen(str); i++) { if(isdigit(str[i]) == 0) return 0; } return 1;}
void lowerprint(char *str){ int i = 0; for( i = 0; i < strlen(str); i++) putc(tolower(str[i])); putc('\n');}
int main(){ char tmpword[100]; char tmpch; char *ptmpword = tmpword; int i = 0; FILE *fp = fopen("words.in", "r"); memset(tmpword, 0, 100); while(fp != EOF) { tmpch = fgetc(); if(fp == EOF) break; if(isdelims(tmpch) == 1) { if(tmpword[0] != '\0' && isstrnum(tmpword) == 0) { addpair(tmpword); } memset(tmpword, 0, 100); ptmpword = tmpword; }
else if(isdelims(tmpch) == 0) { *ptmpword++ = tmpch; }
else if(isdelims(tmpch) == 2) { fgetc(); } }
sortpair();
if(wordlist.pairnum >= 10) { for( i = 0; i < 10; i++) { lowerprint( wordlist.pairs[i].word); } }
else { for( i = 0; i < wordlist.pairnum; i++) { lowerprint( wordlist.pairs[i].word); } }}
相似回答