アルゴリズムは問題を解くための手順のことで、どんなに複雑な手順も順次・選択・繰返しの3つを組み合わせて書けます。
3つの基本構造と流れ図
アルゴリズムをプログラム言語で書くことをプログラミングといい、プログラムにしてはじめてコンピュータで実行できるようになります。 試験では、特定のプログラム言語の代わりに、図で書く流れ図(フローチャート)と、文で書く擬似言語が使われます。どちらで書いても、中身は順次(書かれた順に上から実行する)、選択(条件が成り立つ=真か、成り立たない=偽かで処理を選ぶ)、繰返し(条件に従って同じ処理をくり返す)の組み合わせです。
どんな手順も、順次・選択・繰返しの3つの組み合わせで書けます。
流れ図は、処理の順番を記号と矢印で描いたものです(業務の流れを描く使い方はビジネスプロセスの回)。
流れ図の主な記号
端子(角の丸い横長の形) … 開始と終了
処理(長方形) … 計算や、変数に値を入れること
判断(ひし形) … 条件で道を分ける。中に「x : y」と書いたら x と y を比べる意味で、出口の線に「>」「≦」などの比べた結果を書く
ループ端(角を切った形を上下1組) … あいだの処理をくり返す。端に条件を書く
1から3までを足す流れ図。ループ端の i > 3 が成り立ったら、繰返しを抜けます。
ループ端に書かれた条件の意味は、問題の注記で示されます。IPAの問題では「ループ端の条件は,終了条件を示す」のように断ってあり、この場合はくり返す前に毎回条件を確かめ、成り立ったら抜けます。上の図なら、i > 3 になったところで終了です。
はじめ:s=0、i=1 i=1:1>3 ではない → s=0+1=1、i=2 i=2:2>3 ではない → s=1+2=3、i=3 i=3:3>3 ではない → s=3+3=6、i=4 i=4:4>3 → 抜けて終了 結果:s=6
流れ図や擬似言語を追うときは、このように変数の値を1回ずつ書き出し、条件を確かめるたびに1行を足していきます。
回数を数える変数(カウンタ)
決まった回数だけくり返すときは、回数を数える変数(カウンタ)を使います。回数は「初めの値」と「止まる条件」の組で決まります。
カウンタを 0 にし、処理のたびに 1 を加え、「3 未満なら戻る」 1回目のあと:1 → 戻る/2回目のあと:2 → 戻る 3回目のあと:3 → 3 未満ではないので抜ける → 処理は 3回
同じ「3 未満なら戻る」でも、カウンタを 1 から始めると、2回目のあとで 3 になって抜けるので、処理は 2回です。初めの値が1つずれると、回数も1つずれます。
「進む → 向きを変える」をくり返して図形を描く手順では、1周して元の向きに戻るまでに、向きを変えた角度の合計が360度になります。正方形なら、90度ずつ4回向きを変えます。
擬似言語の書き方
試験問題の冊子には「擬似言語の記述形式(ITパスポート試験用)」の説明が付いていて、問題文に断りがなければ、その形で書かれています。主なものは次のとおりです。
擬似言語の主な書き方
○手続名又は関数名 … 手続や関数を宣言する。ここから中身が始まる
型名: 変数名 … 変数を宣言する。例:整数型: count
変数名 ← 式 … 右の式の値を、左の変数に入れる(代入)
手続名又は関数名(引数, …) … 手続や関数を呼び出し、引数を渡す
if (条件式) … elseif (条件式) … else … endif … 選択。上から条件式を調べ、最初に真になったものの処理だけを実行する。どれも真にならなければ else の処理
while (条件式) … endwhile … 前判定の繰返し。くり返す前に条件式を調べ、真の間くり返す。最初に偽なら1回も実行しない
do … while (条件式) … 後判定の繰返し。先に1回実行してから条件式を調べる
for (制御記述) … endfor … 繰返し。「i を 1 から 5 まで 1 ずつ増やす」のように回し方を書く
注釈 … 処理の説明書き。実行はされない。斜線2本(//)のあとなどに書く
変数にはデータ型があり、入れられる値の種類が決まっています。整数型は整数(-3、0、25 など)、実数型は小数を含む数(1.5 など)、論理型は true(真)か false(偽)のどちらか、文字型は文字です。問題では、文字の並び(“ABC” など)を入れる文字列型もよく使われます。
計算や比較に使う記号を演算子といい、演算子で値や変数をつないだものが式、真か偽かを表す式が条件式です。四則演算は + - × ÷(× と ÷ が先)、比べる記号は = ≠ < ≦ > ≧、条件をつなぐのは and・or・not です。余りを求める演算子 mod もありますが、問題では「a ÷ 4 の商」「a ÷ 4 の余り」のように言葉で書かれることがよくあります。
17 ÷ 5 の商=3、余り=2 (5×3+2=17) 余り=割られる数-割る数×商 → 17-5×3=2 47 ÷ 10 の商=4(十の位)、余り=7(一の位)
余りが 0 なら割り切れるという意味です。「x ÷ 2 の余り が 0 と等しい」なら「x は 2 の倍数(偶数)」と読めます。
条件式は「a が b より大きい」「a が b 以下」のように言葉でも書かれます。「より大きい」「より小さい(未満)」は等しいときを含まず、「以上」「以下」は含みます。
関数・手続・引数・戻り値
手順に名前を付けてまとめ、呼び出して使えるようにしたものが関数と手続です。呼び出すときに渡す値を引数、関数が return で返す結果を戻り値といいます。手続は戻り値を返さず、出力などの処理だけを行います。
○整数型: twice(整数型: n) return n × 2
先頭の「整数型:」は戻り値の型、かっこの中が引数です。twice(5) と呼び出すと、n に 5 が入り、10 が返ります。
呼び出すときに渡すのが引数、return で返ってくるのが戻り値です。
配列と、日本語で書かれた操作
配列は、同じ型の値を並べて1つの名前で扱うものです。{ } の中に値を並べ、[ ] の中に要素番号を書いて1つを取り出します。要素番号が 1 から始まることは、問題文で断ってあります。data ← {7, 3, 9} なら、data[2] は 3、data の要素数は 3 です。
ITパスポートの擬似言語は、「data[1] と data[2] の値を入れ替える」「s の末尾に “A” を追加する」「x を出力する」(結果を外に出す=出力。反対に、外から値を受け取るのが入力)のように、操作を日本語で書くことがあります。書いてあるとおりに読めば十分です。
入れ子の選択を読む
選択の中に、さらに選択を入れることもできます(入れ子)。次は、代金と重さから送料を決める関数です。
○整数型: shipping(整数型: price, 整数型: weight)
整数型: fee
if (price が 5000 より小さい)
if (weight が 10 より小さい)
fee ← 600
else
fee ← 900
endif
else
fee ← 0
endif
return fee
shipping(3000, 12) 3000 は 5000 より小さい → 内側の if へ 12 は 10 より小さくない → fee ← 900 shipping(5000, 2) 5000 は 5000 より小さくない → 外側の else へ → fee ← 0
内側の if は、外側の条件が真のときにしか調べません。行頭の字下げが、どの if の中にあるかを表しています。
プログラムを追う・空欄を埋める
擬似言語の問題は、動かした結果を答えるトレースと、空欄に入る式を選ぶ穴埋めの2つの形で出ます。
while と return
n ← 1 while (n が 10 より小さい) n ← n × 2 endwhile
1 は 10 より小さい → n=2 2 は 10 より小さい → n=4 4 は 10 より小さい → n=8 8 は 10 より小さい → n=16 16 は 10 より小さくない → 抜ける(中身は4回)
while は、くり返す前に毎回条件を調べ、偽になった時点で抜けて endwhile の次の行へ進みます。また、繰返しの途中に return があれば、その時点で関数ごと終わり、残りの繰返しは行いません。
「割っていって調べる」形のプログラムもよく出ます。たとえば素数は、1 とその数自身でしか割り切れない 2 以上の整数です(2、3、5、7、11…)。1 は素数ではありません。ある数が素数かどうかは、2 から順に割っていき、途中で割り切れる(余りが 0 になる)数が見つかれば素数ではない、と調べられます。
for の回し方
for の制御記述は、「i を 初めの値 から 終わりの値 まで 増やす幅 ずつ増やす」と読みます。i が終わりの値を超えたら止まり、終わりの値ちょうどは含みます。
i を 1 から 10 まで 4 ずつ増やす → i=1、5、9(次の 13 は 10 を超えるので止まる)→ 3回 i を 3 から 9 まで 3 ずつ増やす → i=3、6、9(9 ちょうどは含む)→ 3回
ポイントの集計のために、次の手続を作りました。この手続を呼び出したときの出力はどれですか。
○printTotal()
整数型: s, i
s ← 0
for (i を 2 から 11 まで 3 ずつ増やす)
s ← s + i
endfor
s を出力する
× i=2、5、8 で止めた値です。「11 まで」は 11 ちょうどを含むので、i=11 のときも足します。
○ 正解 26です。
i は 2、5、8、11 の4つの値をとります(次の 14 は 11 を超えるので止まる)。s=2+5+8+11=26 です。
× くり返した回数です。出力するのは回数ではなく、足し込んだ s の値です。
× 2 から 11 までの整数をすべて足した値です。増やす幅は 1 ではなく 3 です。
足し込みの形
合計を作る変数は 0 から始め、「s ← s + x」のように自分自身に足して入れ直す形にします。
空欄は小さい値で試す
穴埋めは、選択肢の式を空欄に入れ、小さい値で実際に動かして、問題文に書かれた結果と合うものを選びます。次は、配列の中でいちばん大きい値を返す関数です。
○整数型: maxValue(整数型の配列: data)
整数型: m ← data[1]
整数型: i
for (i を 2 から data の要素数 まで 1 ずつ増やす)
if (data[i] が m より大きい)
[ a ]
endif
endfor
return m
maxValue({4, 9, 2}) を3つの候補で動かす(正しくは 9)
m ← data[i]:i=2 で m=9、i=3 は 2<9 → 9 ○
m ← m + data[i]:i=2 で m=4+9=13、i=3 は 2<13 → 13 ×
data[i] ← m:m は 4 のまま → 4 ×
問題文に「例えば◯◯を受け取ると△△を返す」「変数の値が◯→◯→◯と変化した」のような例が書いてあれば、その例をそのまま試すのが近道です。
2進数の文字列を整数に直すプログラムも出ます。2進数は右端の桁の重みが 1 で、左へ1桁進むごとに 2、4、8…と2倍になり(この重みは「2 を何回掛けたか」で、2 の 0 乗=1、2 の 1 乗=2、2 の 2 乗=4 … と書けます)、各桁の数字×重みを足すと整数の値になります(“1101” なら 8+4+0+1=13)。くわしくは離散数学の回で扱っています。
探索:線形探索と2分探索
配列の中から目的の値を探す手順を探索といいます。代表は次の2つです。
線形探索法 … 先頭から順に1つずつ比べる。データの並び順は問わない。比べる回数は最大で要素の数と同じで、要素の数に比例して増える
2分探索法 … 真ん中の要素と比べ、目的の値がある側の半分に範囲を絞ることをくり返す。データが小さい順(昇順)か大きい順(降順)に整列済みであることが条件
2分探索は1回ごとに範囲を半分にしますが、データが整列済みでないと使えません。
{3, 8, 12, 20, 27, 31, 45} から 27 を2分探索で探す
範囲 1〜7番目:真ん中は4番目の 20。27 は 20 より大きい → 5〜7番目へ
範囲 5〜7番目:真ん中は6番目の 31。27 は 31 より小さい → 5番目だけ
範囲 5番目:27。見つかった(3回)
比べる回数のように、処理にかかる手間の量を計算量といいます。2分探索は1回ごとに範囲が半分になるので、要素が2倍に増えても、比べる回数は最大で1回増えるだけです。
ただし、これは平均や最大の回数で比べた話です。上の7つで 3 を探すと、線形探索は1回で見つかりますが、2分探索は 20、8、3 と3回比べます。比べる回数は、探す値がどこにあるかでも変わります。
整列と併合
データを決まった順に並べ替えることを整列(ソート)といい、小さい順を昇順、大きい順を降順と呼びます。代表的な整列のアルゴリズムは次の3つです。
選択ソート … 整列が済んでいない範囲から最小値(または最大値)を選び、範囲の端の要素と入れ替える。範囲を1つずつ縮めてくり返す
バブルソート … 隣どうしを比べ、順序が逆なら入れ替える。1周すると、残りの中の最大値(または最小値)が端まで運ばれる
クイックソート … 基準の値を1つ決め、それより小さいグループと大きいグループに分ける。分けたグループの中でも同じことをくり返す
選択ソートは「選んで端と入れ替える」、バブルソートは「隣どうしを入れ替える」をくり返します。
選択ソートを追う
最小値を選んで先頭側と入れ替える(昇順) 初め:4,2,5,1,3 1回目:1〜5番目の最小値は 1(4番目)→ 1番目と入れ替え → 1,2,5,4,3 2回目:2〜5番目の最小値は 2(2番目)→ 入れ替える相手が自分 → 1,2,5,4,3 3回目:3〜5番目の最小値は 3(5番目)→ 3番目と入れ替え → 1,2,3,4,5 4回目:4〜5番目の最小値は 4(4番目)→ そのまま → 1,2,3,4,5
2回目と4回目のように、並びが変わらない回も、手順としては1回と数えます。何回くり返すかは、並びが変わったかどうかではなく、手順に書かれた止まる条件で決まります。止まる条件を満たすまで、1回ずつ並びを書き出して数えます。
バブルソートを追う
左が右より大きければ入れ替える(昇順) 初め:4,1,3,2 1周目 4 と 1 → 入れ替え → 1,4,3,2 4 と 3 → 入れ替え → 1,3,4,2 4 と 2 → 入れ替え → 1,3,2,4(最大値 4 が右端に決まる) 2周目(右端の 4 は除く) 1 と 3 → そのまま/3 と 2 → 入れ替え → 1,2,3,4 3周目:1 と 2 → そのまま(変わらない)
入れ替える条件が「左が右より大きい」なら昇順に、「左が右より小さい」なら降順に並びます。
クイックソートと併合
クイックソートは、基準より小さいグループと大きいグループに分けることを、グループが1個ずつになるまでくり返します。最後にグループを小さい順につなぐと、整列が済みます。併合(マージ)は、整列済みの2つの列を1つの整列済みの列にまとめる処理で、先頭どうしを比べて小さいほうを取り出すことをくり返します(1,4,7 と 2,3,9 → 1,2,3,4,7,9)。
ある店で、5種類の商品の在庫数 {6, 2, 9, 4, 1} を少ない順(昇順)に並べ替えます。手順は「整列が済んでいない範囲から最大値を選び、範囲の最後の要素と入れ替え、最後の要素を範囲から外す」のくり返しです。この手順を2回行った直後の並びはどれですか。
× 整列がすべて終わったあとの並びです。2回では終わりません。
× 1回目の直後の並びです。
× 最小値を選んで先頭と入れ替える、別のやり方の1回目です。
○ 正解 4, 2, 1, 6, 9です。
1回目は最大値 9 と最後の 1 を入れ替えて 6, 2, 1, 4, 9。9 を範囲から外し、2回目は 6, 2, 1, 4 の最大値 6 と範囲の最後の 4 を入れ替えて 4, 2, 1, 6, 9 になります。
まとめ
この回で持ち帰ること
1. アルゴリズムは順次・選択・繰返しの組み合わせ。流れ図の記号は端子・処理・判断・ループ端。ループ端の条件は注記に従って読む(終了条件なら、成り立ったら抜ける)
2. 追うときは変数の値を1回ずつ書き出す。回数は初めの値と止まる条件で決まる。穴埋めは小さい値か問題文の例で試す
3. 擬似言語は ← が代入、if は最初に真になった処理だけ、while は前判定、for は終わりの値ちょうどを含む。関数は引数を受け取り return で戻り値を返す。「より大きい・未満」は等しいときを含まない
4. 線形探索は先頭から順に。2分探索は整列済みが条件で、半分ずつ絞る
5. 選択ソート=選んで端と入れ替える、バブルソート=隣どうしを入れ替える、クイックソート=基準で2つに分ける、併合=整列済みの2列を先頭から比べて1列にする
この節で解ける公開問題
令和4〜8年度の公開問題のうち、この節の知識で解ける問題は次の14問です。
擬似言語の穴埋め
令和4年度 問78チェックデジットの計算令和4年度 問96for の制御記述と式令和5年度 問641から max までの総和令和6年度 問852進数の文字列を整数に変換令和8年度 問85素数の判定
同じ分野の過去問を続けて解く(アルゴリズムとプログラミング 17問) →
教科書の一覧(現行の試験の順)教科書の一覧(新しい試験の順)過去問
Udemy の ITパスポート講座を、受講者数・★評価・口コミで比べたページです(広告を含みます)。
出典:IPA「ITパスポート試験 シラバス Ver6.5」、ITパスポート試験 公開問題の冊子「擬似言語の記述形式(ITパスポート試験用)」。 練習問題とプログラム例は当サイトが説明のために作ったものです。

