dポイントプレゼントキャンペーン実施中!

10 REM dft
20 N=8
30 DIM A(N),B(N),X(N)
40 FOR I=0 TO N-1
50 READ X(1)
60 NEXT I
70 P=6.283/N
80 FOR K=0 TO N-1
90 A(K)=0:B(K)=0
100 FOR J=0 TO N-1
110 A(K) =A(K)+X(j)*COS(P*J*K)
120 B(K) =B(K)-X(J)*SIN(P*J*K)
130 NEXT J
140 NEXT K
150 FOR I=0 TO N-1
160 Y=SQL(A(I)^2+B(I)^2)
170 LPRINT I;:LPRINT USING "###,###";A(I),B(I),Y
180 NEXT I
190 DATA 1,1,1,1,0,0,0,0

このDFTプログラムをC言語に直したいのですがよく分かりません;
お願いします@@;

A 回答 (1件)

ずいぶん懐かしい言語で書かれたソースですね


この言語は、BASICですよ
BASICといってもVisual Basicでは、ありません
VB以前のBASICで、N88-BASICや、BASIC/98とかにあたります

さて、プログラムの内容ですが、だいたい、以下の内容になっています
先頭にある数字は、行番号なので、それを手がかりに参考にしてください

 10は、コメントです
 20~30は、定数と、配列を宣言してます
 40~60は、190にある元データを配列Xに代入しています
 70~140は、フーリエ変換の本体部分です
 150~190は、出力部分です(LPRINTなので、プリンタに出力しているかも)

C/C++に直すと以下のようになります
なお、注意点としては、
 ・純粋なC言語にすると、元のソースとの対応が混乱しそうなので、C++にしています。
 ・LPRINT文は、プリンタ出力を行うのですが、今回は、標準出力にしています。
 ・コンパイルおよび、実行は行っていません。細かいところで誤りがあるかも知れません。
です。ご容赦ください。

/* dft */
#include <cstdio>
#include <cmath>

using namespace std;

int main(void)
{
  // 20~30の内容をC/C++で書くと
  int N = 8;// 定数なので、#defineにしたほうが良いかも
  double A(N), B(N), X(N);

  // 40~60、190の内容をC/C++で書くと
  X(0) = 1.0;
  X(1) = 1.0;
  X(2) = 1.0;
  X(3) = 1.0;
  X(4) = 0.0;
  X(5) = 0.0;
  X(6) = 0.0;
  X(7) = 0.0;

  // 70~140の内容をC/C++で書くと
  double P;
  P = 6.283 / N;

  for (int K = 0; K < N; K++) {
    A(K) = 0; B(K) = 0;
    for (int J = 0; J < N; J++) {
      A(K) = A(K) + X(J) * cos(P * J * K);
      B(K) = B(K) - X(J) * sin(P * J * K);
    }
  }

  // 150~190の内容をC/C++で書くと
  for (int I = 0; I < N; I++) {
    double Y;
    Y = sqrt(power(A(I), 2) + power(B(I), 2);
    pirntf("%d %7.3f %7.3f %7.3f\n", A(I), B(I), Y);
  }
}
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!