第3回 - 2進数の計算、四則演算、アニメーション作成

  1. 前回の復習
  2. 2進数を使った計算
  3. Pythonにおける四則演算
  4. Visual Studio Code を使う
  5. 数値だけを使ったアニメーションの作成
  6. 本日の課題

雑談

英語の YouTube を見ると、日本人がやってるのとレベルが全然違う:

いいところ

結論: 英語ができれば、良質な教材がタダで手に入る。

0. 前回の復習

if文 (パターン1):
インデントが重要。複数の文を入れることもできる。
if 条件式:
    条件式が真であるときに実行される文
else:
    条件式が真でないときに実行される文
if文 (パターン2):
else: 以降は省略できる。
if 条件式:
    条件式が真であるときに実行される文
演習 3-1. 真偽を判定する
  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")
演習 3-2. ループを理解する
  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}")
演習 3-3. 条件式の書き換え
  1. b の値に 0 が入力されたときのプログラムの動作を日本語で説明せよ。
  2. 0 < b の部分には、 別の条件式を入れてもよい。 そのような条件式の例をひとつ挙げよ。

0.3. プログラム中に測定器を挿入する

前回の演習 2-11. 問題 b を考えてみる:

演習 2-11. 足し算プログラム・掛け算プログラムの実行
  1. mult.py を短くしようとして 「b = p」の部分を削るとうまく動かなくなる。 なぜか考えよ。
元の 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}")

上のプログラムを見て「わざわざ変数 b なんか使う必要ないジャン」と考えて 削ったものが、以下のバージョンである:

b = p を削ったバージョン
p = int(input("p:"))
q = int(input("q:"))
a = 0
while 0 < q:
    while 0 < p:
        a = a + 1
        p = p - 1
    q = q - 1
print(f"answer={a}")

これはうまく動かないのだが「なぜ動かないのか?」を頭だけで 考えると難しいので、実際にプログラム中に測定器を入れて 動作を観察するという方法がある。

測定器とは何か? print関数である:

測定器を入れた mult.py
p = int(input("p:"))
q = int(input("q:"))
a = 0
while 0 < q:
    print(f"p={p}, q={q}")
    b = p
    while 0 < b:
        a = a + 1
        b = b - 1
    q = q - 1
print(f"answer={a}")

上の例では、1つめの while文の中に pq の値をそれぞれ表示する print関数を入れている。 このプログラムを実行すると、次のように表示される:

p:2
q:3
p=2, q=3
p=2, q=2
p=2, q=1
answer=6

同様に、動かないバージョンにも測定器を入れてみる:

測定器を入れた b = p を削ったバージョン
p = int(input("p:"))
q = int(input("q:"))
a = 0
while 0 < q:
    print(f"p={p}, q={q}")
    while 0 < p:
        a = a + 1
        p = p - 1
    q = q - 1
print(f"answer={a}")

結果はこのようになる:

p:2
q:3
p=2, q=3
p=0, q=2
p=0, q=1
answer=6

つまり、なぜ b = p を削ってはダメだったのか?

結論: プログラム中に測定のための print関数を挿入すると、 ものすごい役に立つ。

今後は動作がよくわからないプログラムに対しては、 積極的に print を入れて動きを探ってみよう。

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進数における加算

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

1.2. 2進数における乗算

演習 3-5. 2進数におけるかけ算の練習
  1. 110 × 100 を計算せよ。
  2. 110 × 1001 を計算せよ。
  3. 4 × 7 を 2進数に変換し、これを計算して、また 10進数に戻せ。

2. Pythonにおける四則演算

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-6. Pythonによる四則演算

以下のプログラムを実行し、 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-7. ユークリッドの互除法 (本日の小課題)

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. Visual Studio Code を使う

Visual Studio Code (以下 VS Code) は高機能なテキストエディタで、 Python のプログラムを書いたり実行したりするのに使える。

3.1. VS Code をインストールする

まず https://code.visualstudio.com/ に アクセスし、VS Code をダウンロードする。

インストールするには、以下の方法に従う:

インストールが終わったら、左下の歯車アイコンをクリックして 「Extensions (拡張機能)」を選ぶ。

ここでさらに「Python」を選択し、インストールする。

3.2. VS Code + Python の使い方

VS Code が正しくインストールされると、 コマンド プロンプト上で以下のようにして VS Code を メモ帳のかわりに使える:

C:\Users\euske\Desktop\cs1> notepad hello.py (使用前)
C:\Users\euske\Desktop\cs1> code hello.py    (使用後)

さらに VS Code (+ Python 機能拡張) では、 編集中のプログラムを同じウィンドウ上でそのまま実行できる。 右上の「再生」ボタンをクリックすればよい。

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

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

anim.py
import time
# 変数を定義する。
img0 = 11111111111111111111
img1 = 11111100111100111111
img2 = 11111100111100111111
img3 = 11111111111111111111
img4 = 11001111111111110011
img5 = 11100111111111100111
img6 = 11110011111111001111
img7 = 11111100000000111111
img8 = 11111111111111111111
img9 = 11111111111111111111
# 20回繰り返す。
t = 0
while t < 20:
    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 = 11111111111111111111
img1 = 11111100111100111111
img2 = 11111100111100111111
img3 = 11111111111111111111
img4 = 11001111111111110011
img5 = 11100111111111100111
img6 = 11110011111111001111
img7 = 11111100000000111111
img8 = 11111111111111111111
img9 = 11111111111111111111
# 20回繰り返す。
t = 0
while t < 20:
    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-8. アニメーションの実行

上のプログラム anim.py を入力し、実行せよ。

  1. プログラム中の
    img0 = img0 // 10
    などの部分を
    img0 = (img0 // 10) + 10000000000000000000
    に変更し、動きがどう変化するか観察せよ。
  2. time.sleep(0.1) の部分を コメントアウトすると、なにが起こるか観察せよ。

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

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

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

5. 本日の課題

小課題 4. ユークリッドの互除法 (10月25日締切)
中課題 1. アニメーションプログラム (11月1日締切)

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

b. レポート (15点)

よいレポートを書くコツ


Yusuke Shinyama