document

第9章
ユーザが作成するデータ型
リスト 構造体を使わないプログラム
#include <stdio.h>
#include <string.h> /* for strcpy() */
void dataout(cahr *name, int wgt, int hgt);
int main(void)
{
char name[40];
int height, weigh;
char wk_name[40];
int wk_height, wk_weight;
strcpy(name, “田中一郎”); ー名前設定
height = 180;
ー身長設定
weight = 70;
ー体重設定
strcpy(wk_name, name);
wk_height = height;
wk_weight = weight;
-作業用変数にコピー
dataout(wk_name, wk_height, wk_weight); ー内容表示
return 0;
}
void dataout(char *name, int hgt, int wgt) ー3つの引数を使う
{
printf(“名前 =%s\n”, name);
printf(“身長 =%d\n”, hgt);
printf(“体重 =%d\n”, wgt);
}
リスト 構造体を使ったプログラム
#include <stdio.h>
#include <string.h> /* for strcpy() */
struct person {
char name[40];
int height;
int weight;
};
ーまずpersonという名前の構造体型を
記述しておく
void dataout(struct person psn);
int main(void)
{
struct person dt, wk_dt;
ーそのperson方をもつ変数を
ふたつ宣言
strcpy(dt.name, “田中一郎”);
dt.height = 180;
dt.weight = 70;
ー名前設定
ー身長設定
ー体重設定
wk_dt = dt;
ー作業用変数にコピー
dataout(wk_dt);
ー内容表示
return 0;
}
void dataout(struct person psn)
ーひとつの引数でよい
{
printf(“名前 =%s\n”, psn.name);
printf(“身長 =%d\n”, psn.height);
printf(“体重 =%d\n”, psn.weight);
}
構造体を使うと便利になる
(1)まずstruct person {…}という構造体を記述しておく
ことで・・・
(2)変数宣言がstruct person dt, wk_dt;のように簡単
になった
(3)データコピーがwk_dt=dt;で一括処理された
(4)関数の引数がdataout(wk_dt);のように単一引数
ですんだ
構造体の宣言
struct 構造体名 {
必要な変数宣言の並び
};
宣言した構造体型の変数の宣言
struct 構造体名
変数名の並び;
◆person型の構造体の構成◆
struct person型の変数dtの構成
dt name [40]
height
身長(int)
weight
体重(int)
名前(char[])
メンバアクセス演算子
変数実体を操作するとき
→”.”を使う(通称ドット演算子)
ポインタで操作するとき
子)
→”->”を使う(通称アロー演算
◎構造体の配列
struct person dt[10];
strcpy(dt[1].name, “田中一郎”);
dt[1].weight = 70;
dt[1].height = 180;
dt[5] = dt[1];
ー配列を宣言
要素1に設定する
ー配列要素間でコピー
printf(“%s %d %d\n”, dt[5].name, dt[5].weight, dt[5].height);
ー出力は “田中一郎 70 180”
リスト 構造体を引数と戻り値にする
#include <stdio.h>
struct myst {
int d1, d2;
};
ーこの構造体を使う
struct myst myst_bai(struct myst n);
int main(void)
{
struct myst a, b = {111, 333};
a = myst_bai(b);
ー構造体bの値を2倍してaに代入
printf(“a.d1=%d a. d2=%d\n”, a.d1, a.d2); -内容を表示
return 0;
}
struct myst myst_dai(struct myst n)
{
struct myst wk;
wk.d1 = n.d1 * 2;
wk.d2 = n.d2 * 2;
return wk;
}
ー構造体nの各メンバ値を
2倍して返す
◆構造体メンバの指定◆
変数名で操作するとき
変数名.weight = 70;
ポインタで操作するとき
ポインタ名->weight = 80;
リスト 共用体を使う
#include <stdio.h>
union myType {
char ch;
int n1;
int n2;
};
int main(void)
{
union myType dt;
ー共用体を宣言
ー共用体myType型の変数dtを宣言
dt.n1 = 0x41424344;
-n1に設定
printf(“dt.ch=%X\n”, dt.ch);
printf(“dt.n1=%X\n”, dt.n1); 3つのメンバ値を表示
printf(“dt.n2=%X/\n”, dt.n2);
return 0;
}
図9-1 共用体のメモリ配置図
メモリ内の値
44
dt.ch(char)
43
dt.n1(int)
dt.n2(int)
42
41
#define YES
#define NO
#define CANCEL
int ret;
ret = YES;
if (ret == YES)
1
2
3
記号定数を設定すると
このように表意的に記述できる
リスト 列挙型を使う
#include <stdio.h>
enum retType {YES, NO, CANCEL};ー列挙型のretTypeを宣言
int main(void)
{
enum retType ret;
-retType型のretを宣言
ret = YES;
-列挙定数を使用
if (ret == YES)
-YESなら
printf(“retはYESです\n”);
else if (ret == NO)
-NOなら
printf(“retはNOです\n”);
else if (ret == CANCEL)
-CANCELなら
printf(“ retはCANCELです\n”);
return 0;
}