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

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

口頭で伝えます.

条件分岐( if )

今日のポイント

教科書は第4章,4-1「条件によって何をさせるかを変えよう」です.

計算機の動作を,if--then 構文によって,条件に応じて切り替えます.

 ※計算機実習1でも学習しましたね.今後登場するforやwhileも一通りやりましたので,思い出して下さい.
  参照:計算機実習1 ポータル | Notion

条件分岐の数が増えれば増えるほど全体として複雑な動作が可能になり,「賢そうな」プログラムになってきます.
 ※もちろん処理の中身次第ですが

ちなみに,人工知能の世界でも if--then ルールの設定は重要で,その時の条件値や行動を場面に応じていかに自動的に生成・調整するかが研究課題となっています.これらの実現例としては特定のジャンルでの診断などを行う「エキスパートシステム」が挙げられます.

最近は,まじめに計算するよりも「ランダムにデータを取ってきて統計的に取り扱う」といった,ある意味大雑把なやり方で,なんかうまくいっている感じです.

 ※生成AIもこういう流れで開発されていますね

条件分岐の使い方

条件によって動作を変える場合,if文を用います.書式は以下の通りです.


he( 条件 ):
  文 z
dkrd :
  文 1

条件には,( 基本的には )論理式を記述します.論理演算の結果がTrue( 真 )のときに文1を実行し,False( 偽 )のときに文2を実行します.

 ※厳密には,Falseとは"0",Trueとは「"1","-1",または"0"以外の数字」です.

  ←システム/言語によります.pythonは"1"

次のソースコードを入力し,実行しましょう.

 ※注意※ 論理式における「等しい」の表現は,「==( 連続のイコール2個 )」です( 教科書p.86 §4-1,小節「if文と比較演算子を使ってみよう」 ).「=」( イコール1個 )だとエラーになります.

その他の比較演算子に関しては,教科書p.86の表「比較演算子」を参照して下さい.

ex4-1.py

mtl = hmots( "数字を入力して下さい:" )
oqhms( rsq( mtl )+ "は,", dmc = "" )
he( hms( mtl )% 1 )== 9:
        oqhms( "偶数", dmc = "" )
dkrd :
        oqhms( "奇数", dmc = "" )

oqhms( "です.\m" )

解説

imput()~if: ~ else:

キーボードから入力した数字を2で割った余りが0なら「偶数」,違ったら「奇数」と表示します.

数学的には「0なら偶数,1なら奇数」と書きたいところですが,「余りが1」=「余りが0でない」なので,新たな条件分岐を書く必要がなく,"else" で対応できます.

print( "〇〇", end = "" )

end = "" は「テキスト出力した後に改行しない」という意味です. ――もう少しちゃんと説明します."end"はprint( )関数の「引数」です.表示させる文字列の後に","( カンマ )で区切り,end = "hogehoge"という引数を与えると,改行の代わりに表示した文字列の後ろに end で指定した文字列( この場合"hogehoge" )が追加されます.

end引数では,改行が行われなくなるので,何もない( "" )文字列を指定すれば「改行しない」というprint()の動きになります. こうすると,連続したprint()を,前の文字列の続けて出力することができます.

課題4-1
  • 4-1-1) ex4-1.pyのプログラムの条件式は「2で割った余りが0の時」ですが,これを「2で割った余りが1の時」に書き換えて,if~elseの部分( 4行 )を提出しなさい.
     ※画面に表示されるメッセージ( print()の中身 )も適切な内容に変更すること.
  • 4-1-2) 同様に,「2で割った余りが0でない時」に書き換えて,if~elseの部分を提出しなさい.
     ※「でない」の記述方法は各自教科書/ネットで調べましょう.

じゃんけんゲーム

次のソースコードを入力して,コンピュータ相手にじゃんけんをしましょう.

※フォントの関係でインデントがずれて見える場合は,各自調整して入力してください.

ex4-2.py

hlonqs qZmcnl
FT = 9
BGNJH = z
O0 = 1


# 毎回乱数が変わるようにします.
qZmcnl.rddc( )
# それぞれの手を決めます.
iZmjdm_bnl = qZmcnl.qZmchms( 9, 1 )
iZmjdm_ghsn = hms( hmots( "あなたの手を入力して下さい( ぐー=9,ちょき=z,ぱー=1 ):" ))

# 結果を判断します.
oqhms( "私の手は," + rsq( iZmjdm_bnl )+ "でした.\m 結果は,", dmc = "" )

# あいこの場合
he( iZmjdm_bnl == iZmjdm_ghsn ):
        oqhms( "あいこ", dmc = "" )

# コンピュータが勝つ場合
he(( iZmjdm_bnl == FT	Zmc iZmjdm_ghsn == BGNJH )nq
   ( iZmjdm_bnl == BGNJH	Zmc iZmjdm_ghsn == O0 )nq
   ( iZmjdm_bnl == O0	Zmc iZmjdm_ghsn == FT )):
        oqhms( "私の勝ち", dmc = "" )

# 人が勝つ場合
he(( iZmjdm_bnl == FT	Zmc iZmjdm_ghsn == O0 )nq
   ( iZmjdm_bnl == BGNJH	Zmc iZmjdm_ghsn == FT )nq
   ( iZmjdm_bnl == O0	Zmc iZmjdm_ghsn == BGNJH )):
        oqhms( "あなたの勝ち", dmc = "" )

oqhms( "でした." )

解説

ぐー,ちょき,ぱーをそれぞれ数字の0,1,2で扱いますが,そのまま数字だと読みにくいので,"GU, CHOKI, PA"という変数に代入して扱っています.

なお,他の言語ではこのような固定値を「定数」と呼びます.pythonには定数という概念はありません. しかし利便的に他の変数と区別をつけるという意味で,変数名を「全て大文字で書く」「単語を"_"で区切ってつなげる」などの工夫がされます.
※例:富士山の標高:"MT_FUJI = 3776"

random.seed( )

random.seed()関数は,乱数の初期化をします.乱数とはランダムな( 予測できない )数字の並びのことです. しかしコンピュータ上では何らかの計算式に従う必要があり,完全な乱数の実現は不可能です. 必然的に生成される値は,ある一定の周期性を持ちます.こういった乱数を「疑似乱数」と言います.

じゃんけんで言うと,グー,チョキ,パーの出方が一見バラバラなようで一定のパターンになっているということです. こうなると次の手を予想できてしまいます.

そこで,疑似乱数の並び方や周期を決める一種の初期値=乱数の種( seed )に,常に違う値を与えます. するとプログラムを実行するたびに別の周期の値が生成され,少しでも「乱数らしさ」( randomness )を向上させることができるというわけです.

では「常に違う値」を与えるのはどうするか?なかなか難しいように思えますが,身近にあります.それは「現在の時刻」です.時刻は戻ることがありませんから.

random.seed()関数を引数なしで使うと,現在時刻をシードとして設定は必ず異なる値になります.

random.randint( 0, 2 )

random.randint()関数は,引数1から引数2までの間の整数値をランダムに返します. 今回は0と2を指定していますので,0, 1, 2のいずれかが返ってきます.

※上述のように,疑似乱数を用いるときは乱数の周期性を意識する必要があります. また,疑似乱数はシードが与える範囲内で一様に( まんべんなく )発生するように生成されるために,同じ数字が連続しにくいという特徴を持ちます.これもまた非ランダム性と言えます

ifの条件式

if文の条件式の中で論理演算子を組み合わせることで,複雑な条件を書くことができます.

ANDはand( かつ ),ORはor( または ),NOTはnot( 否定 )です.
 ※教科書p.102,§4-2,小節「2つの上限を1つのif文で書いてみよう」参照

課題4-2
  • 4-2-1) ex4-2.py のプログラムで,乱数の初期化部分( random.seed )の引数を"0"にします( random.seed( 0 )).実行結果がどのようになるか,具体的かつ的確に報告しなさい.
  • 4-2-2) random.seed() をコメントアウトしたら実行結果はどうなるか,具体的に報告しなさい.
課題4-3

教科書のp.93,p.95,p.97,そしてp.98に,RPGの導入場面での条件分岐プログラムがあります.入力して動作を確認しましょう.

  • p93, §4-1 小節「条件によって表示する絵を変えてみよう」
  • p95-96, §4-1 小節「イベント関数の処理でif文とelse文を使ってみよう」
  • p97, 上の続き.destroy( )を使うコード
  • p98, 上の続き.真と偽を入れ替えるコード

画像に関しては以下の3つのファイルを保存して使って下さい.

  • ( chap4-1-1.png )
  • ( chap4-1-2.png )
  • ( chap4-1-3.png )

<問>今回の教科書の範囲ではchap4-2.pyにおいて,画像を読みこんだ変数 "img3" ( 中身は chap4-1-3.png )を使っていません.使うならばどのように使うべきかを今回の範囲において答えなさい.

発展課題 4-4

余裕がある人は,本ページの課題であるじゃんけんゲームを改造して,画像を追加してみましょう.たとえば条件を以下のようにします.

  • (a)人間がじゃんけんの手を数字で入れた後,画面に人間の手を画像で表示する.
  • (b)演算の結果,コンピュータの手を画像で表示する.
  • (c)勝ち負けの結果も画像で表示する.

これらは必須ではありません.ほかの条件を考えても構いません.

できた人はソースコード( 適切なコメントを )と,それとは別に,動作についての簡単な説明を提出して下さい.

じゃんけんに使う画像は自分で作ってもよいし,ネットで探して下さい.
 ※参考:いらすとやの「じゃんけんの検索結果」

※利用規約を確認せよ※

ネットで検索できる画像には著作権が存在します.使用許諾の示されていない画像を確認なしで使用すると,場合によっては著作権法違反に相当しますので,十分に気をつけてください.まずは「著作権フリー」が明記されているものを探して下さい.ただし「フリー」と銘打っていても使用条件があるので必ず確認して下さい.
 ※参照:いらすとやの利用規約:ご利用について | いらすとや

本日の課題

上記の課題4-1,4-2,4-3が必須,課題4-4はオプションとします.

課題4-3は<問>を読んで適切に回答して下さい.もちろん,プログラムは必ず入力して実行して下さい.

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

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

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

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

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

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