コンピュータサイエンス第一 第3週

  1. 先週の復習
  2. 2進数を使った計算
  3. Pythonにおける計算
  4. 数値だけを使ったアニメーションの作成
  5. 本日の課題

雑談

避難訓練はなぜ重要か?

おわび

先々週の「中課題1.」と呼んでいた課題は、 じつは配点5点の「小課題」でした。 混乱するので名前は変えないことにします。 本日の課題は本当の「中課題 (20点)」です。

0. 先週の復習 (あるいはやり残した部分)

if文 (パターン1):
インデントが重要。複数の文を入れることもできる。
if 条件式:
    条件式が真であるときに実行される文
else:
    条件式が真でないときに実行される文
if文 (パターン2):
else: 以降は省略できる。
if 条件式:
    条件式が真であるときに実行される文
練習問題
  1. x が 3 のとき、x > 2 は成り立つか?
  2. y が 0 のとき、y < 0 は成り立つか?
  3. z が 1 のとき、1 != z は成り立つか?
  4. t が 7 のとき、3 > 7 は成り立つか?

0.1. while文による繰り返し

Python による繰り返し (while文) の構文を思い出そう:

loop.py
i = 0
while i < 10:
    print(f"i={i}")
    i = i + 1
print("end")
練習問題.
  1. 上のプログラム loop.py で、 最後に表示される i の値はいくつか。
  2. 上のプログラム中に以下の if文を挿入し、
        if i == 5:
            print("five!")
    
    "i=5" を表示した直後に "five!" を表示したい:
    i=0
    i=1
    i=2
    i=3
    i=4
    i=5
    five!
    i=6
    i=7
    ...
    
    上のif文を挿入すべき箇所はプログラム中のどこか。

0.2. 繰り返しを使って足し算・掛け算を実現する

「1を足す」「1を引く」だけの計算を使って、整数の和 a + b を計算する:

add.py
a = int(input("a="))
b = int(input("b="))
while 0 < b:
    a = a + 1
    b = b - 1
print(f"answer={a}")
練習問題.
  1. b の値に 0 が入力されたときのプログラムの動作を日本語で説明せよ。
  2. 0 < b の部分には、 0 < b のかわり別の条件式を入れてもよい。 そのような条件式の例をひとつ挙げよ。

0.3. 足し算を使って掛け算を実現する

さらに上の結果を使って、今度は掛け算を実現することを考える。 以下のプログラムは与えられた整数 p と q に対して p × q を計算する。

mult.py (未完成)
p = int(input("p="))
q = int(input("q="))
a = 0
while 0 < q:
(変数 a に p の値を足す)
q = q - 1 print(f"answer={a}")

ここで (変数 a に p の値を足す) の部分に 上の add.py の処理を埋め込むと、以下のようになる:

mult.py (完成版)
p = int(input("p="))
q = int(input("q="))
a = 0
while 0 < q:
    b = p
while 0 < b: a = a + 1 b = b - 1
q = q - 1 print(f"answer={a}")

1. 2進数を使った計算

10進数における 015 までの数を 2進数の 00001111 で 表した結果は以下のようであった:

10進数2進数10進数2進数 10進数2進数10進数2進数
00000 40100 81000 121100
10001 50101 91001 131101
20010 60110 101010 141110
30011 70111 111011 151111

1.1. 2進数における加算

練習問題
  1. 1 + 10 + 100 を計算せよ。
  2. 111 + 11 を計算せよ。
  3. 3 + 5 を 2進数に変換し、これを計算して、また 10進数に戻せ。

1.2. 2進数における乗算

練習問題
  1. 110 × 100 を計算せよ。
  2. 110 × 1001 を計算せよ。
  3. 4 × 7 を 2進数に変換し、これを計算して、また 10進数に戻せ。

2. Pythonにおける計算

2.1. 四則演算

Python では、もちろん +1, -1 だけではなく、実際の四則演算が可能である。 +, -, *, / などの記号を 演算子 (operator) という。

構文:
a + ba と b を足した値
a - ba から b を引いた値
a * ba と b を掛けた値
a // ba を b で割った値 (商)
a % ba を b で割った値 (余り)
a / ba を b で割った値 (実数)
a ** bべき乗 ab
例1:
代入文の中で使うのが一般的。
c = a + b
例2:
通常の数式と同じく、乗算が優先される。
det = a*d - b*c
det = a d - b c (演算子は省略できない)
det = ad - bc (変数 ad から変数 bc の値を引くことになる)
例3:
カッコも使える。
s = n*(n+1)/2
s = n(n+1)/2 (演算子は省略できない)
例4:
直接、print文の中で使ってもよい。
print(f"result={a+b}")
演習 3-1.

以下のプログラムを実行し、 a と b にいろいろな値を入力せよ。 b = 0 とすると何が起こるか?

calc.py
a = int(input("a="))
b = int(input("b="))
print(f"a+b = {a+b}")
print(f"a-b = {a-b}")
print(f"a*b = {a*b}")
print(f"a//b = {a//b}")
print(f"a%b = {a%b}")
print(f"a/b = {a/b}")

例1. 平均を計算する

a = int(input("a="))
b = int(input("b="))
avg = (a+b)/2
print(f"average = {avg}")

例2. 複数の値の合計を計算する

  1. 最初に total = 0 とする。
  2. x に値を入力する。
  3. その値を total に加える。
  4. x = 0 が入力されるまで繰り返す。
total = 0
x = 1
while x != 0:
    x = int(input("x="))
    total = total + x
print(f"total = {total}")
演習 3-2. ユークリッドの互除法

2つの数の最大公約数を発見する以下のプログラム gcd.py を完成させよ:

  1. 最初に ab の 2つの値を入力する。
  2. ab で割った余り a % b を計算する。
  3. その値を新しい b の値とし、2. に戻る。
  4. 余りが 0 になったら、そのときの b の値を表示する。

まず、簡単な例 (a=12, b=3 など) を手作業でやってみて、 同じことをするプログラムを書け:

gcd.py
a = int(input("a="))
b = int(input("b="))
c = a % b
while c != 0:
    a = ???
    b = ???
    c = a % b
print(f"gcd = {b}")

3. 数値だけを使ったアニメーションの作成

今回は、数値だけを使ってアニメーションを表示してみる。

anim.py
import time
# 変数を定義する。
img0 = 1000000000000000000000000000
img1 = 1000000000110000110000000000
img2 = 1000000000110000110000000000
img3 = 1000000000000000000000000000
img4 = 1000001100000000000011000000
img5 = 1000000110000000000110000000
img6 = 1000000011000000001100000000
img7 = 1000000000111111110000000000
img8 = 1000000000000000000000000000
img9 = 1000000000000000000000000000
# 30回繰り返す。
t = 0
while t < 30:
    print(img0)
    print(img1)
    print(img2)
    print(img3)
    print(img4)
    print(img5)
    print(img6)
    print(img7)
    print(img8)
    print(img9)
    print()
    time.sleep(0.1)  # すこし待つ。
    t = t + 1

ここでは表示の間に「0.1秒だけ待つ」という機能を使っている:

構文:
注意: import time はプログラムの最初に 1回だけ必要。
import time
...
time.sleep(秒数)
例1:
time.sleep(60)
time.sleep(1.25)

これだけでは同じ絵が繰り返し表示されるだけなので、 すこし変更を加える:

anim.py
import time
# 変数を定義する。
img0 = 1000000000000000000000000000
img1 = 1000000000110000110000000000
img2 = 1000000000110000110000000000
img3 = 1000000000000000000000000000
img4 = 1000001100000000000011000000
img5 = 1000000110000000000110000000
img6 = 1000000011000000001100000000
img7 = 1000000000111111110000000000
img8 = 1000000000000000000000000000
img9 = 1000000000000000000000000000
# 30回繰り返す。
t = 0
while t < 30:
    print(img0)
    print(img1)
    print(img2)
    print(img3)
    print(img4)
    print(img5)
    print(img6)
    print(img7)
    print(img8)
    print(img9)
    print()
# 1桁減らす。 img0 = img0 // 10 img1 = img1 // 10 img2 = img2 // 10 img3 = img3 // 10 img4 = img4 // 10 img5 = img5 // 10 img6 = img6 // 10 img7 = img7 // 10 img8 = img8 // 10 img9 = img9 // 10
time.sleep(0.1) # すこし待つ。 t = t + 1

3.1. プログラムの「コメント」

実はプログラムの多くの部分はコンピュータに対してではなく、 おもに人間に向けて書かれている。 そのため、たいていのプログラミング言語では動作を説明するための注釈、 あるいは コメント (comment)を入れることができる。 Python では「#」記号がコメントを表す。 コメント (注釈文) とは、プログラムのわかりにくい部分を説明するための 日本語の文である。コメント部分は、なにも実行されない。

構文:
# コメント
#」から行末までがコメントとみなされる。
例1:
# 挨拶する。
print("hello")
例2:
print("hello")  # 挨拶する。
例3:
#print("hello")
文の先頭をコメントにすると、何も実行されない。 このような実行されない部分を「コメントアウトされた部分」などと呼ぶ。
演習 3-3.

上のプログラム anim.py を入力し、実行せよ。 プログラムを変更し、違った動きをするように改造せよ。 time.sleep(0.1) の部分を コメントアウトすると、なにが起こるか?

4. 本日の課題

中課題 2. アニメーションプログラム

a. プログラム本体 (5点)

b. レポート (15点)


Yusuke Shinyama