Friday, July 13, 2018

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第15回

 MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第15回
オープンコースウエア 大学名:MIT
講座名:6.00 Introduction to Computer Science and Programming
講義日:2008年10月28日(火曜日) ― 第9週・1回目

担当教授:Prof. Grimson

全講義数:24コマ
各講義時間:60分

配信開始日:2009年8月19日
講義ビデオソース:Youtube
講義ビデオ収録時間:50分38秒
サブタイトル:有
ジャンル: オブジェクト指向プログラミング、クラステンプレート、クラスメソッド、オペレータオーバーローディング

ビデオ画像品質5段階評価:4
(解像度が480pあり、コンピュータ画面に表示されたソースコードを比較的はっきりと読み取ることができます。)
ビデオ音声品質5段階評価:5 グリムソン教授の発声、とてもめりはりがついているため、YoutubeのCC機能(キャプションソフトウエア機能)を
オンにしてサブタイトルを表示すると、ほぼ正確に話した言葉が表示されています。



講義コメント:
第15回目の講義は、前回および前々回で学習したオブジェクト指向プログラミングの、内容的には山場となっています。

グリムソン教授再登場で、グターグ教授とはまた一味違ったアプローチで、オブジェクト指向プログラミングの理論的側面を捉えつつ、
基本的なクラスやメソッドをPythonでプログラムを組んで教えています。
主なクラスメソッド
__init__ - Create instance
__str__ - string (printed representation)
__cmp__ - compare
__eq__ - same
プログラミングのスタイルとして、

class cPoint:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.radius = math.sqrt(self.x*self.x + self.y*self.y)
        self.angle = math.atan2(self.y,self.x)

や、

class pPoint:
    def __init__(self,r,a):
        self.radius = r
        self.angle = a
        self.x = r * math.cos(a)
        self.y = r * math.sin(a)

のように、クラス定義の最初に Create instanceのクラスメソッドを入れるやり方です。
これは、入れておかないとプログラムが動かないというわけではないが、
プログラミングの実践として身につけておいたほうが良い。
注意事項としてOperator overloading
直交座標と極座標どちらの座標システムを用いても、平面上の点Pを扱えるプログラムを、
Pythonプログラムの例としてオブジェクト指向で実装して、講義内で詳しく説明している。
この、「直交座標と極座標どちらの座標システムを用いても、平面上の点Pを扱えるプログラム」の例はリーディングアサイメントHow to Think Like a Computer ScientistのChapter12からChapter16と連動している。
講義のペースがとても速いのは、講義に出てくる前に予習として、How to Think Like a Computer ScientistのChapter12からChapter16をしっかりと読み込んできていることが前提となっているようだ。




-------------------------------------------------

Lecture 15 Hand out 補助教材 ダウンロード

Lecture 15 ホームワーク ダウンロード
MIT 6.00 講座のプログラムも含んだ資料のダウンロード
-------------------------------------------------



-------------------------------------------------
講義で取り上げたPythonコードの例
例-1

import math
## points as lists
def addPoints(p1,p2):
    r = []
    r.append(p1[0]+p2[0])
    r.append(p1[1]+p2[1])
    return r

p = [1,2]
q = [3,1]
r = addPoints(p,q)
print r
## points as classes
class cartesianPoint:
    pass
cp1 = cartesianPoint()
cp2 = cartesianPoint()
cp1.x = 1.0
cp1.y = 2.0
cp2.x = 1.0
cp2.y = 3.0
def samePoint(p1,p2):
    return (p1.x == p2.x) and (p1.y == p2.y)
def printPoint(p):
    print '(' + str(p.x) + ', ' + str(p.y) + ')'

class polarPoint:
    pass
pp1 = polarPoint()
pp2 = polarPoint()
pp1.radius = 1.0
pp1.angle = 0
pp2.radius = 2.0
pp2.angle = math.pi / 4.0
class cPoint:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.radius = math.sqrt(self.x*self.x + self.y*self.y)
        self.angle = math.atan2(self.y,self.x)
    def cartesian(self):
        return (self.x, self.y)
    def polar(self):
        return (self.radius, self.angle)
    def __str__(self):
        return '(' + str(self.x) + ', ' + str(self.y) + ')'
    def __cmp__(self,other):
        return (self.x == other.x) and (self.y == other.y)
class pPoint:
    def __init__(self,r,a):
        self.radius = r
        self.angle = a
        self.x = r * math.cos(a)
        self.y = r * math.sin(a)
    def cartesian(self):
        return (self.x, self.y)
    def polar(self):
        return (self.radius, self.angle)
    def __str__(self):
        return '(' + str(self.x) + ', ' + str(self.y) + ')'
    def __cmp__(self,other):
        return (self.x == other.x) and (self.y == other.y)

class Segment:
    def __init__(self,start,end):
        self.start = start
        self.end = end
    def length(self):
        return math.sqrt( ((self.start.x - self.end.x) *
                           (self.start.x - self.end.x))
                        + ((self.start.y - self.end.y) *
                           (self.start.y - self.end.y)))

p1 = cPoint(3.0, 4.0)
p2 = cPoint(5.0, 7.0)
s1 = Segment(p1,p2)
print s1.length()
class Rectangle:
    def __init__(self,width,height,corner):
        self.width = width
        self.height = height
        self.corner = corner
def findCenter(box):
  p = cPoint(box.corner.x + box.width/2.0,
             box.corner.y - box.height/2.0)
  return p
box = Rectangle(100,200,p1)
print findCenter(box)
def growRect(box, dwidth, dheight):
  box.width = box.width + dwidth
  box.height = box.height + dheight

growRect(box,10,20)
print findCenter(box)
class newPoint:
    def __init__(self,x = 0,y = 0):
        self.x = x
        self.y = y
    def __str__(self):
        return '(' + str(self.x) + ', ' + str(self.y) + ')'
    def __eq__(self,other):
        return (self.x == other.x) and (self.y == other.y)
    def __add__(self, other):
        return newPoint(self.x + other.x, self.y + other.y)
    def __cmp__(self,other):
        return self.x < other.x and self.y < other.y

origin = newPoint()
p1 = newPoint(3.0,4.0)
p2 = newPoint()
p3 = p1+p2
print p3
print p1 < p2


例-1の実行結果

>>>
[4, 3]
3.60555127546
(53.0, -96.0)
(58.0, -106.0)
(3.0, 4.0)
False
>>> 

例-1のプログラムが実行時に使用したメソッドの出力

>>> dir

<built-in function dir>

>>> dir(p) ##what are all the methods associatd with a varialbe p

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

>>> dir(1) ## what are all the methods associated with an integer 1

['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'conjugate', 'denominator', 'imag', 'numerator', 'real']

>>> dir('1')  ## what are all the methods associated with a string '1'

['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

>>> 



Python コードのHTML表示には、Dan CederholmのSimpleCodeを使用しています。
Python コードの入出力は、Python IDLE から行っています。




-------------------------------------------------

講座第15回のリーディングアサイメント

1. Chapter 12 of How to Think Like a Computer Scientist: Learning with Python

-------------------------------------------------

-------------------------------------------------

No comments:

Post a Comment

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第2回

  MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第2回 オープンコースウエア 大学名:MIT 講座名:6.00 Introduction to Computer Science and Programming Download course material ...