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

  1. 先週の復習
  2. すべての情報を 0 と 1 であらわす
  3. 復習・パソコンの基本的な使い方
  4. Python - 前回までのあらすじ
  5. Pythonで数値を表示・入力する
  6. 数値を計算する
  7. 数値を比較する
  8. 繰り返し処理をおこなう
  9. 足し算・掛け算を実現する
  10. 本日の課題

雑談

なぜプログラミングは油絵のようにいかないのか?

0. 先週の復習

0.1. コンピュータの原理

0.2. コンピュータの4大要素

入力装置 演算装置 出力装置 記憶装置

0.3. 情報とは何か?

コンピュータ上の情報は、 2種類の異なる状態の組み合わせで表される。

数字、文字、画像、音声などをコンピュータで扱うためには、 これらの情報をすべて 01 だけで表す必要がある。

0.4. Python プログラミングの基礎

1. すべての情報を 0 と 1 であらわす

1.1. 数値を 0 と 1 であらわす

我々がふだん使っている数 (10進数) は 「12345」を表すのに 1万文字を書いたりする必要はない。
「桁上がり」の考え方。

 

なぜ人間は10進数を使っているのか? → 5進数を使っている言語もあるらしい。

10進数と2進数の変換

10進数2進数
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001
101010
111011
121100
131101
141110
151111
練習問題
  1. 上の表を完成させよ。
  2. 20 (10進数) を 2進数であらわせ。
  3. 10001 (2進数) を 10進数であらわせ。

1.2. 重要な用語

1.3. 文字を 0 と 1 であらわす

1文字 = 1つの数値と考え、 数値の列を文字列とする。

1.4. 画像を 0 と 1 であらわす

ひとつの点 = 「ピクセル

00000000 00011000 00100100 01000010 01111110 01000010 01000010 01000010

ここでは、0 と 1 を数字でなく、ただ単に点の羅列として扱っている。 このように2進数以外の目的で 0 と 1 を並べたものを ビットマップという。

色を 0 と 1 であらわす

そもそも、色とは何か?

練習問題

R, G, B の各要素をそれぞれ 8ビット (0〜255) で表すと、 256×256×256種類の色が表現できる。 以下の色に(ほぼ)対応する RGB値、または対応する色を答えよ。 (例: 赤 = R…255, G…0, B…0)

  1. 黄色
  2. 紫色
  3. R…0, G…255, B…255
  4. R…128, G…128, B…128

文字と画像の変換

1.5. 音声を 0 と 1 であらわす

音とは何か?

0

音声合成と音声認識

1.6. データの「形式」

コンピュータ上では、すべての情報は 0 と 1 からなる。 その意味は、解釈する方法によって決まる

0と1をどのように解釈するかがわからないと、正しく表示できない。 パソコンでは、ファイル名の拡張子によって、 その情報 (0と1) をどのように解釈するかを決めている。

ファイル拡張子を表示させるには

Macでは (Windowsでも)、ファイルの拡張子はふだんは表示されない設定になっている。 これを変更するには、以下のようにする:

  1. Finderをクリックし、メニューから「環境設定...」を選ぶ。
  2. 「詳細」タブをクリックし、「すべてのファイル名拡張子を表示」に チェックを入れる。

ファイル拡張子の例

テキストファイルとは

ただ文字コードを羅列したファイル。 文字の大きさや色、図表などの情報は含まれていない。

練習問題
  1. インターネットから、 テキスト形式のファイルと、 画像形式のファイルをそれぞれ 1つずつダウンロードせよ。
  2. ダウロードしたファイルの拡張子を確認せよ。
  3. 各ファイルに対して「情報を見る」を実行せよ。
    ひとつのファイルには、その内容の他にどのような情報が付随しているか?

2. パソコンの基本的な使い方・復習

長いので、こっちに移動しました

3. Python - 前回までのあらすじ

3.1. 最初の Python プログラム (再掲)

IDLE を使おうとするとパソコンがクラッシュする (異常終了する) ので、 CotEditor を使うことにした。

  1. 「ターミナル」を起動する。
  2. デスクトップ上にフォルダをひとつ作成する。
  3. そのフォルダに cd する。
  4. CotEditor を使って greetings.py というテキストファイルを作成する。
    $ cd Desktop
    $ mkdir cs1
    $ cd cs1
    $ cot -n greetings.py  (すでにファイルが存在する場合 -n は不要)
    
    greetings.py
    print("What is your name?")
    x = input("name=")
    print(f"Good morning {x}!")
    
  5. プログラム greetings.py を実行する。
    $ python greetings.py
    What is your name?
    name=euske
    Good morning euske!
    

3.2. print関数 - 文字を表示する

構文:
print("文字列")
print(f"文字列")
例1:
print("おおさまのみみはろばのみみ")
例2:
donkey = "ろばのみみ"
print(f"おおさまのみみは{donkey}")

f"〜" のようにすると、 {〜} で囲まれた部分が変数の内容になる。

例3:
donkey = "ろばのみみ"
print("おおさまのみみは{donkey}")
f をつけない場合、 {donkey} はただ文字列として表示される。

3.3. input関数 - 文字を入力する

構文:
変数名 = input("質問")
例1:
x = input("x=")
例2:
name = input("name=")
print(f"Hello, {name}")

4. Pythonで数値を表示・入力する

以下の2つのプログラムは、どう違うのか?

letter.py
x = input("x=")
print(f"x is {x}")
value.py
x = int(input("x="))
print(f"x is {x}")
演習2-1.
  1. 上の2つのプログラムを実行し、それぞれ x の値として 123 を入力して実行結果を観察せよ。
  2. 上の2つのプログラムを実行し、それぞれ x の値として abc を入力して実行結果を観察せよ。

4.1. 数値の入力

input() 関数を int(...) 関数で囲むと、 キーボードからの入力を文字ではなく数値として処理することができる。

構文:
変数名 = int(input("質問"))
例1:
y = int(input("y="))

…これの何が面白いのか?

5. 数値を計算する

本授業で最初に使うのは、この2つだけ。

inc.py
x = int(input("x="))
x = x + 1
x = x + 1
print(f"x is {x}")
演習2-2.
  1. 上のプログラム inc.py を実行し、 いろいろな数値を与えて結果を観察せよ。

6. 数値を比較する

Python では、2つの数値を比較し、 その結果によって異なる動作をさせることができる。 このような機能を 条件分岐 (conditional branch) という。

conditional.py
x = int(input("x="))
print(f"x is {x}")
if x == 0:
    print("x is zero.")
else:
    print("x is not zero.")

上の if文のあとは、かならず インデント (indentation、字下げ) が必要である。 CotEditor では、Tab キーを使ってインデントをおこなう。

演習2-3.
  1. まず CotEditor のメニューから「環境設定...」を開き、 「編集」の欄で タブをスペースに自動的に展開 をチェックせよ。 こうすると Tab キーを押すことで半角スペース4個が挿入される。
  2. 上のプログラム conditional.py を実行し、 x に正の値と負の値を与えて結果を観察せよ。

6.1. if文 (パターン1)

構文:
if 条件式:
    条件式が真であるときに実行される文
else:
    条件式が真でないときに実行される文
例1:
password = int(input("password?"))
if password == 1234:
    print("Correct.")
    print("Good.")
else:
    print("Wrong.")
    print("Baka.")

ifelse の内側に 複数の文を入れることもできる。 この場合も、インデントが重要。

例2:
x = int(input("x="))
if x < 0:
    print("x is negative.")
else:
    print("x is positive.")

このプログラムは正しくない。どうすればよいか?

例3:
x = int(input("x="))
if x < 0:
    print("x is negative.")
else:
    if 0 < x:
        print("x is positive.")
    else:
        print("x is zero.")

ifelseのなかに、さらにif文が入ることもありうる。 この場合、「内側のif文」は2重に字下げされる。

演習2-4.
  1. 上のプログラム conditional.py を変更し、年齢を入力させて 20歳未満であれば "young!"、 20歳以上であれば "old!" と表示するようにせよ。

6.2. 条件式とは

Python では、条件式は if 文の中で変数の値の大小比較をするのに使う。

構文:
変数名あるいは数値 < 変数名あるいは数値
変数名あるいは数値 > 変数名あるいは数値
変数名あるいは数値 == 変数名あるいは数値
変数名あるいは数値 != 変数名あるいは数値
変数名あるいは数値 <= 変数名あるいは数値
変数名あるいは数値 >= 変数名あるいは数値
例1:
if x < 0:
    ... (x は 0 より小さい) ...
例2:
if t == 33:
    ... (t は 33 と等しい) ...
例3:
if 4 >= y:
    ... (y は 4 以下) ...
練習問題
  1. x が 3 のとき、x > 2 は成り立つか?
  2. y が 0 のとき、y < 0 は成り立つか?
  3. z が 1 のとき、1 != z は成り立つか?
  4. t が 7 のとき、3 > 7 は成り立つか?

6.3. if文 (パターン2)

構文:
if 条件式:
    条件式が真であるときに実行される文
条件式が真のときのみ何かを実行させたい場合、 else: 以降は省略できる。
例1:
x = int(input("x="))
if x < 0:
    print("x is negative.")
print(f"x is {x}")
例2:
x = int(input("x="))
if x < 0:
    print("x is negative.")
    print(f"x is {x}")
例3:
x = int(input("x="))
if x < 0:
    print("x is negative.")
if 0 < x:
    print("x is positive.")
if x == 0:
    print("x is zero.")

7. 繰り返し処理をおこなう

Python ではある条件が真である間、 同じ動作を繰り返し実行 (ループ) させることができる。

loop.py
i = 0
while i < 10:
    print(f"i={i}")
    i = i + 1
print("end")

上のプログラム loop.py は、次のように実行される:

7.1. while文

構文:
while 条件式:
    条件式が真の間、繰り返し実行される文

条件式の中には、通常、変数が入っている。 この値が変化すると条件式の真偽も変わる。

例1:
i = 10
while i > 0:
    print(f"i={i}")
    i = i - 1
print("end")
例2:
i = 10
while i > 0:
    print(f"i={i}")
i = i - 1
print("end")
問. 上の 例2. と違っている箇所はどこか?

注意: プログラムの繰り返しが止まらない (無限ループ) 場合は、 Control + C を押して止めること。

例3:
x = 1
while x != 0:
    x = int(input("x="))
print("end")
この繰り返しは変数 x に 0 が入力されるまで続く。
演習 2-5.
  1. 上のプログラム loop.py を変更し、0 から 20 までの数を 2きざみで表示するようにせよ。
    i= 0
    i= 2
    i= 4
    i= 6
    i= 8
    i= 10
    i= 12
    i= 14
    i= 18
    i= 20
    end
    
  2. さらにこのプログラムを変更し、i が 10 になった直後に "ten!" と表示せよ。 (ヒント: while文の中で if 文を使うこと)
    i= 0
    i= 2
    i= 4
    i= 6
    i= 8
    i= 10
    ten!
    i= 12
    i= 14
    i= 18
    i= 20
    end
    

8. 足し算・掛け算を実現する

これまでの成果を使うと、「1を足す」「1を引く」だけの計算を使って、 任意の正の整数の和 a + b を計算することができる。 (なお、ここでは簡単のため正の数のみを考える。)

add.py (未完成)
a = int(input("a="))
b = int(input("b="))
a = a + 1
b = b - 1
a = a + 1
b = b - 1
(... b が 0 になるまで繰り返す ...)
print(f"answer={a}")

この「b が 0 になるまで繰り返す」という処理を while文を使って書くと、以下のようになる:

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

ここで 0 < b のかわりに b > 0 や、 b != 0 などの条件式を使ってもかまわない。

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

さらに上の結果を使って、今度は掛け算を実現することを考える。 以下のプログラムは与えられた整数 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}")
演習 2-6.
  1. 上のプログラム add.pymult.py をそれぞれ実行せよ。
  2. mult.py を短くしようとして 「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}")
    

9. 本日の課題

本日の成果を使って以下の 2つのプログラムを完成させ、OCW-i から提出せよ。

中課題 1. 引き算おより割り算をするプログラム (実際には小課題でした)
  1. まず引き算をするプログラム sub.py から完成させよう。 ここでも正の整数のみを考える。 上の add.py を少し変更すればできる:
    a-b を求めるプログラム sub.py (未完成)
    a = int(input("a="))
    b = int(input("b="))
    while  ? :
        a =  ? 
        b =  ? 
    print(f"answer={a}")
    
  2. つぎに、sub.py の一部をさらに div.py の中で 使って割り算をおこなう。ここでの割り算は原始的に「引けなくなるまで繰り返し引く」 方法を使う。したがって、商 (quotient) と余り (remainder) の両方を計算する必要がある。
    x ÷ y を求めるプログラム div.py (未完成)
    x = int(input("x="))
    y = int(input("y="))
    q = 0
    while y <= x:
    
    (変数 x から y を引く)
    print(f"quotient = {q}") print(f"remainder = { ? }")

なお、OCW-i に提出する際のコメント欄はほとんど読まないので、 あまり重要なことは書かないこと。(読みとばす危険性がある)


Yusuke Shinyama