• 締切済み

Cのプログラムに変換

どなたかこのプログラムをCに変化してくれる方いませんか? なんで変換するのとかの質問はいらないです。 ただ純粋に変換してくれる方いませんか? #include <stdio.h> #include <stdlib.h> #include <math.h> #include <complex.h> #define NREPEAT 1000 int sweepout(float complex **a, int size) { int n,m,k; // 前進消去 for(n=0; n<size; n++) { // 軸の選択 { float amax = cabs(a[n][n]);; float aabs; int npivot = n; for(m=n+1; m<size; m++) { if((aabs = cabs(a[m][n]))>amax) { npivot = m; amax = aabs; } } if(aabs == 0.0) return n; if(npivot != n) { // 軸の交換 float complex t; for(k=n; k<=size; k++) { t = a[n][k]; a[n][k] = a[npivot][k]; a[npivot][k] = t; } } } // 消去 { float complex t; t = 1.0/a[n][n]; // 対角要素 a[n][n] <-- 1 for(k=n+1; k<=size; k++) a[n][k] *= t; // 非対角要素 a[m][n] <-- 0 for(m=n+1; m<size; m++) { for(k=n+1; k<=size; k++) a[m][k] -= a[m][n]*a[n][k]; } } } // 後退代入 { float t; for(n=size-1; n>0; n--) { for(m=0; m<n; m++) a[m][size] -= a[n][size]*a[m][n]; } } return -1; } // 乱数を発生する double drand() { double rn; rn = (2*((double)random()))/((double)(RAND_MAX))-1.0; return rn; } main(int argc, char **argv) { int n, m, k, ncount; double complex **a0; float complex **a; double complex t; double d, r; if(argc>1) n = atoi(argv[1]); if(n <=0) n = 3; srandom((argc>2)?atoi(argv[2]):0); a0 = (double complex **)malloc(n*sizeof(double complex *)); for(m=0; m<n; m++) a0[m] = (double complex *)malloc((n+1)*sizeof(double complex)); a = (float complex **)malloc(n*sizeof(float complex *)); for(m=0; m<n; m++) a[m] = (float complex *)malloc((n+1)*sizeof(float complex)); for(ncount=0; ncount<NREPEAT; ncount++) { // 乱数により、配列の係数を決める(double型) for(m=0; m<n; m++) for(k=0; k<=n; k++) a0[m][k] = drand() + 1.0I*drand(); // 係数をfloat型に変換し、配列 a に代入する for(m=0; m<n; m++) { for(k=0; k<n; k++) a[m][k] = (float complex)a0[m][k]; t = 0; for(k=0; k<n; k++) t += a0[m][k]*a0[k][n]; a[m][n] = (float complex)t; } // 連立方程式を解き、数値解を a[][n] に求める sweepout(a,n); // 2乗誤差を求める d = r = 0; for(m=0; m<n; m++) { d += pow(cabs(a[m][n]-a0[m][n]),2); r += pow(cabs(a0[m][n]),2); } printf("%lf\t\n", 0.5*log10(d/r)); } for(m=0; m<n; m++) { free(a0[m]); free(a[m]); } free(a0); free(a); }

みんなの回答

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

もはやどうでもいいような気はしますが.... C++ だったら複素数はテンプレートになっているので, むしろ float complex とか書いたらエラーになりますです. ところで, なんで float complex 使ってるんだろう. 全部 double complex にしちゃダメなのかなぁ?

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.7

>たぶんタブを利用しているとインデントが消えるようです。スペースに変換してから >アップすれば良いのかな? 半角スペースでは結局インデントが消えます。 コピペで処理できませんが、TAB1つを全角空白で…というパターンがありますかね。 本題と関係ないですが。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.6

あえて言えば、 // から行末まで、というコメントはもともとはC++のものなので、エラーになる場合がある、ということでしょうか。 もっとも、新しい規格であるC99では正式にCにも導入されましたし、それ以前でも、コンパイラの独自機能として対応してたりもするので、実際コンパイルしてエラーになったら修正する、くらいでいいかと。 あとは、randomとsrandomは無い場合がある、とか mainの型を指定していないとか(intとみなされるので大丈夫だけど)とか、中身までは確認してないのでロジックが間違ってるかもしれない、とかはあるけど、いずれもC言語の範囲の問題で、このプログラムを「変換」という話しではありません。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

すでに指摘されているように、このソースコードはCのものです。 処理系によっては可能かもしれませんが、原則としてC++ではコンパイルできません。 あと、randomやsrandomに関しては非標準関数ですので、特定の処理系に依存することになると思います。

  • annys2000
  • ベストアンサー率48% (255/523)
回答No.4

>読みにくくてすいません。 インデントついて無いと読む気が失せます。普段はスルーしてます たぶんタブを利用しているとインデントが消えるようです。スペースに変換してから アップすれば良いのかな? >C++だと思ったんですけど違うんですか? 出てくる関数はCに存在します。C++依存のところは無いようです。 フリーで得られるコンパイラは殆どC/C++ 対応となってますのでどっちにしろコンパイル できますが。 >ただ純粋に変換してくれる方いませんか? そういうサイトではないというのは既出ですが、奇特な人はいるかもしれません このくらい自分で調べられなければ、プログラミングできませんよ

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

#1 で言われている通り C ですね. 微妙に「ん?」と思うところはありますが.

noname#158634
noname#158634
回答No.2

>変換してくれる方いませんか? ここそういうサイトじゃないから(笑)

  • annys2000
  • ベストアンサー率48% (255/523)
回答No.1

読みにくいので細かく見てませんが、これってC言語に既になってると思うのですが・・ デバッグしてということ?

eggs007
質問者

補足

読みにくくてすいません。 C++だと思ったんですけど違うんですか?

関連するQ&A

  • フーリエ変換のC言語プログラムについて

    正弦波(およびガウス性雑音)をフーリエ変換(離散)→逆フーリエ変換するというプログラムを組みました。正弦波をフーリエ変換すると実部は2回ピークがくるはずなのですが、すべて「0.000000」または「-0.000000」と表示されてしまいます。虚部は正常なようで実装の仕方もさほど違わないので、何が問題なのかわからずにいます。念のためコードはすべて載せますが、該当箇所は関数Fourierの fp = fopen("reX.txt", "w"); //書き込む あたりです。問題点を教えていただけないでしょうか。お願いします。 //gauss.txt, sin.txt:発生させたガウス性雑音&正弦波 //reX, imX:フーリエ変換の実部と虚部 //re-1, im-1:逆フーリエ変換の実部と虚部 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #define PI 3.14159265358979323846 #define N 256 //n:長さ, w:角周波数, p:位相(phase), a:振幅 void SinCurve(int n, double w, double p, double a) { FILE *fp; double x; int t; fp = fopen("sin.txt", "w"); //書き込むので"w" if(fp == NULL) { printf("file open error\n"); } else { for(t = 0; t < n; t++) { x = a * sin( w*(double)t + p ); fprintf(fp, "%f\n", x); } } fclose(fp); } //n:長さ, s:分散, m:平均 void Gauss(int n, double s, double m) { FILE *fp; double x, x1, x2, y1; int t; srand((unsigned) time(NULL)); fp = fopen("gauss.txt", "w"); //書き込むので"w" if(fp == NULL) { printf("file open error\n"); } else { for(t = 0; t < n; t++) { x1 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0); x2 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0); y1 = pow(-2.0*log(x1), 0.5) * cos(2.0*PI*x2); y1 = s * y1 + m; fprintf(fp, "%f\n", y1); } } fclose(fp); } //ファイル名sのデータをフーリエ変換し、実部と虚部をreX, imXに保存 void Fourier(int num, char *s) { FILE *fp; int k, n; double largeX, x[N+100], t; fp = fopen(s, "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { // printf("%s\n", s); for(k = 0; k < num; k++) { fscanf(fp, "%lf", &x[k]); printf("x[%d]=%f\n", k, x[k]); } } fp = fopen("reX.txt", "w"); //書き込む if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { largeX = 0.0; t = 2.0*PI*(double)k / (double)N; for(n = 0; n < num; n++) { largeX += x[n] * cos((double)n*t); // printf("%f\n", largeX); } fprintf(fp, "%f\n", largeX); printf("reX[%d]=%f\n", k, largeX); } } fp = fopen("imX.txt", "w"); //書き込む if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { largeX = 0.0; t = 2.0*PI*k / (double)N; for(n = 0; n < num; n++) { largeX -= x[n] * sin(n*t); } fprintf(fp, "%f\n", largeX); } } fclose(fp); } void InverseFourier(int num) { FILE *fp; int k, n; double a[N+100], b[N+100], x, t; //a:reX, b:imX fp = fopen("reX.txt", "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { fscanf(fp, "%lf", &a[k]); // printf("a[%d]=%f\n", k, a[k]); } } fp = fopen("imX.txt", "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { fscanf(fp, "%lf", &b[k]); // printf("b[%d]=%f\n", k, b[k]); } } fp = fopen("re-1.txt", "w"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(n = 0; n < num; n++) { x = 0.0; t = 2.0*PI*(double)n / (double)N; for(k = 0; k < num; k++) { x +=a[k] *cos(k*t) - b[k] *sin(k*t); } x /= (double)N; fprintf(fp, "%f\n", x); // printf("x[%d]=%f\n", n, x); } } /* fp = fopen("im-1.txt", "w"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(n = 0; n < num; n++) { x = 0.0; for(k = 0; k < num; k++) { t = 2.0*PI*(double)k / (double)N; x = x + a[k] *sin(n*t) + b[k] *cos(n*t); } x /= (double)N; fprintf(fp, "%f\n", x); } } */ fclose(fp); } int main(void) { SinCurve(N, PI/8.0, 0.0, 1.0); // Gauss(N, 1.0, 0.0); Fourier(N, "sin.txt"); // Fourier(N, "gauss.txt"); InverseFourier(N); return 0; }

  • C++言語のプログラムをfortranに変換

    const int N = 100; const double q = 10.0, dt = 0.00001, Dm = 30.0, t0 = 2.0, K = 1.0, pi = 3.141592, f = 3.0; double C[N], dC[N]; double dx = q/N; for (int i = 0; i < N; ++i) C[i] = 0; // 初期条件 for (double t = 0; t < t0; t += dt) {  C[0] = 0; // 境界条件1  C[N - 1] = K*sin(2*pi*f*t); // 境界条件2  for (int i = 1; i < N - 1; ++i) dC[i] = (Dm*(C[i + 1] - 2*C[i] + C[i - 1])/(dx*dx))*dt;  for (int i = 1; i < N - 1; ++i) C[i] += dC[i]; } for (int i = 0; i < N; ++i) cout << C[i] << endl; // t = t0 このプログラムをfortranに変換できる方いますか?

  • CからVB

    以下のプログラムはC言語で作成されています。 これをVBで作成したいです。 教えてください。 #include <stdio.h> #include <stdlib.h> double *alloc(int r,int n,int m); void input(double *p,int r,int n,int m); void sumup(double *p,int r,int n,int m); int main(void){ int r, n, m; double *p; // 行列サイズ入力 printf("input r n m "); scanf("%d %d %d",&r,&n,&m); // 行列領域取得 p = alloc(r,n,m); // 行列要素入力 input(p,r,n,m); // 行列の和 sumup(p,r,n,m); //終了,行列領域解放 free(p); return 0; } double *alloc(int r,int n,int m){ double *p; printf("MATRIX[r=%d][n=%d][m=%d]\n\n",r,n,m); p = (double*)malloc(sizeof(double)*r*n*m); if( p == NULL){ printf("error! malloc failed.\n"); exit(-1); } return p; } void input(double *p,int r, int n,int m) { int i,j,k; for(i = 0; i < r; i++){ for(j = 0;j < n; j++){ for(k = 0; k < m; k++){ printf("input MATRIX[%d][%d][%d]= ",i,j,k); scanf("%lf",&p[i*(n*m)+j*m+k]); } } } printf("\n"); } // 行列の和 void sumup(double *p,int r,int n,int m){ int i, j, k; // 0.0, not 0!!! double sum = 0.0; printf("sum of %d matrices:\n",r); for(j = 0; j< n; j++){ for(k = 0;k < m; k++){ sum=0; for(i = 0;i < r;i++){ sum += p[i*(n*m)+j*m+k]; } printf("\n%2f",sum); } } printf("\n"); }

  • 上三角行列の解を出力するプログラム

    /*下記のプログラムで”1回目”という部分以降の繰り返し計算がうまくいきません.エラーは出ませんが,何が間違っているか,お気づきの点を教えてください,よろしくお願いします(..) */ #include <stdio.h> #include <stdlib.h> #include <math.h> int main(){ FILE *fp; //*fp fopen("kadai2.dat","w"); //数値結果エラー表示 if((fp=fopen("kadai2.dat","w"))==NULL){ printf("error\n"); exit(1); } int i,j,k; double r=2,ta=1000,tb=0;//r,ta,tb const int N=10;//N const int T=1;//N const int m=N-1;//mは(N-1)とりあへず一定にしないと定まらないみたい const int n=N-1;//n=N-1 とりあへず一定にしないと定まらないみたい const int t=T;//n=N-1 とりあへず一定にしないと定まらないみたい //行列定義aa,xx double a[m+2][n+2],**aa,a1,x1; double x[n+2][t],**xx; aa=( double **) malloc((unsigned) m*sizeof(float*)); for(i=0;i<=m-1;i++){ aa[i]=a[i]; } xx=( double **) malloc((unsigned) n*sizeof(float*)); for(i=0;i<=n-1;i++){ xx[i]=x[i]; } //xx[n][t]初期化 x[0][],x[10][]以外 for(i=1;i<=n+1;i++){ x[i][0]=0; } //huyou double b[n+2][t],**bb; bb=( double **) malloc((unsigned) m*sizeof(float*)); for(i=0;i<=m-1;i++){ bb[i]=b[i]; } //************************************ 入れなおしでx完成 //kの繰り返し開始 for(k=0;k<=T;k++){ //aaに初期値 初期化 for(j=0;j<=N;j++){ for(i=0;i<=N;i++){ a[j][i]=0; } } //aaに値代入 for(i=0;i<=N-1;i++){ a[i][i]=1+2*r; a[i+1][i]=-r; a[i][i+1]=-r; } //xx[n][t]初期化 x[0][],x[10][] x[0][k]=ta; x[10][k]=tb; //xx[n][t]値代入 j x[1][k]=x[1][k]+r*x[0][k]; x[N-1][k]=x[N-1][k]+r*x[10][k]; //************************************計算部 //printf("*********************** %d\n",k); //1回目 for(j=1;j<=N-2;j++){ for(i=1;i<=N-1;i++){ a[j+1][i]=a[j+1][i]-a[j][i]*a[j+1][j]/a[j][j]; } x[j+1][k]=x[j+1][k]-x[j][k]*a[j+1][j]/a[j][j]; } for(j=1;j<=N-1;j++){ for(i=1;i<=N-1;i++){ printf("%4.2fl",a[j][i]); } printf("\n"); } //2回目 for(j=1;j<=N-2;j++){ for(i=1;i<=N-1;i++){ a[N-1-j][i]=a[N-1-j][i]-a[N-j][i]*a[N-1-j][N-j]/a[N-j][N-j]; } x[N-1-j][k]=x[N-j-1][k]-x[N-1-j][k]*a[N-1-j][N-j]/a[N-j][N-j]; } //3回目 for(i=1;i<=N-1;i++){ x[i][k]=x[i][k]/a[i][i]; } //答え出てきたら //ファイルに結果放り込む※時間変化表示 n x t for(i=0;i<=N;i++){ fprintf(fp,"%d %10.5fl %d\n",i,x[i][k],k); //printf("%d %10.7g %d\n",i,x[i][k],k); } //出てきたxを次の時間用に入れなおし for(i=0;i<=8;i++){ x[i][k+1]=x[i][k]; } }//kの繰り返し終了 fclose(fp); return 0; }

  • Windowsでは出るエラーでMacでは出ない

    現在、Visual C++ 2013 Expressを使っているのですが、そちらではエラーが出るのに、MacbookのXcodeで走らせたらエラーも出ずに正常に実行することができます。 いったい何が原因でエラーが起こっているのでしょうか? エラーメッセージは"XXXXX.exe has triggered a breakpoint."で"malloc.c"のタブがVC++上に開きます。以下がそのコードになるのですが、アドバイス宜しくお願い致します。 #define _USE_MATH_DEFINES #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> #include <iostream> #include <complex> #include <stdlib.h> using namespace std; typedef complex<double> dcmplx; complex<double> M_i = dcmplx(0, 1); //--------------------------------------------------------------- // Characteristic Function dcmplx* CharFunc(double alpha, double* nu, double s0, double r, double q, double sigma, double t, int N) { dcmplx* out = (dcmplx*)malloc(sizeof(dcmplx) * N); dcmplx* u = (dcmplx*)malloc(sizeof(dcmplx) * N); for (int j = 0; j < N; ++j){ // j = 1,...,N u[j] = nu[j] - (alpha + 1) * M_i; out[j] = exp(M_i*(log(s0) + (r - q - sigma*sigma / 2.0)*t)*u[j] - sigma*sigma * u[j] * u[j] * t / 2.0); } return out; } // Characteristic Function for C dcmplx CharFuncC(double u, double s0, double K, double r, double q, double sigma, double t, int N) { return exp(M_i*((log(s0) - log(K)) + (r - q - sigma*sigma / 2.0)*t)*u - sigma*sigma * u*u * t / 2.0); } //--------------------------------------------------------------- // Main int main(int, char**) { double alpha[] = { -1.2, -1.5, -5.0, -10.0 }; double eta; double s0; double r; double q; double sigma; double t; double K; int pow2; int N; int m_atm = 0; FILE *fp; if (!(fp = fopen("inputa.txt", "r"))){ printf("File \'inputa\' could not be opened!"); exit(-1); } fscanf(fp, "%lg%lg%lg%lg%lg%lg%d", &eta, &s0, &r, &q, &sigma, &t, &pow2); double a; double b; double v; double abs_ab[] = { 2.0, 5.0, 10.0, 20.0 }; double sum =0; for (pow2 = 7; pow2 <= 10; ++pow2){ N = (int)pow(2.0, pow2); double *nu = (double*)malloc(sizeof(double)* N);// nu * (b - a) / M_PI; double *Vp = (double*)malloc(sizeof(double)* N); double *chi = (double*)malloc(sizeof(double)* N); double *phi = (double*)malloc(sizeof(double)* N); dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N); for (int i = 0; i < 4; ++i){ b = abs_ab[i]; a = -b; cout << "N:" << N << ", (a, b): (" << a << ", " << b << ")" << endl; for (K = 1600; K <= 1900; K += 100){ for (int k = 0; k < N; ++k){ nu[k] = k * M_PI / (b - a); // chi for Put with (c,d) = (a,0) chi[k] = 1.0 / (1.0 + nu[k] * nu[k]) * (cos(nu[k] * (-a)) - exp(a) + nu[k] * sin(nu[k] * (-a))); // phi for Put with (c,d) = (a,0) phi[k] = sin(nu[k] * (-a)) * (1.0 / nu[k]); phi[0] = -a; // COS expasion coeff V for Put Vp[k] = (2.0 / (b - a)) * K * (-chi[k] + phi[k]); // Characteristic Function for C, (just different argument inputs) nu[k] = k * M_PI / (b - a); Phi[k] = CharFuncC(nu[k], s0, K, r, q, sigma, t, N); sum += real(Phi[k] * exp(-M_i*(k*M_PI) * a / (b - a)))*Vp[k]; if (k == 0) sum /= 2.0; } v = exp(-r*t)*sum; cout << "strike=" << K << ", price=" << v << endl; sum = 0.0; } } } system("Pause"); return 0; }

  • C言語のプログラミングで質問です

    C言語のプログラミングで質問です. 時間を測ろうと下記のようなプログラムをしてみましたが計測時間がoTime, nTime共に0.000になってしまいます.(winmm.libはリンクさせてます) おかしいところはどこでしょうか? #include<stdio.h> #include<time.h> #include<windows.h> #include<mmsystem.h> #include<stdlib.h> #define N 2048 #define M 32 int main(int argc, char* argv[]) {   int i, j, k, l;   float target = 0;   float* a;   float* b;   float c;   DWORD nTime, oTime;     a = (float*)malloc(sizeof(float)*N);   b = (float*)malloc(sizeof(float)*N);   c = 0;   for(i = 0; i < N; i++)   {     a[i] = 1000;     b[i] = 0;   }  oTime = timeGetTime();   for(i = 0; i < M; i++)   {    for(j = 1; j < N/M; j += j)    {      for(k = 0; k < N/M; k++)      {        if(k % 2 == 0)        {          a[k+i*N/M] += a[k+j+i*N/M];        }      }    }    b[i] = a[i*N/M];    printf("%f\n", a[i*N/M]);   }   for(i = 0; i < M; i++)   {     target += b[i];   }   c = target;   nTime = timeGetTime();   printf("%f\n%f\n%f", c, oTime, nTime);   getch();   return 0; }

  • 離散フーリエ変換のプログラムについて

    今DFTのプログラムをC言語で書いているんですが、うまく動いてくれません。 DFTの式はX(k)=1/N{Σx(k)*e^(-j2πkn/N)}のシグマの中をn=0からN-1まで足し合わせればいいと思っているのですがちがいますか。 下にプログラムを書きますのでお願いします。 void DFTcore(double x[],int N,double A[],double fai[],double a_rl[],double a_im[]){     x[]はデータ     Nはデータ数     A[]は振幅     fai[]は位相差     a_rl[]は実数部、a_im[]は虚数部 double w,a; int k,n,t; for(k=0;k<N;k++){  //初期化    a_rl[k]=0.0;  //実数部    a_im[k]=0.0;  //虚数部   }     時間間隔は1秒 for(k=0;k<N;k++){       for(n=0;n<N;n++){   w=((2*PI)/N)*k*n;         a_rl[k]=a_rl[k]+x[k]*cos(w);   a_im[k]=-a_im[k]+x[k]*sin(w);  }   a_rl[k]=a_rl[k]/(double)N;実数部   a_im[k]=-a_im[k]/(double)N; 虚数   A[k]=sqrt(a_rl[k]*a_rl[k]+a_im[k]*a_im[k]); //振幅    fai[k]=atan(a_im[k]/a_rl[k]); //位相 } }

  • フーリェ変換

    フーリェ変換の勉強をしているものです。フーリェ変換の関数はここ(http://www.kurims.kyoto-u.ac.jp/~ooura/fftman/ftmndl.html)からとってきた、fft.tgz (71 KB)と言うファイルの、dfst()を使いました。ですが、周波数440Hzのサイン波を作り、それをフーリェ変換したところ、どうしてもスペクトルが880Hzで最大になってしまいます。下記にそのコードを載せました。どうしてそうなってしまうのか 教えてください。それとなぜかセグメンテーション違反がでます・・・・(涙 ※ところどころ無駄なコードがありますが、気にしないで下さい。 //==================================================================はじまり //---------------------------------------------------------------- // fft4g.h ファイル void dfst(int,double *,double *,int *,double *); //---------------------------------------------------------------- // fft.c ファイル #include <float.h> #include <stdio.h> #include <math.h> #include <limits.h> #include <stdlib.h> #include "fft4g.h" #define BUFSIZE 4097 #define N 4097 // ↑ いつでも変えられるように int main(){ double total = 1, tt; double freq = 440.0; short buf[ BUFSIZE ]; int i; int cur_stream = 0; double a4 = 0; int ii = 0; //data length + 1  int n = N; //input/output  double *a = (double *)malloc(sizeof(double)*N + 100); //work table   const int a3 = (int)(N - 1);  double *t = (double *)malloc(sizeof(double)*a3 + 100);  const int a1 = (int)(2 + sqrt(N/4));  int *ip = (int *)malloc(sizeof(int)*a1 + 100);  const int a2 = (int)(N*(5/8) - 1);  double *w = (double *)malloc(sizeof(double)*a2 + 100); // ↑ + 100 は、予備。 if(a == NULL){printf("a\n");fflush(stdout);exit(1);} if(t == NULL){printf("t\n");fflush(stdout);exit(1);} if(ip == NULL){printf("ip\n");fflush(stdout);exit(1);} if(w == NULL){printf("w\n");fflush(stdout);exit(1);} /* 正弦波データ作成 */ for ( i = 0; i < BUFSIZE; i ++ ) { tt = ( total / BUFSIZE ) * i; buf[i] = (short)(SHRT_MAX * sin( 2.0 * 3.14159 * freq * tt )); } // dfstの仕様による ip[0] = 0; /* データ入力 */ for(i = 0;i < N;i++,cur_stream++){ a[i] = (double)buf[cur_stream]; } /* 変換 */ dfst(n, a, t, ip, w); /* 結果を見る */ for(i = 1;i < N - 1;i++){ if(a4 < a[i]){a4 = a[i];ii = i;} printf("\n[%d]-[%f]",i,a[i]); printf("\n[%d]--------[%f]",ii,a4); } printf("\n"); free(a); free(t); free(ip); free(w); return 0; } //============================================終わり

  • プログラムについて(UNIX)

    以下のプログラムを部分的で結構ですので 解説していただけないでしょうか? 打ち込んだ数字を10進法に変換して、 その後どうなっているのかがよく分かりません。 よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> #define N 127 #define M 121 #define LENGTH 45539 int C[N] ; int d[LENGTH/N]; int b[LENGTH/N]; float r[LENGTH]; char message[LENGTH/N/7]; int PNread(int); int PXread(void); int main() { int i, m; /* Insert the process to input the user No. m here. */ printf("Input the user No. : "); scanf("%d", &m); if (m < 0 || m > M) { printf("You input a wrong user No.\n"); exit(-1); } printf("\nThe user No. m is %d. \n", m); /* Read the spread code for user No. m from data file */ if(PNread(m) == -1) exit(-1); /* Display the spread code. */ /* Here is an example to display the first 10 numbers */ if(PXread()== -1) exit(-1); int t,k; float hatD[LENGTH/N]; for(t=0; t < LENGTH/N; t++){ hatD[t]=0; for(k = t*N; k < (t+1)*N; k++) hatD[t]+= ((float)r[k]*C[k%N])/((float)N); d[t] = (hatD[t] >= 0)?1:-1; /*?はif文の省略形である*/ } for(t = 0; t < LENGTH/N; t++) b[t] = (d[t] >= 0) ? 0 : 1; /* 文字に変換する */ for(i = 0; i < LENGTH/N; i += 7) message[i/7] = b[i]*64 + b[i+1]*32 + b[i+2]*16 + b[i+3]*8 + b[i+4]*4 + b[i+5]*2 + b[i+6]; /* メッセージの表示 */ printf("Message:\n%s\n", message); return 0; } /* Function of spread code reading */ int PNread(int m) { FILE *in; /* Verify the data file */ if ((in = fopen("PN7.dat", "r"))== NULL) { /* Error message */ printf("Error: Cannot find the data file. \n"); return -1; } if(m>1) /* Set the file pointer to the m-th user's spread code */ fseek(in,(m-1)*N*sizeof(int),SEEK_SET); /* Read the spread code to array C */ fread(C,sizeof(int),N,in); fclose(in); return 1; } int PXread(void) { FILE *in; int count; float rtemp; if((in = fopen("Rx7_51.dat", "r"))== NULL) { printf("Error; Cannot find the date file. \n"); return -1; } for(count = 0; count < LENGTH; count++){ fscanf(in, "%f", &rtemp); r[count] = rtemp; } fclose(in); return 1; }

  • C++で分からないプログラムがあるんですが

    #include <iostream> #include <cmath> using namespace std; int main() { static const int N = 2; double va[N]={3,-4}; double vb[N]={4,3}; double a,b; double p; for (int i = 0; i < N; ++i) { for (int i = 0; i < N; ++i) { } } cout << "va + vb = (" ; for (int i = 0; i < N; ++i) { cout << va[i] + vb[i]; if (i < N - 1) { cout << ", "; } } cout << ")" << '\n'; cout << "va - vb = (" ; for (int i = 0; i < N; ++i) { cout << va[i] - vb[i]; if (i < N - 1) { cout << ", "; } } cout << ")" << '\n'; p = 0; for (int i = 0; i < N; ++i) { p += va[i] * vb[i]; } cout << "va・vb = " << p << '\n'; a = 0; for (int i = 0; i < N; ++i) { a += va[i] * va[i]; } a = sqrt(a); b = 0; for (int i = 0; i < N; ++i) { b += vb[i] * vb[i]; } b = sqrt(b); if (a * b != 0) { cout << "cosθ = " << p / (a * b) << '\n'; } return 0; } これで、ベクトルの加減とベクトルの内積とcosθが出るんですが、2つのベクトルを適当に初期化しないといけないんですが、初期化ってこれで初期化ってできてますか?