コンテンツにスキップ

アルゴリズムの表現方法

アルゴリズムを思いついたら、それを他の人やコンピュータに正確に伝える必要があります。頭の中にあるだけでは、チームで共有することも、プログラムとして実装することもできません。ここでは、アルゴリズムを「目に見える形」にするための代表的な表現方法を学びます。

流れ図(フローチャート)は、処理の流れを図形と矢印で表現する方法です。視覚的にアルゴリズムの全体像を把握できるため、ITパスポート試験でもよく登場します。

流れ図で使う基本的な図形は次の4種類です。

図形名前意味使用例
楕円(角丸の長方形)端子処理の「開始」や「終了」「開始」「終了」
長方形処理計算や代入などの操作「合計 ← 合計 + 点数」
ひし形(菱形)判断条件によって分岐する「点数 ≧ 60?」
平行四辺形入出力データの読み込みや表示「点数を入力」「結果を表示」

これらの図形を矢印(→)でつなぐことで、処理が進む順番を表します。

流れ図の基本図形と簡単な例 — 端子・処理・判断・入出力の4つの基本図形と、点数判定の流れ図例

試験で出るポイント

流れ図の問題では、各図形の意味を正確に覚えておくことが前提になります。とくに「ひし形=判断(条件分岐)」「平行四辺形=入出力」を混同しないようにしましょう。

アルゴリズムの3つの基本構造と表現方法

Section titled “アルゴリズムの3つの基本構造と表現方法”

流れ図でも擬似言語でも、アルゴリズムは順次・選択・繰返しの3つの基本構造の組み合わせで表現されます。各構造の詳しい意味や具体例はアルゴリズムの基本構造で解説しています。ここでは、これらの構造を流れ図や擬似言語でどのように書き表すかに注目していきましょう。

擬似言語は、プログラミング言語に似た書き方でアルゴリズムを記述する方法です。流れ図が「図」で表現するのに対し、擬似言語は「文字」で表現します。ITパスポート試験では、擬似言語で書かれたプログラムを読み取る問題が毎年出題されます。

とは、値や変数を演算子で組み合わせたもので、計算の内容を表します。

合計 + 点数 ← 算術演算の式
点数 ≧ 60 ← 条件式

演算子には主に次の種類があります。

種類演算子の例意味
算術演算子+-×÷mod(余り)数値の計算
比較演算子大小や等しさの比較
論理演算子andornot条件の組み合わせ

値同士を比較して「正しい(真)」か「正しくない(偽)」かを判定する式を条件式と呼びます。選択や繰返しの判断条件として使われます。

代入とは、変数に値を格納する操作です。擬似言語では矢印()を使って表します。

合計 ← 0 … 変数「合計」に 0 を入れる
合計 ← 合計 + 点数 … 合計に点数を足した結果を、改めて合計に入れる

代入では、右辺を先に計算し、その結果を左辺の変数に格納します。数学の「=」とは意味が異なる点に注意してください。

試験で出るポイント

擬似言語の問題で最も多いミスは、代入の左辺と右辺を逆に読んでしまうことです。「← の右側が計算、左側が格納先」と覚えましょう。

注釈(コメント)は、プログラムの動作には影響しない補足説明のことです。「この処理は何をしているのか」「なぜこの計算が必要なのか」といったメモを残すために使います。擬似言語では /**/ で囲んで記述します。

/* ここで合計を初期化する */
合計 ← 0

注釈はアルゴリズムの意図を伝えるために書かれるもので、コンピュータはこの部分を無視します。チーム開発や後から見返すときに、プログラムの意図を理解しやすくする重要な役割があります。

入出力とは、外部からデータを受け取ったり(入力)、結果を外部に出したり(出力)する操作です。たとえば、キーボードから数値を読み込む操作が「入力」、計算結果を画面に表示する操作が「出力」にあたります。流れ図では平行四辺形の記号で表します。

点数を入力する … キーボードなどからデータを受け取る
合計を表示する … 画面などに結果を出す

擬似言語では、選択と繰返しを次のように記述します。

選択(if-else)の例:

もし 点数 ≧ 60 ならば
結果 ← "合格"
そうでなければ
結果 ← "不合格"

繰返し(for)の例:

i を 1 から 5 まで 1 ずつ増やす
合計 ← 合計 + i

この例では、i が 1, 2, 3, 4, 5 と変化しながら、合計に i を足す処理を5回繰り返します。

繰返し(while)の例:

合計 < 100 の間
合計 ← 合計 + 10

この例では、合計が100未満である限り、10を足し続けます。

試験で出るポイント

while の終了条件を誤読するミスが頻出です。「〜の間繰り返す」は「条件がの間は続ける」という意味です。条件が偽になったときにループを抜けます。

手続(プロシージャ)とは、一連の処理をひとまとめにして名前を付けたものです。何度も使う処理を手続として定義しておけば、必要なときに呼び出すだけで同じ処理を実行できます。

関数は手続と同様に処理をまとめたものですが、処理の結果として値を返す点が異なります。この返される値を戻り値と呼びます。

引数(ひきすう)とは、手続や関数を呼び出すときに渡す入力データのことです。戻り値とは、関数が処理の結果として返すデータのことです。

具体例で見てみましょう。「1 から指定した数までの合計を求める関数」を考えます。

○整数型: sigma(整数型: max)
整数型: 合計 ← 0
i を 1 から max まで 1 ずつ増やす
合計 ← 合計 + i
return 合計

この関数 sigma では次のようになっています。

要素この例での内容
関数名sigma
引数max(合計を求める範囲の上限)
戻り値合計(1 から max までの総和)

たとえば sigma(5) と呼び出すと、引数 max に 5 が入り、1+2+3+4+5 = 15 が戻り値として返されます。

手続と関数の違いは、関数は戻り値を持つのに対し、手続は戻り値を持たない(処理を実行するだけ)という点です。

試験で出るポイント

「引数=関数に渡す値」「戻り値=関数から返ってくる値」の区別は正確に押さえましょう。試験では擬似言語のコードを読み、引数にどの値が入るかを追いかける問題が出ます。

変数に格納できるデータの種類をデータ型と呼びます。擬似言語では、変数を使うときにデータ型を指定します。

データ型格納できるデータ具体例
整数型小数点のない数値1、-5、100
実数型小数点を含む数値3.14、-0.5、2.0
論理型真(true)か偽(false)true、false
文字型文字や文字列”合格”、“A”

データ型を正しく使い分けることで、プログラムが意図しない動作をすることを防げます。たとえば、試験の点数は小数を使わないので整数型、円周率のような値には実数型、合否の判定には論理型が適しています。

複数のデータをまとめて扱いたいとき、配列を使います。配列は、同じデータ型の値を一列に並べて管理する仕組みです。

配列の各データには要素番号(添字、インデックス)が割り振られており、番号を指定して個々のデータにアクセスします。

点数[1] ← 80
点数[2] ← 65
点数[3] ← 90

この例では、配列「点数」の1番目に80、2番目に65、3番目に90を格納しています。

配列のイメージ図 — 配列の要素番号と値の関係を視覚的に理解する

試験で出るポイント

擬似言語の問題では、配列の要素番号が「1から始まる」のか「0から始まる」のかに注意が必要です。問題文の定義をよく確認しましょう。番号の読み違いは計算結果のずれにつながります。

アルゴリズムのトレース(逐次実行)とは、アルゴリズムを1ステップずつ手動で追いかけ、各変数の値がどのように変化するかを確認する作業です。試験では、流れ図や擬似言語を見てトレースし、最終的な変数の値や出力結果を答える問題が出題されます。

トレースの手順は次のとおりです。

  1. 変数の初期値を書き出す
  2. 処理を上から順に1行ずつ実行し、変数の値を更新する
  3. 条件分岐では、条件式を評価して進む方向を決める
  4. 繰返しでは、ループ変数の変化に注目しながら、ループを抜ける条件を確認する
  5. 最終的な変数の値や出力を確認する

実際にトレースの練習をしてみましょう。次の擬似言語を追いかけます。

整数型: 合計 ← 0
i を 1 から 3 まで 1 ずつ増やす
合計 ← 合計 + i × i
ステップi の値i × i合計の値
初期状態0
1回目110 + 1 = 1
2回目241 + 4 = 5
3回目395 + 9 = 14

このように、1ステップずつ丁寧に追いかけることで、最終的に合計が14になることが分かります。

試験で出るポイント

トレース問題は毎年出題される頻出テーマです。焦らず1行ずつ追いかけることが正答への近道です。とくに繰返しでは「ループ変数の初期値・終了値・増分」を最初に確認し、何回ループするかを把握してから追いかけると間違いが減ります。

流れ図と擬似言語は、表現方法が異なるだけで、同じアルゴリズムを表しています。試験ではどちらの形式でも出題されるため、両方を読めるようにしておくことが大切です。

要素流れ図での表現擬似言語での表現
処理の開始・終了楕円(端子)─(明示しないことが多い)
計算・代入長方形変数 ← 式
条件分岐ひし形(判断)もし 条件式 ならば
繰返しひし形 + 矢印の戻りfor / while
入出力平行四辺形入力する / 表示する

流れ図は全体の処理の流れを視覚的に把握しやすく、擬似言語は細かい処理の内容を正確に記述できるという特徴があります。どちらも試験対策として読み慣れておきましょう。

試験で出るポイント

擬似言語の穴埋め問題が最も頻出です。for/while ループの中で「更新される変数はどれか」「条件式に入る正しい式はどれか」を問う形が典型的です。選択肢を見比べるときは、まず具体的な数値で1〜2回トレースしてみると正解を見つけやすくなります。


過去問に挑戦

Q. 関数checkDigitは,10進9桁の整数の各桁の数字が上位の桁から順に格納された整数型の配列originalDigitを引数として,次の手順で計算したチェックデジットを戻り値とする。プログラム中の a に入れる字句として,適切なものはどれか。ここで,配列の要素番号は1から始まる。

〔手順〕

(1)配列originalDigitの要素番号1〜9の要素の値を合計する。

(2)合計した値が9より大きい場合は,合計した値を10進の整数で表現したときの各桁の数字を合計する。この操作を,合計した値が9以下になるまで繰り返す。

(3)(2)で得られた値をチェックデジットとする。

〔プログラム〕

〇整数型:checkDigit(整数型の配列: originalDigit)
 整数型:i, j, k
 j ← 0
 for(i を 1 から originalDigit の要素数まで 1 ずつ増やす)
  j ← j + originalDigit[i]
 endfor
 while(jが 9 より大きい)
  k ← j ÷ 10 の商
  /* 10進9桁の数の場合,jが2桁を超えることはない */
  [ a ]
 endwhile
 return j
  • ア j ← j - 10 × k
  • イ j ← k +(j - 10 × k)
  • ウ j ← k +(j - 10)× k
  • エ j ← k + j
解答(令和4年)

正解: イ

Q. 関数calcXと関数calcYは,引数inDataを用いて計算を行い,その結果を戻り値とする。関数calcXをcalcX(1)として呼び出すと,関数calcXの変数numの値が,1 → 3 → 7 → 13 と変化し,戻り値は13となった。関数calcYをcalcY(1)として呼び出すと,関数calcYの変数numの値が,1 → 5 → 13 → 25 と変化し,戻り値は25となった。プログラム中のa, bに入れる字句の適切な組合せはどれか。

〔プログラム 1〕

〇整数型: calcX(整数型: inData)

 整数型: num, i

 num ← inData

 for(i を 1 から 3 まで 1 ずつ増やす)

  num ←[ a ]

 endfor

 return num

〔プログラム 2〕

〇整数型: calcY(整数型: inData)

 整数型: num, i

 num ← inData

 for([ b ])

  num ←[ a ]

 endfor

 return num

ab
2 × num + ii を 1 から 7 まで 3 ずつ増やす
2 × num + ii を 2 から 6 まで 2 ずつ増やす
num + 2 × ii を 1 から 7 まで 3 ずつ増やす
num + 2 × ii を 2 から 6 まで 2 ずつ増やす
  • ア 2 × num + i / i を 1 から 7 まで 3 ずつ増やす
  • イ 2 × num + i / i を 2 から 6 まで 2 ずつ増やす
  • ウ num + 2 × i / i を 1 から 7 まで 3 ずつ増やす
  • エ num + 2 × i / i を 2 から 6 まで 2 ずつ増やす
解答(令和4年)

正解: エ

Q. 関数 sigma は,正の整数を引数 max で受け取り,1から max までの整数の総和を戻り値とする。プログラム中の a に入れる字句として,適切なものはどれか。

〔プログラム〕

○整数型: sigma ( 整数型: max )
 整数型: calcX ← 0
 整数型: n
 for ( nを1から max まで1ずつ増やす )
  [ a ]
 endfor
 return calcX
  • ア calcX ← calcX × n
  • イ calcX ← calcX + 1
  • ウ calcX ← calcX + n
  • エ calcX ← n
解答(令和5年)

正解: ウ

Q. 関数 convert は,整数型の配列を一定のルールで文字列に変換するプログラムである。関数 convert を convert(arrayInput) として呼び出したときの戻り値が「AABAB」になる引数 arrayInput の値はどれか。ここで,arrayInput の要素数は1以上とし,配列の要素番号は1から始まる。

〔プログラム〕

○文字列型: convert (整数型の配列: arraiInput)
 文字列型: stringOutput ← "" // 空文字列を格納
 整数型: i
 for( i を 1 から arrayInput の要素数まで 1 ずつ増やす)
  if( arrayInput[i] が 1 と等しい )
   stringOutput の末尾に "A"を追加する
  else
   stringOutput の末尾に "B"を追加する
  endif
 endfor
 return stringOutput
  • ア {0,0,1,2,1}
  • イ {0,1,2,1,1}
  • ウ {1,0,1,2,0}
  • エ {1,1,2,1,0}
解答(令和6年)

正解: エ

Q. 関数 binaryToInteger は,1桁以上の符号なし2進数を文字列で表した値を引数 binaryStr で受け取り,その値を整数に変換した結果を戻り値とする。例えば,引数として「100」を受け取ると,4を返す。プログラム中の a,b に入れる字句の適切な組合せはどれか。

〔プログラム〕

○整数型: binaryToInteger(文字列型: binaryStr)
 整数型: integerNum, digitNum, exponent, i
 integerNum ← 0
 for( i を 1 から binaryStr の文字数まで 1 ずつ増やす)
  digitNum ← binaryStr の末尾からi番目の文字を整数型に変換した値
  // 例: 文字 '1' であれば整数値 1 に変換
  exponent ← [ a ]
  integerNum ← [ b ]
 endfor
 return integerNum
ab
(2の i 乗) - 1integerNum × digitNum × exponent
(2の i 乗) - 1integerNum + digitNum × exponent
2の (i - 1) 乗integerNum × digitNum × exponent
2の (i - 1) 乗integerNum + digitNum × exponent
  • ア (2の i 乗) - 1 / integerNum × digitNum × exponent
  • イ (2の i 乗) - 1 / integerNum + digitNum × exponent
  • ウ 2の (i - 1) 乗 / integerNum × digitNum × exponent
  • エ 2の (i - 1) 乗 / integerNum + digitNum × exponent
解答(令和6年)

正解: エ

もっと過去問を解きたい方へ

フライトパスアプリなら、詳しい解説や分野別の過去問演習、SRS(間隔反復)学習ができます。

アプリで効率的に学習しよう