1 いろいろなデータ構造

これまで3つのデータ構造を学習した。単純型と配列、構造体である。それぞれの概略は 以下の通り。

1.1 単純型

単純型の変数は、次のように変数に一つの数値2しか代入で きないものを言う。これを使う場合、以下のように宣言する。
	char c, h, moji;
	int i, j, seisu;
	double x, y, jisu;
これのイメージは、図2に示しているとおりで、変数とは数値を 入れる箱のようなものである。整数型と倍精度実数型の変数は、数学の変数とよく似てい る。
図 1: 単純型のイメージ。変数とはデータを入れる箱のようなもの。
\includegraphics[keepaspectratio, scale=0.8]{figure/image_variable.eps}

1.2 配列

順序づけられた同じ型のデータが複数ある場合、配列の出番となる。添え字(これが順序を表 す)により、それらにアクセスできるので、データの操作が簡単にできる。 配列を使う場合、
	int i[10], j[100][100];
のように宣言を行う。そうすると必要なメモリー領域が確保され、配列が使えるようにな る。この配列のデータにアクセスするためには、配列名と添え字を指定する。次のように である。
	i[3]=5;
	c=i[3];
図 2: 配列のイメージ。データを入れる箱がいっぱいある。ただし箱の大きさは全 て同じ。
\includegraphics[keepaspectratio, scale=0.8]{figure/image_array.eps}

1.3 構造体

1.3.1 構造体の概要

配列は同じ型のデータの集まりであったが、構造体は異なる型のデータの集まりである 3。この構造体を使う場合、
  1. 構造体のメンバーを規定する。これにより構造体を定義する。
  2. 構造体変数の宣言。これによりメモリーが確保される。
という手順が必要である。このようにして、構造体を定義し、メモリーを確保した後、そ れを使うことができる。今までは、データの型の内容があらかじめ決まっていたので、最 初の手順は不要であった。一方、構造体のメンバー、すなわちデータの型はプログラマーが 決めなくてはならないので、最初の手順が必要となる。

最初のメンバーの規定は、つぎのように行う。

	struct seito{
	  char name[128];
	  int kokugo;
	  int sansu;
	};
これでは、メモリーがまだ確保されていないことに注意が必要である。これは、プログラ マーが新たに変数を定義したのと同じである。

そして、この構造体を実際に使う場合には、次のようにしてメモリーを確保する。

	struct seito yamamoto, ninensei[50];
そうすると構造体変数が使用可能となる。

メモリーに確保された構造体のデータにアクセスするためには、ドット(.)演算子を 使うことになる。次のようにである。

	yamamoto.sansu = 63;
	ninensei[5].kokugo=76;
	tensu = ninensei[6].sansu;

1.3.2 構造体のイメージ

構造体を図に示すと図3の用になる。この場合構造体は
	struct kouzoutai{
	  char name[8];
	  int seisu;
	  double jisu;
	};
の用に定義し、
	struct kouzoutai a, b[10];
のように構造体変数を用意する。
図 3: 構造体のイメージ。データを入れるいろいろな大きさの箱がある。
\includegraphics[keepaspectratio, scale=0.8]{figure/image_structure.eps}

1.3.3 構造体型の定義

構造体は、メンバーと呼ばれる変数の集合体の型である。プログラマーが新たに型を定義 するようなものである。定義の方法は、一般的には次のようになる。
	struct タグ名 {
	  型 メンバー1名;
	  型 メンバー2名;
	  型 メンバー3名;
	  ・
	  ・
	  ・
	  型 メンバーN名;
	} 変数リスト;

例として学生の名前と成績、身長、体重を示した構造体を定義してみる。

	struct gakusei{
	  char name[80];
	  int mathematics;
	  int english;
	  int japanese;
	  int electrical_eng;
	  int info_eng;
	  double height;
	  double weight;
	} sato, tanaka, yamamoto;
これで、gakusei型の構造体変数のsatotanakayamamotoが使え るようになる。さらに、watanabeという変数を追加したい場合は、
	struct gakusei watanabe;
とすればよい。

1.3.4 構造体型のメンバーの参照

構造体のメンバーの参照には、.演算子 (ドット演算子)をつかう。次のようにする のである。
構造体変数.メンバー                           /* 通常 */
構造体変数.メンバー.メンバー                   /* メンバーが構造体 */
構造体変数.メンバー.メンバー.メンバー           /* メンバーのメンバーも構造体*/
構造体変数[配列の添え字].メンバー               /* 構造体が配列*/
構造体変数.メンバー[配列の添え字]               /* メンバーが配列*/
構造体変数[配列の添え字].メンバー[配列の添え字]   /*構造体もメンバーも配列*/

1.3.5 プログラム例

構造体を用いたプログラム例としてリスト1を示す。この内容をよく理 解する必要がある。
   1 #include <stdio.h>
   2 #include <string.h>
   3 
   4 struct seiseki{
   5   int mathematics;
   6   int english;
   7 };
   8 
   9 struct gakusei{
  10   char name[80];
  11   struct seiseki test;
  12   double height;
  13 };
  14 
  15 int main(void){
  16 
  17   struct gakusei e2[10];
  18 
  19   strcpy(e2[0].name,"yamamoto");
  20   e2[0].test.mathematics = 95;
  21   e2[0].test.english = 65;
  22   e2[0].height = 174.8;
  23 
  24   printf("%s\n", e2[0].name);
  25   printf("  Mathematics : %d\n", e2[0].test.mathematics);
  26   printf("  English     : %d\n", e2[0].test.english);
  27   printf("  Height      : %f [cm]\n", e2[0].height);
  28 
  29   return 0;
  30 }
\fbox{実行結果}
yamamoto
  Mathematics : 95
  English     : 65
  Height      : 174.800000 [cm]

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成17年10月27日


no counter