• ベストアンサー

C言語プログラム

C言語で、英文を読み込み単語の出現頻度のランキングを表示するプログラムを書いてください

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

えいやーで作ったので汚いですが。。バグってたらごめん。 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> struct WordList { int count; /*出現数*/ char word[ 64 ]; /*単語文字列*/ }; void registWord( WordList** list, int* size, const char* word ) { /*既に登録済みの単語を検索して見つかったら出現数+1*/ for( int ii = 0; ii < *size; ii++ ) { if( !strcmp( ( *list )[ ii ].word, word ) ) { ( *list )[ ii ].count++; return; } } /*新しい単語の場合は単語リストに登録する*/ *list = ( WordList* )realloc( *list, sizeof( WordList ) * ( *size + 1 ) ); memset( ( *list ) + *size, 0, sizeof( WordList ) ); ( *list )[ *size ].count = 1; strncpy( ( *list )[ *size ].word, word, sizeof( ( *list )[ *size ].word ) - 1 ); ++( *size ); } void sortWords( WordList* list, int size ) { /*選択ソート*/ for( int ii = 0; ii < size - 1; ii++ ) { int max = ii; for( int jj = ii + 1; jj < size; jj++ ) { if( list[ jj ].count > list[ max ].count ) { max = jj; } } WordList temp; memcpy( &temp, &list[ ii ], sizeof( temp ) ); memcpy( &list[ ii ], &list[ max ], sizeof( WordList ) ); memcpy( &list[ max ], &temp, sizeof( WordList ) ); } } void wordRanking( WordList* list, int size ) { for( int ii = 0; ii < size; ii++ ) { printf( "%d:%s=%d\n", ii + 1, list[ ii ].word, list[ ii ].count ); } } void clearWords( WordList** list ) { if( *list ) { free( *list ); *list = NULL; } } int main(int argc, char* argv[]) { static WordList* list = NULL; int size = 0; if( 2 != argc ) { return -1; } /*英文のテキストファイルを開く*/ FILE* stream = fopen( argv[ 1 ], "r" ); if( !stream ) { return -1; } /*1行ずつ読み込む*/ const char* separator = " .,\"\'\t\n\r"; char buffer[ 256 ]; while( fgets( buffer, sizeof( buffer ), stream ) ) { /*単語ごとに文字列を抜き出す*/ char* token = strtok( buffer, separator ); while( token ) { /*単語をリストに登録する*/ registWord( &list, &size, token ); token = strtok( NULL, separator ); } } fclose( stream ); /*出現数の多い順にソートする*/ sortWords( list, size ); /*単語ランキングを表示する*/ wordRanking( list, size ); /*単語リストを破棄する*/ clearWords( &list ); return 0; }