プログラミング基礎覚え書き⑨(構造体struct)

 リポDで頑張っているけど、本当に辛い。なんかレヴィ=ストロースみたいなやつ出てきた(´;ω;`)

参考文献:高橋麻奈著『やさしい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;
}
Calendar
<< November 2020 >>
SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930
search this site.
tags
archives
recent comment
recent trackback
others
にほんブログ村 科学ブログへ にほんブログ村 科学ブログ 恐竜へ カウンター
admin
  • 管理者ページ
  • 記事を書く
  • ログアウト