- ベストアンサー
プログラムのテキストカウント
- プログラムの出現文字数をカウントする方法について
- 出現文字数を頻度順にソートする方法について
- ソートの開始位置と関数の設定方法について
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>出現する文字数のカウントをする これを、「(大小)英文字の出現頻度をカウントする」と読み替えて・・。 ☆的を外していたら、ごめんなさい。 ・お示しのソースは、ch を混同されて使ってませんか。 a iTotal, iMax ch iCode str iCount と改名しました。 CH 使いません 参考 http://e-words.jp/p/r-ascii.html --------------------------------------------- #include <stdio.h> #include <stdlib.h> #define TOTAL(k) (iCount[(k)+0x41]+iCount[(k)+0x61]) void OoijunOutput( int iCount[] ) { int i, j, iMax, iBasyo, iTotal; for( j = 0; j < 26; j++ ){ // 26文字 iMax = TOTAL( j ); // 大小文字数の和、仮の最大値 iBasyo = j; // 仮の最大値の場所、次の for 文ブロックを抜けて確定 for( i = 0; i < 26; i++ ){ // i = 0 ▼「ソート」i = ( j + 1 ) iTotal = TOTAL( i ); if( iTotal <= iMax ) continue; iMax = iTotal; iBasyo = i; } if( ! iMax ) break; printf( "(%c)%5d ", ( iBasyo + 0x41 ), iCount[ iBasyo + 0x41 ] ); printf( "(%c)%5d ", ( iBasyo + 0x61 ), iCount[ iBasyo + 0x61 ] ); printf( "計%5d\n", iMax ); iCount[ iBasyo + 0x41 ] = 0; // ▼「ソート」での入れ替えをしない代わり iCount[ iBasyo + 0x61 ] = 0; // まだ使用する場合は、「入れ替え方式」へ } } int main( int argc, char *argv[] ) { int i, iCode, iCount[ 128 ] = { 0 }; FILE *fp; char cBuf[256]; if( 2 != argc ) exit( 0 ); fp = fopen( argv[1], "r" ); if( fp == NULL ){ printf( "I can't find it. You need to write a file name ! \n" ); exit( 1 ); } printf( "指定されたファイル '%s' 内の各文字の個数は以下のとおり. \n", argv[1] ); while( NULL != fgets( cBuf, 256, fp ) ){ for( i = 0; i < 256; i++ ){ iCode = (int)cBuf[ i ]; if( ! iCode ) break; // 行端 if( iCode < 128 ) iCount[ iCode ]++; } } fclose( fp ); OoijunOutput( iCount ); printf( "\n行数%5d\n", iCount[ 0x0A ] ); return( 0 ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。
その他の回答 (2)
- plh
- ベストアンサー率50% (4/8)
ソートするには、まず文字とカウントをセットにしたデータ構造の配列を作る必要があります。この場合、カウントでソートすることになりますね。 いかは、ご希望通りの動作とはちょっと違う動作のコードです。 これで遊んで見てください。VC6++ を想定しています。 #pragma warning(disable: 4786) #include <cstdio> #include <algorithm> using namespace std; struct CCharCount { int m_iChar; int m_iCount; bool operator <(const CCharCount& rcharcount) { return m_iCount < rcharcount.m_iCount; } }; int main(int argc, char* argv[]) { argc--, argv++; if (argc == 0) { return 0; } char* pcFile = argv[0]; FILE* pfile = fopen(argv[0], "r"); if (pfile == 0) { return 0; } CCharCount acharcount[256]; {for (int iChar = 0; iChar < 256; iChar++) { CCharCount charcount; charcount.m_iChar = iChar; charcount.m_iCount = 0; acharcount[iChar] = charcount; }} {for (int iChar = 0; (iChar = fgetc(pfile)) != EOF; ) { printf("%c", char(iChar)); acharcount[char(iChar)].m_iCount++; }} sort(&acharcount[0x20], &acharcount[0x7e]); {for (int iIndex = 0x20; iIndex < 0x7e; iIndex++) { printf("%d, %c\n", acharcount[iIndex].m_iCount, char(acharcount[iIndex].m_iChar)); }} return 0; }
お礼
何とか解決することができました。(^^) 回答して頂き、ありがとうございました。
- ym103mt
- ベストアンサー率30% (7/23)
ソートのアルゴリズムにも色々な物がありますが、 一番分かりやすいのは「バブルソート法」だと思います。 「バブルソート法」で検索すればやり方はすぐ見つかると思います。 頑張ってください。
お礼
回答ありがとうございます。 がんばってみます。
お礼
回答ありがとうございます。 このプログラムを参考に作成したところ、うまく動作させることができました。 ありがとうございました。