日常1(プロフィールの追加アプリ)

このページは[url=https://www.geogebra.org/m/ddm5798j]マス旅[/url]の一部です。[br][br]今回は、「プログラミングで脳トレ」の初回です。[br][br]身近なネタを使って、数学にも関係のある小物をプログラミングしてみよう。[br]数学もプログラミングも、ちょっとした脳トレの道具にできたらいいね。
1.BMIとか干支って話題に上ることってありませんか?
[size=150]ということで、お題は次の通り。[b][br][br][/b][size=200]課題:プロフィール追加アプリ[/size][color=#0000ff][br]詳細:[br]「身長(cm)、体重(kg)、和暦の生年月日(M/T/S/H/R yy/mm/dd)」[br]を入力すると、[br]「BMIと体型(低体重、標準、肥満度)、西暦の生まれ年、干支」[br]を表示してくれる。[br][/color][/size]
2.使う数学外の知識
#[b]BMI[/b][br]BMI=W(kg)/(H(m))^2[br][br]#[b]体型[/b][br]BMIから判定基準([b]日本肥満学会[/b])[br]18.5未満:低体重(やせ)[br]18.5〜25未満:普通体重(標準)[br]25〜30未満:肥満(1度)[br]30〜35未満:肥満(2度)[br]35〜40未満:肥満(3度)[br]40以上:肥満(4度)[br][br]#[b]西暦AD[/b]の生まれ年[br]M,T,S,H,R[br] ==>明治,大正,昭和,平成,令和[br]元年{1868,1912,1926,1989,2019[br]末   45 15 64 31 [br]末年 1912 1926 1989 2019[br][br]#[b]干支[/b][br]子(ね)、丑(うし)、寅(とら)、卯(う)、[br]辰(たつ)、巳(み)、午(うま)、未(ひつじ)、[br]申(さる)、酉(とり)、戌(いぬ)、亥(い)[br][br]西暦から3を引いて12で割った余りが1が子という人がいます。[br][br]以下が[b]子になる西暦[/b][br]1876年(明治9年)[br]1888年(明治21年)[br]1900年(明治33年)[br].....[br]
3.数学・言語・プログラミングの知識
#BMI計算[br]身長の入力が㎝なので、100で割ってから2乗して、体重を割る。[br]見やすくするために、四捨五入して小数第1の数にします。[br]xの小数第2位を四捨五入した値は、[b]floor[/b](10x+0.5)/10で求められるね。[br][br]#体型判断[br]Case文がないと、if-elseを入れ子にするのが普通の発想ですね。[br]しかし、判定基準の仕切りが[br][b]18.5以外は25,30、35、40と5刻み[/b]になっていることを活用したい。[br][b]5の倍数の判定境界値を5で割ると 5,6,7,8となる[/b]。[br]この特殊性に目をつけて、「[b]リスト的な発想」[/b]で取り組む。[br]体型ランクのリストを作る。[br]ランクに入れるためにはBMI値を5で割って切り捨てると、[br]たとえば、BMI=25.5なら[b]floor[/b](BMI/5)=5となり、インデックス5を指せる。[br][br]だから、最初から判定語(体型ランク)を9個作り、それが1から9の番号で指せるようにしよう。[br]もし、低体重なら無条件にインデックスは1で、[br][b]floor[/b](BMI/5)が9を超えないように最大値が9となるようにしたい。[br]そのため、9と比べて小さい方をインデックスにする。[br][b]「ガードの発想」[/b]ですね。[br][br]#西暦の生まれ年[br]和暦文字はM,T,S,H,Rを入れる。[br]X={"M","T","S","H","R"}を作っておけば、インデックスIdをみつけられます。[br][b]Idの和暦ごとのゼロ年の西暦Cがわかれば、[br]Cにyyをたせば生まれ年の西暦が出ます。[br][br][/b]C1={1868,1912,1926,1989,2019}[br]元年リストC1から1引いた0年リストC0を作れたら楽ですね。[br][br]#干支[br]西暦から3を引いて12で割った余りが1が子という人がいます。[br]というのは面倒ですね。[br](X-3)=1 mod 12 が子(1)[br]X=4 mod 12 のときのXが子(1)[br]Xを9増やすと巡回シフトする。[br]X=4+8≡0 mod 12 のときのXは申さる(9)[br]干支を申さる(9)スタートひつじ未(0)終わりにすると、[br]X(mod 12)で0スタート11エンドの繰り返しになります。[br]こうすれば、Xを12の倍数をスタートの周期にできますね。[br](脱線)[br]12=3×4で、下4桁が4の倍数で各位の和が3の倍数です。[br]西暦は18YY,19YY,20YYの3通りしかありません。[br]申年だけを知りたいとしましょう。[br]1+8=9は3の倍数だから、18YYのYYは12の倍数です。1896が最後の申年。[br]19YYのYYは4の倍数で3の倍数ー1。1992が最後の申年[br]20YYのYYは4の倍数で3の倍数ー2です。2004が最初の申年。
4.コード化
[b]<geogebraのアプレット>[/b][br][br][b]「要素を追加>geogebra>作成>関数グラフ」[br]数式ビューの入力...に[br]1行づつ貼り付けてEnter[br][/b][br]#[b]入力ボックスの挿入で、見出し、コントロール名を選びます[/b]。[br]それをInputBox(見出し、コントロール名)と表示しています。[br][color=#ff0000](InputBoxコマンドから入力するときは、コントロール名だけを引数にとるので、[br]見出しは設定の変更が必要になります。)[br][/color][br]H=180[br]W=70[br]Era="H"[br]YY=20[br]InputBox("身長(cm)",H)[br]InputBox("体重(kg)",W)[br]InputBox("和暦",Era)[br]InputBox("年YY",YY)[br]text0="「和暦」は明治はM,大正はT,昭和はS,平成はH、令和はRで、"[br]text1="「年YY」は、5年生まれならば05と入力してください。"[br][br][b]#計算部分[br][/b]BMI=((floor(10*((W)/((((H)/(100)))^(2)))+0.5))/(10))[br]BodyTypes={"低体重","標準","標準","標準","肥満1","肥満2","肥満3","肥満4","肥満4"}[br]BodyTypeIndex = if(BMI<18.5, 1,floor(BMI/5))[br]BodyType=Element(BodyTypes, min(BodyTypeIndex,9))[br]Eras={"M","T","S","H","R"}[br]base1={1868,1912,1926,1989,2019}[br]base0=base1-1[br]eraBase=Element(base0,IndexOf(Era,Eras))[br]YearAD=eraBase+YY[br]etos={"申(さる)","酉(とり)","戌(いぬ)","亥(い)",[br]"子(ね)","丑(うし)","寅(とら)","卯(う)",[br]"辰(たつ)","巳(み)","午(うま)","未(ひつじ)"}[br]etoId=Mod(YearAD,12)+1[br]eto=Element(etos,etoId)[br][br][b]#結果表示[br][/b]text2="あなたのBMI: "+BMI[br]text3="あなたの体型判定: "+BodyType [br]text4="西暦の生まれ年: "+YearAD[br]text5="干支: "+eto
プロフィール追加アプリ
[b][size=150]<Pythonへの移植コード>[br][/size][/b][br]jupyter notebook のセルにまるごと貼り付けて、Run。[br][br]# 入力ラインが表示される[br]H = float(input("身長(cm): "))[br]W = float(input("体重(kg): "))[br]Era = input("和暦(M/T/S/H/R): ").upper()[br]YY = int(input("年YY: "))[br][br]# 計算部分[br]BMI = round(W / ((H / 100) ** 2), 1)[br]BodyTypes = ["低体重", "標準", "標準", "標準", "肥満1", "肥満2", "肥満3", "肥満4", "肥満4"][br]if BMI < 18.5:[br] BodyTypeIndex = 0 # Pythonは0-indexed[br]else:[br] BodyTypeIndex = int(BMI // 5)-1[br]BodyType = BodyTypes[min(BodyTypeIndex, len(BodyTypes) - 1)][br]Eras = ["M", "T", "S", "H", "R"][br]base1 = [1868, 1912, 1926, 1989, 2019][br]base0 = [b - 1 for b in base1][br]eraBase = base0[Eras.index(Era)][br]YearAD = eraBase + YY[br]etos = ["申(さる)", "酉(とり)", "戌(いぬ)", "亥(い)",[br] "子(ね)", "丑(うし)", "寅(とら)", "卯(う)",[br] "辰(たつ)", "巳(み)", "午(うま)", "未(ひつじ)"][br]eto = etos[YearAD % 12][br][br]# 結果表示[br]print(f"\nあなたのBMI: {BMI}")[br]print(f"あなたの体型判定: {BodyType}")[br]print(f"西暦の生まれ年: {YearAD}")[br]print(f"干支: {eto}")

Information: 日常1(プロフィールの追加アプリ)