12. その他の型(3/4)
12.4 typedef
typedefはユーザ定義の型を作成するのに使用します。型を作成するといっても、既存の型に独自の型名を付けることと、既存の型を組み合わせたもの(構造体や共用体、等)に型名を付けることが出来るということで、まったく新しい型を作るということではありません。
構造体や共用体を使う場合、structやunionといった型指定子を指定しなければなりませんが、これが結構煩わしく感じるかもしれません。こういった場合、構造体や共用体にtypedefで型名を与えておけば、コーディングが楽になりますし、プログラムも理解しやすいものになります。
12.4.1 形式
typedefは既存の型名に対して独自の型名をつけます。既存の型として、構造体や共用体などを指定することも出来ます。
typedef 既存の型名 新しい型名;
- typedef
- 新しい型名を宣言するための型指定子です。
- 既存の型名
- C言語の仕様として定義されているint型やdouble型はもちろん、構造体や共用体なども指定できます。
- 新しい型名
- 上記、既存の型名に付ける型名です。
12.4.2 例題
肥満度を計算して正常・異常を判定して結果を出力します。肥満度情報を格納する構造体に対して、typedefでBMIという型名を宣言しています。
#include <stdio.h>
/* 肥満の状態を表すフラグ */
enum judge_type
{
BMI_NORMAL, /* 正常 */
BMI_UNDER, /* 低い */
BMI_OVER, /* 高い */
BMI_ERROR /* 判定不可 */
};
/* 肥満度データを格納する構造体(型名はBMI) */
typedef struct
{
int number; /* 番号 */
double weight; /* 体重 */
double height; /* 身長 */
double bmi; /* 肥満度 */
enum judge_type judge; /* 肥満状態 */
} BMI;
int main(void)
{
BMI bmi_data;
int return_code = 0;
/* CalcBmiEx関数のプロトタイプ宣言 */
void CalcBmiEx(BMI *Bmi);
printf("肥満度(BMI)の計算を行います\n");
printf("体重(kg)と身長(cm)を入力してください ==> ");
scanf("%lf%lf", &bmi_data.weight, &bmi_data.height);
CalcBmiEx(&bmi_data);
printf("肥満度は%.2fです。", bmi_data.bmi);
switch(bmi_data.judge)
{
case BMI_NORMAL:
printf("正常です。\n");
break;
case BMI_UNDER:
printf("低すぎます。\n");
break;
case BMI_OVER:
printf("高すぎます。\n");
break;
default:
printf("判定出来ません。\n");
return_code = 1;
}
return return_code;
}
/* 体重と身長を元に肥満度(BMI)の計算を行い、正常かどうかの判定を行う*/
void CalcBmiEx(BMI *pBmi)
{
double height;
/* 体重と身長の値をチェック */
if (pBmi->weight > 0.0 && pBmi->height > 0.0)
{
/* 身長をセンチメートルからメートルに変換 */
height = pBmi->height / 100.0;
/* 肥満度(BMI) = 体重(kg) / 身長(m) / 身長(m) */
pBmi->bmi = pBmi->weight / height / height;
/* 肥満度が18.5〜25.5の範囲であれば正常 */
if(pBmi->bmi >= 18.5 && pBmi->bmi <= 25.0)
{
pBmi->judge = BMI_NORMAL; /* 正常 */
}
else
{
if(pBmi->bmi > 25.0)
{
pBmi->judge = BMI_OVER; /* 高い */
}
else
{
pBmi->judge = BMI_UNDER; /* 低い */
}
}
}
else
{
pBmi->bmi = 0.0;
pBmi->judge = BMI_ERROR;
}
return;
}
$ ./ex12_3.prg
肥満度(BMI)の計算を行います
体重(kg)と身長(cm)を入力してください ==> 67.5 188
肥満度は19.10です。正常です。
$
$ ./ex12_3.prg
肥満度(BMI)の計算を行います
体重(kg)と身長(cm)を入力してください ==> 81.5 165.5
肥満度は29.76です。高すぎます。
$
- 11〜18行目
- typedefを使って肥満度情報を格納する構造体に対して、BMIという型名を宣言します。以降、この構造体はBMIという型名を指定するだけで使用出来ます。なお、構造体型名を使うことはないため、省略しています。
- 22行目
- 型名BMIを使用して、肥満度情報を格納するための変数bmi_dataを宣言します。型指定子のstructを指定していない点に注目してください。
- 25行目
- CalcBmiEx関数の関数プロトタイプ宣言ですが、引数の型名をBMIにします。
- 53行目
- 以降、CalcBmiEx関数の定義ですが、こちらも引数の型名をBMIにします。