1 プログラミングを学ぶべき理由...
TRANSCRIPT
2019/1/21
1
情報基礎
アルゴリズムとプログラミング入門
1
Copyright © 2009-2018 Kota Abe
l情報社会を生きる上で,コンピュータとは何なのかを理解しておくことが重要コンピュータは,プログラムに書かれていることを高速に実行するだけの機械であって,それ以上でもそれ以下でもないプログラム = アルゴリズムをプログラミング言語で記述したものプログラムを変更することで,コンピュータの動作は自在に変更可能コンピュータを理解するにはプログラムを書いてみることが早道
lより本格的には「プログラミング入門」で!
プログラミングを学ぶべき理由 2
3lプログラミング教育の必修化2020年度から小学校2021年度から中学校2022年度から高等学校(情報I, 情報II)
プログラミング必修化の流れ
������������ ��������������
4
l なんらかの問題を解決するための処理手順l 誰がやっても同じ手順で実行できるように,厳密に記述される必要がある
l アルゴリズムをコンピュータで実行できるようにプログラミング言語で記述したものがプログラム
l さまざまな問題に対して様々なアルゴリズムが研究・開発されている
アルゴリズム (Algorithm)
2019/1/21
2
5l (例) 辞書順に並んだ単語カードから,ある単語wのカードを検索するアルゴリズム
線形探索アルゴリズム
1. 先頭のカードの単語をsとする2. sとwが同じならばそれが求めるカードである.終了
3. wよりもsの方が辞書順で後,あるいは残るカードが1枚ならば,wのカードは存在しない.終了
4. 先頭のカードを破棄する5. 1に戻る
線形探索アルゴリズム (2)l適当な単語をwとして手動でアルゴリズムを実行してみよう
lカード枚数をnとすると線形探索アルゴリズムは最大n回の繰り返しで実行できる
l apple
l banana
l blueberry
l grape
l melon
l orange
l peach
l pear
l persimmon
l strawberry
6
7l 辞書順に並んでいることを活用して効率化
l 1つの問題の解法(アルゴリズム)は1つとは限らない!
l 2分探索アルゴリズムはカード枚数nに対して最大回の繰り返しで実行できる
2分探索アルゴリズム
1. カードが1枚しかない場合,そのカードがwと同じならばそれが求めるカードであり,同じでなければ求めるカードは存在しない.終了.
2. カードの真ん中で前半と後半の2つの束に分ける3. 後半の先頭カードの単語をsとする4. sよりもwの方が辞書順で後ろならば,前半のカードを破棄する.
反対にwの方が前ならば後半のカードを破棄する5. 1に戻る
log2 n!" #$
8l n と との比較l線形探索に比べて2分探索は圧倒的に速い
2分探索アルゴリズム (2)log2 n!" #$
2019/1/21
3
9l Mまでの素数を得るアルゴリズム
l 古代ギリシャの数学者Eratosthenesが考案したとされる
エラトステネスの篩 (ふるい)
1. ノートに2からMまでの整数をすべて書く2. n=2とする3. ノート上の整数から,2n, 3n, 4n…を消去する4. ノート上でnより大きい次の値を探し,新しいnとする5. n2 > Mならば終了6. 3へ戻る終了した時,ノート上に残った数が素数である
10l 中には効率的に解決できない(=時間がかかる)問題が存在する問題のサイズ n に対して,nの多項式時間で解くアルゴリズムが存在しない (nの多項式: n3+n2+nなど)
(多項式時間ではない例) n! (nの階乗)程度の繰り返しが必要な問題l 現実的な時間で計算が終わらない1秒間に100万回繰り返しを実行しても 50! 回繰り返すには 9.64x1051年かかる(!)
スーパーコンピュータを使っても劇的に早くなるわけではない
難しい問題
11l 巡回セールスマン問題n個の都市と,都市間の移動時間が与えられた時に,最短時間ですべての都市を一周する経路を求める問題一周する経路の総数は (n-1)!応用例郵便の配達経路プリント基盤の穴あけ順序
難しい問題 (2) 12l与えられた合成数を素因数分解する問題桁数が大きいと(数百桁),非常に時間がかかる.232桁の合成数を素因数分解するのに300台のPCを使って3年[2010]現代の暗号(公開鍵暗号)はこの問題が難しいことを利用 (HTTPSでも使用)この問題の効率的な解法は存在しないだろうと予想されている
難しい問題 (3)
2019/1/21
4
13l プログラム = アルゴリズムをコンピュータが理解できる形で表現したもの
l CPUが理解できる機械語でプログラムを書くのは大変!1つ1つの命令が原始的すぎる
l 通常は高級言語(High Level Language)が使われる人にわかりやすい表現でプログラムを書ける様々な高級言語があるFORTRAN, COBOL, Lisp, BASIC, C, C++, C#, Java, JavaScript, Perl, Ruby, Prolog, etc.
言語ごとに文法(書き方)が決まっている文法上の間違いは許されない(エラーになる)
プログラミング言語l プログラミング言語で書かれたプログラムのことl 何らかのアルゴリズムを表現しているl C言語のソースコード例
(画面に “Hello, World” と出力するプログラム)
extern int main(int argc, char **argv){
printf(“Hello, World¥n”);return 0;
}
14ソースコード (Source Code)
15l CPUは高級言語を直接実行できないl コンパイル方式高級言語のプログラムを機械語に翻訳(コンパイル)してから実行翻訳プログラム=コンパイラ機械語で実行されるので高速コンパイル作業が必要
l インタプリタ方式高級言語のプログラムを1行1行解釈しながら実行解釈プログラム=インタプリタコンパイル作業が不要で手軽実行の度に解釈の手間がかかるので低速
高級言語プログラムの実行方法 16l 以下は,ほぼ全てのプログラミング言語に共通する概念
l 変数データを入れておくための箱必要に応じてたくさん作れる値はメモリ上のどこかに格納されている代入:変数に値を書き込むこと参照:変数から値を取り出すデータのタイプによって変数の型を使い分ける整数,実数,文字列など
プログラムの基本要素
2019/1/21
5
17
l制御構造プログラムをどのように実行するか決める順次(逐次)処理上から下に順番に実行する構造条件分岐何らかの条件によって実行する処理を選択する構造繰り返し何らかの条件が満たされる間,処理を実行し続ける構造この3つがあれば全てのプログラムは記述可能!
プログラムの基本要素(Cont’d) 18lプログラミング初心者用学習環境l初心者向け日本語ベースのプログラミング言語 (xDNCL)
入力支援ボタンインタプリタ方式変数一覧,実行速度調節,ステップ実行
PEN
19逐次処理
�1�2�3
�2
�1
����
�3
20条件分岐
�� (�) ���|�1
�� �,�������|�2
�� ��
���
�2�1
� (��)
�(���)
���
2019/1/21
6
21繰り返し文
( �) "�/| �1| �2
*�'��
���
�2
�1
� (�)
�(��)
u���& ���� �)$/�'����#,+-.�)(
u�'��"!�� ����(u�1��2"�� �����'#� � �"�%
22繰り返し文 (例)
�� ii ← 1i ≦ 10 �
| i �����| i ← i + 1
����
�� i, ji ← 256j ← 0i > 1 �
| i ← i / 2| j ← j + 1
����j �����
232重ループ
(�1) ���| (�2) ���| | 1| | 2|�����
�����
u��������������
�2��
2
1
� (� )
�(�� )
���
�1���(�� )
� (� ) �� i, ji ← 0i < 3 ��
| j ← 0| j < 2 ��| | i j ����| | j ← j + 1| ����| i ← i + 1
����
242重ループの例