値渡しによる関数の終了では2つの値を戻せないために,変数の値の入れ替えの際には変数のアドレスを入れ替えることで実際の入れ替え作業が可能となります.以下の例で試してみましょう.
#include <stdio.h> #include <stdlib.h> #include <time.h> void exchange(int *x, int *y); int main(void) { srand((unsigned) time(NULL)); int num1, num2; num1 = rand() % 10 + 20; num2 = rand() % 10 + 10; printf("x=%d y=%d\n", num1, num2); exchange(&num1, &num2); printf("x=%d y=%d\n", num1, num2); return 0; } void exchange(int *x, int *y) { int tmp; tmp = *x; *x = *y; *y = tmp; printf("x=%d y=%d\n", *x, *y); } |
現時点でこれが理解できなくても構いません.
x=28 y=10 x=10 y=28 x=10 y=28 |
10以上20以下の整数を乱数により1つ発生させ,その数から1まで順に数を表示するプログラムを,再帰を使って for 文などの反復処理を用いないで作成しましょう.
16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 |
本体の main() はたとえばこんな感じです.
int main(void) { srand((unsigned) time(NULL)); int num = rand() % 11 + 10; printf("%d ", num); sort(num); //これが呼び出し関数 printf("\n"); return 0; }
教科書p.85の2進表現の例題を拡張して,0から255までの整数を乱数により発生させ,それを必ず8桁の2進数で表すように変更してみましょう.
24 : 00011000 |
最初の0で埋める部分の処理が別途必要ですが,どうやってやるかが問題ですね.
6桁の正の整数を乱数により発生させて,その各位の数を抜き出す作業をすると,これまでの方法では元の乱数を変更してしまう処理になります.元の値を保持したければ,別に変数を用意する必要がありました.そこで,void型関数に値を渡すことにして,元の乱数を保持することが可能なプログラムを作成しましょう.
334069: 3x10^5 + 3x10^4 + 4x10^3 + 0x10^2 + 6x10^1 + 9x10^0 = 334069 |
このプログラムでは再帰は関係ないです.普通に関数を作りましょう.
2以上3以下の実数(小数第二位まで)を乱数により発生させ,その数を x とするとき,実際の exp(x) と,McLaughrin展開の5項目までと10項目まで計算した近似値を比較するプログラムを,一つは教科書のリスト4_10にある階乗の関数と,もうひとつ近似値を求めるdouble型関数とを使って作成しましょう.
True value: exp(2.12) = 8.331137 Approx. value: exp(2.12) = 8.330514 (10 terms) Approx. value: exp(2.12) = 7.796873 (5 terms) |
まさか,McLaughrin展開がわからないなんてことは無いですよね?
数学関数のexp()を利用するためにmathライブラリをインクルードしているので,コンパイル時にはオプションが必要です.
$ cc mclaughrin.c -lm