条件分岐で判定を加える

  • by

日本肥満学会の定めた基準では 、18.5未満が「低体重」で18.5以上25未満が「普通体重」、25以上が「肥満」となり、さらにその度合いによって「肥満1」から「肥満4」に分類される。以前for文で作った関数BodyMassIndex3.mを基に、条件分岐で低体重の人のBMI値の横に「低体重」、肥満の人の横に「肥満」と表示されるようにしてみる。

BMIと肥満の判定
BMIが25以上を肥満とされる。

BMI判定
18.5未満低体重
18.5以上25未満普通体重
25以上30未満肥満1度
30以上35未満肥満2度
35以上40未満肥満3度
40以上肥満4度

関数名を変えて保存
ファイルを開いたら、関数名をBodyMassIndex4(data)に変更して、BodyMassIndex4.mという名称で保存する。ifからendまでを編集して以下のように完成させる。
※変数arrayは事前に読み込んでおく。

function BodyMassIndex4(data)

name = { 'Aさん' 'Bさん' 'Cさん' 'Dさん' 'Eさん' };

for num = 1:5
    bmi = data(1,num)/(data(2,num)/100)^2;
      if (bmi <= 18.5)
         fprintf(1, '%s: %.1f痩せ \n', char(name(num)), bmi);
      elseif (bmi >= 25)
         fprintf(1, '%s: %.1f肥満 \n', char(name(num)), bmi);
      else
         fprintf(1, '%s: %.1f \n', char(name(num)), bmi);
      end
end

if文で条件分岐を設定
基本的なif文の書き方は、関係演算子、論理演算子を用いた条件式を判断して、2分岐選択制御を行う。処理結果の出力設定部分をifとendで挟み、ifに続けて条件式を丸括弧内に書く。

if ( 条件式 )
 条件式に当てはまる場合、trueのとき実行する処理
else
 条件式に当てはまらない場合、falseのとき実行する処理
end

具体的には、条件はbmiを18.5以下に設定。当てはまらない場合は「痩せ」も「肥満」も表示しないので、以下のように計算式の上にelse、下にendを追加する。

if (bmi <= 18.5)
else
fprintf(1, '%s: %.1f \n', char(name(num)), bmi);
end

続いて、条件式に当てはまらない場合に実行する処理を追加する。計算式をコピーしてifとelseの間にペーストし、BMI値を表示した後ろに「痩せ」と書く。

if (bmi <= 18.5)
fprintf(1, '%s: %.1f痩せ \n', char(name(num)), bmi);
else
fprintf(1, '%s: %.1f \n', char(name(num)), bmi);
end

「肥満」の設定を追加する。ifと「痩せ」を書いた2行の計算式をコピーして、elseの上にペーストする。ifを「elseif」、条件式を「25以上」に書き換え、痩せを「肥満」に書き換えれば、最初に示したプログラムが完成する。elseifは、条件式を判断して多分岐選択制御を行う。

if (bmi <= 18.5)
fprintf(1, '%s: %.1f痩せ \n', char(name(num)), bmi);
elseif (bmi >= 25)
fprintf(1, '%s: %.1f肥満 \n', char(name(num)), bmi);
else
fprintf(1, '%s: %.1f \n', char(name(num)), bmi);
end

コマンドウィンドウに「BodyMassIndex4(array)」と打ち込み実行する。

>> BodyMassIndex4(array)
Aさん: 23.0
Bさん: 18.4痩せ
Cさん: 22.0
Dさん: 27.0肥満
Eさん: 23.8

関係演算子(relational operator)

 演算子 意味使用例
  > より大きいif (a > b)
  >= 以上if (a >= b)
  < より小さいif (a < b)
  <= 以下if (a <= b)
  == 等しいif (a == b)
  ~= 等しくないif (a ~= b)

論理演算子(logical operator)ショートサーキット
論理演算子は左から右へ評価され、左辺を評価した時点で論理式の結果が確定した場合には右辺の評価を行わない。これをショートサーキット評価という。例えば、「a && b」という論理式があったとき、aがfalseならその時点で結果が確定するのでbのチェックは行わない。

 演算子意味使用例
  &&論理AND(かつ)if (a > 0 && b > a)
  ||論理OR(または)if (a > 0 || b > 0)
  ~否定(ではない)if (~a) 

上記、BodyMassIndex4.mの場合、BMI値18.5以上25未満の人だけに「普通」と付けるときは、条件式を変更して「痩せ」を「普通」に変更してelseifの1組の行を削除する。関数をBodyMassIndex5(data)に変えBodyMassIndex5.mにファイル名を変えて以下のように作業する。

function BodyMassIndex5(data)

name = { 'Aさん' 'Bさん' 'Cさん' 'Dさん' 'Eさん' };

for num = 1:5
    bmi = data(1,num)/(data(2,num)/100)^2;
       if (bmi >= 18.5 && bmi <= 25)
          fprintf(1, '%s: %.1f普通 \n', char(name(num)), bmi);
      else
         fprintf(1, '%s: %.1f \n', char(name(num)), bmi);
     end
end

コマンドウィンドウに「BodyMassIndex5(array)」と打ち込み実行する。

>> BodyMassIndex5(array)
Aさん: 23.0普通
Bさん: 18.4
Cさん: 22.0普通
Dさん: 27.0
Eさん: 23.8普通