第15回:これまでの復習 3 (1/19)

今回が最後の授業です.テストに備えて頑張りましょう.


第14回演習の解答例


以下の問題を30分以内で紙に書いて解きなさい.

あるクラスの生徒50人の身長(実数)が順に並んだファイルsincho.txtがある.
身長をファイルから配列に読み込み,クラスの生徒の平均身長を求め,各人の身長の平均身長からの差を,kekka.txtファイルに保存するプログラムを作成せよ.
ただし,下線を引いた部分はそれぞれ別の関数を定義すること.


解答例

#include <stdio.h>

void load(int n, float *d)
{
	int i;
	FILE *fp;
	
	fp = fopen("sincho.txt", "r");
	for(i=0;i<n;i++){
		fscanf(fp, "%f", &d[i]);
	}
	fclose(fp);
}

float average(int n, float *d)
{
	int i;
	float sum=0;
	
	for(i=0;i<n;i++){
		sum+=d[i];
	}
	
	return sum/n;
}

void save(int n, float *d, float ave)
{
	int i;
	FILE *fp;
	
	fp = fopen("kekka.txt", "w");
	for(i=0;i<n;i++){
		fprintf(fp, "%f\n", d[i]-ave);
	}
	fclose(fp);
}

void main()
{
	int n=50;
	float d[50], ave;

	load(n, d);
	ave = average(n, d);
	save(n, d, ave);
}

解答例2

#include <stdio.h>

void load(int n, float *d)
{
	int i;
	FILE *fp;
	
	fp = fopen("sincho.txt", "r");
	for(i=0;i<n;i++){
		fscanf(fp, "%f", (d+i));
	}
	fclose(fp);
}

float average(int n, float *d)
{
	int i;
	float sum=0;
	
	for(i=0;i<n;i++){
		sum+=*(d+i);
	}
	
	return sum/n;
}

void save(int n, float *d, float ave)
{
	int i;
	FILE *fp;
	
	fp = fopen("kekka.txt", "w");
	for(i=0;i<n;i++){
		fprintf(fp, "%f\n", *(d+i)-ave);
	}
	fclose(fp);
}

void main()
{
	int n=50;
	float d[50], ave;

	load(n, d);
	ave = average(n, d);
	save(n, d, ave);
}