このxって何ですか?

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

このxって何ですか?

#1

投稿記事 by 亜矢 » 10年前

このプログラムで引数に用いられている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);
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: このxって何ですか?

#2

投稿記事 by softya(ソフト屋) » 10年前

関数が呼び出された時にローカル変数がその場で宣言されて、呼び元の変数の内容が代入されてくると考えればよいかと。
codeタグを使ってくださいね。

【追記】
呼び元の定数も代入されると加えておきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: このxって何ですか?

#3

投稿記事 by beatle » 10年前

まず、ソースコードを貼り付けるときはcodeタグをお使いください チェック2 : ソースコードをそのまま貼り付けない

さて、引数xは4つも有るわけですが、どのことでしょうか。

例えば double SSTACC_NormalDist(double x); について。
この関数は何処からも呼び出されていないようです。すなわち引数はどこからも渡されません。

次は double SSTACC_ErrorFunc(double x); について。
この関数は一箇所から呼び出されています。

コード:

printf("%lf\n",SSTACC_ErrorFunc(0));
これを見ると、仮引数xには実引数0が渡されます。
softyaさん的言い方で言えば、SSTACC_ErrorFunc関数が呼び出された瞬間に、SSTACC_ErrorFunc関数内でローカル変数xが宣言され、整数の0が代入されます。

漠然とした質問でしたがそれなりに答えてみました。
役に立てばいいのですが。

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: このxって何ですか?

#4

投稿記事 by naohiro19 » 10年前

どこのxを指しているのか説明がありません。

閉鎖

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