A10 [授業内]

A10_0 (フォームに回答)

ねらい: オブジェクト指向に関する用語の意味を把握する.

以下のアからキにあてはまる用語あるいはソースコードの断片を選べ.

解答は Microsoft Forms から入力せよ. この課題は何回も答えられるので,全問正解するまで繰り返し行うこと.


A10_1 (スクリプト)

ねらい: 新しいデータ型を作る前に,データ型に実装する機能を整理し,実装する.

※この課題では,新しいデータ型の作成は行わない.

1から6までの値を返す関数 shoot() を,以下の仕様に従って作成せよ.

  1. 変数 face_num に6を代入する.この変数は関数の外で定義せよ.
  2. 関数 shoot() は,1以上face_num以下の整数をランダムに生成して,戻り値として返す.
    なお一般的に関数の外で定義された変数を直接参照することは推奨されないが,本課題では許容する.

作成した関数 shoot() が適切に機能することを確認するために,関数 shoot() をfor文を用いて10回呼び出し,それぞれの戻り値を以下のように表示せよ. なおコロン(:)の前はfor文のカウンタ変数をそのまま表示するものとする.

実行結果の例 (本課題の出力結果はランダムなので全く同じにはならない.以下の課題も同様)

0: 1
1: 2
2: 5
3: 1
4: 2
5: 5
6: 1
7: 4
8: 2
9: 1


A10_2 (スクリプト)

ねらい: 新しいデータ型を作成する方法を習得する.データ型を使用しない場合との相違を確認する.

教科書 pp. 223-231 と,課題A10_1を参考に,以下の仕様を満たす新しいデータ型 Dice を作成せよ.

データ型 Dice の作成にあたっては,以下の点に留意せよ.

作成した Dice 型が適切に機能することを確認するために,Dice 型のインスタンスを生成し,メソッド shoot() を for 文を用いて10回呼び出し,それぞれの戻り値を課題A10_1と同じ形式で表示せよ.

なお Dice 型のインスタンスは for 文の外で作成すること.これは,同じサイコロを10回振ることに相当する.for 文の中で作成すると,10個のサイコロを順次1回ずつ振ることに相当する.結果は同じであるが,その意味は異なる.結果が同じであればよいわけではない.


参考: クラス変数とインスタンス変数の説明

教科書 pp.241-242 を参照せよ. 基本的には,あるデータ型に関連するデータを保持することを考える場合,まずインスタンス変数を使用せよ.クラス変数を用いるのは,全インスタンスで情報を共有することが妥当であると判断される場合のみにせよ.


A10_3 (スクリプト)

ねらい: 初期化メソッドを使用して,インスタンスの生成時に必要な設定を行う方法を習得する.

本課題は課題A10_2の続きである.

教科書 p.237 を参考に,課題A10_2で作成したデータ型 Dice に以下の変更を加えよ.

作成した Dice 型が適切に機能することを確認するために,初期化引数の指定のない Dice 型のインスタンスと,初期化引数を指定した Dice 型のインスタンス(面数は好みで設定せよ.ただし6より大きいこと)をそれぞれ生成し,2つのインスタンスのメソッド shoot() を for 文を用いて10回ずつ呼び出し,それぞれの戻り値を以下のように表示せよ.

表示フォーマット→ forのカウンタ変数: 初期化引数なしサイコロの出目, 初期化引数ありサイコロの出目

実行結果の例

0: 5, 17
1: 5, 4
2: 4, 11
3: 1, 7
4: 3, 13
5: 6, 11
6: 6, 12
7: 1, 20
8: 5, 17
9: 6, 19


コラム: メソッドの仮引数名

ある変数がメソッドの仮引数であるかデータ属性であるかは self の有無で区別できるため,仮引数名はデータ属性名と同一にしても問題ない.名前を考える手間が省ける.

コード例:

class Shout:
    def __init__(self, shout_times=10):
        self.shout_times = shout_times
    def shout(self, phrase):
        for _ in range(self.shout_times):
            print(phrase)

A10_4 (スクリプト)

ねらい: データ型のデータ属性やメソッドを作成する方法を習得する.

本課題は課題A10_3の続きである.

データ型 Dice に,以下の仕様に従って,過去の履歴(メソッド shoot() の戻り値の記録)を取り扱う機能を加えよ.

以上の機能追加を行った上で,好みの面数(6以上)のサイコロのインスタンスを作成し,メソッド shoot_times() と average() を呼び出して,以下の例のような表示を行え. ただし「これまでに x 回振られ,」の回数表示には,forのカウンタ変数を使用してはならない.

0: 10
これまでに1回振られ,平均値は10.0です.
1: 10
これまでに2回振られ,平均値は10.0です.

:

8: 8
これまでに9回振られ,平均値は6.555555555555555です.
9: 1
これまでに10回振られ,平均値は6.0です.

A10_5 (スクリプト)

ねらい: 作成したデータ型を活用する.

複数のサイコロを振る試行を多数回実行し,出た目の合計値の分布を調べよう.

課題A10_4までに作成したデータ型 Dice を用いて,6面体,8面体,10面体のサイコロのインスタンスを1つずつ作成する. 3個のサイコロを振り,出た目の合計値を求める処理を200回実行し,各試行における出目の合計値について,出た回数を記録せよ.記録する方法はいくつか考えられるが,どのような方法を用いてもよい. 200回の試行の後,以下の例に示すように,*を出た回数個並べたグラフとして表示せよ.

 3:
 4: *
 5: ****
 6: ***
 7: ******
 8: *******
 9: *************
10: *****************
11: ***********************
12: *******************
13: ***************
14: ********
15: *************************
16: ***************
17: ************
18: *************
19: ******
20: ******
21: ****
22: **
23:
24: *

宿題課題のうち,課題B10_7および課題B10_8は,オプションですが授業内課題の続きの内容ですので,取り組んでみてください.