大学生です
相関係数と呼ばれるものを計算するプログラムを作りました。
しかし、このプログラムになんどもファイルを通して計算したいのですが自分の力ではいまいち解決方法が
みあたらないのとプログラム能力が低くて困っています
やりたいこと
シェルスクリプト?を使えば処理を早くできるみたいですがいまいちわからなくてCプログラムの中でうまくできないかと
./soukan data1.txt data2.txt
./soukan data1.txt data3.txt
・・・・
とやっていくので今のプログラムだと大変過ぎまして・・・
困っている点
コードの赤文字の所を書き換えるとXの総和計算がおかしくなってしまいます・・・
どのように間違っているのか教えていただけたらと・・・
現プログラムであれば
./soukanで実行し
ファイルを入力という手間が激しく、data1と入力するのもかなりの手間です・・・・
総当たりの組み合わせでファイルがたくさんあるのでとても手動では・・・
dataファイルの中身は
1
2
2
1
のように数字が改行されて入っているファイルが100個ほどあります
ファイル1の配列の中身をx[n]にファイル2の中身をy[n]に入れたいのですけれどいまいちうまく生かしきれている気がしません・・・
環境 linux
言語はcしか使えません。。。
ファイルのソースコードです
//相関係数を求めるファイル名片一方固定
//gcc -o soukan soukan.c -lm
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main(void){
char filename[100];
char filename2[100];
FILE *fp;
int i,n,m,t;
int *ip;
double sumx,avex,bunux,bunx,kyoubunx;
double sumy,avey,bunuy,buny,kyoubuny;
double kyoubunxy,soukan;
double x[n];
double y[n];
char s[100];
float f1,f2;
printf("ファイル名を入力してください");
scanf("%s",filename);
fp=fopen(filename,"r");
if(fp==NULL){
printf("ファイルがありません\n");
return 0;
}
for(n=0;n<20;n++){
fscanf(fp,"%lf",&(x[n]));
}
fclose(fp);
[color=#FF0000] //このコメント3行と下の一行を変えるとXの総和の計算がおかしくなってしまいます・・・ [/color]
//printf("2つめのファイル名を入力してください");
//scanf("%s",filename2);
//fp=fopen(filename2,"r");
fp=fopen("test2.txt","r");
if(fp==NULL){
printf("ファイルがありません\n");
return 0;
}
for(n=0;n<20;n++){
fscanf(fp,"%lf",&(y[n]));
}
fclose(fp);
sumx=0.0;//Xの総和をもとめる
for(i=0;i<n;i++){
sumx+=x[i];
}
avex=0.0;//Xの平均をもとめる
avex=sumx/i;
bunx=0.0;//Xの分散をもとめる
bunux=0.0;
for(i=0;i<n;i++){
bunux+=(x[i]-avex)*(x[i]-avex);
}
bunx=bunux/i;
sumy=0.0;//Yの総和をもとめる
for(i=0;i<n;i++){
sumy+=y[i];
}
avey=0.0;//Yの平均をもとめる
avey=sumy/i;
buny=0.0;//Yの分散をもとめる
bunuy=0.0;
for(i=0;i<n;i++){
bunuy+=(y[i]-avey)*(y[i]-avey);
}
buny=bunuy/i;
kyoubunxy=0.0; //共分散を求める
for(i=0;i<n;i++){
kyoubunxy+=(x[i]-avex)*(y[i]-avex);
}
kyoubunxy=kyoubunxy/i;
soukan=0.0;//相関係数をもとめる
soukan=kyoubunxy/(sqrt(bunx)*sqrt(buny));
printf("X合計=%f\n",sumx);
printf("X平均=%f\n",avex);
printf("X分散=%f\n",sqrt(bunx));//根号をとった
printf("Y合計=%f\n",sumy);
printf("Y平均=%f\n",avey);
printf("Y分散=%f\n",sqrt(buny));//根号をとった
printf("共分散=%f\n",kyoubunxy);
printf("相関係数=%f\n",soukan);
return 0;
}