3 プログラミングの基礎概念

計算機演習 (物理学科)
3
プログラミングの基礎概念
担当: 栗本
3.1
プログラミングとは —コンピュータ.ソフト無ければただの箱—
コンピュータを利用するには,何をどう処理すればよいかをコンピュータに伝えねばならない.よ
り具体的には,以下のような情報をコンピュータに教え込む必要がある.
扱うデータの種類
数値か文字かその他か,数値ならば整数か実数 (浮動小数点数) か,文字ならば半角か全角か
ASCII 文字か日本語か,その大きさは何ビットか,等々
入力はどこからどのような形でやってくるか
キーボードやマウスからの入力か,CD やハードディスクなどの外部記憶装置から読み込むの
か,ネットワーク経由で入ってくるのか,等々
処理の手続き
データをどのように処理していけばいいか ⇒ (狭い意味の) アルゴリズム
結果の出力方法
ディスプレイに出力するのか,プリンターか,外部記憶装置か,形式は文字か,数値か,その
他のデータ形式か,等々
これらの情報を正確に伝えないと (現在の) コンピュータは正しく動作しない.
コンピュータを正しく動作させるための手順を論理的にきちんと整理してまとめたもの
⇒ プログラム
気のきいた人間のように「あれを適当にこうして」で動いてはくれない.
大事なポイント: やるべき仕事とその手順を論理的に整理する
例
問題: 一次方程式 ax + b = 0 の解 x を求めたい
1) 数値 a, b を入力として受け取る
2) a = 0 かどうかを判定
3) a = 0 の場合
b = 0 の場合: 「解は不定 (任意の x で方程式は成立)」と出力
b 6= 0 の場合: 「解なし」と出力
a 6= 0 の場合: x = −b/a を計算して出力
? これはプログラム作成だけに限らず,多くの仕事で重要.
? それさえきちんとできれば,あとはその手順を適当なプログラミング言語に翻訳していけばいい.
? プログラム言語を覚えることは二の次.必要になれば適当な資料を見ながらプログラミングすれば
よい
1
プログラミング言語の分類
機械語 (マシン語) : コンピュータが直接理解できるレベルのコード.バイナリ (2n 進数) の羅列.CPU
によって異なる.
アセンブリ言語 (アセンブラ) : 機械語をやや人間に分かりやすく,add, sub, mov などの短い文字
列で表現したもの.CPU によって異なる.
高級言語 : コンピュータへの指示を人間が理解しやすい表現で表した人工言語.C, FORTRAN, Perl,
ruby など多様な種類がある.
コンパイラ – 高級言語で書かれたプログラムを機械語に変換した実行プログラムを作成 (コン
パイル) し,できた実行プログラムに作業をさせる.実行プログラムの作成に時間がかか
ることがあるが,実行プログラムそのものの処理速度は速い.C, FORTRAN など
インタープリタ – 高級言語で書かれたプログラムを解釈しながら直接実行.コンパイルの作業
は不要で修正も容易だが,実行速度はコンパイル形式より遅い.シェルスクリプト,perl,
ruby など
(参考) 1 から 1000000 (106 ) までを足し上げるプログラムの実行時間の比較
時間 (秒)
ruby
0.8
gcc コンパイラ
0.01
intel C コンパイラ
0.004
文字や記号など,人間が理解できる形式でプログラムを書いたものをソースという.コンパイラは
ソースを機械語に翻訳する働きをし,インタープリタはソースを直接解釈してコンピュータに実行さ
せる.
3.2
様々なコンピュータ言語
コンピュータ言語は,その用途や性質によって多くの種類がある.全てを習得することはほとんど
不可能であるし,その必要もない.自分がなすべき仕事に応じて,使いやすい言語を使用すればよ
い.プログラムのアルゴリズムをしっかり把握できていて,以下の汎用言語かスクリプト言語のどれ
か一つを習得していれば,他の言語に対応することは難しくない.
汎用 : ほとんど全ての処理が可能 – C, C++, C#, Objective-C, Java, BASIC など
数値計算 : FORTRAN
数式処理 : Mathematica, Maxima, Maple など
スクリプト : 比較的軽い処理向き – perl, ruby, python など
WWW 記述 : HTML, XML, PHP
非手続き型言語 : 人工知能やエキスパートシステムでよく使われる– LISP, Prolog など
文書整形 : TEX, Roff など
データベース : SQL
2
3.3
アルゴリズム
問題を解決するための処方,手順を論理的に整理したもの.プログラミングする上で最も大事な柱.
(例)
数の並べ替え : 与えられた n 個の数値を大きい順に並べ替える.
1. n 個の数のうち,最も大きい数を見つけて先頭と入れ替える.
2. 残りの n − 1 個の数のうち,最も大きい数を見つけて先頭と入れ替える.
3. 以下同様の手順を続ける.
この手順を選択ソートという.他にも挿入ソート,クイックソートなどのアルゴリズムがある.
文字列検索 : 与えられた文字列の中から,ある特定の文字列を探し出す.
与えられた文字列を「a1 a2 a3 . . . an 」,求める文字列を「b1 . . . bm 」 (m ≤ n) として
(ai , bi は1文字)
1. a1 a2 a3 . . . an の先頭に b1 . . . bm を合わせて比較
a1 a2 . . . . . . an
b1 . . . bm
2. 1 番目から m 番目までの上下が全て一致すれば OK,一致しなければ b1 . . . bm を1文字分
ずらして比較
a1 a2 . . . . . . an
b1 . . . bm
3. 2 番目から m + 1 番目までの上下が全て一致すれば OK,一致しなければ b1 . . . bm を1文
字分ずらして比較
a1 a2 a3 . . . . . . an
b1 . . . bm
4. この操作を続ける.
この手順を単純法という.他にも KMP 法,BM 法などのアルゴリズムがある.
アルゴリズムは分かりやすいこと,例外なく正しい結果を与えることが重要である.用いるコンピュー
タの能力が問題のレベルに比べて低い場合はメモリや CPU の能力を効率よく利用できることが優先
されることもあるが,それを重視しすぎるとプログラムが分かりづらくなったり,エラーの修正が難
しくなることが多いので,最近では効率よりも分かりやすさを優先することが多い.
3
流れ図 (フローチャート)
処理の流れを図にまとめることによって,分かりやすくてエラーのないアルゴリズムを作る手助
けとなる場合が多い.そのような図を流れ図 (フローチャート) という.以下のような要素を線で結
ぶことにより流れ図を作ることができる.
処理
端点
判断
1 次方程式 ax + b = 0 を解く流れ図の例
開始
a, b 入力
a=0?
YES
NO
YES
x = -b/a
b=0?
NO
解なし
終了
4
解は不定
入出力