第 8 回 - 構造体(2)

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

例題 1

2 次元のベクトルを表現するための構造体 vector を定義しなさい.
そして,その内容を
(x, y)
のかたちで表示するための関数 printVector を作りなさい.
ただし,ベクトルの各成分は int 型とする.

コーディング例

     1	/*
     2	 * プログラミング演習 第 8 回
     3	 * [例題 1]
     4	 * (C) 2006 Hirohisa AMAN <aman@cs.ehime-u.ac.jp, aman@computer.org>
     5	 */
     6	#include <stdio.h>
     7	
     8	/* 構造体 vector の宣言 */
     9	struct vector {
    10	  int x;
    11	  int y;
    12	};
    13	
    14	/* ベクトル表示のための関数 */
    15	void printVector( struct vector v ){
    16	
    17	  printf("( %d, %d )\n", v.x, v.y );
    18	
    19	}
    20	
    21	int main(void){
    22	  struct vector data;
    23	
    24	  scanf("%d %d", &data.x, &data.y);
    25	
    26	  printVector(data);
    27	
    28	  return 0;
    29	}
     
※左端の数字は行番号であり,ソースコードには含まれない点に注意!

コンパイル & 実行例

     $ gcc example8_1.c [Enter]
     $ ./a.out [Enter]
     3, 12 [Enter]
     ( 3, 12 )
     

解説

まず,構造体(新たに struct vector という型)を宣言します:
     8	/* 構造体 vector の宣言 */
     9	struct vector {
    10	  int x;
    11	  int y;
    12	};
    
次に,目的の関数 printVector を作ります:
    15	void printVector( struct vector v ){
    16	
    17	  printf("( %d, %d )\n", v.x, v.y );
    18	
    19	}
     
内容は非常にシンプルです.
関数 printVector を呼び出す時に struct vector 型の変数がカッコ内に指定される ものとしておきます. ここではその変数の名前を 仮に v として おきます. (※既に知っていると思いますが, これを 仮引数(かりひきすう) といいます.)
この場合,ベクトルの各要素は v.x と v.y になりますので, これらを目的のかたちで出力するコードを書いています.

main 関数の中では data という名前でベクトルを用意し, その各要素に整数を読み込んでいます:

    22	  struct vector data;
    23	
    24	  scanf("%d %d", &data.x, &data.y);
     
scanf で読み込む場合,変数名の前に &(アンパサンド)が付くのを忘れないようにして下さい.

最後に自作した関数 printVector を呼び出して, data の内容を目的のかたちで表示させます:

    26	  printVector(data);     
     
この際, data の内容が関数の中では v へコピー されます. つまり,関数の中で「仮に v としていた」ところが,「実際には data となる」わけです. (※これも知っていると思いますが,data の方を 実引数(じつひきすう) といいます.)