第 8 回 - 構造体(2)

[5/19, 2006 H.Aman]
67x27(1669bytes)   67x27(1669bytes) 【課題 3】

例題 3

ここでも, 例題1例題2 と同様に,2 次元ベクトルを表現した構造体 vector を考える.

ベクトルの長さを調べる関数 length を作りなさい.
ただし,ベクトル(構造体 vector)の各成分に対するアクセスにはポインタ変数を用いることとする.
なお,ベクトルの長さは double 型で算出せよ.

コーディング例

     1	/*
     2	 * プログラミング演習 第 8 回
     3	 * [例題 3]
     4	 * (C) 2006 Hirohisa AMAN <aman@cs.ehime-u.ac.jp, aman@computer.org>
     5	 */
     6	#include <stdio.h>
     7	#include <math.h>
     8	
     9	/* 構造体 vector の宣言 */
    10	struct vector {
    11	  int x;
    12	  int y;
    13	};
    14	
    15	/* ベクトルの長さ算出のための関数 */
    16	double length( struct vector* v ){
    17	  
    18	  /* ベクトルの長さを戻り値とする */
    19	  return sqrt( (v->x)*(v->x) + (v->y)*(v->y) ); 
    20	
    21	}
    22	
    23	int main(void){
    24	  struct vector data;
    25	  double len;
    26	
    27	  scanf("%d %d", &data.x, &data.y);
    28	
    29	  len = length(&data); 
    30	  printf("長さ = %lf\n", len);  
    31	  /* 変数 len を使わずに直接 length(&data) を指定しても OK */
    32	
    33	  return 0;
    34	}
     
※左端の数字は行番号であり,ソースコードには含まれない点に注意!

コンパイル & 実行例

     $ gcc example8_3.c -lm [Enter]
     $ ./a.out [Enter]
     3 4 [Enter]
     長さ = 5.000000
     
     $ ./a.out [Enter]
     1 1 [Enter]
     長さ = 1.414214
     
(注意)数学関数 sqrt を使う場合, コンパイルオプションに -lmマイナス,小文字の L,小文字の M) が必要になります.
※実行ファイル(a.out)を生成する際に, 別のコンパイル済み数学ライブラリをリンクする必要があるため.

解説

関数の呼び出し方法は printVector (例題2 参照) と同様であるため説明は省略する.

ベクトルの長さについては,あえて説明するまでもないが

136x32(2732bytes)
である. x と y はそれぞれ v->x と v->y としてアクセスできるので, まず平方根の中身は
 (v->x)*(v->x) + (v->y)*(v->y) 
と書ける.
そして,平方根はライブラリ関数 sqrt を使えばよい(19 行目):
 sqrt( (v->x)*(v->x) + (v->y)*(v->y) ) 
なお,この sqrt という関数は別途 math.h というヘッダファイルに宣言されている(最初から用意されている) ので,プログラムの冒頭に
  #include<math.h>  
という 1 行も必要である(7行目).

関数 length は上で算出したベクトルの長さを return の値に指定している (既に知っていると思うが, これを「戻り値(もどりち)」という.)
直感的に言えば,関数呼び出しの
 length(&data); 
が,関数実行後には 戻り値に化ける
したがって,変数 len には, 関数内で算出されたベクトルの長さが代入される.(29行目)

●参考資料 - 情報工学実験 I(後期開講)の 補足資料:関数が分からない人へ