アルゴリズムとフローチャートとは?わかりやすく解説
問題を解く手順と、その流れを図で表す方法を学びます。
最初に考えてみよう
人間なら「いい感じにやって」で通じることがあります。でもコンピュータは、何を・どの順番で・どんな条件で行うかを決めないと動けません。どうすれば、迷わず正しく動ける手順を伝えられるのでしょうか?
解説
まず、あなたがコンピュータになって実行
お題は「1 から 3 までを足す」。黄色い●が「いま実行している場所」です。 ●が止まったら、コンピュータならどうするかを選んでください。 右の変数の箱も手がかりになります。
答え合わせ:コンピュータの正しい流れ
いま実行した図を、コンピュータが1ステップずつ実行します。 再生すると●が矢印の上を進み、条件の答えで道が変わり、 くり返しでは条件へ戻ります。上限を 5 にして、くり返しが増える様子も見てみよう。
いま動かした図に、3つの基本構造がそろっている
- 順次図の 「合計 ← 0」→「i ← 1」
上から順に、1つずつ実行する
- 選択(分岐)図の ひし形「i ≦ 5 ?」
はい/いいえ で進む道が変わる
- 繰り返し図の 「↺ 条件へ戻る」矢印
条件が「はい」の間、同じ処理をくり返す
試験の書き方:「←」は「右の値を左の箱に入れる」
- 合計の箱を0にする
合計 ← 0- 合計に今の数字 i を足す
合計 ← 合計 + i- i を1増やす
i ← i + 1
同じ手順を、試験の擬似言語で読む
試験では、フローチャートと同じ手順が擬似言語という決まった書き方の文章でも出ます。 さっきの「足し算」を、上限を n にして書き直しました。同じ番号どうしが同じ処理です。
①○整数型: sum(整数型: n)関数の始まり整数型: 合計, i使う変数②合計 ← 0③i ← 1④while (i ≦ n)⑤合計 ← 合計 + i⑥i ← i + 1endwhile④へ戻る⑦return 合計値を返して終わる
- ○整数型: sum(…)
- 関数の始まり。○の後ろの型(整数型)は、返す値の種類
- while 〜 endwhile
- 条件が成り立つ間、間の行をくり返す。endwhile まで来たら条件へ戻る
- return 合計
- 合計の値を呼び出し元へ返し、関数を終える。sum(5) なら 15 が返る
擬似言語の書き方:for・if・商と余り
for で書くと、③④⑥ が1行にまとまる
合計 ← 0③④⑥for (i を 1 から n まで 1 ずつ増やす)⑤合計 ← 合計 + iendfor⑦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 です。
文字列型: 結果 ← ""空の文字列for (i を 1 から 要素数 まで 1 ずつ増やす)if (点数[i] が 5 以上)結果 の末尾 に "○" を追加するelse結果 の末尾 に "×" を追加するendifendfor
| i | 点数[i] | 追加 | 結果 |
|---|---|---|---|
| 1 | 7 | ○ | "○" |
| 2 | 3 | × | "○×" |
| 3 | 9 | ○ | "○×○" |
| 4 | 4 | × | "○×○×" |
「末尾に追加」は右端に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] の値を入れ替えるendifendforendfor
はじめの並び。隣どうし(m と m+1)を左から比べます
バブルソートは1周(n)ごとに一番大きい値が右端へ運ばれ、確定します。だから次の周は比べる範囲が1つ短くなる(m は 要素数−n まで)。
探索:線形探索と2分探索
配列から目的の値を探す方法は2つ。探す値を選ぶと、調べた順番が箱に出ます。
線形探索比べた回数 7 回
2分探索比べた回数 3 回
| 線形探索 | 2分探索 | |
|---|---|---|
| 探し方 | 先頭の要素から順に | 中央と比べ、範囲を半分に絞る |
| 前提 | 並びは何でもよい | 昇順か降順に整列済み |
| 計算量 | 要素数に比例(2倍なら約2倍) | 要素数が2倍でも1回増えるだけ |
ふつうは2分探索のほうが少なく済みますが、いつもではありません。3 を探すと、線形探索は1回、2分探索は3回です。
よく出る型①:数の扱い
2進数の文字列 → 10進数
末尾から i 番目の桁に、2 の(i − 1)乗を掛けて足していく。末尾(i=1)の重みは 2⁰=1。
| 末尾から i | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| 桁の数字 | 1 | 0 | 1 | 1 |
| 2の(i−1)乗 | 1 | 2 | 4 | 8 |
"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 ← 2if (num が 2 より小さい)return falseendifwhile (num が div より大きい)if (num ÷ div の余り が 0 と等しい)return falseendifdiv ← div + 1endwhilereturn 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パスポート試験の公開問題から、このテーマの問題を集めました。
つながるテーマ
学習を記録して、合格まで続ける
教材と確認問題はこのページで全部無料で使えます。登録すると「アルゴリズムとフローチャート」の結果や習熟度が記録され、苦手分野の復習提案、試験日までの学習計画、合格準備度の見える化が使えます。最初の7日間は学習記録も無料です。