前のプログラムでは、学生の体重がゼロになっていた。体重が不正(0以下)であれば、計算によって標準体重を代入するように変更してみよう。
なお、本プログラムは、Windows 11 Home(23H2)上で、 Visual Studio Code(1.90.2)を使用して作成し、gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0でコンパイルしている。
//学生の体重が不正であれば自動的に計算するプログラム
#include <stdio.h>
#define NAME_LEN 64
//学生を表す構造体
struct student
{
char name[NAME_LEN]; //名前
int height; //身長
float weight; //体重
};
//学生の体重が0以下であれば、標準体重を代入する
void set_stdweight(struct student *s)
{
if((*s).weight <= 0)
(*s).weight = ((*s).height - 100) * 0.9;
}
int main(void)
{
struct student michio = {"Michio",172};
set_stdweight(&michio); //標準体重を代入
printf("名前=%s\n",michio.name);
printf("身長=%d\n",michio.height);
printf("体重=%.1f\n",michio.weight);
return 0;
}
実行結果
名前=Michio
身長=172
体重=64.8
関数set_stdweightは、学生の体重を更新する必要があるので、仮引数が「struct student *型」のポインタである。
関数内では、身長、体重を
(*s).height
(*s).weight
でアクセスしている。
![](https://i0.wp.com/my-studies.org/wp-content/uploads/2024/07/8946b4cfd3beed5f5ba49881144526f0.png?resize=1024%2C741&ssl=1)
ポインタに間接演算子*を適用すれば、そのポインタが指すオブジェクトそのものを表す。
*sはmichioのエイリアスである。そのため、ポインタsが指すオブジェクト*sの身長と体重は、(*s).heightと(*s).weightでアクセスできる。
なお、(*s).heightや(*s).weightの表記では、( )の書き忘れなどが起こる。
そこで、->演算子(アロー演算子)を使うことで、ポインタが指すオブジェクトのメンバをアクセスする式を簡潔にできる。
s->height
s->weight
この式を使うと標準体重を求める関数は、
if(s->weight <= 0)
(s->weight = (s->.height - 100) * 0.9;
となる。
そして、全体のコードは次の通りとなる。
//学生の体重が不正であれば自動的に計算するプログラム(アロー演算子)
#include <stdio.h>
#define NAME_LEN 64
//学生を表す構造体
struct student
{
char name[NAME_LEN]; //名前
int height; //身長
float weight; //体重
};
//学生の体重が0以下であれば、標準体重を代入する
void set_stdweight(struct student *s)
{
if(s->weight <= 0)
s->weight = (s->height - 100) * 0.9;
}
int main(void)
{
struct student michio = {"Michio",172};
set_stdweight(&michio); //標準体重を代入
printf("名前=%s\n",michio.name);
printf("身長=%d\n",michio.height);
printf("体重=%.1f\n",michio.weight);
return 0;
}
実行結果
名前=Michio
身長=172
体重=64.8
(参考) 新・明解C言語 入門編 第2版 柴田 望洋 (著)SBクリエイティブ
コメント