/* 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 を付けて下さい.