次のファイルは複素数を計算するプログラムを構成するものである。
これらをプログラムのソースファイルとして作成しなさい。
/* これはメインプログラムである。 このソースファイル名を f_keisan.c とする。*/ #include <stdio.h> #include <fukusosu.h> void f_print(fukusosu z) { printf("%g + %gi\n", z.jitubu, z.kyobu); } int main() { fukusosu a, b, c; a = f_tukuru(1, 2); // 実数1と2から複素数を作る f_print(a); // 1 + 2i b = f_tukuru(3, 4); // 実数3と4から複素数を作る f_print(b); // 3 + 4i c = f_tasu(a, b); // 複素数1 + 2iと複素数3 + 4iを足す f_print(c); // 4 + 6i return 0; } |
/* これはメインプログラムから呼ばれる関数プログラムである。 このソースファイル名を fukusosu.c とする */ typedef struct { double jitubu; // 実数部 double kyobu; // 虚数部 } fukusosu; // 複素数 // 実数xとyから複素数x+yiを作る fukusosu f_tukuru(double x, double y) { fukusosu z; z.jitubu = x; z.kyobu = y; return z; } // 複素数xと複素数yを足す fukusosu f_tasu(fukusosu x, fukusosu y) { fukusosu z; z.jitubu = x.jitubu + y.jitubu; z.kyobu = x.kyobu + y.kyobu; return z; } // 複素数xから複素数yを引く fukusosu f_hiku(fukusosu x, fukusosu y) { fukusosu z; z.jitubu = x.jitubu - y.jitubu; z.kyobu = x.kyobu - y.kyobu; return z; } |
/* これはヘッダーファイルである。 実数から複素数を構成する構造体とプロトタイプ宣言をまとめた ものである。このファイル名を fukusosu.h とする。 */ // 構造体 typedef struct { double jitubu; double kyobu; } fukusosu; // プロトタイプ宣言 extern fukusosu f_tukuru(double x, double y); extern fukusosu f_tasu(fukusosu x, fukusosu y); extern fukusosu f_hiku(fukusosu x, fukusosu y); |
ファイルが正しく作成されたかどうかを試すために、とりあえず分割コンパイル して実行ファイルを生成してみる。
$ gcc -c fukusosu.c |
$ gcc -o f_keisan -I. fukusosu.o f_keisan.c |
次のような実行結果になれば成功である。
$ ./f_keisan 1 + 2i 3 + 4i 4 + 6i |
オブジェクトファイルfukusosu.oをライブラリファイルlibmyfukusosu.aにして、つぎのようにf_keisan.cから 実行ファイルf_keisan2を生成して実行しなさい。
$ gcc -o f_keisan2 -I . -L . f_keisan.c -lmyfukusosu |
-I ~/myInc
)。
前の実験で体験したようにインクルードファイルは、カレントディレクトリにあ
る限り、#include "fukusosu.h"
と書けば、-I . を省略することができる。