/* File name 10-4.c */ #include <stdio.h> #include <math.h> #define BUFFSIZE 1024 double inn_prod(double a[], double b[]); main() { char nyuryoku[BUFFSIZE]; double a[3], b[3]; double angle; printf("Input the components x, y and z of the 1st vector>>"); fgets(nyuryoku, BUFFSIZE, stdin); sscanf(nyuryoku, "%lf %lf %lf", &a[0], &a[1], &a[2]); printf("Input the components x, y and z of the 2nd vector>>"); fgets(nyuryoku, BUFFSIZE, stdin); sscanf(nyuryoku, "%lf %lf %lf", &b[0], &b[1], &b[2]); angle = acos(inn_prod(a, b)/sqrt(inn_prod(a, a)*inn_prod(b, b))); printf("The angle is about %lf radian.\n", angle); } double inn_prod(double a[], double b[]) { return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]; }
このプログラムで, 関数 inn_prod
と言う内積を計算する関数は,
double 型の配列を引数にしています.
角度の計算で acos と言う関数が使われていますが, これは cos の逆関数で, 返り値はラジアン単位です. これは, 数学関数ライブラリに入っています. また, 数学関数ライブラリ を使いますから, コンパイル時にはオプション -lm を付けて下さい.