今日の目標
今日の目標は、プログラムに「条件によって処理を変える力」を持たせることである。
これまでのコードは、上から順番に命令を実行するだけだったが、if を使うと「点数が60点以上なら合格、それ未満なら再挑戦」のように、状況に応じて違う処理を選べるようになる。
さらに、elif を使って条件を三段階以上に分け、else を使ってどの条件にも当てはまらなかった場合の処理を書くことを学ぶ。
最後には、比較演算子や文字列比較で初心者が間違えやすい = と == の違い、インデント、ファイル名の付け方にも注意しながら、標準出力で採点しやすい小さな条件分岐プログラムを書けるようになることを目指す。
今日の内容
4ー1 ~条件分岐は「場合によって処理を変える」ために必要である~
プログラムは、基本的には上から下へ順番に実行される。
しかし、実際の処理では常に同じ動きだけをすればよいわけではない。
たとえば、点数が60点以上なら「pass」と表示し、60点未満なら「retry」と表示したい場合、点数によって表示内容を変える必要がある。
このように、ある条件を見て、実行する処理を分ける仕組みを条件分岐という。
Nimでは、条件分岐を書くときに if を使う。
if の後ろには「正しいかどうかを判定できる式」を書く。
たとえば score >= 60 は、「score が 60 以上である」という条件である。
この条件が正しければ if の中の処理が実行され、正しくなければ実行されない。
Nimで重要なのは、if 条件: のように、条件の後ろにコロン : を付けることである。
そして、その条件が成り立ったときに実行したい処理は、次の行でインデントして書く。
インデントとは、行の先頭に空白を入れて右にずらすことである。
Nimはインデントによって「どこからどこまでが if の中身か」を判断するため、インデントがずれるとエラーになったり、思った通りに動かなかったりする。
以下のコードを考えてみる。
let score = 72
if score >= 60:
echo "pass"
このコードでは、まず score に 72 を入れている。次に if score >= 60: で、点数が60以上かどうかを判定している。
72 は60以上なので、インデントされた echo "pass" が実行され、画面に pass と表示される。
ここで重要なのは、if の行の最後にコロン : があることと、echo の行が右にインデントされていることである。
よくあるミスは、条件を書くときに = を使ってしまうことである。
Nimで = は値を代入するときに使う記号であり、「等しいかどうか」を比べる記号ではない。
等しいかどうかを調べるときは == を使う。
たとえば name == "Alice" は正しいが、name = "Alice" は条件式としては不適切である。
これは初心者がかなり間違えやすいので、最初のうちから明確に区別しておく必要がある。
4ー2 ~elif は「次の条件」を調べるために使う~
if と else だけでも、条件が成り立つ場合と成り立たない場合の二つに分けることはできる。
しかし、現実の判定は二択だけとは限らない。
たとえば、点数が80点以上なら「great」、60点以上なら「pass」、それ未満なら「retry」と表示したい場合、条件は三つに分かれる。
このようなときに使うのが elif である。
elif は、「前の if が成り立たなかった場合に、次の条件を調べる」という意味で使う。
Nimでは else if ではなく、elif と書く。
これはNim特有というより、多くの言語でも似た形はあるが、Nimでは elif が正式な書き方である。
elsif や elseif と書くと別の識別子として扱われ、正しい条件分岐にはならない。
条件分岐では、上から順番に条件が判定される。
たとえば score >= 80 を先に書き、その後に score >= 60 を書けば、80点以上のときは最初の条件で止まり、great の処理だけが実行される。
逆に、score >= 60 を先に書いてしまうと、90点でも「60点以上」という条件に先に当てはまってしまい、80点以上用の処理まで届かない。
このように、elif を使うときは条件を書く順番が非常に重要である。
以下のコードを考えてみる。
let score = 72
if score >= 80:
echo "great"
elif score >= 60:
echo "pass"
else:
echo "retry"
このコードでは、まず score >= 80 が調べられる。
72 は80以上ではないので、最初の echo "great" は実行されない。
次に elif score >= 60: が調べられる。72 は60以上なので、echo "pass" が実行される。
条件に当てはまった時点で、その後ろの else は実行されない。elif は、条件を上から順番に調べるための道具である。
4ー3 ~else は「どの条件にも当てはまらない場合」を受け止める~
else は、if や elif の条件がすべて成り立たなかった場合に実行される部分である。
たとえば、点数が80点以上でもなく、60点以上でもないなら、残るのは60点未満である。
このような最後の受け皿として else を使う。
else には条件を書かない。else: のようにコロンだけを付け、その下にインデントして処理を書く。
else score < 60: のような書き方はしない。条件を書きたい場合は elif score < 60: を使う。
ただし、最後に残ったすべての場合を処理したいだけなら、else のほうが自然である。
Nimでは、if、elif、else のインデントをそろえる必要がある。
if だけ左にあり、elif が少し右にずれているようなコードは正しくない。
条件分岐のまとまりは、同じ深さにそろえる。中に書く echo などの処理だけを、さらに一段右にずらす。
以下のコードを考えてみる。
let score = 45
if score >= 80:
echo "great"
elif score >= 60:
echo "pass"
else:
echo "retry"
このコードでは、score が 45 なので、score >= 80 も score >= 60 も成り立たない。
そのため、最後の else の中にある echo "retry" が実行される。
else は、どの条件にも当てはまらなかった場合の最後の受け皿である。
ここでも、if、elif、else の位置をそろえ、中の echo だけを一段右にずらしている点が重要である。
課題1
この問題では、点数が60点以上なら pass、60点未満なら retry と表示するプログラムを完成させる。
穴埋め部分 ____ には、score が60以上かどうかを判定する条件を書く。
let score = 75
if ____:
echo "pass"
else:
echo "retry"
期待する出力は次の通りである。
pass
60以上を表す比較演算子は >= である。よって score >= 60 のように書くことで、score が60以上かどうかを調べることができる。
= だけを書くと代入になってしまうので、条件を書くときは比較演算子を使う必要がある。
課題2
この問題では、二段階だった点数判定を三段階に改造する。
出発コードでは、60点以上なら pass、それ未満なら retry と表示している。
これを、80点以上なら great、60点以上80点未満なら pass、60点未満なら retry と表示するように変更する。
三段階にするため、elif を必ず使う。
出発コードは次の通りである。
let scoreA = 92
let scoreB = 72
let scoreC = 45
if scoreA >= 60:
echo "pass"
else:
echo "retry"
if scoreB >= 60:
echo "pass"
else:
echo "retry"
if scoreC >= 60:
echo "pass"
else:
echo "retry"
期待する出力は次の通りである。
great
pass
retry
最初に score >= 80 を調べ、その次に score >= 60 を調べる。
先に score >= 60 を書いてしまうと、92点も60点以上として処理されてしまい、great まで届かない。
条件は狭いものから広いものへ順番に書くのが基本である。
今回は3つの判定すべてで if、elif、else を使い、80点以上、60点以上、60点未満の順で正しく処理できていることを合格条件とする。
課題3
この問題では、気温をもとに表示メッセージを変えるプログラムを書く。
入力として、コード内に temperature という変数を用意する。
処理として、気温が30以上なら hot、15以上30未満なら comfortable、15未満なら cold と判定する。
出力として、判定結果を1行だけ表示する。
今回は標準入力から文字を打ち込むのではなく、コード内の let temperature = 31 を入力値として扱う。
出発コードは次の通りである。
let temperature = 31
# ここに if / elif / else を書く
期待する出力は次の通りである。
hot
この問題では、temperature が31なので、30以上の条件に当てはまる。
そのため、出力は hot になる。出力文字列はすべて小文字で書く。
Hot、HOT、hot のように大文字や余分な空白が混じると、標準出力一致の採点では不正解になる可能性がある。
temperature の値を 20 に変えたときは comfortable、10 に変えたときは cold と表示できることを確認できれば合格とする。
今日のまとめ
今日は、Nimで条件によって処理を変えるための if、elif、else を学んだ。
if は最初の条件を調べるために使い、
elif は前の条件が成り立たなかったときに次の条件を調べるために使い、
else は、どの条件にも当てはまらなかった場合の処理を書くために使う。
条件分岐では、条件を書く順番が重要であり、点数判定のような場合は80点以上、60点以上、それ未満というように、狭い条件から先に書くと正しく判定しやすい。
Nimでは、if 条件: のようにコロンを付け、条件の中で実行する処理をインデントして書く。
= は代入、== は等しいかどうかの比較であり、この違いを混同するとエラーや意図しない動作の原因になる。
また、実行するファイル名は day4.nim のように、英小文字、数字、アンダースコアを使った安全な名前にする。
先頭数字やハイフンを含む名前は避けるべきである。