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

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

雑談

ノーベル平和賞を受賞した World Food Programme について調べてみた。 (公式アナウンス)

どういう意味か?
日本語訳は「世界食糧計画」とされているが、 英語で "food program" といえば一般的に (貧しい人のための) 給食という意味が強く、ニュアンスとしては「世界食糧配給」に近い。
なぜ重要なのか?
食糧が十分に確保できないと、そのぶん戦争が多くなり、世界が平和でなくなるから。 とはいえ、世界の食糧供給量は増えつづけている。 そのため、 実はそれほど問題がないという意見もある。
誰が影響を受けているか?
Hunger Map 2020
おもな原因として、以下のものが挙げられている:
技術で問題は解決できるか?
個人でできることは何か?
食品ロスをなくす。 (日本における食品ロスの現状)
食品ロス削減は環境問題にとっても有効であるとされている。

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 < 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}")

0.4. 小課題 1. で散見されたミス

先々週の小課題 1 を採点した結果 判明した、よくある間違い:

なぜこれほど厳しく採点するのかというと、 通常、プログラミングでは 1文字でも間違ったら動かない というケースが多々あるためである。

教訓: 問題は正確に読むこと。

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. かけ算の練習
  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 = 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

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

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

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

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

5. 本日の課題

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

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

b. レポート (15点)


Yusuke Shinyama