• 締切済み

高速フーリエ変換に関すること

皆様、こんばんわ。 今日は、お聞きしたいことが会ってここに質問しにきました。 まず、こちらを見てください。 これは、「毎回異なる計算結果を、順次足していく」、 そのための練習用プログラムです。 #include<stdio.h> int main(void){ int i,j; int z[3]={0}; int a[5]={1,2,3,4,5}; int b[5]={5,4,3,2,1}; for(i=0;i<3;i++){ for(j=0;j<5;j++) Z[i] += a[j]*b[j]; if (i==1) z[i]=z[1] else (i>1) z[i]+z[i-1] } printf("a = {%d,%d,%d,%d,%d}\n",a[0],a[1],a[2],a[3],a[4]); printf("b = {%d,%d,%d,%d,%d}\n",b[0],b[1],b[2],b[3],b[4]); for(i=0;i<3;i++) printf("z[%d] = %d\n",i,z[i]); return(0); } 流れとしては、 (1)2つの配列の各要素の積の計算をする。 (2)そして、計算して出た積(全部で5つ)を足す。 (3) (1)~(2)の計算を繰り替えす。 (但し、1回目以降は前回の計算結果を足す) そして最終的に、 a[5] = {1,2,3,4,5} b[5] = {5,4,3,2,1} Z1 = 35 Z2 = 70 Z3 = 105 という結果を出力したいんです。 ですが、どうしてもエラーが起きて実行できません。 たぶんですが、if-else文の辺りが違うと思うのですが・・・。 どういう風に変更したらいいのでしょうか? ちなみに使っているコンパイラVidualC++2008です。 OSはVistaです。

みんなの回答

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.5

#include<stdio.h> int main(void){ int i,j; int z[3]={0}; int a[5]={1,2,3,4,5}; int b[5]={5,4,3,2,1}; for(i=0;i<3;i++){ for(j=0;j<5;j++) z[i] += a[j]*b[j]; if(i>0) z[i]+=z[i-1]; } printf("a = \ {%d,%d,%d,%d,%d}\n",a[0],a[1],a[2],a[3],a[4]); printf("b = \ {%d,%d,%d,%d,%d}\n",b[0],b[1],b[2],b[3],b[4]); for(i=0;i<3;i++) printf("z[%d] = %d\n",i,z[i]); return(0); }

arubaaruba
質問者

お礼

こ、こんなあっさりできるんですね@@; 自分はもっと複雑になるんだとばっかり思ってました。 次からは、もっと簡潔にできるようにします!

  • u-bot
  • ベストアンサー率58% (1736/2988)
回答No.4

int z[3]={0}; は問題無し。Z配列は全て初期化される。 エラー発生箇所が判れば回答がつけやすいと思う。 気になるのはここかな? if (i==1) z[i]=z[1]   ← ;が無い。なぜ1なのか? else (i>1)   ← 条件文をつけるならifが必要 z[i]+z[i-1]   ← 加算しても代入する変数が指定されていない } の部分を if (i==0) z[i]=z[0]; else if(i>0)  ← 単にelseだけでも可 z[i]+=z[i-1]; } とすれば少しはましになるかな? 申し訳ありませんが高速フーリエ変換のアルゴリズムを知らずにソースだけ見て回答しています。 少しでも参考になれば幸いです。

arubaaruba
質問者

お礼

あああああ、:は忘れてました! z[1]になってるのは、友達にそこはそうなんだよって教えられたからなんですが、違ったんですねw そっか、+=っていうのがありましたねw

回答No.3

>>int z[3]={0}; >これでは、z[0]しか初期化されていないので、z[1]、z[2]には不定値が入っている。  これは、違う。  

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.2

>「エラーが起きて実行できません」というくらいなら, そのエラーメッセージを出してもいいと思うんだがなぁ. 同意です。 で、気になったところ。 >int z[3]={0}; これでは、z[0]しか初期化されていないので、z[1]、z[2]には不定値が入っている。 なので、 >Z[i] += a[j]*b[j]; /*なぜZが大文字?*/ Zは小文字でしょう。 また、小文字としても、z[0]以外には不定値が入っていることになる。 -----> if (i==1) z[i]=z[1] else (i>1) z[i]+z[i-1] } <----- iが1のとき、 z[i]=z[1] は、同じところに同じ値を代入しているので無意味。 iが2のとき、 z[i]+z[i-1] は何にも代入していないので無意味。

arubaaruba
質問者

お礼

Zが大文字なのは、打ち間違えたからですw

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「エラーが起きて実行できません」というくらいなら, そのエラーメッセージを出してもいいと思うんだがなぁ.

関連するQ&A