• ベストアンサー

C言語 ?のついた処理内容

C言語初心者です。 FFTの勉強をしようと先人の作ったC言語プログラムを 参考に処理内容を勉強中ですが、以下の文が どのような処理を行っているのか理解できません。 ご存知の方たいへんおてすうですが、処理内容を ご教授をお願いします。 よろしくお願いします。  w = (flag? M_PI: -M_PI) / (double)n;

質問者が選んだベストアンサー

  • ベストアンサー
  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.2

if(flag)  w = M_PI / (double)n; else  w = -M_PI / (double)n; これと同じ意味です。

matidarian
質問者

お礼

お返事が遅くなって大変申し訳ありません。 大変参考になりました。 ありがとうございます。 今後もしまた不明な点がありましたらまた よろしくお願いします。

その他の回答 (1)

回答No.1

三項演算子 http://www1.cts.ne.jp/~clab/hsample/Flow/Flow07.html キャスト演算子 http://www.cppdrive.jp/cstart/ope/index8.html この辺りが手掛かりとなります。

matidarian
質問者

お礼

お返事が遅くなりまして大変申し訳ありません。 大変参考になるサイトを紹介いただきまして ありがとうございました。 今後もまたよろしくお願いします。

関連するQ&A

  • C言語

    ストップウォッチの一時停止の機能をもつプログラムを作成しているのですが、上手く動作しません。 (一時停止し、再開してもその状態から再開できない状態) #include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <conio.h> #pragma comment(lib, "winmm.lib") int main(void) { int command;//キーボード入力の文字判別用変数 int quit_flag = 1;//プログラム終了フラグ 0で停止 int c_flag = 0;//カウント状態取得用フラグ 1:カウント中,0:停止中 int h,m,s,ms;//左から,時間,分,秒,ミリ秒 int b,c,d,e; int a; int f,g,i; DWORD start,cur; printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n"); printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n"); printf("使い方:qでプログラム終了\n\n"); printf("使い方:tを押すと一時停止.一時停止中,tで計測再開\n"); h=m=s=ms=0; b=c=d=e=0; while(quit_flag != 0)//quit_flagが0以外ならループ { while(!_kbhit())//何かキーが押されるまでループ { if(c_flag != 0)//c_flagが0以外であればカウント中ということ. { h=m=s=ms = timeGetTime() - start; b=h/3600000; c=(m/60000)%60; d=(s/1000)%60; e=ms%1000; cur=timeGetTime(); ms=(cur-g); f=ms; } printf("%02d:%02d:%02d:%03d\r",b,c,d,e); } command=_getch();//ループを抜けるために押されたキーの内容をcommandに代入. if(command=='s' && c_flag == 0) { printf("\n計測開始\n"); c_flag = 1; start = timeGetTime() ; h=m=s=ms=0; } else if(command=='t' && c_flag != 0) { printf("\n一時停止\n"); c_flag = 0; a=c_flag; //計測開始時にtを押すとバグが発生するため } else if(command=='t' && a==0) { printf("\n計測再開\n"); c_flag = 1; f=timeGetTime(); } else if(command=='s') { printf("\n計測中止\n"); c_flag = 0; } else if(command=='r') { printf("\nカウンタリセット,停止\n"); c_flag = 0; h=m=s=ms=0; } else if(command=='q') { printf("\n終了\n"); quit_flag = 0; } else if(command=='l' && c_flag==1) { c_flag=0; printf("\nラップ\n"); printf("%02d:%02d:%02d:%03d\n",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000); c_flag=1; } } return 0; } 差分をとれば良いと聞いたのですが、どのようにとれば良いか全く分からなくて困っています。 ソースコードを修正または適宣追加をしてくだされば幸いです。

  • C言語

    ストップウォッチの一時停止の機能およびラップ機能をもつプログラムを作成しているのですが、上手く動作しません。 (一時停止し、再開してもその状態から再開できない状態) (ラップのほうはスピリットで出力されてしまう) #include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <conio.h> #pragma comment(lib, "winmm.lib") int main(void) { int command;//キーボード入力の文字判別用変数 int quit_flag = 1;//プログラム終了フラグ 0で停止 int c_flag = 0;//カウント状態取得用フラグ 1:カウント中,0:停止中 int h,m,s,ms;//左から,時間,分,秒,ミリ秒 int b,c,d,e; int a; int f,g,i; DWORD start,cur; printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n"); printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n"); printf("使い方:qでプログラム終了\n\n"); printf("使い方:tを押すと一時停止.一時停止中,tで計測再開\n"); printf("使い方:lを押すとラップをとる.\n"); h=m=s=ms=0; b=c=d=e=0; while(quit_flag != 0)//quit_flagが0以外ならループ { while(!_kbhit())//何かキーが押されるまでループ { if(c_flag != 0)//c_flagが0以外であればカウント中ということ. { h=m=s=ms = timeGetTime() - start; b=h/3600000; c=(m/60000)%60; d=(s/1000)%60; e=ms%1000; cur=timeGetTime(); ms=(cur-g); f=ms; } printf("%02d:%02d:%02d:%03d\r",b,c,d,e); } command=_getch();//ループを抜けるために押されたキーの内容をcommandに代入. if(command=='s' && c_flag == 0) { printf("\n計測開始\n"); c_flag = 1; start = timeGetTime() ; h=m=s=ms=0; } else if(command=='t' && c_flag != 0) { printf("\n一時停止\n"); c_flag = 0; a=c_flag; //計測開始時にtを押すとバグが発生するため } else if(command=='t' && a==0) { printf("\n計測再開\n"); c_flag = 1; f=timeGetTime(); } else if(command=='s') { printf("\n計測中止\n"); c_flag = 0; } else if(command=='r') { printf("\nカウンタリセット,停止\n"); c_flag = 0; h=m=s=ms=0; } else if(command=='q') { printf("\n終了\n"); quit_flag = 0; } else if(command=='l' && c_flag==1) { c_flag=0; printf("\nラップ\n"); printf("%02d:%02d:%02d:%03d\n",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000); c_flag=1; } } return 0; } 差分をとれば良いと聞いたのですが、どのようにとれば良いか全く分からなくて困っています。 上記のソースコードを基に適宣追加をしてくだされば幸いです。

  • C言語 質問です。

    以下のソースで半径、円周、面積を求めるものです。 #include <stdio.h> int main(void) { double radius; double pi = 3.1415926; double circumference; double area; printf("円の半径を入力してください。\n"); scanf("%f", &radius); circumference = radius * 2 * pi; area = radius * pi; printf("半径 = %f\n", radius); printf("円周 = %f\n", circumference); printf("面積 = %f\n", area); printf("\n\n"); return 0; } 半径(radius)をint型で、scanf("%d", radius); printf("半径 = %d\n", radius); では、うまく計算出来るのですが、double型ではだめなようです。 scanfを使用しなうで、 double radius = 10;とすると%fでも計算してくれるのですが、なぜでしょうか? C言語初心者です。よろしくお願いいたします。

  • C言語によるチェビシェフ窓の計算について

    現在、C言語でチェビシェフ窓を計算することを考えてます。 一応、エラーもなく実行できるのですが、中央の値が1になりません。 これで正しいのかどうかもわからないので、どなたか教えていただけないでしょうか。 よろしくお願いいたします。 ///////////////////以下 プログラム ///////////////// #include <stdio.h> #include <math.h> /** * 逆双曲余弦関数の定義 */ double Acosh(double x); /** *チェビシェフ関数の定義 * n:関数の次数 */ double Chev(int n, double x); void main(void) { int i, N=128, k, M=(int)floor((N-1)/2); ///data:入力 w:出力(ウィンドウ係数) ii ,kk インデックスの倍精度型, nn サンプル数の倍精度型 double data[128], w[128], ii, kk, nn; // s :メインローブ対サイドローブの比 double t0, s, u, sum; ////円周率の定義 const double pi=3.1415926; nn=(double)N, s=1000.0; //入力をすべて1に初期化 for(i=0;i<N;i++){data[i]=1.0;} /////チェビシェフ窓の計算ルーチンと出力 t0=cosh((1.0/(nn-1))*Acosh(s)); for(i=0;i<N;i++){ ii=(double)i; for(k=1;k<=M;k++){ kk=(double)k; u=ii-(nn-1)/2.0; if(k==1){ sum=Chev(N-1,t0*cos(kk*pi/nn))*cos(2.0*pi*kk*u/nn); }else{ sum+=Chev(N-1,t0*cos(kk*pi/nn))*cos(2.0*pi*kk*u/nn); } } w[i]=data[i]*(s+2.0*sum)/nn; printf("w[%d]=%4.3f\n",i,w[i]); } } double Acosh(double x) { double x2=x*x; return log(x+sqrt(x2-1)); } double Chev(int n, double x) { if(fabs(x)<=1){ return cos((double)n*acos(x)); }else{ return cosh((double)n*Acosh(x)); } } /////////////// ここまで /////////////////// //////////////////以下出力結果///////////// w[0]=0.628 w[1]=0.285 w[2]=0.348 w[3]=0.419 w[4]=0.499 w[5]=0.588 w[6]=0.686 w[7]=0.795 w[8]=0.914 w[9]=1.044 [中略] w[50]=14.268 w[51]=14.559 w[52]=14.832 w[53]=15.085 w[54]=15.320 w[55]=15.533 w[56]=15.725 w[57]=15.895 w[58]=16.041 w[59]=16.164 w[60]=16.264 w[61]=16.338 w[62]=16.388 w[63]=16.413<-中央値 w[64]=16.413<-中央値 w[65]=16.388 [中略] w[121]=0.686 w[122]=0.588 w[123]=0.499 w[124]=0.419 w[125]=0.348 w[126]=0.285 w[127]=0.628

  • FFTをc言語でプログラミング

    助けてください↓c言語でFFTをプログラミングしているのですがバグが発見できずに困り果て居ます。 プログラミングは以下の通りです。画像はカラーではなく、グレースケールのMANDRILLに対して行っています。 for(n=0;n<M;n++){    for(i=0;i<N;i++){ for(j=0;j<N;j++){ Imbatx[n][i][j]=0; } } } //行FFT //まずはソート for(i=0;i<N;i++){ int x=1; for(j=0;j<N;j++){ if(j<N/2){        //左半分 if(j%2!=0) //jが奇数 batx[0][i][j]=imagein[i][j+N/2-1]; if(j%2==0) //jが偶数 batx[0][i][j]=imagein[i][j]; } if(N/2<=j && j<N){ //右半分 if(j%2!=0) //jが奇数 batx[0][i][j]=imagein[i][x+N/2-1];      if(j%2==0) //jが偶数 batx[0][i][j]=imagein[i][x]; x++; } } } for(i=0;i<N;i++){ for(n=1;n<M+1;n++){ k=0; for(j=0;j<N;j++){ mul=(int)pow(2.0,(double)n); if(j%mul < mul/2){ //偶数列 batx[n][i][j] = batx[n-1][i][j]+cos(2*PI*k/mul)*batx[n-1][i][j+mul/2]- sin(2*PI*k/mul)*Imbatx[n-1][i][j+mul/2]; Imbatx[n][i][j]=Imbatx[n-1][i][j]+sin(2*PI*k/mul)*batx[n-1][i][j+mul/2]+ cos(2*PI*k/mul)*Imbatx[n-1][i][j+mul/2]; k++; } else{ //奇数列 batx[n][i][j] = cos(2*PI*k/mul)*batx[n-1][i][j] + batx[n-1][i][j-mul/2]- sin(2*PI*k/mul)*Imbatx[n-1][i][j]; Imbatx[n][i][j]=Imbatx[n-1][i][j-mul/2]+sin(2*PI*k/mul)*batx[n-1][i][j]+cos(2*PI*k/mul)*Imbatx[n-1][i][j]; k++; } Re_countx[i][j] = batx[M][i][j]; Im_countx[i][j] = Imbatx[M][i][j]; } } } for(i=0;i<N;i++){ for(j=0;j<N;j++){ FFT[i][j]=pow(pow(Re_countx[i][j],2)+pow(Im_countx[i][j],2),0.5); FFT[i][j]=log10(FFT[i][j]); if(FFT[i][j]>max) max=FFT[i][j]; imageout[i][j]=(unsigned char)255*FFT[i][j]/max; } } 結果的に出力される画像は以下の画像になります。 ごらんのように縞模様が出てしまいます。 分かる方どうかお願いいたします。

  • 式をC言語で立てれません

    式をC言語で立てれません 式をC 言語で立てれません こんにちは。私は今実験で円板振動子の中心軸上の音圧分布を求めています。 そこで写真のような図をプロットするために与えられた式をC言語で書いています。 式の詳細は P/2ρcV = |sinπ(√(r/λ)^2 + (a/λ)^2)(√はここまで)-(r/λ))| です。 しかしうまくプロットできません。 プログラムは ------------------------------------- #include <stdio.h> #include <math.h> #define F 120 //周波数(Hz) #define C 1500 //音速(m/s) #define A 0.2 // 半径(m) int main() { double x, m, s, p, o, w, l; int i; for (i=0; i<100; i++) { x= (double)i; //観測点までの距離を表しました。距離が変化することで音圧が変わるためです。 l = C/F; //λをlとして音速÷周波数で定義できます。 m = x/l; //x軸です。 o = m*m + (A/l)*(A/l); //式のsinの中身です。 s = sin(M_PI*(sqrt (o) - m)); //sin全体を定義します。 w = fabs(s); //sin全体を絶対値に置き換えます。 p = w; //新しい変数に入れます。 printf("%9.9f %9.9f\n", m, p); } return 0; } ------------------------------ といった感じです。先生からはx軸のプログラムだけいじれば勝手に y軸も出てくるとヒントを頂いているのでx軸についてのプログラムを 書いています。コンパイルはできても写真のようにいきません。 半径やλや周波数はa/λ=2.5と書いてあったので値は推測です。 C言語はあまり得意ではないので困っています。 お分かりになる方、ご教授お願い致します。 ※式が間違っていたので新しく質問します。

  • C言語に関する質問

    初期位置を1mとして、ある物体の自由落下をシミュレートするプログラムを 「高さ=1-1/2×重力加速度×経過時間の二乗」 という考え方を 「初期位置を1m,落下速度を「重力加速度×1ループにかかる時間」とし, 高さを,「1ループ前の高さ」+「落下速度×1ループにかかる時間」」という考え方に変更して計算するようなプログラムにしたいのですが、どのように変えれば分かりません。(というか意味が分からないです) 何か公式などのヒントやソースコードより、どの部分をこのように変えれば良いという指摘があれば分かりやすく教えてください。 #include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <conio.h> #pragma comment(lib, "winmm.lib") int main(void) { int command;//キーボード入力の文字判別用変数 int quit_flag = 1;//プログラム終了フラグ 0で停止 int c_flag = 0;//カウント状態取得用フラグ 1:カウント中,0:停止中 int h,m,s,ms;//左から,時間,分,秒,ミリ秒 double y=1; DWORD start; printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n"); printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n"); printf("使い方:qでプログラム終了\n\n"); h=m=s=ms=0; while(quit_flag != 0)//quit_flagが0以外ならループ { while(!_kbhit())//何かキーが押されるまでループ { if(c_flag != 0)//c_flagが0以外であればカウント中ということ. { h=m=s=ms = timeGetTime() - start; y=1-(1.0/2.0)*(9.8/1000000)*ms*ms; printf("t=%d[ms],y=%f[m]\r",ms,y); //printf("t=%02d:%02d:%02d:%03d,y=%f[m]\r",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000,y); } //printf("%02d:%02d:%02d:%03d\r",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000); if(c_flag==0){ printf("t=%d[ms],y=%f[m]\r",ms,y); //printf("t=%02d:%02d:%02d:%03d,y=%f[m]\r",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000,y); } } command=_getch();//ループを抜けるために押されたキーの内容をcommandに代入. if(command=='s' && c_flag == 0) { printf("\n計測開始\n"); c_flag = 1; start = timeGetTime() ; h=m=s=ms=0; /* if(y==0){ printf("\n終了\n"); quit_flag = 0; } */ } else if(command=='s') { printf("\n計測中止\n"); c_flag = 0; } else if(command=='r') { printf("\nカウンタリセット,停止\n"); c_flag = 0; h=m=s=ms=0; } else if(command=='q') { printf("\n終了\n"); quit_flag = 0; } } return 0; }

  • C言語の配列:「*(w+a)=・・・」という表記について

    C言語の配列:「*(w+a)=・・・」という表記について こんにちは。参考書に載っているプログラムで用いられている関数の一部が分からなかったので質問させていただきました。以下抜粋です。 wgtinit(w,sl,inival,flag) double w[],inval; int sl,flag; { int i; double drand48(); i=0; while(i<sl){if(flag==0) *(w+i)=inval*(drand48()-0.5)*2.0; else *(w+i)=inval*drand48(); i++} return(0);} この関数に出てくる「*(w+i)=」という表記の意味がわかりません。 wが配列でiが整数なのでw[0]、w[1]、w[2]・・・と値を格納しているのではないかと思うのですが、「*」のついた配列の表記なんて見たことがないので自信がありません。あっていますでしょうか? この表記の仕方は「c言語」じゃなくて、「c++」や「c♯」だったりするのですか? ご教授お願いします。 ちなみにdrand48()というのは乱数です。

  • 式をC言語で立てれません

    式をC言語で立てれません こんにちは。私は今実験で円板振動子の中心軸上の音圧分布を求めています。 そこで写真のような図をプロットするために与えられた式をC言語で書いています。 式の詳細は P/2ρcV = |sinπ(√(r/λ)^2 + (a/λ)^2)(√はここまで)-(r/λ)^2)| です。 しかしうまくプロットできません。 プログラムは ------------------------------------- #include <stdio.h> #include <math.h> #define F 120 //周波数(Hz) #define C 1500 //音速(m/s) #define A 0.2 // 半径(m) int main() { double x, m, s, p, o, w, l; int i; for (i=0; i<100; i++) { x= (double)i; //観測点までの距離を表しました。距離が変化することで音圧が変わるためです。 l = C/F; //λをlとして音速÷周波数で定義できます。 m = x/l; //x軸です。 o = m*m + (A/l)*(A/l); //式のsinの中身です。 s = sin(M_PI*(sqrt (o) - m)); //sin全体を定義します。 w = fabs(s); //sin全体を絶対値に置き換えます。 p = w; //新しい変数に入れます。 printf("%9.9f %9.9f\n", m, p); } return 0; } ------------------------------ といった感じです。先生からはx軸のプログラムだけいじれば勝手に y軸も出てくるとヒントを頂いているのでx軸についてのプログラムを 書いています。コンパイルはできても写真のようにいきません。 半径やλや周波数はa/λ=2.5と書いてあったので値は推測です。 C言語はあまり得意ではないので困っています。 お分かりになる方、ご教授お願い致します。

  • 至急で、C言語の問題で解答解説お願いします。

    1実数を3つ(a,b,c)を読み込み3辺とする三角形ができるか判定(d(d-a)(d-b)(d-c)>0のとき三角形となる)しできなければ、三角形ではありません!というメッセージを表示し、できる場合は以下のヘロンの公式を用いて三角形の面積を求めるプログラムをC言語で答えてください。d=(a+b+c)/2 s=√{d(d-a)(d-b)(d-c) 2maxの整数値(≧1)をキーボードから入力し、その値に対応した図形を出力するプログラムをC言語で答えてください。 例 max1 max2 max3 * ** *** * ** *** * ** *** ** *** *** 3整数nをキーボード入力しnの値に応じて以下の図形を表示するプログラムをc言語で答えてください。 n=3 n=4 n=5 3 4 5 45 56 67 678 789 890 0123 1234 56789 4整数n(≧0)を入力し歯科の計算を実行するC言語プログラムを答えてください。2つの自然数nとmを読み込みn個の中からm個を取り出すときの組み合わせの数を計算せよ。ただし、n!を計算する関数long fact (int n)を定義し必ずそれを用いること。 5 1つのscanfで2つの10進数を入力し8進数と16進数で表示するプログラムをC言語で答えてください。 6 実数aを入力し少数第1位で四捨五入する関数g(a)をマクロ定義で入力した値の少数第1位を四捨五入して出力するプログラムをC言語で答えてください。 7 4つの実数w,x,y,zを読み込みその最大値を出力するプログラムをC言語で答えてください。ただし、2つの実数の大きいほうを求める関数 double my may (double x,double y)を定義し、その関数を用い、if文を用いないでc言語で答えてください。

専門家に質問してみよう