Photo by
chakabe_okb
なでしこさんでBMIの計算
毎度おなじみ、日曜日が来てしまった。
ソレが始まるどころか終わってしまうが、今週も結局アレを書くための作業を怠ってしまった。
まあ、頭も使いたくないし雑プログラムで繋ぐか……
何を書こうかと思いながらSNSを見ていると、こんな投稿を見つけた。
えまってBMI配信で大声で話してたけど
— 結城さくな🎀🐾 (@yuki_sakuna) April 5, 2026
身長わかったら体重わかっちゃうじゃん
って起きて気づいたのだけど………
よし、今回のテーマはこれにしよう。
今回やったこと
なでしこで、BMIの計算を行う。
身長・体重・BMIのうち2項目を入力すると、残った項目を計算して表示する。
プログラム
BMI計算 (プログラム貯蔵庫)
ポイント
UIを用意する
「BMI計算」のラベル作成。
それの「文字サイズ」に「250%」をDOMスタイル設定。
改行作成。
「2項目入力すると、残りの項目を計算します。」のラベル作成。
改行作成。
「身長:」のラベル作成。
身長欄は空のエディタ作成。
「cm」のラベル作成。
改行作成。
「体重:」のラベル作成。
体重欄は空のエディタ作成。
「kg」のラベル作成。
改行作成。
「BMI:」のラベル作成。
BMI欄は空のエディタ作成。タイトルと、それぞれの項目の入力欄を用意する。
どこに入力したかの判別の準備をする
身長欄に1をDOMポケット設定。
体重欄に2をDOMポケット設定。
BMI欄に4をDOMポケット設定。
前回入力された欄は0。
今回入力された欄は0。それぞれの入力欄にビットを割り当て、どこに入力したかを判別できるようにする。
さらに、どこに入力したかを保存する変数も用意する。
計算を実行する
●(AとBが)有効とは
もし、AをNAN判定ならば、偽を戻す。
もし、Aが0以下ならば、偽を戻す。
もし、BをNAN判定ならば、偽を戻す。
もし、Bが0以下ならば、偽を戻す。
真を戻す。
ここまで。計算時、入力された値が有効かをチェックする関数を用意する。
面倒なので、2個まとめて判定するようにした。
●計算処理とは
定数の最新変化は対象のDOMポケット取得。
もし、それが今回入力された欄と等しく無いならば
前回入力された欄は今回入力された欄。
今回入力された欄は最新変化。
ここまで。今入力された欄のIDを取得し、それが前回と異なるなら、入力状況を更新する。
定数の身長は身長欄のテキスト取得して実数変換。
定数の体重は体重欄のテキスト取得して実数変換。
定数のBMIはBMI欄のテキスト取得して実数変換。
定数のメートル身長は身長を100で割る。複数の計算処理で使われる値を、共通の処理を行う部分で前もって計算しておく。
定数の入力された欄は前回入力された欄と今回入力された欄のOR。
もし、入力された欄が3と等しいならば
# 身長と体重からBMIを求める
もし、身長と体重が有効ならば
BMI欄に体重÷メートル身長÷メートル身長をテキスト設定。
違えば
BMI欄に「エラー」をテキスト設定。
ここまで。
違えば、もし、入力された欄が5と等しいならば
# 身長とBMIから体重を求める
もし、身長とBMIが有効ならば
体重欄にBMI×メートル身長×メートル身長をテキスト設定。
違えば
体重欄に「エラー」をテキスト設定。
ここまで。
違えば、もし、入力された欄が6と等しいならば
# 体重とBMIから身長を求める
もし、体重とBMIが有効ならば
体重÷BMIの平方根を100倍して身長欄にテキスト設定。
違えば
身長欄に「エラー」をテキスト設定。
ここまで。
ここまで。
ここまで。どの2個の欄に最後に入力したかに応じて、残りの欄の値を計算し、表示する。
入力時に計算をさせる
[身長欄, 体重欄, BMI欄]を反復
{関数}計算処理で対象の変更された時。
ここまで。それぞれの入力欄にイベントハンドラを設定し、値を入力 (後フォーカスを外し) た時に入力状態の更新や計算を行わせる。
おわりに
なでしこで、BMIの計算を行うことができた。
単に身長と体重からBMIを求めるだけではなく、任意の2項目から残りの項目を計算できるようにした。
しかし、BMI計算なんてよくあるテーマすぎる。貯蔵庫で「BMI」で検索した結果だけでも15個もあった。でもそんなの関係ねー!時事ネタなので……


コメント