C言語応用 - 舟橋研究室

C言語応用
構造体
構造体
 構造体とは
構造体とは、いくつかのデータを「ひとまとめ」にした
データ構造である。
たとえば、学生の名前、身長、体重をひとつのデー
タとして扱いたい場合など。
構造体
氏名
身長
体重
構造体
 定義
struct gstudent {
char name[20];
int height;
float weight;
};
struct xyz a,b;
枠組みの宣言
struct gstudent {
char name[20];
int height;
float weight;
} a,b;
オブジェクトの定義
http://www.center.nitech.ac.jp/~sfukui/ouyou/list13-1.c
構造体
 メンバの表し方
複数のオブジェクトの集まりを扱うという性質上、配列と構
造体には、数多くの共通点がある。両者をまとめて集合体
と呼ぶ。
int a[3];
a[0]
a[1]
a[2]
変数名[添え字]
使用例
c.x = 5;
b = 3 + c.x;
struct xyz {
int
x;
long y;
double z;
} c;
c.x
c.y
c.z
変数名.メンバ名
構造体
 構造体と配列の類似点
構造体変数の初期化は、配列と同様に、{ }で初期
化子を囲んだものを与えることによって行う。
配列
int a[6] = {3,5,7,6,4,2};
構造体 struct xyz c = {15,100,10.5};
構造体
 配列化する
構造体も配列化
することができる。
struct xyz {
int
x;
long y;
double z;
} d[2];
c[0].x
c[0].y
c[0].z
c[1].x
c[1].y
c[1].z
構造体
 構造体と配列の相違点
配列は「同じ型」のデータの集合を効率よく表すための
データ構造である。一方、構造体は、一般には「異なる型」
のものの集合を効率よく表すデータ構造である。
配列の変数は、たとえ要素数が同じであっても、代入を行
うことはできない。しかし、同じ型の構造体は、代入を行う
ことができる。
配列
構造体
int a[6],b[6];
struct xyz a,b;
a = b; /* エラー */
a = b; /* OK */
http://www.center.nitech.ac.jp/~sfukui/ouyou/list13-2.c
構造体
 学生データの構造体とソート
学生の名前、身長、体重のデータをひとまとめ
にしたデータ構造を struct gstudent 型として宣言
し、身長順にソートを行うプログラムを考える。
http://www.center.nitech.ac.jp/~sfukui/ouyou/list13-3.c
構造体
 構造体とポインタ
ポインタで構造体を指すこともできる。
struct xyz {
int
x;
long y;
double z;
} a;
struct xyz *p;
p = &a;
(*p).x = 20;
(*p).y = 100;
(*p).z = 3.14;
or
p = &a;
p->x = 20;
p->y = 100;
p->z = 3.14;
http://www.center.nitech.ac.jp/~sfukui/ouyou/list13-4.c
構造体
 補足
構造体の変数の宣言において
struct xyz a;
sturct をいちいちつけるのは面倒であるので、
typedef struct
{
int x;
long y;
float z;
} xyz;
と宣言すれば、
xyz a;
として変数宣言ができる。
演習
 x座標およびy座標のペアとして構成される構造体 point
を定義せよ。(両座標は整数であるとする)。
 x座標およびy座標のメンバに値を設定し、その構造体を
返す関数
struct point pointof(int a,int b){ ・・・ }
を作成せよ。
 2つの座標 a,b間の距離を計算する関数
double distanceof(struct point a, struct point b){ ・・・ }
を作成せよ。