点の表現コーディングルール 一つとは限らない 例 直交座標系 ( 原点 O と、x 軸、y 軸の二本の直交軸を想定して x, y 座標で表現 ) 極座標系 ( 原点 O と 0 度方向の軸だけをきめ、原点から距離 r と、0 度軸との成す角度 a で表現 ) p1 現実 直交座標系 P -------------------------- P' \ ^ \ -------+ ^ | \ 可換 | | v \ <--- + v \ 原点対称R --------------------------- R' \ \ \ \ \ p'' \ ^ \ | \ v R'' 極座標系 構造体 : 複数のデータを一つにまとめる仕組 例 double 型の x とdouble 型の y をまとめて 一つの型(「点」)のデータして扱う場合 struct { double x; double y; } ( double 二つ : それぞれに x, y の名前 ) ( x, y を「タグ(tag)」と呼ぶ ) struct { double x; double y } p1; 構造体を使って、変数宣言ができる(「型」と同じ) p1 という変数は二つの変数 ( p1.x, p1.y ) の 対として宣言され、二つの double 型の値を保持 できる struct { double x; double y } p2; の時には、 p2 = p1; としても、 p2.x = p1.x; p2.y = p1.y; としても、結果は同じ。 <従来> double p1x; -> +--------+ double p1y; p1x| 1.0 | +--------+ p1x=1.0; p1y| -2.0 | p1y=-2.0; +--------+ <構造体> struct { double x; double y } p1; +-----------+ p1 | +------+ | p1.x=1.0 | x| 1.0 | | p1.y=-2.0 | +------+ | | y|-2.0 | | | +------+ | +-----------+ 複雑な例 sturct { char name; /* 点の名前 */ struct { double x; /* 点の x 座標 */ double y; /* 点の y 座標 */ } zahyo; } p1, p2; p1.zahyo.x /* 点 p1 の x 座標 */ p1.zahyo.y /* 点 p1 の y 座標 */ p1.name /* 点 p1 の 名前 */ typedef 型に新しい名前をつける仕組 typedef 型 新しい型名; 「新しい型名」だけで「型」と同様に扱われる 例 sturct { char name; /* 点の名前 */ struct { double x; /* 点の x 座標 */ double y; /* 点の y 座標 */ } zahyo; } p1; sturct { char name; /* 点の名前 */ struct { double x; /* 点の x 座標 */ double y; /* 点の y 座標 */ } zahyo; } p2; の代りに typedef sturct { char name; /* 点の名前 */ struct { double x; /* 点の x 座標 */ double y; /* 点の y 座標 */ } zahyo; } NamedPoint; NamedPoint p1; NamedPoint p2; struct { double x; double y } p; p.x = - p.x; 原点対称な位置に移動 p.y = - p.y; double tmp; tmp = p.x; x 座標と y 座標の交換 p.x = p.y; p.y = tmp; y = x に線対称な移動をする 配列 同じ型の複数の変数をまとめて一つの物として扱える cf. 構造体は、異る型でもよいが配列は同じ型のみ <従来> double a0, a1, a2; +------------+ a0 | | +------------+ a1 | | +------------+ a2 | | +------------+ double a[3]; /* [3] の 3 は 3 個 */ +------------+ a -> a[0] | | <- a[0] +------------+ a[1] | | +------------+ a[2] | | +------------+ sturct { double a0, a1, a2; } a; +------------------------+ | +------------+ | a | a0 | | | <- a.a0 | +------------+ | | a1 | | | | +------------+ | | a2 | | | | +------------+ | +------------------------+ a[添字] 添字 には、式がかける 式の値は実行時に決る <従来> double a0, a1, ..., a99; /* 全ての変数を 0 にしたいとすると.. ? */ a0 = 0; a1 = 0; ... a99 = 0; <配列> double a[100]; a[0] = 0; a[1] = 0; ... a[99] = 0; /* 変形 */ int i; /* 添字変数 */ i = 0; a[i] = 0; i = 1; /* i が 0 だったので i は 1 になる */ a[i] = 0; ... i = 99; a[i] = 0; /* 変形 */ int i; i = 0; a[i] = 0; i = i + 1; /* i が 0 だったので i は 1 になる */ a[i] = 0; ... i = i + 1; a[i] = 0; /* 変形 */ int i; i = 0; a[i] = 0; i = i + 1; /* i が 0 だったので i は 1 になる */ a[i] = 0; i = i + 1; ... a[i] = 0; i = i + 1; /* 最後は余分だがあえて、追加 */ /* 同じ命令列 a[i] = 0; i = i + 1; が 100 個並んでいる */ /* 同じ命令がくりかえされる場合は loop ( 再帰か、while ) を使え */ /* 変形 */ i = 0; while ( i < 100 ) { /* i が 0 から 99 なので.. */ /* i <= 99 ではなく i < 100 とするのは a サイズが 100 だから */ a[i] = 0; i = i + 1; }