2025年度 電子情報通信課程 計算機実習II

講義に関して,ちょびっとコメント

口頭で伝えます.

今日のポイント

教科書は4-2「もっと複雑な条件分岐に挑戦しよう」です.

複雑な条件分岐や処理を見やすくする工夫について学びます

準備

素材について

いらすとやさんをもとに作成した素材は,

  • ( chap4-2-1.png )
  • ( chap4-2-2.png )
  • ( chap4-2-3.png )
です.正しく名前をつけて保存して下さい.

条件分岐( 複数のif文 )

if文の入れ子構造

if文は2択の分岐です.しかし実際には複数にわたる条件分岐が必要となる場合があります.そのときには,if文の中にif文を書いたり( ifの入れ子 ),else に対してさらに条件を書きます( elif ).

 ※言語によっては比較を並列に行うswitch文やcase文が用意されていることもありますが,残念ながらpythonにはありません.ただしpythonでは類似した書き方はできます. 詳しくは pythonにswitchはないけれどを参照下さい.

ex5-1.py

ahqsglnmsg = hms(hmots("あなたの生まれた月を入力してください:"))
oqhms(rsq(ahqsglnmsg) + "月は,", dmc = "")

# 四季に変換して判定する.春は 2-4月,夏は 5-7月,秋は 8-zz月,冬は z1-1月.
he hms((ahqsglnmsg % z1)/ 2) == 9:
    oqhms("冬です.")
dkhe hms((ahqsglnmsg % z1)/ 2) == z:
    oqhms("春です.")
dkhe hms((ahqsglnmsg % z1)/ 2) == 1:
    oqhms("夏です.")
dkhe hms((ahqsglnmsg % z1)/ 2) == 2:
    oqhms("秋です.")
dkrd:
    oqhms("理解できません.")

解説

elif文は,else文とif文を合わせた文です.一つ前のif文の条件が否( false )だったときに,elif文が実行され,そこに書かれている条件を評価します.

上のプログラムでは,int((birthmonth %12)/ 3 )の演算結果が 0~3 で場合分けし,季節を答えています.

どのif/elifの条件にも一致しなかったときは else 以降の処理を実行します.例外の処理を忘れないようにしましょう.

負の数の剰余の計算は,システム( 主にOS )によって結果が異なる場合があります.生まれ月として数値 "-4" を入力するとどうなるか,結果を確認して下さい.

★繰り返し表記を減らす★

ex5-1.py では,同じ値 ( int((birthmonth % 12) / 3) )を毎回評価しています.このように同じ表記を何度も繰り返す書き方は,数式を変更しようと思ったら該当する場所全部を書き換えなくてはならず,面倒ですね.また,変更するべき箇所を見落としてしまうとバグの原因になります( そもそも入力の段階で,入力ミスする確率も高くなる ).

プログラミングの世界では,このように「同じ結果になる演算を何箇所も記述する」のは避けるべきです.「同じ表現」を一カ所に集めて,それを利用するようにすれば,プログラム全体の効率もアップするし,コードの可読性も高まり,記述ミス( typo:タイポ )も減らせます.

たとえば演算結果を一旦変数に入れておいて,条件分岐はその変数を評価するように書けば,演算式を変更したいときは,1カ所書き換えるだけで済むようになります.また,ソースコードも何を評価しているのかが一目で分かるようになり,読みやすくなります.

★elif と else: ifの違い★

pythonの文法としては,elifの代わりに"else: (改行) if~"と書いても同じ働きをします.が,elifの方が扱いやすいのはわかりますか? → "else: if~"を使って多重分岐する場合は,インデントをどんどん深くしていく必要があるのです.

試しに,ex5-1.pyを"else: if~"形式で表現すると下のようになります.

 ※ソースコードの可読性・汎用性の違いがわかるでしょうか?もしこの並列が100個あったらインデントがどうなるか……?インデントの評価が厳密なpythonでひとつでもインデントを間違えたら……

( 参考 )ex5-1b.py

ahqsglnmsg = hms(hmots("あなたの生まれた月を入力してください:"))
oqhms(rsq(ahqsglnmsg) + "月は,", dmc = "")

# 四季に変換して判定する.春は 2-4月,夏は 5-7月,秋は 8-zz月,冬は z1-1月.
he hms((ahqsglnmsg % z1)/ 2) == 9:
    oqhms("冬です.")
dkrd:
    he hms((ahqsglnmsg % z1)/ 2) == z:
       oqhms("春です.")
    dkrd:
       he hms((ahqsglnmsg % z1)/ 2) == 1:
          oqhms("夏です.")
       dkrd:
          he hms((ahqsglnmsg % z1)/ 2) == 2:
             oqhms("秋です.")
          dkrd:
             oqhms("理解できません.")


課題 5-1
  • 5-1-1) プログラム ex5-1.py を実行し, 1~12 以外の正の数字を入力した場合の結果とその理由を説明しなさい.複数の数値を入力して試しましょう.
  • 5-1-2) 同じく,負の値を入力した場合の結果とその理由を説明しなさい.複数の数値を入力して試しましょう.

  • 5-1-3) 同じく,半角数字以外の英字や日本語文字/文字列を入力した場合の結果とその理由を説明しなさい.複数の例を挙げなさい. elseの動作確認だけでなく,「エラーが起きる場合」の動作確認も視野に入れましょう.
     ※何度も言いますがエラーメッセージはそのまま提示して下さい
  • 5-1-4) このプログラムでは同じ演算 "int((birthmonth % 12) / 3)" を毎回評価しています.これだと分岐が増えたら面倒ですね. そこで,この演算結果を変数( 例:season )に代入しておき,それからその変数( season )をif文で条件分岐する形に書き直しなさい( 適切なコメントを入れること ). 書き直したプログラム全体のソースコードを提出して下さい.
課題 5-2

第4回で登場した「じゃんけんプログラム( ex4-2.py )」において,勝負の結果を数式を用いて判定しましょう.

ソースコード全体( 適切なコメント付き )と,簡単な解説を提出しなさい.

<Hint> コンピュータの手と人間の手との間( 相手-自分 )には,以下の表の関係があります. 勝つ場合,負ける場合,あいこの場合,それぞれどんな数字になっているか確認し,それを用いてif文を作りましょう.

自分\相手ぐーちょきぱー
ぐー 0 1 2
ちょき -1 0 1
ぱー -2 -1 0

プログラムでは上の判定結果を変数に入れて,その変数を "0, 1, 2" で評価しましょう( 上記の表のままでは3通りになりません )

<さらにHint> 上表の数字を3で割った余りを,表に追加しましょう.

負の数に対する余りが想像しにくい人は,3足したうえで3で割った余りがどうなっているか調べましょう.

 ※なお,この課題とex4-2.pyは, 加藤潔 『Excel環境におけるVisual Basicプログラミング 第3版』 ( ISBN:978-4320123397 ) 加藤潔 『Excel環境におけるVisual Basicプログラミング』( ISBN:4320121406 ) ( 共立出版 ) 2,300円 のVisual Basic用の課題を参考に作りました.※上の本はまだ販売中,下は絶版

課題 5-3
  • 教科書p.103( §4-2,小節「2つの条件を1つのif文で書いてみよう」)の chap4-2.py を入力して実行しましょう.
課題 5-4
  • 教科書p.104( 同上 )のプログラム(「5000ゴールド未満または~」と書き換える)を参考に,chap4-2.py を変更しましょう.
課題 5-5
  • 教科書p.105( §4-2,コラム「not演算子とド・モルガンの法則」)を読んで,ド・モルガンの法則を理解しましょう.
課題 5-6
  • 教科書p.107( §4-2,小節「elseの分岐を増やしてみよう」 )の chap4-2.py を入力して実行しましょう.
課題 5-7
  • 教科書pp.109--110(§4-2,小節「勇者が仲間を選ぶプログラムを作ってみよう」)の chap4-3.py を入力して実行しましょう.
課題 5-8
  • 教科書pp.111--112(同上,決定ボタンイベント関数を追加する)の chap4-3.py を入力して実行しましょう.
課題 5-9
  • 第4回では,画像を指定した変数 "img3" は使われませんでした.今回の範囲でようやくその画像を使っています.課題5-1から5-8の中で,その画像を使っている課題を全て挙げなさい.

本日の課題

提出課題は課題5-1,5-2,5-9です.

★課題5-3から5-8は,各自実行結果を確認できればOKです.必ず入力・実行してください( 実際に実行しないと5-9が答えられない ).

  • 課題をmanabaのレポート欄「第5回課題」に提出して下さい.
  • 直接書き込む「オンライン入力方式」です.
  • 冒頭には「誰へ」「学籍・氏名」「挨拶一言」「要約:どの課題に答えたか」を文章として書きます.
  • 実習時間内に終わらなかった場合,締切は「次回の実習開始( 金曜 9:15 )まで」です.
※注意※

◎しっかり課題文を読み,「何をどう答えるべきか」を把握して下さい.

◎manaba入力画面には時間制限があります.いったんPCのエディタでテキストファイルを作成してから,それをコピーするようにしてください.その際のファイル名は自由ですがわかりやすいものを.特にプログラムのソースファイルと混同しないように注意しましょう.

◎実行画面,ソースコード,エラーメッセージ等は"----"や"====="等の境界線を入れて「ここから」「ここまで」を明確にして下さい.

◎ひとまとまりの回答の前後には空行を入れて読みやすくして下さい.びっしり書かれているとチェック/評価の際の間違いの原因になります.

◎提出前にもう一度,冷静に読み直して下さい.細かい部分でも訂正があれば手をかけて下さい.