C言語講座第5回 2017 構造体
構造体とは... 異なる型の値をまとめて 1つの新しい型とする機能. 次ページの例を見てみよう. ポイント: •複数の変数を1つのまとまりにできる. •同じ型の変数をまとめる配列と違って, 異なる型のデータをまとめられる. 次ページの例を見てみよう.
例えば, … 車のナンバー(int)やガソリン(double) といった異なる型のものをまとめ, 車という新しい型とする. (構造体の要素/メンバ) ナンバー(int) 車という構造体 ガソリン(double) 車種(char) …
構造体の書き方 struct 構造体の名前{ }; mainの外で定義する.(大抵mainの上) 構造体の名前は何でもよい. メンバ変数(作りたい型の中身) }; mainの外で定義する.(大抵mainの上) 構造体の名前は何でもよい. セミコロンをつける.
独自に定義したstruct car型の変数を 構造体の例 struct car{ int num; //車のナンバー double gas; //車のガソリン }; int main(){ struct car benz; benz.num=3421; benz.gas=18.5; struct car audi; audi.num=5786; audi.gas=23.4; } ここで実際にstruct car型の benzという構造体を作っている. ドット演算子を使うと, 構造体の各要素に アクセスできる. 構造体変数名.メンバ ※ 独自に定義したstruct car型の変数を 簡単に量産できる.
typedef struct car Car; ※ 前ページの※において, 毎回struct carと書くと大変なので, struct carの定義後に, typedef struct car Car; のように書いて, struct carをCarで代用しましょう.
typedef使用例 struct car{ int num; //車のナンバー double gas; //車のガソリン }; typedef struct car Car; int main(){ Car benz; benz.num=3421; benz.gas=18.5; Car audi; audi.num=5786; audi.gas=23.4; }
演習1 名前(char),歳(int),体重(int),身長(double)を要素にもつ 構造体struct humanを定義し, human型配列hito[3]を宣言したのち, 名前にはそれぞれa,b,cを, それ以外の要素には乱数を代入しなさい. また,次ページの実行結果のように a,b,cの全要素を表示させるプログラムを作成しなさい. (hito[3]の各要素への代入はfor文を使い, nameの代入はname=‘a’+i;とするとよい. また,0以上1以下の一様乱数(double)は (double)rand()/RAND_MAX)で作成できる.)
実行結果 このような 実行結果にしてください. 乱数の値の範囲は 自由に設定してOKです.
解答例 #include<stdio.h> #include<stdlib.h> #define N 3 struct human{ char name; int age; int weight; double height; }; typedef struct human Human; int main(){ Human hito[N]; int i; for (i = 0; i < N; i++){ hito[i].name = 'a' + i; hito[i].age = rand() % 101; hito[i].weight = 40 + rand() % 51; hito[i].height = 120 + 80 * (double)rand() / RAND_MAX; } printf("%cさん,%d歳,%dkg,%.1lfcm\n", hito[i].name,hito[i].age,hito[i].weight,hito[i].height); return 0;
演習2 演習1で作成したプログラムに, 一番背の高い人を調べる関数を追加し, その結果をmain()内で表示させなさい.
解答例 int main(){ ・ ・(演習1と同じなので割愛) printf("\n"); Human x; tall(hito, &x); printf("一番背が高いのは,%cさん,%d歳,%dkg,%.1lfcm\n", x.name, x.age, x.weight, x.height); return 0; } void tall(Human *p, Human *max){ (*max).height = 0; for (int i = 0; i < N; i++){ if ((*max).height < p[i].height){ *max = p[i]; #include<stdio.h> #include<stdlib.h> #define N 3 struct human{ char name; int age; int weight; double height; }; typedef struct human Human; void tall(Human *p, Human *max);
最後に struct human{ char name; int age; int weight; double height; }; struct student{ struct human who; char num[8]; 構造体の要素に 構造体を入れることもできる. (右の例でstruct studentは struct humanの要素の他に char[8]の学生証番号をもつ) C++では「クラス継承」によって より楽で安全に 同様(orそれ以上)の仕様を定義できる. お楽しみに? お疲れさまでした!!!