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

今日の説明動画

本日の説明は,3本の動画に分かれています.それぞれ視聴して,理解ができたら次に進むようにして下さい.

動画の長さは次の通りです.最後の動画は短いですが,課題の作業量は多いです.気をつけて下さい.

  1.  計算機実習2/計算機基礎実習2-04回目ex4-1 - 12分05秒
  2.  計算機実習2/計算機基礎実習2-04回目ex4-2 - 10分48秒
  3.  計算機実習2/計算機基礎実習2-04回目ex4-3 - 04分52秒
  4. 計 27分45秒

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

前回のレポート採点結果は,こちらです.

条件分岐(if)

今日のポイント

計算機の動作を,条件に応じて変えます.条件分岐の数が増えれば増えるほど複雑な処理を行うプログラムになり,すなわち「賢そうな」プログラムになります.

ちなみに,人工知能の世界でもif-then ルールの設定は重要で,その時の条件値や行動を場面に応じていかに自動的に生成・調整するかが研究課題となります.

条件分岐の使い方

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

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

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

※厳密には,Falseとは0,Trueとは「1,-1,または0以外の数字」(←システムや言語によって異なる)のことを指しますので,計算結果が0か否かで分岐します.

次のプログラムを入力し,実行しましょう.キーボードから入れた数字が偶数か否かを判断して表示します.

※論理演算における「等しい」は,「==」です(教科書p.86).「=」にすると,エラーが出ます.

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

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

oqhms("です.\m")

解説

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

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

※print関数に,end = "hogehoge"を与えると,表示した文字列の後ろにendで指定した文字列が追加されます. このとき,改行が行われなくなりますので,何もない("")文字列を追加すると,改行の抑制ができます.

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

じゃんけんゲーム

次のプログラムを入力して,コンピュータとじゃんけんゲームをしましょう.

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

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で扱いますが,そのまま数字で扱っていては読みにくいので,変数に名前をつけて扱っています.

なお,他の言語ではこのような固定値を「定数」と呼びますが,pythonに定数はありません.

しかし利便的に変数と区別をつけるために,変数名を全て大文字で書くとすることが多いです.


random.seed関数は,乱数の初期化をしています.乱数とは,ランダムな(予測できない)数字の並びのことですが,コンピュータで計算する以上,何らかの計算式に従う必要があり,これを疑似乱数と言います.同じ計算式を使うと毎回同じ数字の並びになります

じゃんけんの結果が毎回同じだとゲームになりませんので,毎回乱数の並びが変わるように乱数の種(=初期値を決める数字)として現在の時刻を用いています.


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


※疑似乱数を用いるときは,乱数の計算式に十分気をつける必要があります.計算式で生成している以上,周期性が現れます.乱数を使う側がその周期と一致してしまうと,簡単に計算できる数列になってしまいます.また,疑似乱数は,その範囲内で一様に(まんべんなく)発生するように調整されていますので,同じ数字が連続しにくい特徴を持ちます.


if文の条件式の中に論理演算子を用いることで,複雑な条件を書くことができます.

AND(かつ)はand,OR(または)はorです.これ以外には,否定(反転)のnotがあります(教科書p.102).

課題4-2
  • ex4-2.pyのプログラムで,乱数の初期化部分(random.seed)の引数を「0」にした場合(random.seed(0)),どのようになるか報告しなさい.
  • random.seed をコメントアウトした場合,どうなるか報告しなさい.
課題4-3

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

なお,画像に関しては,以下の3つのファイルを用意しています.

  • 今回の教科書の範囲ではimg3(ファイル名はchap4-1-3.png)を使っていません.使うとするならばどのように使うべきかを今回の範囲において答えなさい.

発展課題 4-4

早くできた人は,本ページの課題であるじゃんけんゲームに対して,教科書の課題を参考に画像を追加してみましょう.

つまり,人間がじゃんけんの手を数字で入れたら,画面に人間の手とコンピュータの手が画像で出て勝ち負けが分かるプログラムです.

勝ち負けの絵もあると,より面白いですね.

じゃんけんに使う画像は,自分で作ったり探したりして下さい(参考までにいらすとやの「じゃんけんの検索結果」へのリンクを貼っておきます)

本日の課題

上記の課題4-1,4-2,4-3です.

課題はメールで提出して下さい.

件名はreport04,アドレスはcom02@elec.ryukoku.ac.jp です.

発展課題(4-4)ができた人はプログラムを提出して下さい.その際は,メールの文頭に4-4ができたことを書いて下さい(メールの最後に書いていた場合,見落とす危険性があります).