アルゴリズムとフローチャートとは?わかりやすく解説

テクノロジ系 ・ 基礎理論(アルゴリズム) ・ 読む目安8分 ・ 頻出

問題を解く手順と、その流れを図で表す方法を学びます。

最初に考えてみよう

人間なら「いい感じにやって」で通じることがあります。でもコンピュータは、何を・どの順番で・どんな条件で行うかを決めないと動けません。どうすれば、迷わず正しく動ける手順を伝えられるのでしょうか?

解説

アルゴリズム=問題を解くための手順。フローチャート=その手順を、箱と矢印で描いた図です。 コンピュータは図のとおり、1つずつ・書いてある順に実行します。

まず、あなたがコンピュータになって実行

お題は「1 から 3 までを足す」。黄色い●が「いま実行している場所」です。 ●が止まったら、コンピュータならどうするかを選んでください。 右の変数の箱も手がかりになります。

はいいいえ↺ 条件へ戻る
開始
合計 ← 0
i ← 1
i ≦ 3 ?
合計 ← 合計 + i
i ← i + 1
合計を表示
終了
変数の箱
i?
合計?

答え合わせ:コンピュータの正しい流れ

いま実行した図を、コンピュータが1ステップずつ実行します。 再生すると●が矢印の上を進み、条件の答えで道が変わり、 くり返しでは条件へ戻ります。上限を 5 にして、くり返しが増える様子も見てみよう。

くり返す上限:
はいいいえ↺ 条件へ戻る
開始
合計 ← 0
i ← 1
i ≦ 3 ?
合計 ← 合計 + i
i ← i + 1
合計を表示
終了
変数の箱
i?
合計?
いま実行した命令順次:上から順に1つずつ開始ここから実行
開始終了

いま動かした図に、3つの基本構造がそろっている

  • 順次図の 「合計 ← 0」→「i ← 1」

    上から順に、1つずつ実行する

  • 選択(分岐)図の ひし形「i ≦ 5 ?」

    はい/いいえ で進む道が変わる

  • 繰り返し図の 「↺ 条件へ戻る」矢印

    条件が「はい」の間、同じ処理をくり返す

試験の書き方:「←」は「右の値を左の箱に入れる」

合計の箱を0にする
合計 ← 0
合計に今の数字 i を足す
合計 ← 合計 + i
i を1増やす
i ← i + 1

同じ手順を、試験の擬似言語で読む

試験では、フローチャートと同じ手順が擬似言語という決まった書き方の文章でも出ます。 さっきの「足し算」を、上限を n にして書き直しました。同じ番号どうしが同じ処理です。

sum(n)①合計 ← 0②i ← 1③i ≦ n ?④合計 ← 合計 + i⑤i ← i + 1⑥合計を返す⑦はい戻るいいえ
①○整数型: sum(整数型: n)関数の始まり
整数型: 合計, i使う変数
②合計 ← 0
③i ← 1
④while (i ≦ n)
⑤合計 ← 合計 + i
⑥i ← i + 1
endwhile④へ戻る
⑦return 合計値を返して終わる
○整数型: sum(…)
関数の始まり。○の後ろの型(整数型)は、返す値の種類
while 〜 endwhile
条件が成り立つ間、間の行をくり返す。endwhile まで来たら条件へ戻る
return 合計
合計の値を呼び出し元へ返し、関数を終える。sum(5) なら 15 が返る

擬似言語の書き方:for・if・商と余り

for で書くと、③④⑥ が1行にまとまる

合計 ← 0
③④⑥for (i を 1 から n まで 1 ずつ増やす)
⑤合計 ← 合計 + i
endfor
⑦return 合計

for の1行に「i を 1 から始める(③)」「n を超えたら抜ける(④)」「1周ごとに i を1増やす(⑥)」が入っています。 だから間に書くのは ⑤ だけ。while 版と同じ結果になります。

分岐 if 〜 endif:上から調べて、当てはまった1つだけ実行

if (点数 ≧ 80)
評価 ← "A"
elseif (点数 ≧ 60)80未満のときだけ調べる
評価 ← "B"
elseどれにも当てはまらないとき
評価 ← "C"
endif

点数が 70 なら、1つ目(80以上)は「いいえ」、2つ目(60以上)が「はい」で 評価 は B。 フローチャートのひし形を、上から順に並べたものです。

割り算は「商」と「余り」を区別する

7 ÷ 3 の商

→ 2

割り算の整数部分

7 ÷ 3 の余り

→ 1

割り切れずに残った数

i ÷ 3 の余り が 0 と等しい

→ i は 3 の倍数

割り切れる、という意味

解き方はフローチャートと同じ。変数の値を1行ずつメモしながら、上から順にたどります。

配列と要素番号:1つずつ取り出して表で追う

配列は、同じ種類の値を要素番号(添字)付きで並べた箱。試験では「配列の要素番号は1から始まる」と書かれます。点数[3] は3番目の箱の値 9、要素数は箱の数 4 です。

7[1]
3[2]
点数[3]9[3]
4[4]
文字列型: 結果 ← ""空の文字列
for (i を 1 から 要素数 まで 1 ずつ増やす)
if (点数[i] が 5 以上)
結果 の末尾 に "○" を追加する
else
結果 の末尾 に "×" を追加する
endif
endfor
i点数[i]追加結果
17○"○"
23×"○×"
39○"○×○"
44×"○×○×"

「末尾に追加」は右端に1文字つなげること。結果の i 文字目は 点数[i] で決まるので、結果から配列を選ぶ問題も1文字ずつ突き合わせれば解けます。

並べ替え(整列)を1手ずつ

二重の for で要素を比べて入れ替えるのが並べ替えの定番。小さい順(昇順)に並べます。N は配列 a の要素数。

for (n を 1 から N − 1 まで 1 ずつ増やす)
for (m を 1 から N − n まで 1 ずつ増やす)
if (a[m] > a[m + 1])
a[m] と a[m + 1] の値を入れ替える
endif
endfor
endfor
40[1]
10[2]
30[3]
20[4]

はじめの並び。隣どうし(m と m+1)を左から比べます

バブルソートは1周(n)ごとに一番大きい値が右端へ運ばれ、確定します。だから次の周は比べる範囲が1つ短くなる(m は 要素数−n まで)。

探索:線形探索と2分探索

配列から目的の値を探す方法は2つ。探す値を選ぶと、調べた順番が箱に出ます。

線形探索比べた回数 7 回

1回目3[1]
2回目8[2]
3回目12[3]
4回目17[4]
5回目21[5]
6回目26[6]
7回目30[7]

2分探索比べた回数 3 回

3[1]
8[2]
12[3]
1回目17[4]
21[5]
2回目26[6]
3回目30[7]
線形探索2分探索
探し方先頭の要素から順に中央と比べ、範囲を半分に絞る
前提並びは何でもよい昇順か降順に整列済み
計算量要素数に比例(2倍なら約2倍)要素数が2倍でも1回増えるだけ

ふつうは2分探索のほうが少なく済みますが、いつもではありません。3 を探すと、線形探索は1回、2分探索は3回です。

よく出る型①:数の扱い

2進数の文字列 → 10進数

末尾から i 番目の桁に、2 の(i − 1)乗を掛けて足していく。末尾(i=1)の重みは 2⁰=1。

末尾から i1234
桁の数字1011
2の(i−1)乗1248

"1101" → 1×1 + 0×2 + 1×4 + 1×8 = 13(合計 ← 合計 + 数字 × 重み)

10進数の各桁を取り出す(÷ 10 の商と余り)

47 なら、47 ÷ 10 の商=4(十の位)、47 − 10 × 4 = 7(一の位。47 ÷ 10 の余りと同じ)。 各桁の合計 4 + 7 = 11 はまだ2桁なので、もう一度 1 + 1 = 2。9以下になるまで while でくり返します。

最大公約数(ユークリッドの互除法)

2つの数が等しくなるまで、大きいほうから小さいほうを引く。残った値が最大公約数。

(36, 24) → (12, 24) → (12, 12) → 12

「割った余りで割る」を余りが0になるまでくり返す書き方もある。36÷24 の余り12、24÷12 の余り0 → 12

どれも変数の値を表に書きながら1周ずつ追えば解けます。式の穴埋めは、小さい例("10" や 13)を入れて確かめるのが近道です。

よく出る型②:回数と止まる条件

回数は始まりの値・終わりの条件・増やし方で決まる。「未満」と「以下」で1回ずれるのが落とし穴。

  • カウンタ ← 0 で始め、6 未満の間0,1,2,3,4,56 回
  • カウンタ ← 1 で始め、6 以下の間1,2,3,4,5,66 回
  • for (i を 2 から 10 まで 4 ずつ増やす)2,6,103 回

正多角形を描く:「直進して右へ曲がる」を辺の数だけくり返すと1周(360度)。正五角形なら1回に 360 ÷ 5 = 72 度。

素数の判定:2から順に割ってみる

div ← 2
if (num が 2 より小さい)
return false
endif
while (num が div より大きい)
if (num ÷ div の余り が 0 と等しい)
return false
endif
div ← div + 1
endwhile
return true

1 は素数でない(2より小さい)。割る数 div は2から自分自身の手前まで。 num=9 なら div=2 は余り1、div=3 で余り0 → false。最後まで割り切れなければ true。

表を書いて追ってみよう

  • {2, 3, 1} をバブルソート(解説7の書き方)で並べる。n=1 の周が終わった直後の並びは?
  • 2分探索を使うための前提はどれ?
  • 2進数の文字列 "1010" を10進数にすると?
  • for (i を 1 から 9 まで 2 ずつ増やす) の中は何回実行される?

試験のポイント

ITパスポート試験での問われ方

フローチャートや擬似言語で書かれた手順をたどり、最後の値や出力を答える問題で問われる

間違えやすいポイント

  • アルゴリズムをプログラム言語そのものだと思う
  • 判断記号と処理記号を混同する

関連用語

アルゴリズム、フローチャート、順次、分岐、反復

図解の内容を文章で読む

アルゴリズムとフローチャートをイメージでつかむ

アルゴリズムは、目的を達成するための手順です。フローチャートは、その手順を箱や矢印で見える化した図です。ITパスポートでは、複雑な計算よりも、順番・分岐・繰り返しの読み取りが大切です。

たとえると:料理のレシピがアルゴリズム、レシピの流れを矢印で書いたものがフローチャートです。

アルゴリズムは、目的を達成するための手順を、誰がやっても同じ結果になるように決めたものです。特定のプログラミング言語のことではなく、レシピのような「手順そのもの」を指します。どんなに複雑な処理も、上から順に実行する「順次」、条件によって道を選ぶ「分岐」、同じ処理をくり返す「繰り返し」の3つの組合せで書けます。フローチャートはこの手順を図にしたもので、長方形=処理、ひし形=判断(分岐)、平行四辺形=入出力、と記号ごとに意味が決まっています。試験では、同じ手順が「擬似言語」という決まった書き方の文章でも出ます。「○整数型: 関数名(…)」は関数の始まり(○の後ろが返す値の型)、「←」は右の値を左の変数に入れる代入、「return」は値を返して関数を終える命令です。「if(条件)〜elseif〜else〜endif」は上から条件を調べて当てはまった1つだけを実行する分岐、「for(i を 1 から n まで 1 ずつ増やす)〜endfor」と「while(条件)〜endwhile」は間の行をくり返します。「÷ の商」は割り算の整数部分、「÷ の余り」は割り切れずに残った数で、「余りが0」は割り切れる(倍数である)という意味です。フローチャートでも擬似言語でも、1歩ずつたどって「最後に変数はいくつになるか」を答えるトレース問題が定番です。あせらず、値の変化をメモに書きながら追うのがコツです。

押さえどころ

  • アルゴリズム = 手順
  • フローチャート = 手順の図
  • 分岐と繰り返しを読む
  • 擬似言語:← は代入、if〜endif は分岐、for・while〜endfor・endwhile は繰り返し

確認問題(5問)

確認問題を読み込んでいます...

確認問題は本サービスのオリジナル問題です。ログインなしで解けます(結果は保存されません)。

「アルゴリズムとフローチャート」の過去問(14問)

IPAが公開しているITパスポート試験の公開問題から、このテーマの問題を集めました。

つながるテーマ

この解説をXでシェア

学習を記録して、合格まで続ける

教材と確認問題はこのページで全部無料で使えます。登録すると「アルゴリズムとフローチャート」の結果や習熟度が記録され、苦手分野の復習提案、試験日までの学習計画、合格準備度の見える化が使えます。最初の7日間は学習記録も無料です。