参考文献:高橋麻奈著『やさしいC第5版』
構造体(struct構文)
文字型や数値型などの異なるデータ型の変数を、まとめてひとつの型として定義したもの。
これを使うと、車という構造体に、セダンやカローラのデータを入れたりと、図鑑的なデータベースが作れる。
メンバー
構造体の中に定義した変数はメンバーと呼ばれる。
構造体名 .(ドット) メンバー=そのメンバーに格納したい値 ;
でメンバーのデータを操作することができる。
名前、年齢、性別の3つのメンバーを持つ構造体Person
ただし性別は、男性=M、女性=Fと一文字に置き換える。
#include
struct Person //構造体personと3つのメンバーの宣言
{
char name[100];
int age;
char gender;
};
int main(void)
{
struct Person p1;
printf("名前を入力:");
scanf("%s", p1.name); //文字列では&はいらない!
printf("年齢を入力:");
scanf("%d", &p1.age);
printf("性別を入力:");
scanf("\n%c",&p1.gender); //一文字だけの場合は%c
printf
("{name=%s, age=%d, gender=%c}\n",p1.name,p1.age,p1.gender);
return 0;
}
書名、価格、ページ数の3つのメンバーを持つ構造体Book
聖書のデータを入れているんだけど、聖書って定価は1365円もするんだな・・・だいたい教会の人が「クイアラタメヨ!」ってタダでくれるからな(^_^;)
#include
typedef struct book
{
char title[ 20 ];
int value, pages;
} Book;
int main(void) {
Book book1 = { "Bible", 1365, 687 };
printf( "{title=%s,Value=%d,pages=%d}", book1.title, book1.value, book1.pages );
return 0;
}
3冊の書籍のデータを格納する構造体Book
さらにさっきの構造体のコードを改造して、3冊の本のデータを入力し、構造体の配列に格納できるようにしたもの。
typedef struct Book {
char title[100];
int value;
int pages;
} Book;
#include
int main(void){
Book p1[3];
int i;
for(i=0;i<3;i++){
printf("%d冊目タイトル\n",i+1);
scanf( "%s", p1[i].title );
printf("%d冊目ページ数\n",i+1);
scanf( "%d", &p1[i].pages );
printf("%d冊目価格\n",i+1);
scanf( "%d", &p1[i].value );
}
for(i=0;i<3;i++){
printf("{title=%s,value=%d,pages=%d}\n",
p1[i].title,p1[i].pages,p1[i].value);
}
return 0;
}
typedef構文
構造体の型名を短縮するために用いるキーワード。簡単に説明すると、構造体名にあだ名をつける感じ。
typedef 型名 識別子; の順で記述する。
typedef struct Car{
int num;
double gus;
}Car;
と書くと、struct Carという長い構造体名が、以降はCarだけで済むようになる。
構造体Personをさらにまとめる構造体Couple
構造体のネスト文を作る。
#include
//構造体struct Personをtypedef構文で構造体名をPersonに短縮。
typedef struct Person
{
char name[100];
int age;
char gender;
}Person;
//構造体struct Coupleをtypedef構文で構造体名をCoupleに短縮。さらに構造体personを構造体Coupleの中に取り込み。
typedef struct Couple
{
Person boy;
Person girl;
}Couple;
int main(void)
{
Person Ichiro = {"Ichiro",20,'M'};
Person hanako = {"Hanako",19,'F'};
Couple c1;
c1.boy = Ichiro;
c1.girl = hanako;
printf("Couple:\n");
printf(" boy:{name=%s, age=%d, gender=%c}\n",
c1.boy.name, c1.boy.age, c1.boy.gender);
printf(" girl:{name=%s, age=%d, gender=%c}\n",
c1.girl.name, c1.girl.age, c1.girl.gender);
return 0;
}
sizeof構文
データの大きさ(サイズ)を何バイトか計算する構文。
構造体のサイズは各メンバーのサイズの合計値か、それ以上となる(無駄なメモリの隙間パディングができることが多いため)。
#include
#define NUM 100 //☚マクロのこの数字(配列の要素数)を変えることでサイズも変わっていく。
typedef struct Person {
char name[NUM];
int age;
char gender;
} Person;
int main(void)
{
printf("%d, %d\n",NUM,sizeof(Person)); //Person構造体のサイズを計算したものを表示。
return 0;
}
構造体の配列のソート
任意のメンバー(ここでは年齢)でソートする。
#include
typedef struct Person {
char name[100];
int age;
char gender;
} Person;
int main(void)
{
int i,j;
Person tmp;
Person test[3] = { {"Ichiro",20,'M'},
{"Jiro",21,'M'},
{"Hanako",19,'F'} };
for(i=0; i<2; i++)
{
for(j=i+1; j<3; j++)
{if(test[i].age > test[j].age)
{
tmp = test[i];
test[i] = test[j]; //この3行が君の名は。
test[j] = tmp;
}
}
}
for(i=0; i<3; i++)
{
printf("{name=%s, age=%d, gender=%c}\n",
test[i].name, test[i].age, test[i].gender );
}
return 0;
}