第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; }
© Copyright 2024 ExpyDoc