Transcript Document

コンピュータの言語
2011年度 秋学期 金曜1・2限
1限担当:山添大丈
2限担当:荻野正樹
1
コンピュータの言語 第六回
コンピュータのための処理手順
アルゴリズムの基礎 その2
2
2. コンピュータのための
処理手順
アルゴリズムの基礎
データの探索と整列
様々なアルゴリズム
3
第1回中間テストの結果
1時間目クラス
2時間目クラス
4
コンピュータと言語2011 中間試験1回目
Q1. 14通りの情報を表すには、( )ビット必要? a. 1, b. 2, c. 3, d. 4
Q2. 2000通りの情報を表すには、( )バイト必要? a. 1, b. 2, c. 3, d. 4
Q3. M(メガ)は、10の( )乗? a. 3, b. 4, c. 5, d. 6
Q4. (2.25)10を2進数で表すと?
a 1.01 b 10.001 c 1.001 d 10.01
Q5. (31.25)10を16進数で表すと?
a 2F.2 b 2F.4 c 1F.2 d 1F.4
Q6. (101.01001)2を10進数で表すと? a 3.28125 b 5.28125 c 3.625 d 5.625
Q7. (101.01001) 2を16進数で表すと?
a A.8F b 5.8F c A.48 d 5.48
注意:計算が大変だと思うので下記を参考にすること
1/2=0.5, 1/4=0.25, 1/8=0.125, 1/16=0.0625, 1/32=0.03125, 1/64=0.015625
Q8.アルファベット、数字を表現できる文字コードを( )バイト文字コードと呼ぶ。
a. 1, b. 2, c. 3, d. 4
Q9.漢字も表現できる文字コードを( )バイト文字コードと呼ぶ。 a. 1, b. 2, c. 3, d. 4
Q10.世界中の文字を統一的に表すことを目指した文字コードとして、( )がある。
a. ASCII, b. EBCDIC, c. JIS, d. Unicode
Q11. 赤色を6桁の16進数で表すと(??)となる
Q12. 紫色を6桁の16進数で表すと(??)となる
Q13. (5A2)16を10進数で表すと?
Q14. (26)10 を2進数で表すと?
a. FF0000, b. 00FF00, c. 0000FF, d. FFFFFF
a. FFFF00, b. 00FFFF, c. FF00FF, d. FFFFFF
各問の正解率
6
アルゴリズムとは(続き)
計算などの問題を解くための手順
 コンピュータの上で実行可能な処理手順


曖昧な記述ではコンピュータが実行できない
アルゴリズムの表現
⇒ フローチャート(流れ図)




順次処理が基本
条件分岐
繰り返し処理
開始
フローチャート
の例
i=7
i>0
No
Yes
i の値を出力
i=i-2
終了
7
アルゴリズムの構造化定理

どんな複雑な処理手順も3種類の基本構造から組
み立てることができる

1つの入口と1つの出口を持つすべてのプログラムは,
「順次」「選択」「繰り返し」の3つの基本構造の組合せに
よって記述することができる
入口
プログラム
順次
選択
出口
繰り
返し
8
変数とは

1つの値(数値や文字列)を一時的に保存する場所

格納された値は,後から参照することができる
変数
a
3
変数
a
5
変数
a
JavaScriptによる
プログラム例
変数 a が利用で
var a;
a = 3;
a = 5;
きるようにする(変
数 a を宣言する)
変数 a に数値3
を代入する
変数 a に数値5 を
代入する(元の値3
は参照できなくなる)
9
フローチャートの統一記号
記号
名称
意味
処理
任意の種類の処理(一般的)
判断
条件を評価した結果によって出口の
うちのいずれか1つを選択する
線
データや制御の流れを示す.矢印を
付けて流れの方向を明示してもよい
端子
プログラムの開始・終了を示す。
ループ端
ループの始まりと終りを表す.記号
の中にループ名と終了条件を書く
定義済み処理
既に処理内容が定義されている処
理 (サブルーチン等)
ここに示したのは日本工業規格(JIS)で
定められた統一記号の一部
開始
A=1?
(A増加ループ)
AをA+1に
A>=16
終了
10
カウンタ変数を用いた繰り返し(例)

「変数 : 初期値,増分,終了条件」を並べて示す
ループ名
カウンタ変数
カウンタ変数
の初期値
ループA
i : 2 , 3 , i>10
処理
ループA
カウンタ変数 i を2から始めて,3
ずつ増やしながら処理を繰り返し,
i が10より大きくなれば終了する
終了条件
カウンタ変数
の増分
条件が成り立
てば終了する
1回の繰り返しに
おけるカウンタ値
の増分
カウンタ変数 i の変化
1回目 → (初期値) i = 2
2回目 → (1回目の値+3) i = 5
3回目 → (2回目の値+3) i = 8
4回目 → (3回目の値+3) i = 11
〔4回目は終了条件( i > 10 )が
成り立つので実行されない〕
11
2. コンピュータのための
処理手順
アルゴリズムの基礎
データの探索と整列
様々なアルゴリズム
12
2. コンピュータのための
処理手順
アルゴリズムの基礎
データの探索と整列
様々なアルゴリズム
13
コンピュータの言語 第六回
コンピュータのための処理手順
アルゴリズムの基礎 その2
14
実用的なアルゴリズム

整列(ならべかえ)アルゴリズム



選択ソート (基本選択法)
クイックソート
探索(指定のものがあるか探す)アルゴリズム


逐次探索
二分探索
15
配列とは
複数の値を連続して保存する場所



3
0
ひとつひとつの保存場所 → 配列の要素
保存場所を区別する数値 → 配列の添字
4
1
12
2
3
4
5
配列変数 data
6個の値が格納で
きる(添字 0~5)
プログラム言語で
は配列の添字は0
(ゼロ)から始まる
JavaScriptによるプログラム
例 Array(6);
var data = new
data[0] = 3;
data[1] = 4;
data[3] = 12;
4番目の要素(添字3)
に 値12 を代入する
16
整列アルゴリズム
主にやるのは、
1.選択ソート(基本選択法)
2.クイックソート
17
いろいろな整列アルゴリズム

選択法


交換法


挿入ソート(基本挿入法),シェルソート(改良挿入法)
併合法


クイックソート,バブルソート(基本交換法),
挿入法


選択ソート(基本選択法),ヒープソート
マージソート
基数法

ラディックスソート(基本整列法)
18
整列アルゴリズム:
選択ソート (基本選択法)

昇順の場合(1,2,3,4....という順番)




全データの中から最も小さいデータを探して先頭のデータ
と入れ換える
次に,2番目以降に並んでいるデータの中で最も小さい
データを取り出して2番目のデータと入れ換える
この操作を,末尾から2番目のデータと末尾のデータの比
較が行われるまで続ける
降順の場合(10,9,8,7....という順番)

昇順の場合と同じ方法で,最も大きいデータと入れ換える
ようにする
SelectionSort
19
選択ソートによる整列(昇順)
全体から最小値
を探す
基準となる先頭を1つずつずらしな
がら,順番が決定していないデータ
の中から最小値を見つける
28 3 17 25 24 10
入れ換える
残りの中から
最小値を探す
3 28 17 25 24 10
入れ換える
3 10 17 25 24 28
3 10 17 25 24 28
3 10 17 24 25 28
3 10 17 24 25 28
20
整列アルゴリズム2: クイックソート
軸より大
中央値を基準
(軸)にする
軸より小
軸より大
1.
整列したいデータの中から
軸(基準)となる値を選ぶ
2.
軸より小さなデータは全て
左側へ,軸より大きなデー
タは全て右側へ移動させる
3.
入れ替えが終了したらデー
タを2つに分けて,それぞ
れのデータに対して同じ操
作を繰り返す
軸より小
(1) 60 40 10 30 80 1 20 70
(2)
移動させる
1 20 10 30 60 40 80 70
(3)
1 20 10
軸より小さい部分
をクイックソート
1 10 20
60 40 80 70
軸より大きい部分
をクイックソート
40 60 70 80
基準の中央の値で分けられた
左右のいずれかが0個または1個
になると,その部分のデータは整
列されている
21
1 20 10
10 1 20
1 10 20
探索アルゴリズム
ある数字や対象を探す
1.逐次探索
2.二分探索
22
逐次探索 [同じものがない時]


配列に格納されたデータを,先頭から1つずつ順番に調べる.
目的の値(キー)に一致するデータが見つかれば処理を終了
する
「大阪」は何番目
にあるか?
注) 配列の添字は
0から始まる
添字
配列
先頭から1つず
つ調べていく
0
1
2
滋賀 和歌山 京都
違う
違う
3
4
5
大阪
兵庫
奈良
違う
4番目に見
つかった
23
二分探索 <前提条件>

データが予め昇順か降順に整列していること

整列(ソート)



データをある順番に並べること
整列アルゴリズムは何種類も考えられている
昇順と降順

昇順: データを値の小さいものから順に並べること


例 (1,2,3,4,5,6)
降順: データを値の大きいものから順に並べること

例 (6,5,4,3,2,1)
24
効率的に
二分探索:並べてあるデータで探索

逐次探索の場合と比べて..



逐次探索では先頭から順番に探索するため,データ数が
多いほど探索時間は長くなる(効率的な探索ではない)
順番に並べてあるデータでは、より効率的な探索方法とし
て二分探索法がある
(データ数が多くなっても効率が著しく低下しない!!)
二分探索の手順
1. 配列のほぼ中央にあるデータとキーを比較する
2. そのデータがキーと合致したら探索終了
3. 合致しなければ,配列を半分にして中央のデータと
キーの比較を行う
4. データが見つかるまでこの操作を繰り返す
「キー」は
目的のデータ
25
重要
二分探索の例

データは予め整列
していることが前提
配列中から値が10のデータを探す
中央値
の添字
中央値
0
1
1
データを半分ずつ
絞り込んでいく
1
2
2
2
5
5
3
6
4
10
6
10
6
10
10
中央値の添字には添字の最
小値と最大値の平均値(小数
点以下切捨て)を用いる
5
11
6
13
7
14
8
17
目的の値(10)は
中央値(11)より
小さい
目的の値(10)は
中央値(5)より
大きい
目的のデータ
9
19
10
20
中央値に対して
大きいか小さいか
によって絞り込む
26
OrderedArray
それぞれのアルゴリズムと
フローチャート
カウンタ変数やフローチャートの書き方
など
思い出していきましょう
27
整列アルゴリズム
主にやるのは、
1.選択ソート(基本選択法)
2.クイックソート
28
整列アルゴリズム:
選択ソート (基本選択法)

昇順の場合(1,2,3,4....という順番)




全データの中から最も小さいデータを探して先頭のデータ
と入れ換える
次に,2番目以降に並んでいるデータの中で最も小さい
データを取り出して2番目のデータと入れ換える
この操作を,末尾から2番目のデータと末尾のデータの比
較が行われるまで続ける
降順の場合(10,9,8,7....という順番)

昇順の場合と同じ方法で,最も大きいデータと入れ換える
ようにする
SelectionSort
29
選択ソートによる整列(昇順)
全体から最小値
を探す
基準となる先頭を1つずつずらしな
がら,順番が決定していないデータ
の中から最小値を見つける
28 3 17 25 24 10
入れ換える
残りの中から
最小値を探す
3 28 17 25 24 10
入れ換える
3 10 17 25 24 28
3 10 17 25 24 28
3 10 17 24 25 28
3 10 17 24 25 28
30
選択ソートでdata[i]配列を考える
N = 6 のとき
開始
ループ1
i : 0, 1, i≧N-1
i 番目からN-1番目までの
データから最小値minを探す
i 番目のデータdata[i]と
最小値minとを入れ換える
ループ1
i を0から4
(N-2)まで,
1ずつ増やす
i番目の値を仮の最小値(min)
とし,残りの i +1番目から N-1
番目までで最小のデータを探す
0
1
2
3
4
5
i = 0 28 3 17 25 24 10
i=1
3 28 17 25 24 10
i=2
3 10 17 25 24 28
i=3
3 10 17 25 24 28
i=4
3 10 17 24 25 28
3 10 17 24 25 28
終了
31
選択ソートのフローチャート
min(最小値)
開始
ループ1
i : 0, 1, i ≧ N-1
min = data[i]
place = i
並べ替え対象の先頭
minの場所
data[i] と
data[place]を
入れ替える
ループ1
終了
place(配列での
minの場所)
??
??
ループ2
j : i+1, 1, j ≧ N
0
1
2
3
4
5
i = 0 28 3 17 25 24 10
No
i=1
3 28 17 25 24 10
i=2
3 10 17 25 24 28
min = data[j]
i=3
3 10 17 25 24 28
place = j
i=4
3 10 17 24 25 28
data[j]<min
Yes
ループ2
後の<練習問題>
での観測点
3 10 17 24 25 28
32
繰り返しの入れ子(2重ループ)
繰り返しの中で,繰り
返しを行うことも可能
繰り返しのループが交差して
はいけない(不適切な例)
ループ1
条件1
ループ2
条件2
処理 A
ループ1
条件1
ループ2
条件2
処理 A
ループ2
ループ1
処理 B
処理 B
ループ1
ループ2
33
<練習 2-13>
選択ソートにおけるデータの様子

基本選択法によって4個のデータ を整列させるとき,ループ2内で j の値
が更新される直前に各変数の値がどのように変化するか以下の表に記
入せよ
i
配列名 data は
d と略記している
0
j
d[j]
min
d[0] d[1] d[2] d[3]
40
60
30
10
10
30
40
60
1
0
0
1
1
34
<練習 2-13> (解答)
選択ソートにおけるデータの様子

基本選択法によって4個のデータ を整列させるとき,ループ2内で j の値
が更新される直前に各変数の値がどのように変化するか以下の表に記
入せよ
i
配列名 data は
d と略記している
j
d[j]
min
0
1
60
40
0
2
30
30
0
3
10
10
1
2
30
30
1
3
40
30
2
3
40
d[0] d[1] d[2] d[3]
40
60
30
10
10
60
30
40
10
30
60
40
10
30
40
60
40
35
整列アルゴリズム2: クイックソート
軸より大
中央値を基準
(軸)にする
軸より小
軸より大
1.
整列したいデータの中から
軸(基準)となる値を選ぶ
2.
軸より小さなデータは全て
左側へ,軸より大きなデー
タは全て右側へ移動させる
3.
入れ替えが終了したらデー
タを2つに分けて,それぞ
れのデータに対して同じ操
作を繰り返す
軸より小
(1) 60 40 10 30 80 1 20 70
(2)
移動させる
1 20 10 30 60 40 80 70
(3)
1 20 10
軸より小さい部分
をクイックソート
1 10 20
60 40 80 70
軸より大きい部分
をクイックソート
40 60 70 80
基準の中央の値で分けられた
左右のいずれかが0個または1個
になると,その部分のデータは整
列されている
36
1 20 10
10 1 20
1 10 20
クイックソートの考え方
開始
軸より左側の
データ列に対して
軸の値を設定
(1)
軸を基準とした
データの入換え
(2)
クイックソート
(3)
軸より右側の
データ列に対して
クイックソート
終了
クイックソートのアルゴリズム
は,自分で自分自身を再帰的
に呼び出す
37
性能の比較
クイックソート
選択ソート
選択ソート
クイックソート
38
探索アルゴリズム
ある数字や対象を探す
1.逐次探索
2.二分探索
39
逐次探索 [同じものがない時]


配列に格納されたデータを,先頭から1つずつ順番に調べる.
目的の値(キー)に一致するデータが見つかれば処理を終了
する
「大阪」は何番目
にあるか?
注) 配列の添字は
0から始まる
添字
配列
先頭から1つず
つ調べていく
0
1
2
滋賀 和歌山 京都
違う
違う
3
4
5
大阪
兵庫
奈良
違う
4番目に見
つかった
40
逐次探索(データが3個の場合)


探索すべきデータを x とする
3個のデータが配列 data に
格納されている
データ数が3個
のとき有効な
添字は 0 ~ 2
data[0]
data[1]
data[2]
開始
x == data[0]
Yes
No
x == data[1]
Yes
No
x == data[2]
より多くのデータを探索
できるようにするには?
(繰り返し構造を用いる)
xは1つ目の
データ data[0]
と等しいか?
No
終了
Yes
探索成功
41
逐次探索のフローチャート
(カウンタ変数を用いた繰り返し)
開始
見つけるべきデータ x,
データ配列 data,
データ数 size を与える
size個
data[0]
data[1]
data[2]
data[3]
・・・
data[size-1]
データ数がsize個
のとき有効な添字
は 0 ~ size-1
ループ1
i : 0, 1, i ≧ size
x == data[i]
No
Yes
初期値: 0
増分: 1
終了条件: i ≧ size
x == data[i]
が成り立つ
探索成功
ループ1
終了
42
<練習 2-10>
逐次探索フローチャートでのループ書換

前ページの逐次探索のフ
ローチャートを,ループ端
記号の代わりに選択構造
を用いて書換える.右の
空欄 (a) (b) に当てはま
る内容を答えなさい
開始
(a)
(b)
No
Yes
x == data[i]
No
Yes
探索成功
i=i+1
終了
43
<練習 2-10> (解答)
逐次探索フローチャートのループ書換
配列の添字は
0 から始まる
開始
i=0
(b)
i < size
有効な添字は
0 ~ size-1
探索が失敗した
時,ここを通る
No
Yes
x == data[i]
No
ループ端記号を用いる
と繰り返しの処理(背景
色が灰色部分)を簡潔
に表すことができる
(a)
Yes
探索成功
i=i+1
終了
44
二分探索 <前提条件>

データが予め昇順か降順に整列していること

整列(ソート)



データをある順番に並べること
整列アルゴリズムは何種類も考えられている
昇順と降順

昇順: データを値の小さいものから順に並べること


例 (1,2,3,4,5,6)
降順: データを値の大きいものから順に並べること

例 (6,5,4,3,2,1)
45
効率的に
二分探索:並べてあるデータで探索

逐次探索の場合と比べて..



逐次探索では先頭から順番に探索するため,データ数が
多いほど探索時間は長くなる(効率的な探索ではない)
順番に並べてあるデータでは、より効率的な探索方法とし
て二分探索法がある
(データ数が多くなっても効率が著しく低下しない!!)
二分探索の手順
1. 配列のほぼ中央にあるデータとキーを比較する
2. そのデータがキーと合致したら探索終了
3. 合致しなければ,配列を半分にして中央のデータと
キーの比較を行う
4. データが見つかるまでこの操作を繰り返す
「キー」は
目的のデータ
46
重要
二分探索の例

データは予め整列
していることが前提
配列中から値が10のデータを探す
中央値
の添字
中央値
0
1
1
データを半分ずつ
絞り込んでいく
1
2
2
2
5
5
3
6
4
10
6
10
6
10
10
中央値の添字には添字の最
小値と最大値の平均値(小数
点以下切捨て)を用いる
5
11
6
13
7
14
8
17
目的の値(10)は
中央値(11)より
小さい
目的の値(10)は
中央値(5)より
大きい
目的のデータ
9
19
10
20
中央値に対して
大きいか小さいか
によって絞り込む
47
OrderedArray
配列の中央値



L (low) : データを探索する配列の最小の添字
H (high) : データを探索する配列の最大の添字
M (mid) : 中央値の添字
M = [ (L+H) / 2 ]
[x] は x を越えない整数を表す
(x が正の数なら切捨てと同じ)
M
L
M+1
M-1
配列 data
2
5
6
10
H
11
13
14
17
19
data[M] の値 11 が中央値となる
48
二分探索による絞込みの例:
13個のデータから「3」を検索
(1) L: 0
data
1
M: 6
2
5
6
10
12
14
15
17
19
H: 5
2
5
6
10
11
(3) L: 0 H: 1
添字 M = [ (L+H) / 2 ]
配列の中央値 data[M]
「1」の探索なら成功!
(このとき L < H )
2
M: 0
(4)
(3 > data[M] なので L = M+1)
L: 1 H: 1
「2」の探索なら成功!
(このとき L = H )
2
M: 1
(5)
22
〔(L+H) / 2 の結果を切捨てる〕
M: 2
(3 < data[M] なので H = M-1)
1
20
(3 < data[M] なので H = M-1)
(2) L: 0
1
11
H: 12
(3 > data[M] なので L = M+1)
L: 2 H: 1
「3」の探索は
L > H となって失敗する


L>H のとき探索対象
データがない(探索失敗)
L<H または L=H の間
は探索が成功する可能
性がある
49
二分探索のフローチャート
ループ
L>H
開始
L=0
H = size - 1
M = [(L+H) / 2]
Yes
見つけるべきデータ x,
データ配列 data,
データ数 size は予め
与えられるものとする
x >= data[M]
x < data[M]
x <= data[M]
No
H=M-1
最大の添字は
(データ数-1)
<練習問題>
での観測点
x > data[M]
No
x == data[M]
が成り立つ
Yes
L=M+1
探索成功
ループ
終了
50
<練習 2-11> 二分探索(1)

二分探索によって,以下の9個のデータから「10」を探索
する.中央値の添字 Mが計算された直後に,変数 L, M,
Hの値がどのように変化するか以下の表に記入せよ
L: 0
data
2
H: 8
6
10
11
14
15
17
19
20
繰り返し
回数
L
(1)
0
M
H
8
(2)
(3)
51
<練習 2-11> (解答) 二分探索(1)

(1)
二分探索によって,以下の9個のデータから「10」を探索する.中央値
の添字Mが計算された直後に,変数 L, M, Hの値がどのように変化
するか以下の表に記入せよ
L:0
2
H:8
6
10
繰り返し
回数
L
M
H
(1)
0
4
8
H:3
(2)
0
1
3
11
(3)
2
2
3
11
14
M:4
(2)
L:0
2
6
10
15
17
19
20
M:1
(3)
L:2 H:3
10
11
M:2
52
<練習 2-12> 二分探索(2)

以下の配列データから「6」を探索する.中央値 の添字Mが計算され
た直後の 各変数の値を以下の表に記入せよ.なお,該当しない繰り
返しには「なし」と記入しなさい.
L: 0
data
1
3
4
6
5
H: 5
繰り返し
回数
L
7
(1)
0
M
H
data[M]
5
(2)
(3)
(4)
53
<練習 2-12> (解答) 二分探索(2)

配列データから「6」を探索する
L: 0
(1回目)
data 1
3
4
6
5
H: 5
繰り返し
回数
L
M
H
data[M]
7
(1)
0
2
5
4
(2)
3
4
5
5
H: 5
(3)
5
5
5
7
7
(4)
なし
なし
なし
なし
M: 2
6 > data[M]
なので L = M+1
L: 3
6
(2回目)
5
M: 4
6 > data[M]
なので L = M+1
(3回目)
6 < data[M]
なので H = M-1
L: 5 H: 5
4回目の繰り返しに
入る前に終了する
7
M: 5
L: 5 H: 4
与えられた配列に存在
するデータ「6」の探索に
失敗したのはなぜか? 54
Backup
55
Obsolete
56
<練習 3-6> ループ端記号による
フローチャートの書換え
開始
キー x を入力
Nにデータ数を代入

前ページの逐次探索の
フローチャートを,ループ
端記号(前判定型)を用
いて書換えなさい
i=1
Yes
i<N
No
i の値を出力
終了
57
<練習 3-6> (解答) ループ記号によ
るフローチャートの書換え
開始
キー x を入力
Nにデータ数を代入
i=1
繰り返しの
終了条件
ループ1
data[i] == x または i ≧ N
i=i+1
ループ1
Yes
i<N
No
終了
i の値を出力
58
二分探索のフローチャート
開始
キー x を入力
L=0
H = N-1
ループ1
L>H
M = [(L+H)] / 2
x < data[M]
Yes
No
データがN個
なのでHにN
を代入する
x > data[M]
No
探索成功
探索に成功した場合の終
了条件がないので,無駄
な繰り返しが行われる
中央より小さい方に
絞り込む.最大値を
(中央値-1)にする
Yes
H=M-1
L=M+1
中央より大きい方に
絞り込む.最小値を
(中央値+1)にする
ループ1
終了
59
二分探索のフローチャート
(終了条件付き)
Fが0(ゼロ)になったら
探索の繰り返しを終了
開始
ループ1
F == 0
キー x を入力
L=0
H = N-1
F=1
M = [(L+H)] / 2
x < data[M]
Yes
H=M-1
No
x > data[M]
Fの初期値
を1に設定
データが見つか
らなかった場合,
L > H となる
No
探索成功
Yes
L=M+1
L>H
No
Yes
探索失敗
F=0
F=0
ループ1
終了
60
フラグ

アルゴリズムの中で,状態を記憶,参照するために
使われるデータ(変数)のことをフラグ という


フラグ(旗): flag
2種類の状態を区別する場合には,データに0か1
を設定して用いることが多い

前ページのフローチャートでは,探索できる状態かどうか
を区別するために フラグFを用いた

Fの値が1の間は探索継続,0になったとき探索を終了する
61
二分探索のフローチャート
開始
これ以上絞り込めない
ときに L > H となる
x ← ke
y
ループ1
L>H
L←1
H←N
M ← [ (L+H) / 2 ]
<
データがN個
なのでHにN
を代入する
x : T(M)
中央より大きい方に
絞り込む最小値を
(中央値+1) にする
>
=
H ← M -1
中央より小さい方に絞
り込む最大値を (中
央値-1) にする
探索成功
L←M+1
ループ1
終了
探索に成功した場合の終了
条件がないので,無駄な繰り
62
返しが行われる
二分探索のフローチャート
(終了条件付き)
Fが0(ゼロ)になったら
探索の繰り返しを終了
開始
ループ1
F=0
x ← ke
y
M ← [ (L+H) / 2 ]
F←1
L←1
H←N
L:H
<
x : T(M)
>
>
H ← M -1
探索成功
≦
探索失敗
=
Fの初期値
は1に設定
データが見つか
らなかった場合
は L > H とな
る
L←M+1
F←0
F←0
ループ1
探索が成功したとき
Fを0(ゼロ)にする
探索が失敗したとき
Fを0(ゼロ)にする
終了
63
64
コンピュータの言語
2010年度 秋学期 金曜1・2限
1限担当:山添大丈
2限担当:米澤朋子
65
2. コンピュータのための
処理手順
アルゴリズムの基礎
データの探索と整列
様々なアルゴリズム
66
インフォメーションシステムを使った
課題提出練習




出席などは今までとっていませんが、インフォメーションシ
ステムを用いたこのような出席レポート(授業内外で提出)
を求めます。
今回は、インフォメーションシステムを使ったことがない人
のために、 課題提出の練習として、簡単な課題(レポート
含まず)を出してもらいます。
提出期限:10月28日(木)
提出方法:テキストファイル
(kadai04学籍番号ローマ字名前.txt)
67
コンピュータとは何か?

従来の機械



コンピュータ




人間の身体的能力の限界を補うために作られた
例: 電車,自動車,クレーン ・・・
人間に代わってアルゴリズムを自動的に実行する機械
人間の脳みその役割を肩代わりする
情報を「処理」する機械
情報を「伝達」したり,「保存」するだけではない


例: テレビ,ラジオ,電話,DVDレコーダ ・・・
↑は人間が自分の脳みそで考えて使うものにすぎない
68
アルゴリズムとは
ある問題を解決する(解く)ために必要な処理と手順
を表したもの
 JISによる定義


「明確に定義された有限個の規則の集まりであって,
有限回適用することによって問題を解くもの」
問題
一連の
処理と手順
アルゴリズム
結果
69
アルゴリズムとは(続き)

ある問題を解くためのアルゴリズムは1通りではなく,
いくつもの方法が存在する
問題: 2の4倍は?
2×4
2
+2
+2
+2
2を足す
0
2を足す
2
2を足す
4
2を足す
6
結果は8
70
アルゴリズムとは(続き)
計算などの問題を解くための手順
 コンピュータの上で実行可能な処理手順


曖昧な記述ではコンピュータが実行できない
アルゴリズムの表現
⇒ フローチャート(流れ図)




順次処理が基本
条件分岐
繰り返し処理
開始
フローチャート
の例
i=7
i>0
No
Yes
i の値を出力
i=i-2
終了
71
フローチャートの統一記号
記号
名称
意味
処理
任意の種類の処理(一般的)
判断
条件を評価した結果によって出口の
うちのいずれか1つを選択する
線
データや制御の流れを示す.矢印を
付けて流れの方向を明示してもよい
端子
プログラムの開始・終了を示す。
ループ端
ループの始まりと終りを表す.記号
の中にループ名と終了条件を書く
定義済み処理
既に処理内容が定義されている処
理 (サブルーチン等)
ここに示したのは日本工業規格(JIS)で
定められた統一記号の一部
開始
A=1?
(A増加ループ)
AをA+1に
A>=16
終了
72
アルゴリズムとは(続き)
計算などの問題を解くための手順
 コンピュータの上で実行可能な処理手順


曖昧な記述ではコンピュータが実行できない
アルゴリズムの表現
⇒ フローチャート(流れ図)




順次処理が基本
条件分岐
繰り返し処理
開始
フローチャート
の例
i=7
i>0
No
Yes
i の値を出力
i=i-2
終了
73
よいアルゴリズムとは

当然アルゴリズムは正確に結果を導けるものでなく
てはならない。しかし,,,,
正確で効率が良く
分かりやすい
複雑で
分かりにくい
誤った答え
が導かれる
正確で効率が良く,分かりやすいプログラムを作成
するには,アルゴリズムの設計が重要
74
アルゴリズムの構造化定理

どんな複雑な処理手順も3種類の基本構造から組
み立てることができる

1つの入口と1つの出口を持つすべてのプログラムは,
「順次」「選択」「繰り返し」の3つの基本構造の組合せに
よって記述することができる
入口
プログラム
順次
選択
出口
繰り
返し
75
アルゴリズムとプログラム

アルゴリズム


具体的な記述方法によらない抽象的な解法の手順
プログラム


ある計算の実行方法を,ある記述方法(例えば,フロー
チャートやC言語などの)基本要素とその組合せによって
示したもの
特定のプログラム言語を用いて,ある解法の手順(アルゴ
リズム)を記述したもの


1つのアルゴリズムでも異なるプログラム言語で記述できる
今後、アルゴリズムを、フローチャートやプログラム
記述によって説明していくことが増えます。
76
アルゴリズム要素1:順次構造

1つの処理が終了したら,次の処理に順次進む
フローチャートによる記述
例
開始
処理1
aに3を代入
処理2
処理3
bに4を代入
a×b を出力
終了
77
例1: 演算結果の出力プログラム
〔順次構造〕
フローチャート
開始
aに3を代入
JavaScriptによる
プログラム例
var a = 3;
変数 a を宣言し,その
値として3を代入する
var b = 4;
alert(a*b);
bに4を代入
a×b を出力
「b = 4」としてもよい.
(b と 4 が等しいと
いう意味ではない)
a*b の結果をダイアログ
(小ウィンドウ)に出力する
終了
78
変数とは

1つの値(数値や文字列)を一時的に保存する場所

格納された値は,後から参照することができる
変数
a
3
変数
a
5
変数
a
JavaScriptによる
プログラム例
変数 a が利用で
var a;
a = 3;
a = 5;
きるようにする(変
数 a を宣言する)
変数 a に数値3
を代入する
変数 a に数値5 を
代入する(元の値3
は参照できなくなる)
79
例1: 演算結果の出力プログラム
〔順次構造〕
フローチャート
開始
aに3を代入
JavaScriptによる
プログラム例
var a = 3;
変数 a を宣言し,その
値として3を代入する
var b = 4;
alert(a*b);
bに4を代入
a×b を出力
「b = 4」とプログラ
ムでは記述するが、
(b と 4 が等しいと
いう意味ではなく、
あくまで代入の意味
a*b の結果をダイアログ
(小ウィンドウ)に出力する
終了
80
参考: JavaScriptプログラムの実行
<html>
<head>
<title>プログラム例1</title>
</head>
<body>
<h1>プログラム例1</h1>
<script type="text/javascript">
var a = 3;
var b = 4;
alert(a*b);
</script>
</body>
</html>
エディタで入力し
eg1.html として保存
マウスで
アイコンを
ダブルクリック
81
例2: ユーザからの入力 〔順次構造〕
フローチャート
JavaScriptによるプログラム例
入力された文字列を
数値に置き換える
開始
aに数値を入力
var a = Number ( prompt("aを入力") );
var b = Number ( prompt("bを入力") );
bに数値を入力
a×b を出力
alert(a*b);
説明(“aを入力”)を
文字入力ダイアログに表示する
終了
82
<練習2-1> 順次構造(1)

買い物の合計金額(税別)が
変数 a に入力されたとする.
変数 b に2割引の金額,変
数 c に消費税(5%)込みの
支払い金額を代入し,最後に
cの値が出力されるように,
右のフローチャートの空欄を
埋めなさい

ただし,1円未満の端数につい
ては考えなくてよい
開始
aに数値を入力
b=
cの値を出力
終了
83
<練習2-1> (解答)
順次構造(1)

買い物の合計金額(税別)が
変数 a に入力されたとする.
変数 b に2割引の金額,変
数 c に消費税(5%)込みの
支払い金額を代入し,最後に
cの値が出力されるように,
右のフローチャートの空欄を
埋めなさい

ただし,1円未満の端数につい
ては考えなくてよい
開始
aに数値を入力
b = a × 0.8
c = b × 1.05
cの値を出力
終了
84
<練習2-2> 順次構造(2)

右のフローチャートにおいて,
変数 aに 3,bに 5 を入力
したとき,最後に出力される
a,b の値を答えなさい
開始
aに数値を入力
bに数値を入力
c=a
変数c に変数a
の値を代入する
a=b
b=c
??
aの値を出力
??
bの値を出力
終了
ここで出力さ
れる値は?
85
<練習2-2> (解答)
順次構造(2)
開始
aに3,bに5 を入力
「変数」は箱(入れ物)
「値」は入れ物の中身
aに数値を入力
3
5
3
bに数値を入力
変数
変数
変数
3
5
5
3
変数
変数
変数
このフローチャートは変数a と
bの値を入れ替える処理
(1) aの値を一時的にcに退避
(2) bの値をaに移す
(3) cに退避したaの値を bに移す
a
b
変数aの中身(値)を変数cの箱
に移しても,aの値は変わらない
c
c=a
a=b
b=c
a
b
c
aの値を出力
5
5
3
3
bの値を出力
変数
変数
変数
終了
a
b
c
aの値は5,bの値は3
86
アルゴリズム要素2:選択構造
ある条件によって2つの処理のどちらかを選択して
実行する
例
開始
 x>y, x≧yなどで分岐

年齢を入力
条件を満たさな
ければこちらの
処理を実行
条件を満たせ
ばこちらの
処理を実行
条件
No
年齢>12
Yes
大人運賃
の処理
No
小人運賃
の処理
Yes
処理1
処理2
終了
87
例3: 数値の判別 〔選択構造〕
フローチャート
var age = Number( prompt("年齢は?", "18") );
開始
ageを入力
age>12
Yes
大人運賃
の処理
JavaScriptによるプログラム例
No
小人運賃
の処理
if (age>12) {
alert( age + "歳は大人運賃です" );
}
else {
alert( age + "歳は小人運賃です" );
}
文字列を連結
して出力する
終了
88
<練習2-3> 選択構造(1)

ある学部の卒業要件では,
講義科目を50単位以上,
実習科目を12単位以上取
得する必要がある.さらに,
在籍年数は8年以下でな
ければならない.この条件
に基づいて,卒業可能か
どうかを判定する右のフ
ローチャートを完成させな
さい.
開始
講義科目の取得単位数 a を入力
実習科目の取得単位数 b を入力
在籍年数 c を入力
a
b
c
卒業可能
終了
卒業
できない
89
<練習2-3> (解答)
選択構造(1)
このフローチャート
も誤りではないが,
条件の与え方が直
感的に分かりにくい
開始
開始
講義科目の単位数 a を入力
実習科目の単位数 b を入力
在籍年数 c を入力
講義科目を50単位
以上取得したか?
(50単位でも良いの
で ≧ となる)
実習科目を12単位
以上取得したか?
(12単位でも良いの
で ≧ となる)
在籍年数が8年
以下か?
(不等号の向き
に注意)
a ≧ 50
Yes
b ≧ 12
No
講義科目の単位数 a を入力
実習科目の単位数 b を入力
在籍年数 c を入力
a < 50
No
No
b < 12
Yes
Yes
Yes
No
c ≦8
No
c >8
Yes
卒業可能
終了
Yes
No
卒業
できない
卒業可能
終了
卒業
できない
90
<練習2-4> 選択構造(2)


大阪市のあるテーマパーク
の入場料は,65歳以上ま
たは12歳以下の大阪市民
に対して特別割引,その他
の大阪市民には優待割引
が適用される.
この条件に基づいて,入場
割引の種別を判定する、右
のフローチャートを完成させ
なさい.
開始
年齢を変数 a に入力
大阪市民?
a
a
特別割引
終了
優待割引
割引なし
91
<練習2-4> (解答)
選択構造(2)

特別割引:


大阪市民で
65歳以上または12歳以下
開始
年齢を変数 a に入力
大阪市民?

優待割引:上記以外の大阪市民
Yes
a ≧ 65

割引なし:大阪市民でない人
Yes
大阪市民として
割引は受けられ
るが,さらに条件
を絞込む
No
No
a ≦ 12
Yes
特別割引
終了
No
優待割引
割引なし
コンピュータの言語 第五回
コンピュータのための処理手順
アルゴリズムの基礎 その2
93
インフォメーションシステムを使った
課題提出練習




出席などは今までとっていませんが、インフォメーションシ
ステムを用いたこのような出席レポート(授業内外で提出)
を求めます。
今回は、インフォメーションシステムを使ったことがない人
のために、 課題提出の練習として、簡単な課題(レポート
含まず)を出してもらいます。
提出期限:10月28日(木)
提出方法:テキストファイル
(kadai04学籍番号ローマ字名前.txt)
94
アルゴリズムとは(続き)
計算などの問題を解くための手順
 コンピュータの上で実行可能な処理手順


曖昧な記述ではコンピュータが実行できない
アルゴリズムの表現
⇒ フローチャート(流れ図)




順次処理が基本
条件分岐
繰り返し処理
開始
フローチャート
の例
i=7
i>0
No
Yes
i の値を出力
i=i-2
終了
95
アルゴリズムの構造化定理

どんな複雑な処理手順も3種類の基本構造から組
み立てることができる

1つの入口と1つの出口を持つすべてのプログラムは,
「順次」「選択」「繰り返し」の3つの基本構造の組合せに
よって記述することができる
入口
プログラム
順次
選択
出口
繰り
返し
96
変数とは

1つの値(数値や文字列)を一時的に保存する場所

格納された値は,後から参照することができる
変数
a
3
変数
a
5
変数
a
JavaScriptによる
プログラム例
変数 a が利用で
var a;
a = 3;
a = 5;
きるようにする(変
数 a を宣言する)
変数 a に数値3
を代入する
変数 a に数値5 を
代入する(元の値3
は参照できなくなる)
97
アルゴリズム要素3:繰り返し

同じ処理を繰り返す
処理1
98
選択構造による繰り返し

ある条件が成り立つ間 処理を繰り返す

条件が成り立たなくなったら次の処理に進む
条件
No
Yes
条件が成り立
たなくなったら
処理2に進む
処理1
条件が成り立つ間
処理1を繰り返す
処理2
99
フローチャートの統一記号
記号
名称
意味
処理
任意の種類の処理(一般的)
判断
条件を評価した結果によって出口の
うちのいずれか1つを選択する
線
データや制御の流れを示す.矢印を
付けて流れの方向を明示してもよい
端子
プログラムの開始・終了を示す。
ループ端
ループの始まりと終りを表す.記号
の中にループ名と終了条件を書く
定義済み処理
既に処理内容が定義されている処
理 (サブルーチン等)
ここに示したのは日本工業規格(JIS)で
定められた統一記号の一部
開始
A== 1?
(A増加ループ)
AをA+1に
A>=16
終了
100
選択構造による繰り返し
前判定型: 条件を満たさなければ、処理1は1回も実行されない
後判定型: 条件を満たさなくても、処理1は1回は実行される
前判定型
条件
後判定型
No
処理1
Yes
条件
No
Yes
処理1
処理2
処理2
101
例4-1: 選択構造による繰り返し
(先に判定:前判定型)
1から10までの
総和を求める
開始
i が10以下の間
処理を繰り返す
sum = 0
i=1
var sum = 0;
var i = 1;
No
i ≦10
JavaScriptによるプログラム例
while (i<=10) {
sum = sum + i;
i = i + 1;
}
Yes
sum = sum + i
i=i+1
alert(sum);
終了
sum の値を出力
終了
sumに i を足して
その結果を sum
に代入する
i に 1 を足して
その結果を i
に代入する
102
例4-2: 選択構造による繰り返し
(後で判定:後判定型)
1から10までの
総和を求める
開始
i が10以下の間
処理を繰り返す
sum = 0
i=1
var sum = 0;
var i = 1;
sum = sum + i
do {
sum = sum + i;
i = i + 1;
} while (i<=10);
i=i+1
i ≦10
JavaScriptによるプログラム例
No
alert(sum);
Yes
終了
sum の値を出力
終了
sumに i を足して
その結果を sum
に代入する
i に 1 を足して
その結果を i
に代入する
103
<練習2-5>
選択構造による繰り返し(1)


(a) 右のフローチャートが
終了するまでに,「iの値を
出力」が何回実行されるか
答えなさい
(b) 「iの値を出力」が最後
に実行されたときの i の値
を答えなさい
開始
i=7
i>0
Yes
この地点で
値を調べる
No
i の値を出力
i=i-2
終了
104
<練習2-5> (解答)
選択構造による繰り返し(1)
開始
i=7
i>0
Yes
この地点で
値を調べる
No
i の値を出力
実行回数
i の値
1回目
7
2回目
5
3回目
3
4回目
1
5回目
-1
i >0 が成り立たない
ので終了する (i の
値は出力されない)
i=i-2
終了
(a) 「i の値を出力」は4回実行される
(b) 最後に実行されたときの値は 1
105
<練習2-6>
選択構造による繰り返し(2)

5から13までの奇数の総
和を求める処理となるよう
に,空欄(a)(b)にあては
まる変数 i への代入式を
答えなさい
開始
sum = 0
(a)
i ≦13
No
Yes
sum = sum + i
(b)
sum の値を出力
終了
106
<練習2-6> (解答)
選択構造による繰り返し(2)
5から13までの
奇数の総和を求める
開始
sum = 0
i=5
i ≦13
参考: JavaScriptによる
プログラム例
(a)
No
var sum = 0;
var i = 5;
Yes
sum = sum + i
i = i + 2 (b)
sum の値を出力
終了
while (i<=13) {
sum = sum + i;
i = i + 2;
}
(a)
(b)
alert(sum);
107
ループ端記号による繰り返し


ループに名前を付けて繰り返しの開始と終了の対応を示す
終了条件が成り立つまで,処理を繰り返す
 ループ終了条件は開始端・終了端のどちらか一方に書く
前判定型
後判定型
ループ名
終了条件
処理
ループ名
ループ名
処理
終了条件
ループ名
108
例5: ループ端記号による繰り返し
フローチャート
開始
n を入力
ループA
n <= 0
n の値を出力
JavaScriptによるプログラム例
var n = Number( prompt(“初期値?", "3") );
while ( n>0 ) {
alert( "あと" + n + "回" );
n = n - 1;
}
alert( "終了" );
n=n-1
文字列の連結
(数値の足し算
ではない)
ループA
メッセージを出力
終了
n の値が0と等しく
なるか,負になっ
たら繰り返しを終
わる(終了条件)
nの値が0より大
きい間 繰り返す
(繰り返し条件)
要注意!
109
<練習2-7>
ループ端記号の終了条件

右のフローチャートによる処理は
終了することなく無限に繰り返さ
れる(無限ループとなる).繰り返
し処理が終了するようにループ
端記号の終了条件を訂正しなさ
い
開始
n=5
ループA
n == 0
この地点で
値を調べる
n=n-2
ループA
終了
110
<練習2-7> (解答)
ループ端記号の終了条件
開始
n=5
n の値が 0 と等し
くなったら終了する
n == 0 (終了条件)
が成り立たないのでい
つまでも終了しない
実行回数
ループA
n == 0
n=n-2
ループA
終了
この地点で
値を調べる
n の値
1回目
5
2回目
3
3回目
1
4回目
-1
5回目
-3
以下の条件で繰り返しを終了する
n==1 (nの値が奇数になった場合),または
n < 0 (nの値がある値を下回った場合)
111
カウンタ変数を用いた繰り返し(例)

「変数 : 初期値,増分,終了条件」を並べて示す
ループ名
カウンタ変数
カウンタ変数
の初期値
ループA
i : 2 , 3 , i>10
処理
ループA
カウンタ変数 i を2から始めて,3
ずつ増やしながら処理を繰り返し,
i が10より大きくなれば終了する
終了条件
カウンタ変数
の増分
条件が成り立
てば終了する
1回の繰り返しに
おけるカウンタ値
の増分
カウンタ変数 i の変化
1回目 → (初期値) i = 2
2回目 → (1回目の値+3) i = 5
3回目 → (2回目の値+3) i = 8
4回目 → (3回目の値+3) i = 11
〔4回目は終了条件( i > 10 )が
成り立つので実行されない〕
112
開始
sum = 0
ループA
i=2
i : 2 , 3 , i>10
i ≦10
処理
(a)
No
Yes
sum = sum + i
ループA
i = i + 3 (b)
sum の値を出力
終了
113
例6: カウンタ変数を用いた繰り返し
〔繰り返し回数固定〕
開始
sum = 0
ループ
i : 1, 1, i>10
sum = sum + i
JavaScriptによる
プログラム例
i に 1 を足して
その結果を i
に代入する
(i = i + 1 と同じ)
var sum = 0;
for ( var i=1; i<=10; i++ ) {
sum = sum + i;
}
alert(sum);
要注意!
for文では,繰り返し条件
を記述( i が 10以下の間
繰り返す)
ループ
sum の値を出力
終了
変数 i の値を初期値 1 から始
めて,1 ずつ増やしながら,i が
10より大きくなるまで繰り返す
114
例7: カウンタ変数を用いた繰り返し
〔繰り返し回数変更可〕
開始
k を入力
sum = 0
ループ
i : 0, 2, i>k
sum = sum + i
0からk まで
の偶数の総
和を求める
JavaScriptによるプログラム例
var k = Number( prompt( “kの値?", "3" ) );
var sum = 0;
for ( var i=0; i<=k; i=i+2 ) {
sum = sum + i;
}
alert(sum);
ループ
sum の値を出力
終了
i の値がkを超え
るまで繰り返す
i がk以下の間,i
の値を2ずつ増や
しながら繰り返す
115
<練習2-8>
カウンタ変数を用いた繰り返し

5から13までの奇数の総和を
求めるフローチャートとなるよう
に空欄(a) を埋めよ

カウンタ変数 i を用いること
開始
sum = 0
ループ
(a)
sum = sum + i
ループ
sum の値を出力
終了
116
<練習2-8> (解答)
カウンタ変数を用いた繰り返し
5から13までの
奇数の総和を求める
開始
sum = 0
(a)
ループ
i : 5, (a)
2, i>13
sum = sum + i
ループ (a)
sum の値を出力
終了
5から13までの奇数: 5,7,9,11,13
初期値: 5
増分: 2
終了条件: 13より大きい(13を含まない)
参考: JavaScriptによるプログラム例
var sum = 0;
for ( var i=5; i<=13; i=i+2 ) {
sum = sum + i;
}
alert(sum);
117
例8 最大値を求める
〔処理の繰り返し〕
それまでに入力された数値
のうち最大値を求める
JavaScriptによるプログラム例
var max = 0;
開始
while (true) {
var n = Number(prompt(“値?”, “0”));
if (n>max) { max = n; }
}
max = 0
n を入力
n>max
もし n の値がこれまで
に入力された値(max)
より大きければ,n を
max に代入する
No
Yes
max = n
このフローチャート
では処理が終了で
きない
118
例9 最大値を求める
〔終了条件の追加〕
開始
入力された値 n
が0または負の
場合,最大値を
出力して処理を
終了する
Yes
JavaScriptによるプログラム例
max = 0
var max = 0;
while (true) {
var n = Number(prompt(“値?”, “0”));
if (n<=0) { break; }
if (n>max) { max = n; }
}
n を入力
n<=0
No
max を出力
n>max
Yes
終了
max = n
alert(max);
No
n の値が0以下なら
whileループから
抜け出す
119
例10 最大値を求める
〔前判定型ループ端記号を使った例〕
開始
max = 0
n の値が0または
負となれば,繰り
返しを終わる
JavaScriptによるプログラム例
var max = 0;
var n = Number(prompt(“値?”, “0”));
n を入力
ループ1
n<=0
Yes
n>max
No
max = n
n を入力
max を出力
while (n>0) {
if (n>max) { max = n; }
n = Number(prompt(“値?”, “0”));
}
alert(max);
nの値が正である限り,
この処理を繰り返す
ループ1
終了
120
<練習2-9>
後判定型の繰り返し

例10(前ページ)のフローチャー
トを後判定型のループ端記号を
用いて書き換え,例10と同じく最
大値を求める処理となるように,
右の空欄(a) を埋めよ
開始
max = 0
ループ1
(a)
後判定型ループでは,ループ
内の処理を1度行ってから終
了条件の判定が行われる
max を出力
n<=0
ループ1
終了
n<=0 となれ
ば,繰り返しを
終わる
121
後判定型ループで
は,ループ内の処
理を1度行ってか
ら終了条件の判定
が行われる
開始
max = 0
n の値が0または
負となれば,繰り
返しを終わる
max = 0
n を入力
ループ1
ループ1
n<=0
(a)
Yes
n>max
No
開始
max = n
n を入力
max を出力
max を出力
ループ1
終了
終了
n<=0
ループ1
n<=0 となれ
122
ば,繰り返しを
終わる
<練習2-9> (解答)
後判定型の繰り返し
後判定型ループ
では,ループ内の
処理を1度行って
から終了条件の
判定が行われる
開始
JavaScriptによるプログラム例
max = 0
var max = 0;
var n;
ループ1
「n を入力」の
処理が1箇所し
かないことに注
意
n を入力
n>max
No
max を出力
n <= 0
ループ1
終了
Yes
max = n
do {
n = Number(prompt(“値?”, “0”));
if (n>max) { max = n; }
} while (n>0);
alert(max);
nの値が正である限り,
処理を繰り返す
n が0 または
負となれば,繰
り返しを終わる
123
フローチャートの統一記号
記号
名称
意味
処理
任意の種類の処理(一般的)
判断
条件を評価した結果によって出口の
うちのいずれか1つを選択する
線
データや制御の流れを示す.矢印を
付けて流れの方向を明示してもよい
端子
プログラムの開始・終了を示す。
ループ端
ループの始まりと終りを表す.記号
の中にループ名と終了条件を書く
定義済み処理
既に処理内容が定義されている処
理 (サブルーチン等)
ここに示したのは日本工業規格(JIS)で
定められた統一記号の一部
開始
A=1?
(A増加ループ)
AをA+1に
A>=16
終了
124
例11 最大値を求める
〔定義済み処理を用いた例〕
開始
定義済み処理
の呼び出し
max = 0
Sub1開始
ループ1
n を入力
n = Sub1
n>max
n<=0
ループ1
max を出力
No
Yes
max = n
n を返し終了
終了
定義済み処理は「サブルーチン」とも呼ばれる
125
例11 最大値を求める (続き)
〔定義済み処理を用いた例〕
データ入力と最大値の判定
(定義済み処理)
Sub1
n を入力
n>max
No
n を返す
JavaScriptによるプログラム例
var max = 0;
var n;
do {
n = Sub1( );
} while (n>0);
alert(max);
定義済み処理
の呼び出し
Yes
max = n
function Sub1( ) {
n = Number(prompt(“値?”, “0”));
if (n>max) { max = n; }
return n;
}
定義済み処理
の本体
126
インフォメーションシステムを使った
課題提出練習




出席などは今までとっていませんが、インフォメーションシ
ステムを用いたこのような出席レポート(授業内外で提出)
を求めます。
今回は、インフォメーションシステムを使ったことがない人
のために、 課題提出の練習として、簡単な課題(レポート
含まず)を出してもらいます。
提出期限:10月28日(木)
提出方法:テキストファイル
(kadai04学籍番号ローマ字名前.txt)
127
インフォメーションシステムを使った
課題提出練習 (続き)
1.
2.
3.
4.
5.
6.
7.
10進数で75.25だと16進数ではなんと表すか??
10進数で75.25だと2進数ではなんと表すか??
2進数で101.0001101だと16進数ではなんと表すか??
2進数で101.0001101だと10進数ではなんと表すか??
16進数でB.2Aだと2進数ではなんと表すか??
16進数でB.2Aだと10進数ではなんと表すか??
淡いピンク色を6桁の16進数でどのように表すか??
(正解複数)
128
繰り返し構造
のパターンを復習する
練習問題を入れる
(繰り返し回数のカウント)
(終了条件の穴埋め) etc.
129
まとめ

どんな処理手順も3種類の基本構造で表せる(構造化定理)




「順次構造」 1つずつ順番に処理を実行する
「選択構造」 条件によって次に行う処理を変える
「繰り返し構造」 一連の処理を繰り返す
アルゴリズムをフローチャートやプログラムとして記述する方
法は一通りに限らない

例: 繰り返し構造の記述


フローチャート → 条件分岐 または ループ端記号 を用いる
プログラム → while または for を用いる
( JavaScript,Java,C言語の場合)
130
Backup
131
<練習2-1> (解答)
順次構造(1)

買い物の合計金額(税別)が
変数 a に入力されたとする.
変数 b に2割引の金額,変
数 c に消費税(5%)込みの
支払い金額を代入し,最後に
cの値が出力されるように,
右のフローチャートの空欄を
埋めなさい

ただし,1円未満の端数につい
ては考えなくてよい
開始
aに数値を入力
b = a × 0.8
c = b × 1.05
cの値を出力
終了
132
<練習2-2> (解答)
順次構造(2)
開始
aに3,bに5 を入力
「変数」は箱(入れ物)
「値」は入れ物の中身
aに数値を入力
3
5
3
bに数値を入力
変数
変数
変数
3
5
5
3
変数
変数
変数
このフローチャートは変数a と
bの値を入れ替える処理
(1) aの値を一時的にcに退避
(2) bの値をaに移す
(3) cに退避したaの値を bに移す
a
b
変数aの中身(値)を変数cの箱
に移しても,aの値は変わらない
c
c=a
a=b
b=c
a
b
c
aの値を出力
5
5
3
3
bの値を出力
変数
変数
変数
終了
a
b
c
aの値は5,bの値は3
133
<練習2-3> (解答)
選択構造(1)
このフローチャート
も誤りではないが,
条件の与え方が直
感的に分かりにくい
開始
開始
講義科目の単位数 a を入力
実習科目の単位数 b を入力
在籍年数 c を入力
講義科目を50単位
以上取得したか?
(50単位でも良いの
で ≧ となる)
実習科目を12単位
以上取得したか?
(12単位でも良いの
で ≧ となる)
在籍年数が8年
以下か?
(不等号の向き
に注意)
a ≧ 50
Yes
b ≧ 12
No
講義科目の単位数 a を入力
実習科目の単位数 b を入力
在籍年数 c を入力
a < 50
No
No
b < 12
Yes
Yes
Yes
No
c ≦8
No
c >8
Yes
卒業可能
終了
Yes
No
卒業
できない
卒業可能
終了
卒業
できない
134
<練習2-4> (解答)
選択構造(2)




開始
特別割引
大阪市民で
65歳以上または12歳以下
年齢を変数 a に入力
No
大阪市民?
優待割引

Yes
大阪市民
a ≧ 65
No

割引なし

大阪市民として
割引は受けられ
るが,さらに条件
を絞込む
a ≦ 12
大阪市民でない人
No
割引なし
優待割引
終了
Yes
Yes
特別割引
135
<練習2-5> (解答)
選択構造による繰り返し(1)
開始
i=7
i>0
No
Yes
i の値を出力
この地点で
値を調べる
実行回数
i の値
1回目
7
2回目
5
3回目
3
4回目
1
5回目
-1
i >0 が成り立たない
ので終了する (i の
値は出力されない)
i=i-2
終了
(a) 「i の値を出力」は4回実行される
(b) 最後に実行されたときの値は 1
136
<練習2-6> (解答)
選択構造による繰り返し(2)
5から13までの
奇数の総和を求める
開始
sum = 0
i=5
i ≦13
参考: JavaScriptによる
プログラム例
(a)
No
var sum = 0;
var i = 5;
Yes
sum = sum + i
i = i + 2 (b)
sum の値を出力
終了
while (i<=13) {
sum = sum + i;
i = i + 2;
}
(a)
(b)
alert(sum);
137
<練習2-7> (解答)
ループ端記号の終了条件
開始
n=5
n の値が 0 と等し
くなったら終了する
n == 0 (終了条件)
が成り立たないのでい
つまでも終了しない
実行回数
ループA
n == 0
n=n-2
ループA
終了
この地点で
値を調べる
n の値
1回目
5
2回目
3
3回目
1
4回目
-1
5回目
-3
以下の条件で繰り返しを終了する
n==1 (nの値が奇数になった場合),または
n < 0 (nの値がある値を下回った場合)
138
<練習2-8> (解答)
カウンタ変数を用いた繰り返し
5から13までの
奇数の総和を求める
開始
sum = 0
(a)
ループ
i : 5, (a)
2, i>13
sum = sum + i
ループ (a)
sum の値を出力
終了
5から13までの奇数: 5,7,9,11,13
初期値: 5
増分: 2
終了条件: 13より大きい(13を含まない)
参考: JavaScriptによるプログラム例
var sum = 0;
for ( var i=5; i<=13; i=i+2 ) {
sum = sum + i;
}
alert(sum);
139
<練習2-9> (解答)
後判定型の繰り返し
後判定型ループ
では,ループ内の
処理を1度行って
から終了条件の
判定が行われる
開始
JavaScriptによるプログラム例
max = 0
var max = 0;
var n;
ループ1
「n を入力」の
処理が1箇所し
かないことに注
意
n を入力
n>max
No
max を出力
n <= 0
ループ1
終了
Yes
max = n
do {
n = Number(prompt(“値?”, “0”));
if (n>max) { max = n; }
} while (n>0);
alert(max);
nの値が正である限り,
処理を繰り返す
n が0 または
負となれば,繰
り返しを終わる
140
補足
141
参考情報: JavaScript

「9.JavaScriptの文法」


「速効! 図解プログラミング JavaScript」


大津 真 著,オーム社 (2002)
上級
デイビッド・フラナガン 著,オライリー・ジャパン (2000)
「とほほのJavaScriptリファレンス」


古旗一浩 著,毎日コミュニケーションズ (2003)
「JavaScript 第3版」


初級
「JavaScript プログラミング入門」


ネットワークコンピューティング実習テキスト (2005)
http://pzxa85.hp.infoseek.co.jp/www/js/index.htm
「JavaScript 講座」

http://www.site-cooler.com/kwl/javascript/
142
ループ(while と for)
while (式) 文
では、まず式が計算される。式が 0 でないとき、文が実行され、式が再度評
価される。 このサイクルは式が 0 になるまで続けられ、その時点で実行は
文の後に移る。
for文 for (expr1; expr2; expr3) 文 は、以下に等しい。
expr1;
while (expr2) {
文
expr3;
}
文法的には for の三つの要素は式である.一般的には式1と式3は代入ま
たは関数呼び出しであり、式2は関係式である.三つの部分のどれを省略し
てもよいが、セミコロンは省略してはならない
143
繰り返し構造

ある条件が成り立つ間 処理を繰り返す

条件が成り立たなくなったら次の処理に進む
後判定型
前判定型
処理をする前に
終了判定をする
条件
Yes
処理
No
最低1回は実
行される
処理
条件が成り
立つ間この
処理を繰り
返す
条件が成り
立つ間この
処理を繰り
返す
Yes
条件
No
1回も実行され
ないこともある
処理をした後で終
了判定をする
144
繰り返し回数の指定
変数 : 初期値,増分,
終了値を並べて示す
変数が順次取
る値を示す
ループ
ループ
i = 1, 2, ・・・ , 10
i : 5, -1, 0
処理
処理
ループ
ループ
変数 i を1から10まで
1ずつ増やしながら
10回繰り返す
i=5, 4, ・・・ 1, 0 と
6回繰り返す
145
146
147
148
本日の授業
講師の自己紹介・研究紹介
 「コンピュータの言語」でやること



シラバスの説明 (授業の予定)
受講する皆さんが目指すこと





大学での勉強の根幹を身につける
基礎情報処理試験合格(2011春実施)
コンピュータの言語でお勧めの本紹介
成績の評価方法・がんばりどころ
第一回授業 「コンピュータのための情報表現」
149
講師紹介(1限・山添大丈)
基礎工学部出身
 現在(株)国際電気通信研究所=ATR 研究員。
 電子工作大好き
 画像処理研究・電子デバイス研究

150
講師紹介(2限・米澤朋子)
情報系学部出身
 現在(株)国際電気通信研究所=ATR 研究員。
 音楽・インタフェース・デジタルアート好き
 ヒューマン・エージェント・インタラクション研究,ヒュ
ーマン・メディア処理研究

151
講師らの研究紹介@ATR
人の視線に反応する看板案内ロボット
 高齢者・障害者のTV対話を助けるぬいぐるみ

152
講義について
1.履修の心構え・参考書紹介など
2.シラバス(授業計画)について
3.目標地点と成績評価
153
「コンピュータの言語」履修の心構え
「コンピュータの言語」では....【2つの目標】
 これからの大学学業と研究の礎となります


コンピュータとその使い方や仕組みの基礎を学ぼう



プログラミングで、早い・効率がよいアルゴリズムを選べる
作りたいソフトを手順よく設計できる
基本情報処理技術者試験の来年春受験を目指そう

だいたい皆さんの今後の勉強に必要な、コンピュータに関
係する知識の基礎的な理解をカバー
かやのき
おすすめ参考図書:栢木先生の基本情報技術者教室
平成22年度 イメージ&クレバー方式でよくわかる(技術評論社)
>> 過去問集とは違い、授業でやる内容を、やさしいレベルか
154
らしっかり理解できます。
基本情報処理技術者試験とは

春と秋の年二回開催


情報処理推進機構(IPA)が開催・管理
その他の情報処理技術者試験




LEVEL0.ITパスポート試験
LEVEL1.基本情報処理技術者試験
LEVEL2.応用情報処理技術者試験
LEVEL3 高度情報処理技術者試験(項目別)





システムアーキテクト試験
ネットワークスペシャリスト試験
ITストラテジスト試験
情報セキュリティスペシャリスト試験
ITサービスマネージャ試験
155
シラバスの内容(授業計画)

1.コンピュータのための情報表現(01~04回)



2.コンピュータのための処理手順(05~11回)



情報とコンピュータ
数値・文字・色の表現
アルゴリズムの基礎
データの探索と整列
3.プログラムの実行方式(12~14回)


プログラムの実行
言語プロセッサ
156
履修にあたっての注意事項

教科書は基本使用しない




基本は講義中にスライドを表示するのみ
講義資料はWeb等で公開予定だが、未定
参考書は随時紹介 (おすすめは今日の紹介)
成績評価



出席をとることがある
課題レポートを課すことがある
定期試験は参照不可
157
「コンピュータの言語」シラバス(参考)
(1)コンピュータと情報表現
概
(2)2進数と基数変換
論
(3)文字コードの体系
(4)RGBによる色の表現
(5)アルゴリズムとフローチャート
(6)順次構造と選択構造
(7)繰り返し構造 (反復構造)
(8)逐次探索と二分探索
(9)整列アルゴリズム
(10)基数変換のアルゴリズム
(11) 再帰的アルゴリズム
(12) プログラムの実行方式
実
(13)言語プロセッサ
行
(14)まとめと復習
コンピュータの中での情報の形式
n進数:換算できるようになろう
ASCIIコードや漢字などの情報
デジタルメディアを理解する
コンピュータに考えさせる方法
ア
「A⇒B⇒C」 or 「もしXならA」
ル
100回「A処理」をする
ゴ
全部探すか効率的探索か
リ
順番に並べる(ソート)とは
ズ
..2回目に関係
ム
階乗 n! など
様々なプログラムの実行方法
プログラム言語から機械語へ
1.コンピュータのための
情報表現
シラバス01:コンピュータと情報表現
シラバス02:2進数と基数変換
シラバス03:文字コードの体系
シラバス04:RGBによる色の表現
~ 数・文字・色などの情報 ~
159
コンピュータの言語 第一回
シラバス01 「コンピュータと情報表現」
コンピュータの中での情報の形式
160
情報と物理の違い

物理(学)の観点 「モノ」


物質(材質,質量)やエネルギー(位置や温度の高低)に
よる違いに着目する
情報(学)の観点 「」

以下の2つには大きな違いがある.それは何か?
物理的には違いがないにも関わらず,
2通りの並び方を区別している何かがある
それが「情報」
161
コンピュータと情報表現

コンピュータ内部での情報表現



電気のオン・オフで表される
参考:モールス信号
0と1の数字の列 (2進数) で表される
機械だけに理解できる文字列(機械語)で表される


機械語周辺のお話は後日またやります
コンピュータから人間への情報表現



文字: 数字,アルファベット,ひらがな,カタカナ,漢字
色: アイコン,イラスト,写真,動画
音: 効果音,音楽
コンピュータで利用可能なこんな複雑な情報の表現も、
全て内部表現(2進数)に基づいている
162
コンピュータの5大機能
中央処理装置(CPU)
処理装置
主記憶装置(メモリ・HDD)
コンピュータ
補助記憶装置(外付HDD)
周辺装置
制御
情報の
演算 処理
情報の
記憶
記録
入力装置(キーボード・マウス) 入力
出力装置(ディスプレイ等)
情報の
出力 入出力
163
ハードウェアの5大装置:
データの流れ
CPU(中央処理装置)
制御装置
データの流れ
演算装置
入力装置
記憶装置
主記憶装置(メモリ)
補助憶装置(外部記憶装置)
• 磁気ディスク(ハードディスク)
• 磁気テープ
• 光ディスク,CD,DVD
出力装置
• 演算装置
記憶装置に保持された
データ(2進数)に対して
数値計算を行う
• 制御装置
ハードウェアの各装置に
動作の開始・終了などを
指示する
• 入力装置
ユーザからの入力を受
取る
• 記憶装置
入力されたデータ,プロ
グラム,演算結果などを
記憶する
• 出力装置
ユーザに対してデータを
出力する
164
情報量の単位:ビット

ビット (bit: binary digit)


コンピュータ内部で 0または1 で表現される2進数の1桁
1ビットで,2つの状態が区別できる
0
または
1

1ビット
情報表現の
最小単位
例えば:


トイレが使用中かどうか
お酒を飲んでいいかどうか
165
情報量の単位(続き)

2ビットでは,4つの状態が区別できる
0 0
または
例題:3ビットだと何個の状態区別??
4ビットだと
〃
??
0 1
または
1 0
または
1 1
2ビット
答え:3ビット⇒ 8個の状態区別
4ビット⇒16個の状態区別
つまり(2nビット)個の状態区別
アルファベット(26文字),大文字・小文字,その他の
記号(# $ % & )は区別し切れない..
(情報量が足りない)
⇒8ビットで256種類の情報(文字など)を区別
166
8ビットを1バイトとしてまとめて扱う

バイト (byte)


8ビットをひとまとまりとみなす
1バイト(= 8ビット)
表現できる情報は 28=256通り
0 1 0 0 1 1 0 1
1バイト(= 8ビット)
ちなみにこれは77
2×2×2×2×2×2×2×2 = 28 = 256種類

ビットパターン


複数のビットをひとまとめにしたもの
例: 8ビット(8桁)で表される 0,1の列 「10011010」
167
さらに大きな情報量を表す単位






=
=
=
=
210
220
230
240
B
B
B
B
ファイルの大きさを表す場合によく用いられる単位


1B (バイト)
= 8ビット
1KB (キロバイト) = 1,024B
1MB (メガバイト) = 1,024KB
1GB (ギガバイト) = 1,024MB
1TB (テラバイト) = 1,024GB
バイト,キロバイト,メガバイト
補助記憶装置(ハードディスクなど)でよく用いられる単位

メガバイト,ギガバイト,テラバイト
168
<練習 1-1>
情報量の単位

(1) 12通りの状態を区別するには,最低何ビット必要か?

2^4 =16, 2^3=8

(2) 常用漢字1945文字を区別するには何バイト/bit以上
必要か?
1945種類の情報を区別するには何bit?? 11bit
それは何byte?? 2byte


169
10進数と2進数と16進数:


進数:桁が上がる数
10進数



2進数



0から9までの10種類の数値で表す
最大の値(9)に1を加えたとき1つ桁上がりして10となる
0と1の2種類の数値で表す
最大の値(1)に1を加えたとき1つ桁上がりして10となる
16進数


0 から15までの16種類の数値で表す
10~15も1桁で表現する


10=A,11=B,12=C,13=D,14=E,15=F
最大の値(15)に1を加えたとき1つ桁上がりして10となる
170
桁上がりのタイミング(進数ごと)
10進数
10進数と2進数
では桁上がりの
タイミングが異なる
2進数
16進数
0
0
0
1
1
1
2
10
2
3
11
3
4
100
4
5
101
5
6
110
6
7
111
7
8
1000
8
9
1001
9
10
1010
A
11
1011
B
12
1100
C
13
1101
D
14
1110
E
15
1111
F
16
10000
10
17
10001
11
2進数の4桁が
16進数の1桁に
相当している
2進数と16進数
は同時に
桁上がりする
171
基数変換

n進数からm進数への変換を行うこと
10進数で
「13」と入力
人間は日常使用し
ている10進数で
入力する
2進数「1101」
として処理
入力された10進数は
コンピュータが理解で
きる2進数に変換して
処理される
コンピュータ内部の処理を理解こととは,2進数,10進数,
16進数を相互に変換する方法を知ることである!!
172
基数

10進数は,10のべき乗(10n)に各桁の数値をか
けた数の和で表わすことができる 基数の指数乗
基数
指数
重み
4725 = 4 x 103 + 7 x 102 + 2 x 101 + 5 x 100

ある数値が何進数であるかは,数値の右下に基数
を付記して区別する

例: (11011)2 = (27)10 = (1B)16
173
基数変換: 通貨体系によるたとえ
10進数
100 = 1
101 = 10
102 = 100
・・・
312 = 100×3 + 10×1 + 1×2
100
100
100
100円玉3枚
1
10
10円玉1枚
1
1円玉2枚
同じ 312円 を異なる通貨体系で支払う
16進数
160 = 1
161 = 16
162 = 256
・・・
312 = 256×1 + 16×3 + 1×8
16
256
16
256円玉1枚
1
16
16円玉3枚
1
1
1
1
1
1
1円玉8枚
1
174
10進数からn進数への変換
基数nで割った余りを逆順に並べる
 10進数 → 2進数


例: (37)10
2進数への変換
では,2で割る
余り
2
37
・・・ 1
2
18
9
・・・ 0
2
2
2
2
2で割った答(商)が
0になるまで続ける
4
2
1
0
・・・ 1
・・・ 0
余りを逆順に並べる
(100101)2
・・・ 0
・・・ 1
175
<練習 1-2>
10進数から16進数への変換

(3804)10 を16進数に変換せよ
176
1.コンピュータのための
情報表現
シラバス01:コンピュータと情報表現
シラバス02:2進数と基数変換
シラバス03:文字コードの体系
シラバス04:RGBによる色の表現
~ 数・文字・色などの情報 ~
177
コンピュータの言語 第二回
シラバス02 「2進数と基数変換」より
コンピュータの中での数値の形式
178
前回やったこと
コンピュータの中の表現:0と1(電気信号のON/OFF)
 0と1の表現の単位:ビット
 0と1の表現の列が並ぶと、○○ビットなどと数える



区別できる情報の数を考える: 2のn乗(nビット)
8ビット=1バイト とする単位があります

ビット数を計算後、区別する情報数に必要なバイト数の考察
桁の繰り上げ単位を「○○進数」という
 コンピュータの中で使われる表現:2進数、16進数
 ヒトが使う数値の表現:10進数


進数の基数変換の練習問題
179
<練習 1-1>
情報量の単位

(1) 12通りの状態を区別するには,最低何ビット必要か?

2^4 =16, 2^3=8

(2) 常用漢字1945文字を区別するには何バイト/bit以上
必要か?

1945種類の情報を区別するには何bit??


11bit
それは何byte??

2byte
180
<練習 1-2>
10進数から16進数への変換

(120)10 を16進数に変換せよ
16
16
120 ・・・ 8
7
0
・・・ 7
余りを逆順に並べる
(78)16
181
各桁の数値に重みを乗じた値の総和を求める
n進数から10進数への変換

16進数 → 10進数

例: (C2F3)16 = C
163 = (24)3
= 24×3 = 212
= 210×22
= 1024×4
2
F
3 ・・・ 基数16の数値
163 162 161 160 ・・・ 各桁の重み
= Cx163 + 2x162 + Fx161 + 3x160
= 12x4096 + 2x256 + 15x16 + 3x1
= (49907)10

2進数 → 10進数

例: (1101)2 = 1x23 + 1x22 + 0x21 + 1x20 = (13)10
182
小数点付き10進数からn進数への変換

基数nをかけ続け,積の整数部を順に並べる


整数部の変換は既に説明した通り
小数点付き10進数 → 2進数

例: (0.1875)10
0.1875
×
2
0.375
小数部
積の整数部
を並べる
0.375
×
2
0.75
(0.0011)2
0.75
×
2
1.5
0.5
× 2
1.0
小数点以下が0に
183
なるまで続ける
<練習 1-3>
小数点付き10進数から16進数への変換

(0.171875)10 を16進数に変換せよ
184
<練習 1-3> (解答)
小数点付き10進数から16進数への変換

(0.171875)10 を16進数に変換せよ
0.171875
×
16
2.75
小数部
(0.2C)16
0.75
×
16
12.0
小数点以下が0に
なるまで続ける
積の整数部
を並べる
185
小数点付きn進数から10進数への変換

小数点付き16進数 → 10進数

例: (F.2C)16 = F . 2
C ・・・ 基数16の数値
160 16-1 16-2 ・・・ 各桁の重み
= Fx160 + 2x16-1 + Cx16-2
= 15x1 + 2x
1
16
1
+ 12x 162
= (15.171875)10
小数点以下の数値について重みの指数を負の値とする
186
<練習 1-4>
小数点付き2進数から10進数への変換

(1.01)2 を10進数に変換せよ
187
<練習 1-4> (解答)
小数点付きn進数から10進数への変換

(1.01)2 を10進数に変換せよ
(1.01)2 = 1×20 + 0×2-1 + 1×2-2
= 1×1 + 0×0.5 + 1×0.25
= (1.25)10
188
2進数と16進数の相互変換

2進数の4桁が16進数のひと桁に対応していること
を利用する


2進数 → 16進数


2進数の4桁: 2×2×2×2 = 24 = 16
小数点を境として整数部と小数部をそれぞれ4桁ずつに
区切り,それぞれを16進数に変換する
16進数 → 2進数

16進数のひと桁を,それぞれ4桁の2進数に変換する
同様に,3桁をひとまとめに考えれば,
2進数と8進数の相互変換も可能
189
2進数から16進数への変換

例: (101.101101)2

4桁ずつに区切り,足りない桁は0を補う
整数部
小数部
(0) 1 0 1 . 1 0 1 1
23 22 21 20
0 1 (0) (0) ・・・ 2進数
23 22 21 20
23 22 21 20
4+1
8+2+1
4
5
11(B)
4
・・・ 各桁の重み
・・・ 16進数(5.B4)16
190
<練習 1-5>
16進数から2進数への変換

(7.6E)16 を2進数に変換せよ

16進数のひと桁を,それぞれ4桁の2進数に変換する
191
<練習 1-5> (解答)
16進数から2進数への変換

(7.6E)16 を2進数に変換せよ

16進数のひと桁を,それぞれ4桁の2進数に変換する
7
0111
整数部
.
6
E (14) ・・・ 16進数
0110
1110
小数部
・・・ 2進数
(111.0110111)2
192
参考: Windowsの電卓

Windows (C棟3階のパソコン教室)で

[スタート] → [プログラム] → [アクセサリ] で表示され
るメニュから [電卓] を選ぶと普通の電卓が起動する
電卓の[表示]メニューで
[関数電卓] に切り替わる
193
Windowsの電卓によるべき乗計算

べき乗キー [x^y]

xのy乗
例: 23 ⇒ [2] [x^y] [3] [=] のキーを順に押す
194
Windowsの電卓による基数変換
(43)10
(43)16
(43)2
195
196
コンピュータの言語
2010年度 秋学期 金曜1・2限
1限担当:山添大丈
2限担当:米澤朋子
197
1.コンピュータのための
情報表現
シラバス01:コンピュータと情報表現
シラバス02:2進数と基数変換
シラバス03:文字コードの体系
シラバス04:RGBによる色の表現
~ 数・文字・色などの情報 ~
198
コンピュータの言語 第三回
シラバス03 「文字コードの体系」
シラバス04 「 RGBによる色の表現」より
コンピュータの中での数値の形式
199
これまでのまとめ:
コンピュータの表現

ビットとバイト



0か1の2通りの情報表現:bit(ビット)
8ビット(28)=256通り
何通りの表現があるかは、表したい情報による
200
基数変換まとめ:
10進数とn進数の間の基数変換

10進数 → n進数



整数部: 基数nで割り続け,余りを逆順に並べる
小数部: 基数nをかけ続け,積の整数部を順に並べる
n進数 → 10進数


整数部: 各桁の数値に重みをかけて総和を求める
小数部: 各桁にかける重みの指数を負の値とする
201
小数点付き10進数からn進数への変換

基数nをかけ続け,積の整数部を順に並べる


整数部の変換は既に説明した通り
小数点付き10進数 → 2進数

例: (0.1875)10
0.1875
×
2
0.375
小数部
積の整数部
を並べる
0.375
×
2
0.75
(0.0011)2
0.75
×
2
1.5
0.5
× 2
1.0
小数点以下が0に
202
なるまで続ける
小数点付きn進数から10進数への変換

小数点付き16進数 → 10進数

例: (F.2C)16 = F . 2
C ・・・ 基数16の数値
160 16-1 16-2 ・・・ 各桁の重み
= Fx160 + 2x16-1 + Cx16-2
= 15x1 + 2x
1
16
1
+ 12x 162
= (15.171875)10
小数点以下の数値について重みの指数を負の値とする
203
基数変換まとめ:
10進数とn進数の間の基数変換

10進数 → n進数



整数部: 基数nで割り続け,余りを逆順に並べる
小数部: 基数nをかけ続け,積の整数部を順に並べる
n進数 → 10進数


整数部: 各桁の数値に重みをかけて総和を求める
小数部: 各桁にかける重みの指数を負の値とする
204
もじこーど
205
キーボードからの文字入力の流れ
入力装置
出力装置
「A」のキーを押す
A
適切な文字コード
で表示されなけ
れば「文字化け」
を起こす
周辺装置
“01000001”
“01000001”
“01000001”
主記憶装置
(メモリ)
同じコンピュータで入力さ
れ,出力される場合は,通
常文字化けは起こらない
処理装置
206
コード体系
文字を表現するためのビットパターンの体系
 コード体系が異なると,同じビットパターンが異なる
文字を表す


データのやりとりを行うにはコード変換が必要
A
ASCII コードでは
(11000001)2
コード変換
EBCDIC コードでは
(01000001)2
207
文字データの表現

文字コード



キーボードなどの入力装置から入力された数字や文字
(英数,カタカナ,記号など)は,コンピュータ内部ではあら
かじめ決められたビットパターン(ビット列)で表される
情報処理分野で使用される文字コードは,情報交換用符
号と呼ばれる
文字コードの種類

国際標準化機構(ISO: International Organization
for Standardization)によって定められた7ビットコード
に準拠している


ASCIIコード,JISコード,JIS漢字コード,シフトJISコード ・・・
1バイト文字コードと2バイト文字コード
208
1バイト文字コード

1バイト: 28 = 256通りの文字を表現できる

アルファベットや数字は表現できるが,漢字を表現するに
は足りない
1バイト
上位ビット 下位ビット
b8 b7 b6 b5 b4 b3 b2 b1
A= 0100 0001
4
JISコード
の場合
1
2進数
16進数
209
2バイト文字コード

2バイト: 216 = 65,536通りの文字を表現できる

アルファベットや数字の他に,漢字も表現できる
上位1バイト
下位1バイト
上位ビット 下位ビット 上位ビット 下位ビット
b8 b7 b6 b5 b4 b3 b2 b1 b8 b7 b6 b5 b4 b3 b2 b1
亜= 0011 0000 0010 0001
3
JIS漢字コード
の場合
0
2
1
2進数
16進数
210
コード体系の種類
コード名
規格団体
特徴
ASCII
ANSI
パソコンやデータ通信で広く利用されている
EBCDIC
IBM社
メインフレーム(汎用)コンピュータで事実上の
標準として用いられている
JIS
JIS
日本で制定された7ビットコード.電子メールの
送受信に事実上の標準として用いられている
シフトJIS
Microsoft WindowsやMacで用いられている.機種に依
社ほか
存して異なる文字が割り当てられる場合がある
EUC
AT&T社
2バイトの漢字も扱えるマルチバイトコード
Unicode
ISO
全ての文字を(原則として)2バイトで表す
211
ASCIIコード

ASCII


米国規格協会(ANSI)が1962年に制定


American Standard Code for Information
Interchange
ANSI: American National Standards Institute
パソコンやデータ通信で幅広く利用されている


27=128種類の文字しか表現できない
7ビットコードだが,先頭にパリティビットまたは0を加えて,
8ビットとして使われている
212
ASCIIコード表
上位ビット
b8 は常に
0として
考える
下位ビット
Aは (41)16
または
(01000001)2
制御
コード
上位 下位
ビット ビット
JISコードでは
\(バックス
ラッシュ)が
¥(円マーク)
になる
213
<練習 1-6>
文字コード

以下の各文字をASCII コード(16進)で置き換えよ

Men
214
<練習 1-6> (解答)
文字コード

以下の各文字をASCII コード(16進)で置き換えよ

Men
M = (4D)16
上位ビット: (4)16
下位ビット: (D)16
e = (65)16
上位ビット: (6)16
下位ビット: (5)16
n = (6E)16
215
参考: 文字列をシフトJISコードに変換
するソフト (xdump 1.3)
「0D」 → キャリジリターン
制御コード
「0A」 → ラインフィード
2バイト文字(16進数2桁)
“xdump.exe”
(ファイルの内容を
16進数で表示)
文字列ダンプ
ダイアログ
http://www.vector.co.jp/soft/win95/util/se197132.html
216
(EBCDICコード)

EBCDIC(エビスディック)

Extended Binary Coded Decimal Interchange
Code

IBM社が自社の汎用大型コンピュータ(メインフレー
ムコンピュータ)用に制定した8ビットコード

1960~70年代は,IBM社のコンピュータが市場の
半分以上を占めていた


そのため,IBM社以外のコンピュータメーカもIBM社と同
じコード体系を採用した
メインフレームの世界ではデファクトスタンダード(事実上
の標準)となっている
217
JISコード (ISO-2022-JP)

日本工業規格(JIS)がISOコードをもとに制定


7ビットコード (最上位ビットは必ず0)



JIS: Japanese Industrial Standards
1バイト文字(英数字)と2バイト文字(ひらがな/漢字)の区切りは特
殊文字(エスケープシーケンス)で判別する
半角カナは扱えない
欧米で開発された初期の電子メールシステムはASCIIコー
ド(7ビット)を前提としたため8ビット目が無視される


電子メールによる日本語送受信には,JISコードが事実上の標準とし
て用いられている
メールやネットニュースで半角カナが適切に送受信できないのは,
JISコード(ISO-2022-JP)で半角カナが扱えないから
218
シフトJISコード (Shift_JIS)

主にパソコン(Windows,Mac等)で用いられる


半角カナも扱うことができる
JISコードよりも文字列の扱いが簡単



文字の1バイト目を見るだけで漢字か1バイト文字(半角
英数字)かを識別できる
ただし,ユーザ定義領域に機種依存の文字が定義されて
いるので機種間の互換性に乏しい
機種依存文字の例:
Windows
①
②
③
Ⅰ
Ⅱ
Ⅲ
Mac
(日)
(月)
(火)
(特)
(監)
(企)
Macでは,括弧 () 付きの文字に化けるものがある
219
EUCコード(拡張UNIXコード)
EUC: Extended Unix Code
 1985年にUNIXシステムで世界各国の文字を統一
的に扱うために,AT&T社が制定したコード



EUCコード自体は8ビットだが,表現に2バイトを必要とす
る漢字コードは変換によって2バイトで表現される
漢字などの各国独自の文字は決められた領域内に
定義する


世界各国の異なった言語にも対応できる
EUC-JP (日本語版),EUC-KR (韓国語版) ほか
220
Unicode

Unicodeは世界中の文字を統一的に表すことを目
指している



Apple Computer社,IBM社,Microsoft社の提案に基
づいて制定された
インターネットが普及し各国の文字コードが異なることが
問題となった (メール送受信時の文字化け等)
UTF-8


Unicodeをビット列に対応付ける方式の1つ
ASCIIコードの1バイト部分の表記は従来通りとし,
その他の文字を2バイトで表記する
221
Webページにおける文字の符号化
ネットワーク(TCP/IP)で転送
されるのは2進数のデータ
(文字が何であるかは関係ない)
Webブラウザ
2進数のビットパターンをどの
文字に対応付けて表示(文字
コードによる判別が必要)
(文字コード)
アマゾンのサイト
www.amazon.co.jp
Shift-JIS
関西大学のサイト
www.kansai-u.ac.jp
Unicode (UTF-8)
ウィキペディアのサイト
wikipedia.org
Unicode (UTF-8)
〔日本語サイト〕
〔多言語サイト〕
222
Webページの文字化け

Webブラウザ



世界中のWebサーバにあるHTMLファイルを表示する
文字コードの切り替えができるソフトウエア
シフトJISを前提に作られたページを強制的に他の
文字コード(EUC-JP等)で表示すると文字化けする

日本語表示できない海外のコンピュータで,日本語の
ページを表示すると文字化けする
223
Webブラウザでの文字コードの変更

アマゾン (http://www.amazon.co.jp)

Shift-JIS を前提に作成されたページ
エンコーディング(符号化)を強制的に
UTF-8 に変えると文字化けする
224
いろのひょうげん
今日のテーマ
225
色の表現: RGBによる色指定

RGBとは,赤(Red),緑(Green),青(Blue)3色



これら3色(光)の組合せと強弱で様々な色をつくり出す
( <赤色の強さ>,<緑色の強さ>,<青色の強さ> )
赤,緑,青のそれぞれに256段階(0~255)の値を
割り当てて色の強さを表す





赤の強さが最大で,その他はゼロ: (255, 0, 0)
緑の強さが最大で,その他はゼロ: (0, 255, 0)
青の強さが最大で,その他はゼロ: (0, 0, 255)
白: 全ての光の強さが最大: (255, 255, 255)
黒: 全ての光の強さがゼロ: (0, 0, 0)
226
16進数によるRGB値の指定

256段階の数値(8ビット)は2つの16進数の積で表
せる

256 = 28 = 24×24 = 16×16
FF FF FF
R
赤

G
緑
2つの16進数
B
青
理論的には24ビットで約1600万色が表現できる

28×28×28 = 224 = 16,777,216色
R
赤
G
緑
B
青
Webフルカラー
227
16進コードによる色指定
0,
0)
→ FF0000
緑: (
0, 255,
0)
→ 00FF00
青: (
0,
0, 255)
→ 0000FF
白: (255, 255, 255)
→ FFFFFF
黒: (
→ 000000
赤: (255,
0,
0,
0)
228
HTMLでの色指定の例
背景色
を青
文字色
を白
<html>
<body style="background-color:#0000FF; color:#FFFFFF;">
<b>このページの背景は青,文字色は白</b>
</body>
</html>
229
加色法による色の混合

RGB各色に対応する16進数の加算によって混合
色が表現できる

赤(Red)と緑(Green)を混ぜると黄色(Yellow)


(FF0000) +
(00FF00) =
(FFFF00)
緑(Green)と青(Blue)を混ぜるとシアン(Cyan)

(00FF00) +
(0000FF) =
(00FFFF)
230
RGBによる色加法

光の3原色(赤・緑・青)を混合すると,加色法によっ
てシアン・マジェンタ・黄色が生じる

すべて混ぜると白になる
231
Webセーフカラー 216色

様々なOS(Windows, Unix, Mac OS ・・・)やブラウザ
(IE, Netscape, Opera ・・・)で共通して使える216色


http://www.interq.or.jp/japan/goofy/color.html
RGB各色を6段階で表す (6×6×6 = 216色)



0,51,102,153,204,255 (10進数)
00,33,66,99,CC,FF (16進コード)
例:
薄いオレンジ
ライムグリーン
藍色
ただし,現在ほとんどのディスプレイはフルカラーに対応
(セーフカラー相当のディスプレイは1%に満たない)
232
色設定の例: Word 2007
ライムグリーン
233
参考 「色々の色」

パソコン画面上の任意の点
の色を識別して、色の名前
やRGB値を表示するソフト


マウスカーソルのある場所の
色を常時読み取って表示
色弱・色盲の人がパソコン画
面で色を見分けるのに有用
http://www.hikarun.com/w/
234
ドリルタイム
問題をメモして解いてみてね
235
情報表現ドリル

26種類のアルファベットだけを表現するのに必要な
bit数は??


400台の車の種類を識別するのに必要なbit数は
??



2^4(24)=16種類,2^5=32種類。よって5ビット。
2^6=64, 2^7=128, 2^8=256, 2^9=512
よって9ビット。
同じく400台の車の種類を識別するのに必要な
byte数は??


8ビット以内で区別できないので、1バイトでは無理。
236
2バイト(16ビット)あれば区別できるので答えは2バイト。
基数変換ドリル

(F.2C)16を10進数に直せ


F=15, 2x16-1=0.125, Cx16-2=0.046875
(23.5479)10を16進数に直せ>>ごめん!!


23/16=1…7 1/16=0…1 ->17
小数点以下長すぎ!!



0.5479x16= 8.7664, 0.7664x16= 12.2624,
0.2624x16= 4.1984, 0.1984x16= 3.1744,
0.1744x16= 2.7904, 0.7904x16= 12.6464,
0.6464x16=10.3424, 0.3424x16= 5.4784,
0.4784x16= 7.6544, 0.6544x16= 10.4704, …
きりがないのでこのへんで。答え:17.8C432CA57A …
(F.2C)16を2進数に直せ

237
F=1111, 2=0010, C=1100 よって 1111.001011
文字や色表現ドリル

文字コードには_バイト文字コードと_バイト文字コ
ードがある

ASCIIとは:(記述)

SJISとは:(記述)
色表現は___といわれる_、_、_の光の三原
色であらわされる。
 色は通常___段階であらわされるが、__段階
にする場合もある。この時、各色は_段階であらわ
される。

238
239