【C言語】英語の文章の出現回数が最も多い単語

25132 ワード

問題の説明:現在のディレクトリには「case 14.in」というファイル名のテキストファイルが存在し、その内容は英語の文章(EOFを終了フラグとする)である.このテキストファイルの内容を読み取り、文章中の単語ごとに出現した回数を統計し、出現回数が最も多い上位5単語とその出現回数(出現回数が多い順から少ない順に出力し、回数が同じ場合は辞書順に出力し、5単語未満の場合は全単語を順番に出力する)を出力することを要求する.プログラムでは、(1)スペース、句読点、リターン記号が単語を区切る役割を果たすことに注意してください.(2)文章の行の末尾にハイフンがある可能性があり、ハイフンが現れた場合、その行の最後尾の文字列と下りで最初に現れた文字列が単語を構成する.(3)名詞の略語は単語を表す.(4)数字は単語ではない.(5)単語は大文字と小文字を区別しない.(6)出力時の単語はすべて小文字である.
#include 
#include 

struct WORDCOUNT{
	char word[20];
	int count;
};

int main()
{
	FILE *fp;
	struct WORDCOUNT wordcount[10000];
	char essay[200000], ch, temp[20];
	int i, j, k, len, count, t;
	
	fp = fopen("case14.in", "r");
	for(i=0; (ch = fgetc(fp)) != EOF; i++)
		essay[i] = ch;
	len = i;
	
	//      essay    
	for(i=0; i<len; i++)
	{
		if(essay[i]=='-')
		{
			for(j=i+1; j<len; j++)
				essay[j-1] = essay[j];
			len--;
		}	
		else if(essay[i]>='A' && essay[i]<='Z')
			essay[i] +=32;
		else if(essay[i]>='a' && essay[i]<='z')
			essay[i]= essay[i];
		else essay[i] = ' ';
	}
	
	
	//       
	for(i=1; i<len; i++)
	{
		if(essay[i-1]==' ' && essay[i]==' ')
		{
			for(j=i+1; j<len; j++)
				essay[j-1] = essay[j];
			len--;
		}
	}
	
	//   
	k=0;
	for(i=0; i<10000, k<len; i++)
	{
		for(j=0; j<20 && essay[k]!=' ' && k<len; j++, k++)
			wordcount[i].word[j] = essay[k];
		k++;
	}
	count = i;
	
	//    
	for(i=0; i<count; i++)
		wordcount[i].count = 1;
	
	//      
	for(i=0; i<count; i++)
	{
		for(j=i+1; j<count; j++)
		{
			if(strcmp(wordcount[i].word, wordcount[j].word)==0)
			{
				wordcount[i].count += wordcount[j].count;
				for(k=j+1; k<count; k++)
					strcpy(wordcount[k-1].word, wordcount[k].word);
				count--;
			}
		}
	}
	
	//     
	for(i=0; i<count-1; i++)
	{
		for(j=1; j<count-i; j++)
		{
			if(strcmp(wordcount[j-1].word, wordcount[j].word) > 0)
			{
				strcpy(temp, wordcount[j-1].word);
				strcpy(wordcount[j-1].word, wordcount[j].word);
				strcpy(wordcount[j].word, temp);
				t = wordcount[j-1].count;
				wordcount[j-1].count = wordcount[j].count;
				wordcount[j].count = t;
			}
		}
	}
	
	//      
	for(i=0; i<count-1; i++)
	{
		for(j=1; j<count-i; j++)
		{
			if(wordcount[j-1].count < wordcount[j].count)
			{
				strcpy(temp, wordcount[j-1].word);
				strcpy(wordcount[j-1].word, wordcount[j].word);
				strcpy(wordcount[j].word, temp);
				t = wordcount[j-1].count;
				wordcount[j-1].count = wordcount[j].count;
				wordcount[j].count = t;
			}
		}
	}
	
	if(count<5)
		for(i=0; i<count; i++)
			printf("%s %d
"
, wordcount[i].word, wordcount[i].count); else for(i=0; i<5; i++) printf("%s %d
"
, wordcount[i].word, wordcount[i].count); }