ファイルを用いた平均値の計算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

ファイルを用いた平均値の計算

#1

投稿記事 by » 18年前

こんばんは、幻です。
また質問させていただきますm(_ _)m

Cの方もようやく「ファイル入出力」の分野まで進んできました。
そこでまた課題が出ました。

『整数が書かれたファイル(添付ファイルのような感じです)を読み込み、その平均値を画面に出力するプログラムを書け。ただし、ファイルから入力データを読み込む部分、平均値を計算する部分、結果を出力する部分のそれぞれを関数にせよ。』

main関数の中に全て書き込むプログラムなら出来たのですが、それぞれを関数に分けるとなると急に分からなくなります。
↓は自分なりに上記のプログラムを崩しながら作ってみたプログラムです。
/* ファイルから読み込んだ整数値の平均を求める */

#include<stdio.h>

/* ファイルを読み込む関数 */
void r_file(FILE *fp)
{
	fp = fopen("file02.txt", "r");
	fclose(fp);
}

/* ファイル内の整数値の平均を求める関数 */
double average(FILE *fp, int *sum, int *i)
{
	int n;  /* ファイル内の整数を格納する変数 */
	double ave;
	
	while (fscanf(fp, "%d", &n) != EOF) {
		sum = sum + n; /* ファイル内の整数の和を求める */
		i = i + 1;      /* ファイル内の整数の個数を求める */
	}
	ave = sum / i;
	
	return ave;
}

/* 結果を出力する関数 */
void output(double ave)
{
	printf("ファイル内の整数値の平均--> %5.2lf\n", ave);
}

int main()
{
	FILE *fp;
	int sum = 0, i = 0;
	double ave;
	
	r_file(fp);
	ave = average(fp, &sum, &i);
	output(ave);
	
	return 0;
}

特にr_file関数で読み込んだファイルを、どうすればaverage関数で計算処理できるのか(?)がよく分からない状態です。
(すみません、上手く言えなくて・・・
添削していただいて、ここはこう書くんだよとか、こうするべきところを教えていただければと思います。
宜しくお願いします。

box

Re:ファイルを用いた平均値の計算

#2

投稿記事 by box » 18年前

> main関数の中に全て書き込むプログラムなら出来た

そのコードを提示していただけますか?

Re:ファイルを用いた平均値の計算

#3

投稿記事 by » 18年前

↓がコードになります。
#include<stdio.h>

int main(void)
{
	FILE *fp;
	int n, i = 0, sum = 0;
	double ave;
	
	fp = fopen("file02.txt", "r");
	
	while (fscanf(fp, "%d", &n) != EOF) {
		sum = sum + n;
		i = i + 1;
	}
	fclose(fp);
	
	ave = (double)sum / (double)i;
	
	printf("ファイル内の整数値の平均-->%5.2lf\n", ave);
	
	return 0;
}
よろしくお願いします。

たかぎ

Re:ファイルを用いた平均値の計算

#4

投稿記事 by たかぎ » 18年前

質問の中のプログラムがまともに動かないことも問題ですが、それ以前に、

> ファイルから入力データを読み込む部分、平均値を計算する部分、結果を出力する部分

の3つを関数にすることでどのような効果が期待できるかをまず考えましょう。
例えば、入力データを読み込む部分を関数にすることで、

・ファイルから読む場合
・標準入力から読む場合
・ダイアログなどを使って入力す場合

のように仕様が変わっても、本体を変更することなく、その関数だけを変更すれば対応できるようになります。
このように、関数を分割することで、後々どんな利点があるかを考えてみると、関数の仕様が見えてくると思います。

Re:ファイルを用いた平均値の計算

#5

投稿記事 by » 18年前

>boxさん
>たかぎさん

ご返答ありがとうございました。
なんとかコンパイル&実行が出来ました!

以下のソースなのですが、「こうした方がもっと良い」「こうすべき」というものがあれば、アドバイスのほどお願いします。
/* ファイルから読み込んだ整数値の平均を求める */

#include<stdio.h>

/* ファイルを読み込む関数 */
void r_file(FILE *fp, int *sum, int *i)
{
	int n;				 //ファイル内の整数値を格納するための変数
	fp = fopen("file02.txt", "r");
	
	while (fscanf(fp, "%d", &n) != EOF) {
		*sum = *sum + n;
		*i = *i + 1;
	}
	fclose(fp);
}

/* ファイル内の整数値の平均を求める関数 */
double average(int sum, int i)
{
	double ave;
	
	ave = sum / i;
	
	return ave;
}

/* 結果を出力する関数 */
void output(double ave)
{
	printf("ファイル内の整数値の平均--> %5.2lf\n", ave);
}

int main()
{
	FILE *fp;
	int sum = 0, i = 0;
	double ave;
	
	r_file(fp, &sum, &i);
	ave = average(sum, i);
	output(ave);
	
	return 0;
}

汚いソースでスミマセン(汗

たかぎ

Re:ファイルを用いた平均値の計算

#6

投稿記事 by たかぎ » 18年前

> /* ファイルを読み込む関数 */
> void r_file(FILE *fp, int *sum, int *i)

これはファイルを読み込む関数ではなく、ファイルから値を読み込んで合計と個数を返す関数ですよね。
要求されている仕様とは異なると思います。

> ave = sum / i;

これでは、小数点以下が失われてしまいます。

> printf("ファイル内の整数値の平均--> %5.2lf\n", ave);

C99でなければ、double型の書式指定は %lf ではなく %f です。
http://www.kijineko.co.jp/tech/supersti ... ouble.html

まずはこれぐらいにしておきましょう。

Re:ファイルを用いた平均値の計算

#7

投稿記事 by » 18年前

返信が遅れてしまいました、すみません;

>たかぎさん
ご返信ありがとうございますm(_ _)m
リンク先拝見させていただきました、お気に入りに追加させていただきました^^
/* ファイルから読み込んだ整数値の平均を求める */

#include<stdio.h>

/* ファイルから入力データを読み込む関数 */
void r_file(FILE *fp)
{
	fp = fopen("file02.txt", "r");
	fclose(fp);
}

/* ファイル内の整数値の平均を求める関数 */
double average(FILE *fp, int *sum, int *i)
{
	int n;
	double ave;
	while (fscanf(fp, "%d", &n) != EOF) {
		*sum = *sum + n;
		*i = *i + 1;
	}
	
	ave = (double)*sum / *i;
	
	return ave;
}

/* 結果を出力する関数 */
void output(double ave)
{
	printf("ファイル内の整数値の平均--> %5.2f\n", ave);
}

int main()
{
	FILE *fp;
	int sum = 0, i = 0;
	double ave;
	
	r_file(fp);
	ave = average(fp, &sum, &i);
	output(ave);
	
	return 0;
}
ご指示のあった箇所で今の自分に訂正できるものはしました。
ただコンパイルは通るのですが、実行時に何も表示されません。

r_file関数内で、
1.ファイルを読み込み用としてオープン
2.何かの処理
3.ファイルをクローズ

上のソースでは1と3しか書けておらず2がないのが原因だと思うのですが、どういった処理を記述すれば良いのか分かりません。そこについてアドバイスを頂けないでしょうか?
またソースで普通に使っていながら「fp = fopen("file02.txt", "r");」の記述で、fpに代入されているものがいまいち分かりません。
fpにオープンされたファイルの中身が代入されているのかなぁ…とあやふやに解釈している感じです。

説明が上手く出来ず、本当にごめんなさい…。

閉鎖

“C言語何でも質問掲示板” へ戻る