がベクトル値 の場合も、 実数値の場合と基本的には変わらないが、 初心者がよく犯す間違いがあるので、特に説明する。 (実数値とベクトル値でプログラムの書き方を変えねばならないのは、 C 言語がベクトルを基本的なデータとして扱えないためであるとも言える。 実際、ベクトルを扱えるプログラミング言語 (C++, Python, Ruby, Julia, …) を用いれば、 2.6.1 と同じような感じでプログラムが書ける。)
まず、間違いのあるプログラムから。
間違いのあるプログラム |
/* * prog2wrong.c */ #include <stdio.h> #define N 100 int main(void) { int j; double a, b, F1(double, double), F2(double, double); printf("a[0], b[0]: "); scanf("%lf %lf", &a, &b); for (j = 0; j < N; j++) { /* ここに間違いがある!真似をしてはダメ!! */ a = F1(a, b); b = F2(a, b); printf("(a[%d],b[%d])=(%g,%g)\n", j+1, j+1, a, b); } return 0; } double F1(double x, double y) { return x / 2 + y / 3 + 1.0; } double F2(double x, double y) { return - x / 3 + y / 2 - 0.5; } |
正しくするには、例えば
正しいプログラム |
/* * prog2right.c */ #include <stdio.h> #define N 100 int main(void) { int j; double a, b, newa, newb, F1(double, double), F2(double, double); printf("a[0], b[0]: "); scanf("%lf %lf", &a, &b); for (j = 0; j < N; j++) { newa = F1(a, b); newb = F2(a, b); a = newa; b = newb; printf("(a[%d],b[%d])=(%g,%g)\n", j+1, j+1, a, b); } return 0; } double F1(double x, double y) { return x / 2 + y / 3 + 1.0; } double F2(double x, double y) { return - x / 3 + y / 2 - 0.5; } |