• ベストアンサー

ヒストグラムのプログラム

乱数で入力されたテキストファイル読み込んでヒストグラムを出力するCプログラムが分かりません。 現在、乱数のテキストファイル作成まで出来ました。 ぜひ教えてください。よろしくお願いします。

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

  • ベストアンサー
noname#119918
noname#119918
回答No.2

#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つの数字と仮定してコーディングしてみました。 手元では正しく動いているように思えましたが、 ご自分で確認してください。

dragonkei
質問者

お礼

無事に出来ました! ありがとうございました。

dragonkei
質問者

補足

回答ありがとうございました。 分からないところがありまして、 #define BUF 10の意味や、buf,BUFの意味、 void count以降の動作が分かりません。 (このソースはこういう動作をするためってことです) 教えていただけないでしょうか? よろしくお願いします。

その他の回答 (2)

noname#119918
noname#119918
回答No.3

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]++; } }

dragonkei
質問者

お礼

分かりやすい説明をありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

この質問の仕方だと何が分からないのか僕らも分かりません ファイルからのデータの入力方法なのか データの解析方法なのか はたまた ヒストグラムの出力の仕方か データの種類などはどんな具合だとか いったい何がどこまで理解できていてどこでツマヅイテおられるのでしょう? 出来ているソースがあるなら掲示して この部分が期待した通りに動作しないのですがといった質問をしましょう 考え方としては ヒストグラムの要素種別以上のカウント用配列を準備 ファイルから読み込んだデータの配列要素をインクリメント 全てのデータを読み終えたら カウンタ配列にしたがってヒストグラムを描画 といった手順ですよ

dragonkei
質問者

補足

説明不足ですいませんでした。 まず0~255の乱数が1000入力されたテキストファイルを作成して、 そのテキストファイルを読み込んで、ヒストグラムを出力するプログラムを作成します。 出力で乱数ファイルの中に0は何個、1は何個…255は何個という結果が出ればいいです。 そのあと、そのデータをエクセルを用いてグラフを表示する方法です。 今の地点では乱数のファイル作成は出来ました。 カウンタ配列も初めて聞く言葉なので、ソースは全く分かりません。 これでよろしいでしょうか? よろしくお願いします。

関連するQ&A

  • c言語でのヒストグラム作成用のプログラム

    -50から500までの整数が一列に乱数で入力されたテキストファイルを読み込んで-50が何個、-49が何個、・・・、499が何個、500が何個といった感じにに出力するCプログラムが分かりません。 テキストファイルの中身は-50から500までの整数が一列に書いてあります。説明不足かも知れませんがわかる方よろしくお願いします。

  • C言語でヒストグラムを作成するプログラムを作りたいのですが

    C言語でヒストグラムを作成するプログラムを書いたのですが、正しい濃度値が出力されずに困っています。 ヘッダなしの2バイト画像データを読み込みヒストグラムを書き出すプログラムです。 gccを使っています。 よろしくお願いします。

  • プログラムを教えてください!

    レポートの質問です。 以下の問題のプログラムを作らなければいけないのですが、いろいろと調べてみてもまったくわかりません。 わかる方プログラム教えてください! 課題1 合同式法を用いて,区間[0,1] (区間[0,1)でも良い) の 一様乱数を100 万個生成し,以下を報告せよ.ただし,一様乱数の生成にはC 言語で自作したプログラムを用いること. (1a) 平均の数値計算結果 (1b) 標準偏差の数値計算結果 (1c) 一様乱数のヒストグラム.ヒストグラムは区間[0,1] を100 分割して 作成すること. 課題2 中心極限定理に基づく「間便法」を用いて,区間[0,1] (区 間[0,1)でも良い) の一様乱数から標準正規分布N(0,1)に従う正規乱数を100 万 個生成し,以下を報告せよ.ただし,正規乱数の生成にはC言語で自作したプ ログラムを用いること. (2a) 平均の数値計算結果 (2b) 標準偏差の数値計算結果 (2c) 正規乱数のヒストグラム.ヒストグラムは区間[-5, 5] を100 分割して 作成すること.

  • 確率統計 プログラム

    (1) 正規乱数の発生–中心極限定理の利用  中心極限定理を利用して,区間[0, 1) の一様乱数から標準正規分布N(0, 1) に従う正 規乱数を100,000 個発生し,そのデータから得られる以下の各項目を報告しなさい. ここでは,一様乱数の生成は合同式法を用い,また,正規乱数の生成は中心極限定 理を利用して,いずれも自分で作成したC 言語プログラムで実現すること.(既存の RAND 関数などを用いない) 1. 100,000 個の正規乱数の平均値.なお,理論値は0 である. 2. 100,000 個の正規乱数の標準偏差.なお,理論値は1 である. 3. 100,000 個の正規乱数のヒストグラム(頻度分布).ただしここでのヒストグラ ムは,区間[−5, 5] を100 分割したものとする. 4. 100,000 個の正規乱数のヒストグラム.ただしここでのヒストグラムは,区間 [2.5, 5] を25 分割したものとする.これは,前項3 の右端部を取り出したもので ある. 5. 正規乱数を発生して上項1 ∼ 4 を求めるために作成した,プログラムのソース. (2) 正規乱数の発生–Box-Muller 法  ボックス・ミュラー法により,区間[0, 1) の一様乱数から標準正規分布N(0, 1) に従う 正規乱数を100,000 個発生し,そのデータから得られる以下の各項目を報告しなさい. ここでは,一様乱数の生成は合同式法を用い,また,正規乱数の生成はBox-Muller 法 を用いて,いずれも自分で作成したC言語プログラムで実現すること.(既存のRAND 関数などを用いない) 1. 正規乱数の平均値. 2. 正規乱数の標準偏差. 3. 正規乱数のヒストグラム.区間[−5, 5] を100 分割したものとする. 4. 正規乱数のヒストグラム.区間[2.5, 5] を25 分割したものとする. 5. プログラムのソース. (3) 両者の比較課題1, 2 で得られた結果を比較し,2 つの方法で得られた正規乱数の性質 に違いが見い出されれば,それを考察しなさい. 何ですけどお願いいたします 期限は2009/7/27

  • プログラムについて

    次の問題が自分はどうしても分からないので、みなさんの力をお借りしたいのです。 問題は:   N以下の素数を求めるプログラムと   試験の得点(0以上100以下の整数)を入力し,得点データの分布を10点刻    みのヒストグラムの形式で出力するプログラムの作成が分かりませんので、   何とかよろしくお願いします!

  • 一般的なプログラムの作り方

    こんにちは。 あるプログラムをVC++にて作成しようとしています。 このプログラムは、入力ファイルからテキストを読み込み、編集してから、出力ファイルを生成するというものです。出力ファイルは新規の場合と、上書きの場合があります。 そこで質問なのですが、プログラムの作り方として、以下のパターンが考えられるのですが、どちらが一般的なのでしょうか。 【パターン1】 入力ファイルからのテキスト読み込み、編集及び出力ファイルの生成を同時に行う。 ・長所として考えられる点 メモリ内で持つデータが一時的な領域なため、構造がシンプルでメモリ使用量も少ない。 ・短所として考えられる点 処理の開始から終了まで、出力ファイルを開いたままにするため、他から出力ファイルを編集できない時間が長くなる。 【パターン2】 入力ファイルからのテキスト読み込み、編集が全て完了してから、一括で出力ファイルへ書込む。 ・長所として考えられる点 出力ファイルへアクセスする時間が短くてすむ。 ・短所として考えられる点 メモリ内で全て編集するため、メモリ使用量が増大かつ構造が複雑になる。 以上です。アドバイスなどありましたら、よろしくお願いいたします。 【環境】 Windows XP Professional 入力ファイルのデータ量:10MB程度 出力ファイルのデータ量:1MB程度

  • ヒストグラム平滑化について

    MATLABで画像のヒストグラム平滑化処理プログラムを作成しました。ヒストグラムは確かに処理前と比べて平滑化され、私としては良かったんですが、友人に完全に一律に平均化されていないがそれで良いのかと言われ、不安になりました。色々調べてみましたが、どの平滑化処理でも完全に平均化されてはいなかったんですが、ヒストグラムの平滑化処理において正規分布に沿っている等、何かあるのでしょうか?完全に平均化してしまうと元の画像を損なってしまう気がするのですが…ご意見の程よろしくお願いします。

  • ビン数が大きなヒストグラム

    C言語で、あるデータ群をヒストグラムにまとめたいと思っています。 ヒストグラムのビンに相当するものを配列で用意して…… という、よく学習課題でもあるような形ならば簡単に出来るのですが、 今回やりたいと思っているものは、非常にビンの数が多いのです。 具体的に言うと、数万、数十万という数で、 それだけの要素数を持った配列を用意しようと思っても メモリの都合上、エラーが起きてしまいます。 そこで、配列に記憶させるのではなく、 テキストファイルを用意して、これの入出力をすることで ヒストグラム情報を作る方法をとりました。 この方法で成功はしたのですが、ファイルのオープン/クローズを 何度も繰り返すことになるため、動作が非常に遅くなってしまいます。 要するに、数万、数十万という数の変数を扱いたい、という問題なのですが、 何か良い手段はないでしょうか。

    • 締切済み
    • CGI
  • ヒストグラム平均化のアルゴリズム

    画像をヒストグラム平均化処理するプログラムを 作成したいのですが,具体的なアルゴリズムが わかりません.どなたか,教えてください.

  • 合同式法をつかって(CPad)

    合同式法をつかって(CPad) (1)一様乱数(平均1、分散1) (2)正規乱数(平均1、分散4)のヒストグラムを作成したいのですが、 どのようにしてすればよいのでしょうか? ちなみに乱数のプログラムは作成しました。 よろしくお願いいたします。

専門家に質問してみよう