#3-1 それなりに意味のあるプログラムを作ろう(前編)
前回までに作った、“Hello World”とただ画面に表示させるプログラム。本当に何の役にも立たないし、なんならWordなり何なりを開いて直接“Hello World”と打ち込んだ方が手間も少ない。
ということで、Hello Worldよりは少し役に立つプログラムを作ろうと思う。
何を作るか考えた結果、体育系大学院生らしく最高心拍数を求めるプログラムを作ることにした。今後いろいろと拡張できるテーマでもあるので。
最高心拍数とは?
運動すると心拍数は上昇する。1分間に心臓が拍動できる回数には限界があって、その限界値を“最高心拍数”という。この最高心拍数、年齢を重ねるごとにどんどん低下していくため、自分の最高心拍数を知ることは、運動強度を設定するための重要な指標になる。
最高心拍数を求める推定式として、「220-年齢」が一般的だけど、それだと電卓で計算したほうが早いじゃんということになるので、ここではアメリカスポーツ医学会(以下、ACSM)が提唱している「206.9-年齢×0.67」を使うことにする。
ソースコード
上記が、最高心拍数を求めるプログラムのソースコード。
今回は「中華名菜 酢豚」が工場で作られて料理になるまでと例えて、1行ずつ意味を見ていこう。
まず、ソースコードを中華名菜のレシピ風に書くとこんな感じ。今回から空白行は無視していく。
1 中華の道具一式を使います。
3 それでは調理を始めます。
4 セットには食材206.9gが含まれています。
5 セットには調味料0.67gが含まれています。
6 玉ねぎをお好みの個数用意してください。
7 完成する料理名は酢豚です(玉ねぎの個数によって完成する量は変化します)。
9 (もんちゃんへ)玉ねぎを何個入れるか聞いてね。
10 玉ねぎを入れてもらいます。
12 調味料と玉ねぎを絡めて、食材を入れて炒めると酢豚が完成します。
14 完成したことを知らせて、酢豚を食卓に並べます。
16 以上で調理は終了です。
1行目
料理のレシピ:「中華の道具一式を使います。」
ソースコード:「このプログラムを作るにはiostreamを使います。」
3行目
こいつも登場済み。プログラムの開始位置を知らせているので、こいつが無いと始まらない。
料理のレシピ:「それでは調理を始めます。」
ソースコード:「プログラムの開始位置はここですよ。」
4行目
「中華名菜 酢豚」には、豚肉・にんじん・たけのこなどの“具”パックと“甘酢ソース”パックが入っている。
4行目と5行目は材料を工場で加工してパックに詰め、そのパックに名前を付けていく作業。
constはconstantの略で、“不変の”という意味。ACSMが決めた最高心拍数の理論値は変わることが無いので、この値は変わることが無いよってことをコンピュータに教えている。
ちょっと無理やり中華名菜に例えると、この食材パックは全部使ってねという感じ。
その次のdoubleは倍という意味だけど、意味よりも機能の方が重要。その機能とは、数字が“整数なのか小数点を含んでいるのか”と“数字の大きさがどのくらいなのか”をコンピュータに教える機能。doubleは小数点を含んでいて、結構大きい値だよと教えている。
これを中華名菜に例えると、入れる食材に合わせてパックの種類と大きさを選んでいるイメージ。。
THEORETICAL_HRMAX = 206.9の部分は、酢豚を作るなら酢豚用の食材を必要量入れて“酢豚の具パック”と名前を付けるように、自分で入れる物と名前を自由に決めることができる。
今回はACSMが定めた最高心拍数の理論値を入れるので、THEORETICAL_HRMAXと名前を付けた。
以上で、酢豚の具材パック206.9gが完成。
5行目
4行目と同じ。ACSMが定めた係数0.67に“COEFFICIENT”と名前を付けて入れてやる。
6行目
6行目は家庭で玉ねぎを準備するイメージ。
年齢は人によって違うし、1年に1回必ず歳をとるので、後から入力する方が良い。
ソースコードを解説していくと、intはintegerの略で、整数という意味。これも4行目に出てきたdoubleと同じ機能を持っていて、intはその意味の通り、数字は整数で、最大億単位の大きさだよと教えている。
doubleやintには、他にも様々な種類があるので、それは後々解説する。
ageは4行目のTHEORETICAL_HRMAXなどと同じで、名前を自由に決めることができる。今回は年齢を入れるので、ageと名前を付けた。
6行目はこれで終了。
量が変わらないものはそのことをコンピュータに”const”を使って教えてやる必要があるのに、量が変わるものは変わることを教える必要が無いのは何とも不思議な話。
7行目
この行も料理のレシピだとかなりの違和感。
酢豚を作ろうとしているのに、完成する料理名は酢豚ってことを教えてやらなければいけない。この謎は12行目で何となく解決するはず。
計算式内には小数点を含むものがあるので、最高心拍数の計算結果も小数点を含む可能性がある。ということで、そのことをdoubleを使ってコンピュータに教えておく。
9行目
#2-4ではstd::coutとstd::endlをそれぞれ、中華用コンロと中華用皿と例えた。これは、“中華用の器具=iostream内の機能”と例えるための、かなり無理やりな表現。
iostreamの機能としては、キーボードからの入力と画面への出力。つまり、コンピュータの中のもんちゃんとやり取りするための機能。現実世界でもんちゃんと会話するためには、握手券が必要。そう、iostreamはコンピュータの中のもんちゃんと会話するための握手券というわけだ!
現実世界の握手券と違うのは、もんちゃんに喋ってもらうには“もんちゃんが喋る券”を、こっちからもんちゃんに喋りかけるには“喋りかける券”を使う必要があること。
そして、握手券を何回も使えること(コンピュータ内の握手券最高かよ…)。
つまり、9行目では“もんちゃんが喋る券”を一枚使って、「何歳?」と質問してもらっているわけだ。言葉はもんちゃんの口から発せられるので、
<< “How old are you? “
の「<<」を口だとイメージすると覚えやすい。
これまでの料理の例えだと、「玉ねぎ何個?」って聞いてくれる。
10行目
もんちゃんに質問されたら、答えない訳にはいかない。ってことで、“喋りかける券”を一枚使って年齢を答える。
こっちが喋りかけた言葉は、もんちゃんの耳に入るので、
>> age
の「>>」を耳だとイメージすると覚えやすい。
料理の例えだと、「玉ねぎは2個」と答えている。
12行目
玉ねぎの個数を指定したことで材料は全て揃ったので、後は調理の工程を書くだけ。
何を作るのか(=求める値。今回は最高心拍数)を指定してから、その作り方(数式)と材料(値)を指示する。7行目で「完成する料理名は酢豚です。」と書いたのは、先に何を作るのかを指定してやる必要があるから。
今回は「206.9-年齢×0.67」なので、ソースコード的には
hrmax = THEORETICAL_HRMAX - age * COEFFICIENT;
となる。
あれ、掛け算の記号(×)が文字化けしてない?
#2-1でしつこく説明したように、ソースコードは半角英数字で記述する。残念ながら半角英数字には「×」が存在しないので、その代わりに「*」を使う。
ちなみに割り算の記号(÷)の半角文字も存在しないんだけど、その説明は長くなるので後々。
14行目
コンピュータの中のもんちゃんはドSで、計算してもその結果は教えてくれない。
そこで、“もんちゃんが喋る券”を一枚使って、結果を知らせてもらう必要がある。計算結果を表示するだけなら
std::cout << hrmax …
でいいけど、数字だけ画面に表示されても何のことやらイマイチ分からないので、
“Your max HR is “の一言もついでに喋ってもらおう。
コンピュータの中のもんちゃんとの握手会には、剥がされるのにもそれ用の握手券が用意されていたりする。それが、#2-4で中華用の皿と表現された「std::endl」。
この行を料理の例えでまとめると、もんちゃんが「酢豚できたよ~」と言って、食卓に並べてくれる感じ。
16行目
これは、解説済み。
料理のレシピ:「これで調理は終了です。」
ソースコード:「これでプログラムは終了です。」
長くなったので、今回はここまで。
次回、それなりに意味のあるプログラムを作ろう(後編)に続く。