基本情報技術者 学習ページ|科目B・アルゴリズムとプログラミング
アルゴリズムを読む
整列、探索、再帰、文字列処理は、処理の目的と一回の操作をつかむと追跡しやすくなります。このページでは、代表的なアルゴリズムを擬似言語で読み、比較回数や変数の変化から空欄と結果を判断します。
流れ図を追う
流れ図では、処理、判断、繰返しの流れを矢印に沿って追います。判断では条件が真の経路と偽の経路を区別し、合流後の処理まで確認します。
擬似言語へ置き換えて考えると、判断はif、反復はforやwhileに対応します。戻り矢印がどの条件へ戻るかを見失わないことが大切です。
分岐の直後で変数がどう変わるかを書き添えると、経路ごとの差が見えます。
流れ図は分岐先と戻り先を矢印で確認する。
三つの整列法
選択ソートは未整列部分から最小値などを探して所定位置と交換します。バブルソートは隣り合う要素を比較し、順序が逆なら交換します。挿入ソートは取り出した値を、整列済み部分の適切な位置へ差し込みます。
一回の外側ループで何が進むかを見ると、三つの方法を区別しやすくなります。選択ソートとバブルソートは、外側ループ1回ごとに端の位置が1つ確定します。挿入ソートは整列済みの範囲が1つずつ広がりますが、その中の値は後から動くことがあります。
外側ループが1回終わるごとに配列の並びを1行ずつ書き出すと、どこから整列済みになっていくかが見えます。
選択・バブルは端が1つずつ確定、挿入は整列済み範囲が広がる。
線形探索と2分探索
線形探索は先頭などから順に値を比較します。2分探索は整列済みの配列で中央要素と比較し、探索範囲を半分側へ狭めます。
2分探索ではleft、right、midの三つを表にして追います。整列されていない配列には、同じ手順で2分探索を適用できません。
探索範囲が縮まる向きまで確認すると、leftとrightの更新を逆にしにくくなります。
2分探索は整列済み配列で探索範囲を半分に狭める。
再帰は小さくする
再帰は、関数が自分自身を呼び出す形です。読むときは、呼出しを止める条件と、次の呼出しでその条件へ近づくことを確認します。
例えばnを1ずつ減らす、配列の対象範囲を狭めるなど、停止条件へ近づく変化が必要です。戻り値は最も深い呼出しから順に戻して計算します。
呼出しごとの引数を縦に並べると、停止条件へ近づいているかを確認できます。
再帰は停止条件と、そこへ近づく変化を確認する。
文字列処理を分解
文字列処理では、1文字ずつ調べる操作や一致区間を探す操作を、問題文で定義された関数に分けて読むことがあります。文字の取り出し規則が独自に示されたら、その定義を先に確認します。
照合処理では、比較する位置、何文字一致したか、ずれたときにどこから再開するかを追います。問題文の関数定義を擬似言語より先に整理します。
文字列は問題文で定義された操作の意味を先に確認する。
本番の形で解いてみる
科目Bの形: プログラム(擬似言語)を読んで解答群から選ぶ(このページのために作った問題)
次のプログラム中の【a】、【b】に入れる正しい答えの組合せを、解答群の中から選べ。関数selectSortは整数型の配列aを昇順に並べ替えて返す。要素番号は1から始まる。
1○整数型の配列: selectSort(整数型の配列: a) 2 整数型: i, j, minPos, temp 3 for (i を 1 から aの要素数 - 1 まで 1 ずつ増やす) 4 minPos ← i 5 for (j を i + 1 から aの要素数 まで 1 ずつ増やす) 6 if (a) 7 minPos ← j 8 endif 9 endfor 10 temp ← a[i] 11 a[i] ← a[minPos] 12 b 13 endfor 14 return a
- a: a[j] < a[minPos] b: a[minPos] ← temp
- a: a[j] > a[minPos] b: a[minPos] ← temp
- a: a[j] < a[i] b: a[j] ← temp
- a: j < minPos b: a[minPos] ← temp
- a: a[j] < a[minPos] b: a[i] ← temp
答えと解説を見る
正解: a: a[j] < a[minPos] b: a[minPos] ← temp
未整列部分の最小値の位置をminPosに記録するので、a[j]が現在の最小値より小さいとき更新します。最後はa[i]とa[minPos]を交換するため、a[minPos]へtempを入れます。
まちがえやすい点: 最小値そのものではなく、その位置minPosを更新している。
科目Bの形: プログラム(擬似言語)を読んで解答群から選ぶ(このページのために作った問題)
次のプログラム中の【a】、【b】に入れる正しい答えの組合せを、解答群の中から選べ。関数binaryFindは、昇順で重なりのない整数型配列aとtargetを受け取り、targetがあればその要素番号、なければ0を返す。
1○整数型: binaryFind(整数型の配列: a, 整数型: target) 2 整数型: left ← 1 3 整数型: right ← aの要素数 4 整数型: mid 5 while (left ≦ right) 6 mid ← (left + right) ÷ 2 の商 7 if (a[mid] = target) 8 return mid 9 elseif (a[mid] < target) 10 a 11 else 12 b 13 endif 14 endwhile 15 return 0
- a: left ← mid + 1 b: right ← mid - 1
- a: left ← mid b: right ← mid
- a: right ← mid - 1 b: left ← mid + 1
- a: left ← mid b: right ← mid - 1
- a: left ← mid - 1 b: right ← mid + 1
答えと解説を見る
正解: a: left ← mid + 1 b: right ← mid - 1
中央値がtargetより小さいときは、mid以下を候補から外してleftをmid+1にします。中央値がtargetより大きいときは、rightをmid-1にします。
まちがえやすい点: mid自身は比較済みなので、次の範囲には含めない。
科目Bの形: プログラム(擬似言語)を読んで解答群から選ぶ(このページのために作った問題)
次の関数digitSumをdigitSum(4726)として呼び出したとき、戻り値として正しいものを解答群から選べ。
1○整数型: digitSum(整数型: n) 2 if (n < 10) 3 return n 4 else 5 return n mod 10 + digitSum(n ÷ 10 の商) 6 endif
- 9
- 12
- 15
- 19
- 26
答えと解説を見る
正解: 19
4726は末尾の6と472へ分かれ、同じ処理で2、7、4が順に加わります。6+2+7+4=19なので戻り値は19です。
まちがえやすい点: n ÷ 10 の商は末尾の1桁を除く操作として使われる。
基本情報の学習ページ
ほかの学習ページの一覧と、2択の用語カード(750語)は、基本情報技術者のページにあります。
基本情報技術者のページへ →このページの内容は、IPA「基本情報技術者試験 シラバス Ver.9.2」(2026年1月公表)と試験要綱Ver.5.6の範囲にもとづきます(2026年10月確認)。IPAは2027年度春ごろから新しい試験制度に移る予定です。