1-2 アルゴリズムとプログラミング
アルゴリズムとプログラミング
アルゴリズムは、入力から目的の結果を得るための有限で明確な処理手順です。ITパスポートでは複雑なコードを書くことより、順次・分岐・繰返し、変数、配列、探索、整列の動きを追跡し、どの処理が正しいかを判断する力が問われます。
この節の目標は、擬似言語やフローチャートを一行ずつ追い、変数と配列の値を表に記録し、条件・終了判定・探索方法を説明できるようになることです。
1. アルゴリズムの三つの基本構造
| 構造 | 内容 | 例 |
|---|---|---|
| 順次 | 記述された順に処理する | 数量を入力し、金額を計算し、表示する |
| 選択 | 条件の真偽で処理を分ける | 在庫が0なら「売切れ」を表示する |
| 繰返し | 条件や回数に応じて同じ処理を行う | 全商品の売上を合計する |
複雑な処理も、基本的にはこの三つを組み合わせます。問題では「条件を判定するタイミング」と「繰返しを終了する条件」を確認します。
2. 変数と代入を式として読まない
代入x ← x + 1は、数学の等式ではなく、「現在のxに1を加えた値を新しいxとして保存する」という意味です。
最初にx ← 3、その後でx ← x + 2を実行すると、xは5になります。
追跡表を使う
次の処理を考えます。
sum ← 0
for i を 1 から 4 まで繰り返す
sum ← sum + i
endfor
| 繰返し後 | i | sum |
|---|---|---|
| 初期状態 | - | 0 |
| 1回目 | 1 | 1 |
| 2回目 | 2 | 3 |
| 3回目 | 3 | 6 |
| 4回目 | 4 | 10 |
頭の中だけで追わず、変化する変数を列にした表を作ると誤りを減らせます。
3. 分岐条件を境界値で確認する
次の条件を比べます。
score >= 80
score > 80
80点は前者では真、後者では偽です。境界値で結果が変わるため、79、80、81のように条件の前後を確認します。
複数条件では、論理演算も使います。
age >= 18 AND consent = true:18歳以上で、かつ同意済みmember = true OR amount >= 10000:会員または1万円以上購入NOT deleted:削除済みではない
4. 繰返しの種類と無限ループ
| 繰返し | 特徴 | 注意点 |
|---|---|---|
| 回数指定 | 決まった回数を繰り返す | 開始値と終了値を含むか確認する |
| 前判定 | 実行前に条件を確認する | 最初から偽なら一度も実行しない |
| 後判定 | 実行後に条件を確認する | 少なくとも一度は実行する |
繰返し条件に使う変数が更新されないと、終了できない無限ループになる可能性があります。
完全ケース:入力値の合計と平均
正の整数を繰り返し入力し、0が入力されたら終了して平均を表示する処理を考えます。
sum ← 0
count ← 0
value を入力する
while value != 0
sum ← sum + value
count ← count + 1
value を入力する
endwhile
if count > 0
average ← sum / count
average を表示する
endif
確認すべき点は次のとおりです。
- 終了用の0は合計と件数へ含めない。
- 次の入力をループ内で行う。
- 最初に0が入力された場合、0で割らない。
5. 配列と添字を追う
配列は同じ種類の複数データを一つの名前で管理します。問題文で添字が0から始まるか1から始まるかを確認します。
配列price = [120, 300, 80, 500]で0から数える場合、price[0]は120、price[2]は80です。
最大値を求める手順
max ← data[0]
for i を 1 から 要素数-1 まで繰り返す
if data[i] > max
max ← data[i]
endif
endfor
最初の要素を仮の最大値とし、残りと順番に比較します。max ← 0とすると、全要素が負の数の場合に誤った結果になるため注意します。
6. 関数で処理を部品化する
| 用語 | 意味 |
|---|---|
| 関数 | 一つの目的を持つ処理の部品 |
| 引数 | 関数へ渡す値 |
| 戻り値 | 関数から返される結果 |
| ローカル変数 | 関数内だけで使う変数 |
| 再帰 | 関数が自分自身を呼び出す処理 |
関数を使うと、重複を減らし、テストしやすくなります。ただし、入力、戻り値、副作用を明確にします。
7. 探索方法をデータの状態で選ぶ
| 探索 | 方法 | 条件・特徴 |
|---|---|---|
| 線形探索 | 先頭から順に比較する | 未整列でも使えるが、件数が多いと比較回数が増える |
| 二分探索 | 中央と比較し、対象範囲を半分にする | あらかじめ整列されている必要がある |
完全ケース:二分探索
昇順配列[3, 8, 12, 17, 25, 31, 40]から25を探します。
- 中央の17と比較する。
- 25は17より大きいので、右半分
[25, 31, 40]へ絞る。 - 中央の31と比較する。
- 25は31より小さいので左へ絞り、25を発見する。
データが未整列なら、同じ手順では正しく絞れません。
8. 整列方法の違い
| 手法 | 基本的な考え方 | 特徴 |
|---|---|---|
| バブルソート | 隣同士を比較し、逆なら交換する | 単純だが比較・交換が多くなりやすい |
| 選択ソート | 未確定部分から最小値を選び、先頭へ置く | 交換回数を抑えやすい |
| 挿入ソート | 整列済み部分へ新しい要素を挿入する | 小規模・ほぼ整列済みのデータで扱いやすい |
| クイックソート | 基準値で小さい群と大きい群へ分割する | 一般に高速だが分割方法で性能が変わる |
試験では細かな計算量より、比較・交換・分割の考え方を読み取ります。
9. プログラミング言語とデータ表現
| 種類 | 例 | 主な用途 |
|---|---|---|
| プログラミング言語 | Python、Java、JavaScript、C | 処理やアルゴリズムを記述する |
| マークアップ言語 | HTML、XML | 文書やデータの構造を表す |
| スタイルシート | CSS | 表示方法や見た目を指定する |
| データ交換形式 | JSON、CSV | システム間でデータを受け渡す |
| SQL | SELECT、UPDATEなど | 関係データベースを操作する |
HTMLはページ構造、CSSは見た目、JavaScriptは動作を担当するという違いを押さえます。
10. 問題を解く判断手順
- 入力、出力、初期値を確認する。
- 変化する変数と配列を書き出す。
- 条件式を日本語へ置き換える。
- 境界値と終了条件を確認する。
- 一回ずつ追跡表へ記録する。
- 配列の添字と要素数を確認する。
- 空データ、0件、負の値など例外を試す。
11. よくある誤りと理由
- 代入を数学の等式として読む:右辺を計算して左辺へ保存する処理です。
- ループ回数を一つ多く・少なく数える:開始値と終了値を含むか確認します。
- 終了条件の変数を更新しない:無限ループになります。
- 0件で平均を計算する:0除算を避ける条件が必要です。
- 配列の添字を常に1始まりと決めつける:問題文の定義を確認します。
- 未整列データへ二分探索を使う:範囲を正しく絞れません。
- 最大値の初期値を常に0にする:負数だけの配列で誤ります。
12. セルフチェック
- 初期値、終了条件、1回ごとの更新を確認したか。
- 条件式の境界値を試したか。
- 変数の値を追跡表へ記録したか。
- 配列の添字範囲を超えていないか。
- 探索方法とデータの整列状態が合っているか。
- 0件・空データ・異常値を考えたか。
理解を確認したら、第1章の練習問題と第1章の知識カードで処理を追跡してください。数値・論理の基礎は基礎理論、実行環境はソフトウェアで確認できます。
公式範囲との対応
本節は、IPA「ITパスポート試験シラバス Ver.6.5」のアルゴリズムとプログラミング、プログラム言語、その他の言語に対応し、基本構造、擬似言語、変数、配列、関数、探索、整列、マークアップ言語などを扱います。