第6章 アルゴリズムとプログラミング
手順を設計し,コードにする.重要用語33語を1つずつ確認できます.
基礎概念
問題を解くための手順や計算方法を,順序立てて表したもの.
補足
- 正しさ(必ず解ける),効率(時間・回数が少ない),分かりやすさ(手順が明確)を意識する.同じ問題でも複数のアルゴリズムがあり,性能差が出ることがある.
具体例
- 最大値を探す手順,整列(ソート)の手順,探索(サーチ)の手順.
コンピュータに実行させる命令を,決められた形式で記述したもの.
補足
- アルゴリズム(手順)を,コンピュータが理解できる形にしたものがプログラム.データ(入力)に対して処理を行い,結果(出力)を得る.
具体例
- 点数の平均を計算するプログラム,条件で合否を判定するプログラム.
アルゴリズムを考え,プログラムとして記述し,動作確認や修正を行う一連の作業.
補足
- 書くだけでなく,テスト(確認)とデバッグ(誤り修正)まで含む.目的,入力,出力,例外(想定外)を整理してから作るとミスが減る.
具体例
- 仕様を決める→コードを書く→テストする→直す→完成させる.
プログラムを記述するための言語(文法と規則の集合).
補足
- 人が読み書きしやすい高水準言語が多い.言語ごとに得意分野や実行方式(コンパイル,インタプリタなど)がある.
具体例
- Python,JavaScript,C,Java.
CPUが直接実行できる0と1の命令列.
補足
- CPUの種類(命令セット)によって異なる.人が読むには難しいため,通常は高水準言語→機械語へ変換して実行する.
具体例
- CPUが理解する命令コード列(人にはほぼ読めない).
人が読める形で書かれたプログラムのコード(高水準言語などで記述されたもの).
補足
- 実行するには,コンパイラやインタプリタで機械語に変換したり解釈したりする.コメントや命名で可読性を高めると保守しやすい.
具体例
- Pythonファイル,C言語の.cファイルの中身.
設計した内容に基づいて,実際にソースコードを書く作業.
補足
- プログラミングの一部(実装工程)として使われることが多い.読みやすさ(命名,一貫性,整理)と,テストしやすさが重要.
具体例
- フローチャートで決めた処理を,if文やfor文で書く.
Application Programming Interface.他のソフトウェアの機能を利用するための接続口(呼び出し方法の取り決め).
補足
- APIを使うと,自分で全部作らなくても機能を利用できる.入力(引数),出力(返り値),利用条件(認証,回数制限など)が決められていることが多い.
具体例
- 地図APIで地図表示を行う,天気APIで天気データを取得する.
手順の表現
処理の手順や流れを,決まった記号(開始・終了,処理,判断など)と矢印で表した図.
補足
- 順次・分岐・反復の流れを視覚的に整理できる.判断(Yes/No)の条件を明確に書くことが重要.処理が複雑なときは,まとまりごとに分けて見やすくする.
具体例
- 成績が基準以上なら「合格」,未満なら「不合格」と表示する手順を図で表す.
UMLの図の一つで,処理や作業の流れ(アクティビティ)を表す図.
補足
- フローチャートに近いが,並行処理(同時に進む流れ)や,担当(泳線)なども表しやすい.業務手順やシステムの動作の流れを整理するのに向く.
具体例
- 注文→在庫確認→(並行して)支払い処理と発送準備→発送,の流れを表す.
対象の状態(state)と,条件やイベントによる状態の移り変わり(遷移)を表す図.
補足
- 処理の「流れ」よりも,「状態の変化」に注目する.同じ入力でも状態によって動作が変わるもの(機械,アプリ画面,信号など)の整理に強い.
具体例
- 信号機が「青→黄→赤→青」と切り替わる,ログイン状態が「未ログイン→ログイン中→ログアウト」に遷移する.
データと制御
データを一時的に入れておく「名前付きの箱」.プログラム中で値を参照したり更新したりできる.
補足
- 型(数値,文字列など)や,値が変化することを意識する.名前は役割が分かるように付けると読みやすい.
複数のデータを順番に並べてまとめて扱うデータ構造(言語によって呼び方や性質が少し違う).
補足
- 要素を順番(添字)で取り出せる.要素の追加や削除がしやすい仕組みを持つ言語もある.
具体例
- 点数の一覧[70,82,91]をリストとして扱う.
同じ種類のデータを,連続した要素としてまとめて扱うデータ構造.
補足
- 添字(インデックス)で要素を指定して取り出す.多くの場面で,配列は要素数が固定的というイメージで扱われることが多い(言語仕様による).
具体例
- a[0],a[1],a[2]のように番号でアクセスする.
処理を上から順に,書かれた順番どおりに実行する制御構造.
条件によって実行する処理を分ける制御構造(ifなど).
補足
- 条件式が真か偽かで処理が変わる.条件の境界(以上/より大きい)や,複数条件の組合せに注意する.
同じ処理を繰り返し実行する制御構造(for,whileなど).
補足
- 回数が決まっている反復と,条件が満たされるまで続ける反復がある.終了条件を誤ると無限ループになる.
具体例
- 1から10まで足し算する,合計が100を超えるまで入力を続ける.
まとまった処理に名前を付けて,必要なときに呼び出せるようにしたもの.
補足
- 同じ処理を繰り返し書かずにすみ,再利用性や読みやすさが上がる.入力(引数)と出力(戻り値)を整理すると設計しやすい.
関数を呼び出すときに,関数へ渡す値(入力).
補足
- 引数に何を渡すかで関数の動作が変わる.順序や個数,型に注意する.
関数が処理した結果として呼び出し元に返す値(出力).
補足
- 戻り値を変数に代入して利用することが多い.戻り値がない関数(手続き的なもの)もある.
見かけ上ランダムな数.プログラムでランダムな動きを作るために使う.
補足
- 多くの場合は疑似乱数(決まった計算で生成).シード(種)によって同じ列を再現できることがある.範囲(0〜1,1〜6など)を指定して使う.
具体例
- サイコロの目を1〜6でランダムに出す,抽選をランダムに行う.
論理
真(1)/偽(0)を扱い,条件の組合せを計算する演算.
補足
- 代表例はAND(かつ),OR(または),NOT(否定).条件分岐や検索条件などで使われる.真理値表で整理するとミスが減る.
具体例
- 「AかつBが真なら合格」「AまたはBが真ならOK」などの判定.
論理演算を,電子回路として実現したもの.入力(0/1)から出力(0/1)を決める.
補足
- コンピュータ内部の演算や制御の基礎.複数の論理回路を組み合わせて,より複雑な処理を実現する.
論理回路の基本となる回路(AND回路,OR回路,NOT回路など).
補足
- これらを組み合わせてNAND,NOR,XORなども作れる.真理値表で入力と出力の対応を押さえると理解しやすい.
具体例
- AND回路は両方1のときだけ1,NOT回路は0と1を反転する.
データに「パリティビット」を付加して,誤り(主に1ビット誤り)を検出する方法.
補足
- 1の個数が偶数になるように付ける偶数パリティ,奇数になるように付ける奇数パリティがある.誤りの「検出」はできても,どのビットが誤ったかは分からないので訂正はできない.2ビット誤りのように偶数個のビットが誤ると1の個数の偶奇が変わらず,検出できない.
具体例
- 送信データの1の個数が偶数になるようにパリティビットを付け,受信側で偶数か確認する.
番号(識別コード)の誤入力を検出するために,元の数字から計算して付け加える検査用の数字.
補足
- 入力ミス(数字の打ち間違い,桁の入れ替えなど)の検出に使われる.バーコードや各種番号で利用される.
具体例
- ISBN(書籍),JANコード(商品),クレジットカード番号などで,末尾の数字がチェック用になっている.
その他の重要語
プログラムの書き表し方の考え方による分類(手続き型・オブジェクト指向型・関数型など)がある.実行方式にはコンパイルや解釈実行(インタプリタ)があり,両者を組み合わせる場合もある.
補足
- 手続き型は処理の手順を順に記述する,オブジェクト指向型はデータとその操作をひとまとまりの部品として扱う,関数型は処理を関数の組合せとして表す考え方である.スクリプト言語は手軽に書けて実行時に解釈されながら動くものが多い呼び方で,実行方式だけで決まる分類ではない.1つの言語が複数の書き方に対応することもあり,分類は排他的なものではない.
具体例
- 手順どおりに書き下す手続き型のプログラム,部品を組み合わせて設計するオブジェクト指向型のプログラム.
機械語の命令一つ一つに,人が読みやすい記号を対応させた言語.
補足
- 機械語とほぼ1対1に対応するためハードウェアの動きを細かく指定できるが,CPUの種類ごとに記述が異なり,移植性は低い.実行するにはアセンブラで機械語に変換する.
具体例
- 機器の制御など,動作の速さや大きさが厳しく求められる場面での記述.
計算や比較,条件の組合せなどの操作を表す記号.
補足
- 代表的なものに,算術演算子(加減乗除など),比較演算子(等しい・より大きい・以上など,結果は真か偽),論理演算子(かつ・または・でない)がある.条件式では,比較演算子で作った真偽の値を論理演算子でつなぐ.「等しい」を表す記号と代入を表す記号の区別に注意する.
具体例
- 得点が60以上かつ欠席が3回以下なら合格とする条件式.
データを先頭から順に一つずつ調べて,目的の値を見つける探索方法(逐次探索).
補足
- 並び順に関係なく使えて手順も単純だが,データの個数が増えるほど調べる回数が増える.見つからない場合は最後まで調べることになる.
大小の順に並んだデータの中央の値と目的の値を比べ,探す範囲を半分ずつ絞り込む探索方法.
補足
- あらかじめ並べ替えられていることが前提だが,データが多いときは線形探索よりずっと少ない回数で見つけられる.1回の比較で候補が約半分になる点が要点である.
具体例
- 辞書の真ん中を開いて,目的の語が前半か後半かを判断しながら絞り込む.
プログラムに含まれる誤りや不具合.
補足
- 文法の誤りのように実行前に見つかるものと,実行はできるが結果が正しくないもの(論理の誤り)がある.後者は気づきにくいため,想定した値と実際の値を突き合わせて確かめる.
具体例
- 条件の境界を「より大きい」と書くべきところを「以上」と書いたために結果がずれる.
プログラムのバグを見つけて取り除く作業.
補足
- 途中の変数の値を表示して確かめる,処理を小さく分けて確認する,境界にあたる値を入れて試すなどの方法がある.わかりやすい変数名やコメントは,デバッグをしやすくする.
具体例
- 合計が合わないとき,繰り返しの回数と加算の位置を1ステップずつ確認する.