数値解析II課題1改訂版

どうやら問題の意味を取り違えてると先生から指摘が
あったので改良した。その改良したソースファイルがこちら。

#include<stdio.h>

int main(int argc, char *argv[])
{
	int i,data_number;
	double data_x[100],data_y[100];
	double heikin_x,heikin_y;
	double varius_x,varius_y;
	double varius_xy;
	FILE *ifp,*ofp;

	/* 各種値の初期化 */
	double sum_x=0,sum_y=0;
	double sum_valx=0,sum_valy=0;
	double sum_valxy=0;

	if(argc<3){
		printf(">>> too few parameter <<<\n");
		return (-1);
	}
	if((ifp=fopen(argv[2],"r"))==NULL){
		printf(">>> read open error <<<\n");
		return (-1);
	}
	
	/* 数値を読み出し、それをdata_numberとする。*/
	sscanf(argv[1],"%d",&data_number);

	for(i=0;i<data_number;i++){
		fscanf(ifp,"%lf",&data_x[i]);
		fscanf(ifp,"%lf",&data_y[i]);
	}
	fclose(ifp);

	/* 平均、分散、共分散 を求める。*/
	
	/* xとyの平均を求める。 */
	for(i=0;i<data_number;i++){
		sum_x+=data_x[i];
		sum_y+=data_y[i];
	}
	heikin_x=sum_x/data_number;
	heikin_y=sum_y/data_number;

	/* xとyの分散を求める。*/
	for(i=0;i<data_number;i++){
		sum_valx+=(data_x[i]-heikin_x)*(data_x[i]-heikin_x);
		sum_valy+=(data_y[i]-heikin_y)*(data_y[i]-heikin_y);
	}
	varius_x=sum_valx/(data_number-1);
	varius_y=sum_valy/(data_number-1);
	
	/* 共分散を求める。*/
	for(i=0;i<data_number;i++){
		sum_valxy+=(data_x[i]-heikin_x)*(data_y[i]-heikin_y);
	}
	varius_xy=sum_valxy/(data_number-1);
	
	/* 各計測値を出力する。*/
	if((ofp=fopen("odata.txt","w"))==NULL){
		printf(">>> write open error <<<\n");
		return(-1);
	}
	fprintf(ofp,"xの平均は %6.2lf\n",heikin_x);
	fprintf(ofp,"xの分散は %6.2lf\n",varius_x);
	fprintf(ofp,"yの平均は %6.2lf\n",heikin_y);
	fprintf(ofp,"yの分散は %6.2lf\n",varius_y);
	fprintf(ofp,"xとyの共分散は %6.2lf\n",varius_xy);
	fclose(ofp);
}

・使い方
コマンドプロンプトを開いてソースファイルとデータファイルがある
ディレクトリまで移動する。そして、コマンド上に
work1 100 in01.datを入力する。
ここで100とはデータの数であり、in01.datはデータファイルである。
これを実行すると、データファイル内の平均、分散、共分散が求まる。