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回ずつ振ることに相当する.結果は同じになるが,その意味は異なる.結果が同じであればよいということはない.


A10_3 (スクリプト)

ねらい: クラス変数とインスタンス変数の違いを理解する.

クラス変数とインスタンス変数は,クラスに属するメソッド内で参照する際には同様の構文を使用するが,性質は大きく異なる.

教科書 pp.241-242 を参照せよ.

基本的には,あるデータ型に関連するデータを保持することを考える場合は,インスタンス変数を使用する.クラス変数を用いるのは,全インスタンスで情報を共有することが妥当であると判断される場合のみである.

クラス変数とインスタンス変数の違いを理解するために,以下の課題に取り組むこと.プログラムの作成にあたっての指定があるため問題文を最後までよく読むこと.


以下のプログラムでは野球チームを表すデータ型を定義して使用している.

class Team:
    members = []
    def __init__(self, name):
        self.name = name
    def addMember(self, player_name):
        self.members.append(player_name)
    def getMembers(self):
        return self.members

tigers = Team('阪神')
tigers.addMember('大山')
tigers.addMember('近本')
print(tigers.getMembers())

実行結果は以下の通りであり,正常に動いているように見える.

['大山', '近本']

別のチームのインスタンスを追加する.

class Team:
    members = []
    def __init__(self, name):
        self.name = name
    def addMember(self, player_name):
        self.members.append(player_name)
    def getMembers(self):
        return self.members

tigers = Team('阪神')
tigers.addMember('大山')
tigers.addMember('近本')
print(tigers.getMembers())

# 以下を追加した
giants = Team('巨人')
giants.addMember('菅野')
giants.addMember('岡本')
print(giants.getMembers())

すると実行結果が以下のようになり,想定した動作をしない.

['大山', '近本']
['大山', '近本', '菅野', '岡本']

想定される適切な結果は以下の通りである.

['大山', '近本']
['菅野', '岡本']

適切な結果が得られるように,データ型 Team の定義を修正せよ.

プログラムの修正にあたっては,データ型 Team の定義以外,すなわちtigers = Team('阪神')以降のソースコードには修正を加えてはいけない.


A10_4 (スクリプト)

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

本課題は課題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_5 (スクリプト)

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

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

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

過去の履歴に関する機能追加を行った上で,好みの面数(6以上)のサイコロのインスタンスを作成し,以下の処理を行え.

  1. サイコロを1個振り,出た目の値を表示する.
  2. メソッド shoot_times() と average() を呼び出して,以下の例のような表示を行う.
  3. 出た目が1だったら終了する.
出た目は10です.
これまでに1回振られ,平均値は10.0です.
出た目は10です.
これまでに2回振られ,平均値は10.0です.

:

出た目は8です.
これまでに9回振られ,平均値は6.555555555555555です.
出た目は1です.
これまでに10回振られ,平均値は6.0です.
終了します.

A10_6 (スクリプト)

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

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

課題A10_5までに作成したデータ型 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は,オプションですが授業内課題の続きの内容ですので,取り組んでみてください.