このプログラムで引数に用いられているxがどこから来るxなのか分かりません。漠然とした質問で申し訳ないのですが、分かる方は教えてください。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define PI 3.1415926535897932384626433832795
void Read_Gauss_Table(void);
double SSTACC_NormalDist(double x);
double SSTACC_ErrorFunc(double x);
double tableread_yjiku(int x);
double tableread_S(int x);
struct ERROR_TABLE{ /* ガウステーブル読み込み用 */
double yjiku[502];
double S[502];
}GAUSS_TABLE;
double SSTACC_NormalDist(double x){
double tmp;
tmp = (1/sqrt(2*PI))*exp(-x*x/2);
if(tmp<0.000001) {/*printf("%.16f\n",tmp);*/tmp=0;}
return(tmp);
}
double SSTACC_ErrorFunc(double x){
double kai,amari,takasa,moto;
double xone,xtwo,yone,ytwo;
double newx,y,S;
int i,kiri;
newx=x;
if(newx<5 && newx>-5){
/*負の場合の処理*/
moto=newx;
if(newx<0){
newx=-newx;
}
kiri=newx/0.01;
takasa=newx-kiri*0.01;
/*x1,x2,y1,y2の決定*/
xone=kiri*0.01;
xtwo=(kiri+1)*0.01;
yone=tableread_yjiku(kiri);
ytwo=tableread_yjiku(kiri+1);
/*yの決定*/
y=(ytwo-yone)*(newx-xone)/(xtwo-xone)+yone;
/*余りの面積*/
amari=(yone+y)*takasa/2;
/*正と負の場合分け*/
S=tableread_S(kiri);
if(moto>=0){
kai=0.5+S+amari;
}else{
kai=0.5-S-amari;
}
}else if(newx>=5){
kai=1.0000000000000000;
}else if(newx<=-5){
kai=0.0000000000000000;
}
return(kai);
}
double tableread_yjiku(int x){
int kiri;
double ans;
kiri=x;
ans=GAUSS_TABLE.yjiku[kiri];
return(ans);
}
double tableread_S(int x){
int kiri;
double ans;
kiri=x;
ans=GAUSS_TABLE.S[kiri];
return(ans);
}
void Read_Gauss_Table(void){
FILE *fp_data;
int i;
if((fp_data=fopen("data","rt"))==NULL){
fprintf(stderr,"err:ファイルが開けませんでした > data\n");
exit(1);
}
for(i=0;i<=501;i++){
fscanf(fp_data,"%lf %lf",&GAUSS_TABLE.yjiku,&GAUSS_TABLE.S
);
}
fclose(fp_data);
}
main(){
int i;
double a,tmp,tmpA,tmpB;
a=9;
printf("%lf\n",a=sqrt(a));
Read_Gauss_Table();
printf("%lf\n",SSTACC_ErrorFunc(0));
FILE *input_file_A;
FILE *input_file_B;
FILE *output_file;
if((input_file_A=fopen("jikken17.txt","rt"))==NULL){
fprintf(stderr,"err:ファイルが開けませんでした > sample_A.txt
\n");
exit(1);
}
if((input_file_B=fopen("data17.txt","rt"))==NULL){
fprintf(stderr,"err:ファイルが開けませんでした > sample_B.txt
\n");
exit(1);
}
if((output_file=fopen("result.txt","w"))==NULL){
fprintf(stderr,"err:ファイルが開けませんでした > result.txt\n");
exit(1);
}
int node_kazu_A;
int node_kazu_B;
fscanf(input_file_A,"%d",&node_kazu_A);
printf("%d\n",node_kazu_A);
fscanf(input_file_B,"%d",&node_kazu_B);
printf("%d\n",node_kazu_B);
struct node_data{
int num;
double mean;
double sigma;
}node_data_A[node_kazu_A+1],node_data_B[node_kazu_B],node_data_C
[node_kazu_B];
double node_cliticality[node_kazu_A];
for(i=0;i<=node_kazu_A;i++){
node_data_A.num=0;
node_data_A.mean=0;
node_data_A.sigma=0;
node_data_B.num=0;
node_data_B.mean=0;
node_data_B.sigma=0;
node_data_C.num=0;
node_data_C.mean=0;
node_data_C[i].sigma=0;
node_cliticality[i]=0;
}
node_data_A[node_kazu_A].num=0;
node_data_A[node_kazu_A].mean=100.494827;
node_data_A[node_kazu_A].sigma=0;
double Cov[9];
Cov[0]=0;
Cov[1]=0;
Cov[2]=7.833995814;
Cov[3]=8.182995211;
Cov[4]=12.56749534;
Cov[5]=8.949997;
Cov[6]=0;
Cov[7]=7.94999601;
Cov[8]=0;
printf("node_num mean sigma\tA\n");
for(i=0;i<node_kazu_A;i++){
fscanf(input_file_A,"%d%lf%lf",&node_data_A[i].num,&node_data_A
[i].mean,&node_data_A[i].sigma);
//fprintf(output_file,"%lf\n",a);
printf("%d\t%lf\t%lf\n",node_data_A[i].num,node_data_A
[i].mean,node_data_A[i].sigma);
}
printf("node_num mean sigma\tB\n");
for(i=0;i<node_kazu_B;i++){
fscanf(input_file_B,"%d%lf%lf",&node_data_B[i].num,&node_data_B
[i].mean,&node_data_B[i].sigma);
printf("%d\t%lf\t%lf\n",node_data_B[i].num,node_data_B
[i].mean,node_data_B[i].sigma);
}
printf("%lf\n",node_data_A[node_kazu_A].mean);
printf("\n");printf
("******************************************************************\n\n");
double alpha;
double beta;
for(i=0;i<node_kazu_A;i++){
node_data_C[i].sigma=sqrt(node_data_A[i].sigma*node_data_A
[i].sigma+node_data_B[i].sigma*node_data_B[i].sigma+Cov[i]);
//node_data_C[i].sigma=node_data_A[i].sigma+node_data_B[i].sigma;
node_data_C[i].mean=node_data_A[i].mean+node_data_B[i].mean;
printf("%\t%lf\t%lf\n",node_data_C[i].mean,node_data_C[i].sigma);
alpha=sqrt(node_data_C[i].sigma*node_data_C[i].sigma+node_data_A
[node_kazu_A].sigma*node_data_A[node_kazu_A].sigma);
tmpA=(node_data_C[i].mean+3*node_data_C[i].sigma)-(node_data_A
[node_kazu_A].mean);
printf("nodeC[%d].mean = %lf\tnodeC[%d].sigma = %lf
\n",i,node_data_C[i].mean,i,node_data_C[i].sigma);
// printf("nodeB[%d].mean = %lf\tnodeB[%d].sigma = %lf
\n",i,node_data_B[i].mean,i,node_data_B[i].sigma);
printf("nodeC[%d].mean+3sigma = %lf\n",i,node_data_C
[i].mean+3*node_data_C[i].sigma);
tmp=node_data_C[i].mean-node_data_A[node_kazu_A].mean;
// printf("node_data_C[%d].mean-node_data_A[%d].mean = %lf
\n",i,node_kazu_A,tmp);
// printf("alpha=%lf\t",alpha);
beta=tmp/alpha; //printf("beta=%lf\t",beta);
printf("node_data_C[%d].mean = %lf\tnode_data_A[%d].mean = %lf
\n",i,node_data_C[i].mean,node_kazu_A,node_data_A[node_kazu_A].mean);
printf("node_data_A[%d].sigma = %lf\tnode_data_B[%d].sigma = %lf
\n",i,node_data_C[i].sigma,node_kazu_A,node_data_A[node_kazu_A].sigma);
node_cliticality[i]=SSTACC_ErrorFunc(beta);
printf("node_cliticality[%d]\t%lf\n\n",i,node_cliticality[i]);
printf
("******************************************************************\n\n");
}
fclose(input_file_A);
fclose(input_file_B);
fclose(output_file);
}
このxって何ですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: このxって何ですか?
関数が呼び出された時にローカル変数がその場で宣言されて、呼び元の変数の内容が代入されてくると考えればよいかと。
codeタグを使ってくださいね。
【追記】
呼び元の定数も代入されると加えておきます。
codeタグを使ってくださいね。
【追記】
呼び元の定数も代入されると加えておきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: このxって何ですか?
まず、ソースコードを貼り付けるときはcodeタグをお使いください チェック2 : ソースコードをそのまま貼り付けない
さて、引数xは4つも有るわけですが、どのことでしょうか。
例えば double SSTACC_NormalDist(double x); について。
この関数は何処からも呼び出されていないようです。すなわち引数はどこからも渡されません。
次は double SSTACC_ErrorFunc(double x); について。
この関数は一箇所から呼び出されています。 これを見ると、仮引数xには実引数0が渡されます。
softyaさん的言い方で言えば、SSTACC_ErrorFunc関数が呼び出された瞬間に、SSTACC_ErrorFunc関数内でローカル変数xが宣言され、整数の0が代入されます。
漠然とした質問でしたがそれなりに答えてみました。
役に立てばいいのですが。
さて、引数xは4つも有るわけですが、どのことでしょうか。
例えば double SSTACC_NormalDist(double x); について。
この関数は何処からも呼び出されていないようです。すなわち引数はどこからも渡されません。
次は double SSTACC_ErrorFunc(double x); について。
この関数は一箇所から呼び出されています。 これを見ると、仮引数xには実引数0が渡されます。
softyaさん的言い方で言えば、SSTACC_ErrorFunc関数が呼び出された瞬間に、SSTACC_ErrorFunc関数内でローカル変数xが宣言され、整数の0が代入されます。
漠然とした質問でしたがそれなりに答えてみました。
役に立てばいいのですが。