プログラミング的思考とは。エクセルで考える。以上・以下・未満の条件分岐。その4。

 プログラムのほとんどは if で出来ていると言ってイイ。「もし●●なら」の集合。

 例えば、下記の基準で100点満点のテストの採点を行うとする。

 100点:表彰と賞品あり。

 90点以上:表彰あり。

 80点以上:合格。

 70点以上:再試験。

 70点未満:お別れ会。

 得点をエクセルのC1セルに入力するとして、IF文の書式で言うと、

 IF(C1<70, "お別れ会" , "") //「<」は右側未満だから70点は含まない(演算子の説明)。

ということになるが、採点した行から削除していくという決まりの場合、上から下に処理すべきか、下から上に処理すべきか。1分ほど考えていただきたい。

/*
 その間、違う話をしよう。エクセルで「もし得点セルが100点なら」としたい時「IF(得点セル=100, , )」と書くが、プログラミングでは「=」は代入を意味し「得点セルを100点にする」と意味になってしまう。“等しい”という意味合いならば「==」と2つ書く(ほとんどの言語で)。そういった細かな違いはあっても、エクセルの関数を使いこなしていればプログラミングの入門〜初級編は余裕だと思ってイイ。「<」「>」「<=」「>=」などは同じ。
参考リンク:Excelで使う演算子の種類 | Excel関数 | できるネット
*/

 話は戻って、では下から順に処理してみよう。

 (1) IF(C1<70, "お別れ会。" , "")

 (2) IF(C1>=70, "再試験。" , "")

 (3) IF(C1>=80, "合格。" , "")

 (4) IF(C1>=90, "表彰あり。" , "")

 (5) IF(C1=100, "表彰と賞品あり。" , "")

 どうだろうか。何か変じゃないか。

 (1)は問題ない。しかし(2)で(1)以外の全部が該当してしまう。だから上(100点側)から順に処理する必要がある。

 PHPのコードなら(得点が変数 $ten に入力される場合)、

 if($ten == 100){print "表彰と賞品あり。";}
 elseif($ten >= 90){print "表彰あり。";}
 elseif($ten >= 80){print "合格。";}
 elseif($ten >= 70){print "再試験。";}
 else{print "表彰あり。";}

と書く。ifとelseifとelseは、もし(if)→じゃぁこれは?(elseif)→その他全部(else)という処理。プログラミングコードとは上から順に該当した時点でそれ以降は処理しないから、冒頭に書いた「採点した行から削除していくという決まり」というエクセルと同じ。

 エクセルでも同じように書けなくはないが長くなるので冒頭では書かなかった。

 =IF(C1=100, "表彰と賞品あり。", IF(C1>=90, "表彰あり。", IF(C1>=80, "合格。", IF(C1>=70, "再試験。", IF(C1<70, "お別れ会。", "?"))))) //C1セルに点数が入力されている場合。

という具合。条件式が真なら"文字列"を出力、偽なら次のIF文を評価する仕組み。

 最後の「?」は、点数が100点ではない、90点以上ではない、80点以上ではない、70点以上ではない、70点未満でもないとすれば何が考えられるだろうか。数字以外の文字が入力されている場合。

 しかし更に例外がある。101以上を入力した場合「表彰あり。」と表示される。最初が「100点なら」だから101点は該当せず、次の「90点以上なら」に該当するから。100点を超える点数を許さない場合は最初に if($ten > 100){print ”100点を超えています。このテストは100点満点です。”;) と例外処理を入れるのが一般的だろう。

 エクセルの解説・例題等で、IF(C1<70, "お別れ会。" , "") のところを「C1<=69」とする人も多い。その手前の「70点以上なら」は70点も含むから次は「69点以下なら」とした気持ちは解るが、「69.5」と入力すると宙ぶらりんになってしまう。

 これが前回書いた、「実際に入力作業を行う担当者の性格が几帳面であることを確定できない限り」という問題であり、また前々回書いた「店長の気まぐれ」を見越して対応するか否かの問題。この採点ケースでは教師が偶然目にした珍回答に対し「この解はおもしろい!正解じゃナイけど0.5点あげちゃう!」とならなくもない。だから得点に小数点が絶対ないと開発者側は先に(無断で)決定できない。

 ※プログラミングの場合は「型」問題があるからまたいつか。

 というわけで最後は「C1<70」の方が確実。この例では結果がお別れ会であることに代わりはないが(笑)。

 このように「以上」「以下」「未満」という言葉の意味が重要なことがわかる。同時に「●●以上でも●●以下でもない。●●そのものなのだ」という表現がおかしなことがわかる(笑)。●●を「100」に置き換え、これをif文で書くと(C1セルに100が入る)、

 =IF(C1>=100, "", IF(C1<=100, "", IF(C1=100, "100以上でも100以下でもない。100そのものなのだ。", "?")))

となりそうだが、最初の「100以上でもなく」の文で100が含まれるからそこで止まって何も表示されない。これを、

 =IF(C1>100, "", IF(C1<100, "", IF(C1=100, "100超でもなく100未満でもない。100そのものなのだ。", "?")))

とすれば機能する。

 ココまでマスターしたら出現率換算でIQ 110(S.D.15)くらい(笑)。オンラインIQテストに慣れた人達は110じゃがっかりされたかもしれないが、プログラミング的思考が義務教育になるとはそういうことで、全体が底上げされると今まで通りの人は下がることになる。

 前進あるのみ。