鹿児島大学 プログラミング基礎演習 第10回 構造体 半田利弘 鹿児島大学 大学院理工学研究科 物理・宇宙専攻 理化学研究所 配列(復習) ▶ 同じ型の変数の組 ■ 順番が付いている ▶ C言語での表現方法 ■ 配列の各要素 aa[0], aa[1], aa[2],… 番号は0から始まることに注意! ■ 配列全体 aa 理化学研究所 ▶ 配列:同じ型の変数をセットで使える 構造体 ▶ 異なる型のデータをワンセットで扱う ■ ■ 「定食」「セットメニュー」 構造体のメンバー:セット中の単品のこと ライス 味噌汁 割り箸 トンカツ 理化学研究所 トンカツ定食 構造体のメンバー ▶ 任意の型をメンバーにすることができる ■ int, char, long, float 理化学研究所 総理大臣の構造体 List10-1(教科書p.243) #include <stdio.h> #include <string.h> struct souri { int rekidai; char name[20]; int ninki; int looks; }; int main(void); void print_souri(struct souri s); int main(void) { struct souri ito, kuroda; ito.rekidai=1; strcpy(ito.name,"Ito Hirobumi"); ito.ninki=100; ito.looks=85; kuroda.rekidai=2; strcpy(kuroda.name,"Kuroda Kiyotaka"); kuroda.ninki=90; kuroda.looks=95; print_souri(ito); print_souri(kuroda); return(0); } void print_souri(struct souri s) { printf("%d代総理大臣\n",s.rekidai); 理化学研究所 printf("人気=%d, ルックス=%d",s.ninki,s.looks); printf("合計=%d\n\n",s.ninki+s.looks); return; } 構造体の定義 構造体であること 構造体の種類名(構造体タグ) List10-1(教科書p.243) struct souri { int rekidai; char name[20]; int ninki; int looks; }; メンバーの名前と型を宣言 構造体の中身を定義 理化学研究所 構造体変数 ▶ 構造体タグを変数の型名にできる ■ あとは普通の変数と同じように書けば良い 構造体の種類名(構造体タグ) struct souri ito, kuroda; 構造体である変数名 理化学研究所 構造体のメンバー ▶ 構造体変数とメンバー名を「.」でつなぐ ■ 通常の変数と同じになれば同じに扱える 文字列複写関数 ito.rekidai=1; strcpy(ito.name,"Ito Hirobumi"); ito.ninki=100; ito.looks=85; kuroda.rekidai=2; strcpy(kuroda.name,"Kuroda Kiyotaka"); ito.ninki=90; ito.looks=95; 理化学研究所 文字列の複写 ▶ 文字列=文字の配列 ■ 1文字ずつ代入しても良い strcpy(ito.name,"Ito Hiro"); ito.name[0]='I'; ito.name[1]='t'; ito.name[2]='o'; 最後はNULL文字 ito.name[3]=' '; (文字列の終識別) ito.name[4]='H'; ito.name[5]='i'; ito.name[6]='r'; ito.name[7]='o'; ito.name[8]=NULL; 理化学研究所 文字列の複写 ▶ こんな裏技 strcpy(&(ito.name[0]),"Ito Hiro"); ■ 「文字位置[0]から複写」となる 「n文字目からの複写」とできる ■ 型宣言 <string.h> ■ 理化学研究所 配列の構造体メンバー ▶ 文字列と同じく、配列もメンバーにできる struct souri { int rekidai; char name[20]; int point[5]; } 配列 理化学研究所 総理大臣の構造体 List10-1(教科書p.243) #include <stdio.h> #include <string.h> struct souri { int rekidai; char name[20]; int ninki; int looks; }; int main(void); void print_souri(struct souri s); int main(void) { struct souri ito, kuroda; ito.rekidai=1; strcpy(ito.name,"Ito Hirobumi"); ito.ninki=100; ito.looks=85; kuroda.rekidai=2; strcpy(kuroda.name,"Kuroda Kiyotaka"); kuroda.ninki=90; kuroda.looks=95; print_souri(ito); print_souri(kuroda); return(0); } void print_souri(struct souri s) { printf("%d代総理大臣\n",s.rekidai); 理化学研究所 printf("人気=%d, ルックス=%d",s.ninki,s.looks); printf("合計=%d\n\n",s.ninki+s.looks); return; } 構造体の配列 ▶ 構造体も配列にできる struct tontei { int ライス; int 味噌汁; int トンカツ; char 割箸;} struct tontei lunch[4]; 理化学研究所 トンカツ定食[0] トンカツ定食[1] トンカツ定食[2] トンカツ定食[3] 構造体の初期化 ▶ 型宣言の際に初期値を代入できる struct souri { int rekidai; char name[20]; 「配列の初期化」と似た記法 int ninki; int looks; } struct souri ito={1,"Ito Hirobumi", 100, 85}; 理化学研究所 構造体メンバーが構造体!? ▶ 問:構造体は構造体のメンバーにできるか? ▶ 答:できる struct seiseki { int ninki; int looks; } struct souri { int rekidai; char name[20]; struct seiseki point; } メンバーである構造体 理化学研究所 構造体のメンバー ▶ 配列もメンバーにできる ■ 「トンカツの皿」も構造体 トンカツとキャベツと付け合わせ キャベツ トンカツ 理化学研究所 多重構造体へのアクセス ▶ 普通に重ねれば良い struct seiseki { int ninki; int looks; } struct souri { int rekidai; char name[20]; struct seiseki point; } ito; ito.point.ninki=100; ito.point.looks=85; メンバーのメンバー 理化学研究所 総理大臣の構造体 多重構造体を用いた例 #include <stdio.h> #include <string.h> struct seiseki { int ninki; int looks; }; struct souri { int rekidai; char name[20]; struct seiseki point; }; int main(void); void print_souri(struct souri s); int main(void) { struct souri ito, kuroda; ito.rekidai=1; strcpy(ito.name,"Ito Hirobumi"); ito.point.ninki=100; ito.point.looks=85; kuroda.rekidai=2; strcpy(kuroda.name,"Kuroda Kiyotaka"); kuroda.point.ninki=90; kuroda.point.looks=95; print_souri(ito); print_souri(kuroda); return(0); } void print_souri(struct souri s) { printf("%d代総理大臣\n",s.rekidai); 理化学研究所 printf("人気=%d, ルックス=%d", s.point.ninki,s.point.looks); printf("合計=%d\n\n",s.point.ninki+s.point.looks); return; } 構造体タグの変数型化 ▶ 構造体タグを新たな変数型として定義 ■ structと書かなくても良くなる 「変数型の定義」の意味 typedef struct souri { int rekidai; 新たに定義された「変数型」 char name[20]; int ninki; 初期化する場合 int looks; } Souri; Souri ito={1,"Ito Hirobumi", 100, 85}; 理化学研究所 typedefの使用例 変数型Souriの使用例 #include <stdio.h> #include <string.h> struct seiseki { int ninki; int looks; }; typedef struct souri { int rekidai; char name[20]; struct seiseki point; } Souri; int main(void); void print_souri(Souri s); int main(void) { Souri ito, kuroda; ito.rekidai=1; strcpy(ito.name,"Ito Hirobumi"); ito.point.ninki=100; ito.point.looks=85; kuroda.rekidai=2; strcpy(kuroda.name,"Kuroda Kiyotaka"); kuroda.point.ninki=90; kuroda.point.looks=95; print_souri(ito); print_souri(kuroda); return(0); } void print_souri(Souri s) { printf("%d代総理大臣\n",s.rekidai); 理化学研究所 printf("人気=%d, ルックス=%d", s.point.ninki,s.point.looks); printf("合計=%d\n\n",s.point.ninki+s.point.looks); return; }
© Copyright 2024 ExpyDoc