- ベストアンサー
ヒストグラムのプログラム
乱数で入力されたテキストファイル読み込んでヒストグラムを出力するCプログラムが分かりません。 現在、乱数のテキストファイル作成まで出来ました。 ぜひ教えてください。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#include <stdio.h> #include <stdlib.h> const static int BUF = 10; const static int MAX = 256; void num_count(FILE* p_file , int* counter); int main(void) { FILE* input = fopen("random.txt","r"); if (input == NULL) { fprintf(stderr , "fopen failed."); exit(1); } int counter[MAX]; int i; for(i=0 ; i<MAX ; i++) { counter[i] = 0; } num_count(input , counter); for(i=0 ; i<MAX ; i++) { printf("%d -> %d\n" , i , counter[i]); } fclose(input); return 0; } void num_count(FILE* p_file , int* counter) { char buf[BUF]; while (fgets(buf , BUF , p_file) != NULL) { int n; sscanf(buf , "%d" , &n); counter[n]++; } } 1行につき、1つの数字と仮定してコーディングしてみました。 手元では正しく動いているように思えましたが、 ご自分で確認してください。
その他の回答 (2)
1.const int BUF = 10; char buf[BUF]; fgetsは指定のファイルから1行ずつ読み込みます。 bufは読み込んだ行を蓄えておくための領域です。 (そのため、「バッファ」と言う意味で、bufと宣言しています。) BUFはその領域のサイズです。 1行につき数字1つ、しかも0~255の範囲ならば、 10文字分もあれば十分だろうと考え、 このように宣言しました。 2. // FILE* p_file ファイルポインタ // 入力ファイルを指定します。 // あらかじめ、適切な処理で開かれているものとします。 // counter カウンタ用配列 // 数字をカウントするための配列 // counter[k]が数字kの出現回数を記録します。 // こちらも、あらかじめ適切な配列が確保されているとします。 void num_count(FILE* p_file , int* counter) { // 1.で述べたとおり、入力行を蓄えるためのバッファ char buf[BUF]; // fgetsにより、1行ずつファイルから読み込みます。 while (fgets(buf , BUF , p_file) != NULL) { int n; // 入力行はbufに入っているため、sscanfを用いて // 数字を読み取り、変数nに格納します。 sscanf(buf , "%d" , &n); // 読み取った数字のカウンタを1増やします。 // 本来ならば、nが適切な範囲に収まっているか、 // チェックすべき所ですね。 counter[n]++; } }
お礼
分かりやすい説明をありがとうございました。
- redfox63
- ベストアンサー率71% (1325/1856)
この質問の仕方だと何が分からないのか僕らも分かりません ファイルからのデータの入力方法なのか データの解析方法なのか はたまた ヒストグラムの出力の仕方か データの種類などはどんな具合だとか いったい何がどこまで理解できていてどこでツマヅイテおられるのでしょう? 出来ているソースがあるなら掲示して この部分が期待した通りに動作しないのですがといった質問をしましょう 考え方としては ヒストグラムの要素種別以上のカウント用配列を準備 ファイルから読み込んだデータの配列要素をインクリメント 全てのデータを読み終えたら カウンタ配列にしたがってヒストグラムを描画 といった手順ですよ
補足
説明不足ですいませんでした。 まず0~255の乱数が1000入力されたテキストファイルを作成して、 そのテキストファイルを読み込んで、ヒストグラムを出力するプログラムを作成します。 出力で乱数ファイルの中に0は何個、1は何個…255は何個という結果が出ればいいです。 そのあと、そのデータをエクセルを用いてグラフを表示する方法です。 今の地点では乱数のファイル作成は出来ました。 カウンタ配列も初めて聞く言葉なので、ソースは全く分かりません。 これでよろしいでしょうか? よろしくお願いします。
お礼
無事に出来ました! ありがとうございました。
補足
回答ありがとうございました。 分からないところがありまして、 #define BUF 10の意味や、buf,BUFの意味、 void count以降の動作が分かりません。 (このソースはこういう動作をするためってことです) 教えていただけないでしょうか? よろしくお願いします。