• 締切済み

C言語の配列の宣言について

20年以上前に発行された本に書いてある、利用したいCのコードがあります。 JavaやPHPは使ったことがありますが、Cは触ったことすらありません。 とりあえずメモ帳に打ち出して、codepadでC codeで実行してみましたが、正常に動作しません。 どこがおかしいのか、ご教示ください。 よろしくお願いします。 ---- #include <stdio.h> #include <math.h> #define N 20; int main( int argc, char **argv ) { double u[N+1], w[N+1]; double k=0.001; double h, r, s; int i, j; h= 1.0/(double)N; r= k/(h*h); s= 1.0-2.0*r; for( i=0; i<=N; i++ ) w[i]=0.0; for( i=1; i<N; i++ ) u[i]=1.0; u[0]=0.0; u[N]=0.0; for(j=1;j<200;j++){ if((j%10)==0) { printf("%5.31f",(double)j*k); for(i=0;i<=N;i+=2) printf("%5.31f",u[i]); printf("\n"); } for( i=0; i<=w; i++ ) w[i]=r*(u[i+1]+u[i-1])+s*u[i]; for( i=1; i<N; i++ ) u[i]=w[i]; } return 0; }

みんなの回答

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

追記。 もし、「C言語作る」のが目的でなく、「そのプログラムの実行結果を得る」のが目的だったら、自分の得意な言語に直せばいいです。 ここにある程度なら、簡単にJavaに直せます。 それなら、C特有の問題は考えなくて済むでしょう。

  • TT414
  • ベストアンサー率18% (72/384)
回答No.5

unacyoさん >また、5.31f? 小数点以下31桁も表示するのですか? >それとも、5.3lf(エルエフ)の間違い? (double型を表示する際の使い方ですね) とありますが、「5.3lf(エルエフ)の間違い?」は同意できますが、「(double型を表示する際の使い方ですね)」は同意できません。%lfは関数の呼び出し方法を知らない人間の書くインチキ書式です。 doubleの出力に%lfを使うような参考書は捨てましょう。

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

#defineなどのプリプロセッサ命令は、C言語とは違う処理をされるものですので注意が必要です。 #define N 20; これだと、Nというマクロの内容が「20;」になります。 プリプロセッサによる前処理で、マクロ「N」を「20;」に置き換えていきます。 ここでは「単純な文字列置き換え」しかしません double u[N+1], w[N+1]; → double u[20;+1], w[20;+1]; for( i=0; i<=N; i++ ) w[i]=0.0; for( i=1; i<N; i++ ) u[i]=1.0; → for( i=0; i<=20;; i++ ) w[i]=0.0; for( i=1; i<20;; i++ ) u[i]=1.0; ...となります。そうすると、あきらかに文法的におかしいです。

  • unacyo
  • ベストアンサー率51% (35/68)
回答No.3

すいません、#2ですが、コンパイル環境は書いてありましたね・・・ #2のコンパイル環境うんぬんは抜きで見て下さい。すいません

  • unacyo
  • ベストアンサー率51% (35/68)
回答No.2

正常に動作しないというのが、何であるか書かないと判りませんが・・・ エラーで落ちますか?コンパイルが通りませんか? また、どんな環境(コンパイラ)で作ってるかは書いてください。VisualC++? こちらで検証(VisualC++)でチェックしてみたところ、以下のエラーがあります。 (1) #deifneのミス >>> #define N 20; #defineの最後のセミコロンは不要です。入れてしまうと、Nを使っている場所全てにセミコロンが入ってしまってコンパイルが通りませんよ? (それともこれはコンパイラ依存?) (2) for( i=0; i <= w; i++ )  最後から2つ目のfor()文   整数型(int)と配列の比較はできません。wはNの間違い? (3) w[i]計算時、uの配列の-1を参照する >>> w[i]=r*(u[i+1]+u[-1]) (以下省略) 配列は0から開始しますが、w[i]を計算する際、i=0から開始するので、u[i-1]を計算途中に入れてると、u[-1]となってしまいますよ? 場合によってはメモリアクセスエラーになってアプリが落ちたり、参照できたとしても何が入っているかわからない領域の値を計算に使うので、最初の計算結果が合わないはずです。 せめて、参照して良いかどうかのチェックは必要ではないでしょうか?  double temp1 = 0.0;  if( i > 0 ) temp1 = u[i-1]; //i>0の場合はtemp1にu[]の値を入れる。i=0の場合はtemp1=0.0とする  w[i] = r * (u[i+1] + temp1) + s * u[i]; あと、気になったのは、printf( "%5.31f", u[i] )ですが、実行すると小数点以下の表示と、次に表示する整数部がくっついて表示されて、一見バグったように見えます。ここは1つごとに改行するつもりでしたか?それともこれが意図した出力?せめて、%5.31fの所の前後どちらかにスペース1個は入れたほうが見やすいかと。 また、5.31f? 小数点以下31桁も表示するのですか? それとも、5.3lf(エルエフ)の間違い? (double型を表示する際の使い方ですね) とりあえず、こちらでチェックした際の結果は以上です

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

>#define N 20; 最後のセミコロンは、いらないような気がします。

関連するQ&A

  • C言語

    #include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }

  • C言語の問題

    以下はC言語の問題です。お教えください。 1000以下の素数を求めるプログラム prog.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 です。 僕の考えでは、 #include <stdio.h> #include <math.h> main(){ int i; int j; int ix; int k; printf("正の整数を入力して下さい: "); scanf("%d",&i); ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++) { if(i%j==0) { k=1; } } if(k==0) { printf("%d は素数です\n",i); } else { printf("%d は素数ではありません\n",i); } となると思うのですが。どうやら違うようです。全然わからないので、正しい答えを教えてください。

  • C言語についてなのですが、

    C言語についてなのですが、 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<search.h> int main(void) { int i,j,k,temp,n,count,time,list[65537]; clock_t startTime, endTime; printf("取得する乱数の個数を入力してください\n"); scanf("%d",&n); srand((unsigned)time(NULL)); printf("Before sort\n"); startTime = clock(); for(i = 0; i < n; i++) { list[i] = rand(); /* printf("%d\n", list[i]);*/ } count = 0; for (i = 1; i < n; i++) { for (j = i; j < n-i-1; j++) { count++; if(list[j] < list[j+1]) { temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; } } } endTime = clock(); printf("\nAfter sort\n"); for(k = 0; k < n; k++) { /* printf("%d\n", list[k]);*/ } printf("\n比較回数:%d\n", count); printf("実行時間:%.4f秒\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); return 0; } 上記のソースコードをcygwinで gcc -Wall -o k5-1-2 k5-1-2.c でコンパイルしようとすると k5-1-2.c:関数'main'内 k5-1-2.c:14:error:called object is not a function と表示されます。 いろいろなサイトを参考にして乱数取得用に srand((unsigned)time(NULL));を使うように書かれていたので使っているのですが、何かだめなのでしょうか?自分ではお手上げ状態で。

  • C言語についての質問です。

    C言語についての質問です。 このプログラムの前半にある A[N][N]={{1,0,0},{0,1,0},{0,0,1}} b[N]={4,5,3} という行列の成分をキーボードから入力するようにする にはどうすればいいでしょうか。 for や scanf や printf を使って、変えてくれないでしょうか。 #include <stdio.h> #include <math.h> /* gauss33.c */ #define N 3 main(){ double A[N][N]={{1,0,0},{0,1,0},{0,0,1}}; double b[N]={4,5,3}; double Aa[N][N]; double x[N], bb[N], e[N]; int n=N; int i, j, k; double akk, aik, s; /* input original coefficients */ /* save original coefficients */ for(i=0; i<n; i++){ for(j=0; j<n; j++){ Aa[i][j]=A[i][j]; } bb[i]=b[i]; } /* forward operation */ for(k=0; k<n-1; k++){ akk=1/A[k][k]; for (i=k+1; i<n; i++){ aik=-A[i][k]*akk; for (j=k+1; j<n; j++){ A[i][j]+=aik*A[k][j]; } b[i]+=aik*b[k]; } for(j=k+1; j<n; j++){ A[k][j]*=akk; } b[k]*=akk; } /* backward operation */ x[n-1]=b[n-1]/A[n-1][n-1]; for(k=n-2; k>=0; k--){ s=0.0; for (j=k+1; j<n; j++){ s+=A[k][j]*x[j]; } x[k]=b[k]-s; } /* chek */ for(i=0; i<n; i++){ s=0.0; for(j=0; j<n; j++){ s+=Aa[i][j]*x[j];} e[i]=s-bb[i]; printf("\nx(%d)=%f error=%f\n",i, x[i], e[i]); } }

  • C言語 素数判定

    1000以下の素数を求めるプログラム kadai7-2.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 という問題なのですが、以下のプログラムを実行しても動きませんでした。どこが違うのでしょうか。ご指摘お願いします。 #include<stdio.h> #include<math.h> main(){ int i,j,ix,k,h; for (i=2;i<=1000;i++){ ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++){ if(i%j==0){ k=1; } } if(k==0){ printf("%4d",i); h+=1 if(h=15){ printf("\n"); h=0; } }

  • 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"); }

  • C言語でこのプログラムを完成させるには

    C言語でこのプログラムを完成させるには C言語初心者です。 1~6の乱数を100回発生させて、それぞれの出現回数をカウントし、ヒストグラムとして表示するプログラムを作成したいのですが上手くいきません。 #include <stdio.h> #include <time.h> #include <stdlib.h> int rnd(int m, int n) { return (int)(n-m+1)*(rand()/(RAND_MAX+0.1))+m; } int main(void) { int i, j, r; int hist[7]; for (i=1; i<7; i++) hist[i]=0; srand((unsigned)time(NULL)); for (i=0; i<100; i++) { r=6; while (6-- > 0) putchar('*'); putchar('\n'); } for (i=1; i<7; i++) { printf("%2d:", i); for (j=0; j<hist[i]; j++) printf("*"); printf("\n"); } return 0; } 何がいけないのでしょうか? よろしくお願いします。

  • C言語の2次配列

    4行5列の配列を用意し、その配列の要素をtij(i=1~4, j=1~5)とするとき、tij=i×j となるように配列に値を入れ、 それを表の形で画面に表示するプログラムを作りなさい。  という問題なんですが、自分は下の様に組みましたがうまく動きません。どこが悪いのか教えてください。よろしくお願いします。あまりC言語を理解していないので申し訳ないですが、なるべく簡単に教えて頂ければ幸いです。 #include<stdio.h> int main(void) { int i,j; int t[4][5]; for(i=0;i<=3;i++) { for(j=0;j<=4;j++) t=i*j; printf("%5d",t); printf("\n"); } return 0; }

  • C++についての質問です

    プログラミング初心者です 以下の通りに正方行列の積を求めるプログラムを作成したのですが、うまくいきません。 #include<stdio.h> #define DTM 20 void InputMatrix(double[][DTM], int, char); void PrintMatrix(double[][DTM], int, char); void MatrixMulti(double[][DTM], double[][DTM], double[][DTM], int); int main(void) { double matrixA[DTM][DTM]; double matrixB[DTM][DTM]; double matrixC[DTM][DTM]; int n; printf("正方行列の積を求めるプログラムです\n"); printf("正方行列の次元を入れてください(<=20):"); scanf_s("%d", &n); InputMatrix(matrixA, n, 'A'); InputMatrix(matrixB, n, 'B'); MatrixMulti(matrixA, matrixB, matrixC, n); printf("\n行列 C =A×B\n"); PrintMatrix(matrixC, n, 'C'); return 0; } void InputMatrix(double a[][DTM], int n, char ch) { int i, j; printf("行列 %cの入力\n", ch); for (i = 0; i < n;i++) { for (j = 0;j < n;j++) { printf("%c[%d][%d] =", ch, i + 1, j + 1); scanf_s("%lf", &a[i][j]); } } } void PrintMatrix(double a[][DTM], int n, char ch) { int i, j; printf("行列 %c の出力\n", ch); for (i = 0;i < n;i++) { for (j = 0;j < n;j++) { printf("%5.2f\t", a[i][j]); } printf("\n"); } } void MatrixMulti(double a[][DTM], double b[][DTM], double c[][DTM], int n) { int i, j, k; for (i = 0;i < n;i++) { for (j = 0;j < n;j++) { c[i][j] = 0; for (k = 0;k < n;k++) { c[i][j] =a[i][k] * b[k][j]; } printf("%5.2f\t",c[i][j]); } printf("\n"); } }

  • C言語の配列の入れ方について質問です。

    以下のプログラムは配列opに"+-*/"を入れて考えられる組み合わせを三通り作るプログラムを作りたいのですが、どこを修正したら宜しいですか? #include <stdio.h> int main() { int i,j, k,l; /*i=1桁目 j=2桁目 k=3桁目 l=4桁目*/ char op[4] = "+-*/"; for(op[i]=0; op[i]<4; op[i]++){ for(op[j]=0; op[j]<4; op[j]++) { for(op[k]=0; op[k]<4; op[k]++) { for(op[l]=0; op[l]<4; op[l]++){ printf("%c%c%c%c\n", op[i], op[j], op[k], op[l]); } } } } return 0; }

専門家に質問してみよう