WRITE(*,*) 'BACKWARD : METHOD=1, ',
1 'CENTRAL : =2, ',
2 'FORWARD : =3'
(6桁目にブランクでない文字 1,2 を置いている、
継続行であることを意味する。)
|
printf("BACKWARD : METHOD=1, CENTRAL : =2, FORWARD : =3\n");
|
C 菊地文雄, 山本昌宏「微分方程式と計算機演習」, 山海堂 (1991), P. 13 |
// 菊地文雄, 山本昌宏「微分方程式と計算機演習」, 山海堂 (1991), P. 13 |
ともあれ、C言語では、変数宣言は絶対にサボれないので、ちゃんと書く必要がある。 IJKLMN ルールを使っているので、 先頭の文字が I,J,K,L,M,N のいずれかの 場合は int 型に、そうでない場合は double 型にした。 (もとの FORTRANプログラムは単精度(REAL)なので、 double でなく float にすべきかもしれないが、 C言語で float の利用はあまり推奨できないので double にした。)
| (変数宣言なし) |
int i,j,k; double aa; |
DIMENSION A(NDIM,NDIM),F(NDIM)
|
int n, i, j; double a[NDIM][NDIM], f[NDIM]; |
例えば、B(1) は b[0] に, A(N) は a[n-1] に直す。 また
DO 2 I=1,N
DO 1 J=1,N
READ(*,*) A(I,J)
1 CONTINUE
2 CONTINUE
|
for (i=0; i<n; i++)
for (j=0; j<n; j++)
scanf("%lf"< &a[i][j];
|
PARAMETER (NDIM=100)
DIMENSION A(NDIM,NDIM),F(NDIM)
|
#define NDIM (100 double a[NDIM][NDIM], f[NDIM]; |
次元 N 以上の数NDIMを取って、大きめの変数を用意しておく、 ということである。 古いFORTRANでは、動的な変数宣言は出来ず、 プログラムをコンパイルする時点で、 変数の大きさを決めておく必要があるので、 このようなプログラムになっている (そうするより仕方がない)。 最近のプログラミング言語では、動的な変数宣言が出来るのが普通なので、 古めかしい書き方であると言える。
例えば C 言語であれば、ベクトルを記憶する変数 f は
#include <stdlib.h> // malloc() のため
int N;
double *f;
// N を決めてから
f = malloc(sizeof(double) * N);
if (f == NULL) { } // エラー処理
|
SUBROUTINE GAUSS(A,F,N,NDIM)
DIMENSION A(NDIM,NDIM),F(NDIM)
|
void gauss(double a[ndim][ndim],f[ndim],int n, int ndim) |
void gauss(int ndim,double a[ndim][ndim],double f[ndim],int n) |
void gauss(int ndim,double a[][ndim],double f[],int n) |
// n次元ベクトル x,y の内積を計算する関数 double naiseki(double x[], double y[], int n) |