プログラミング基礎演習

鹿児島大学
プログラミング基礎演習
第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;
}