テクノロジ系アルゴリズムとプログラミング出題頻度 ★★★

擬似言語の読み方

試験で使われる擬似言語の記法(代入・if・while・for・配列・関数)を、変数を「名前付きの箱」に見立てて図解。トレース表を書きながら1行ずつ読む手順がわかり、擬似言語で書かれたプログラムの実行結果を求める問題が解けるようになります。

この単元の用語:擬似言語 / 変数 / 代入 / 選択処理(if) / 前判定繰返し(while) / 後判定繰返し(do〜while) / for / 配列 / 関数 / トレース

試験にプログラムが出るって聞いて焦っています。プログラミングなんてやったことないです…。

大丈夫。試験で出るのは擬似言語という、日本語まじりの読みやすい書き方なんだ。書く必要はなくて、上から1行ずつ読んで、変数の値を追いかけることができれば解けるよ。

擬似言語とは

擬似言語 は、特定のプログラミング言語に依存せず、処理の手順(アルゴリズム)を表すための書き方です。IPAが記述形式を定めていて、試験問題ではその形式で書かれたプログラムが出題されます。

覚えるべき書き方はそれほど多くありません。主なものを表にまとめます。

記述形式意味
○手続名又は関数名手続・関数を宣言する
型名: 変数名変数を宣言する(例:整数型: x)
/* 注釈 */注釈(説明のメモ。処理には関係しない)
変数名 ← 式右の式の値を、左の変数に代入する
if (条件式) 〜 elseif 〜 else 〜 endif条件によって処理を選ぶ(選択処理)
while (条件式) 〜 endwhile条件を満たす間くり返す(前判定繰返し)
do 〜 while (条件式)1回実行してから条件を調べ、満たす間くり返す(後判定繰返し)
for (制御記述) 〜 endfor制御記述に従ってくり返す
return 式関数の結果として値を返す

演算子は、算数と同じ + − × ÷ のほか、%(割り算の余り)、比較の = ≠ < ≦ > ≧、論理演算の and・or・not が使われます。

変数と代入:名前付きの箱に入れる

変数 は、値を入れておく 名前付きの箱 です。整数型: x は「整数を入れる x という箱を用意する」という意味です。

← は 代入 で、「右側を計算して、その結果を左の箱に入れる」という意味です。

x ← x + 1 箱 x(実行前) 3 ① 右辺を計算 3 + 1 = 4 ② 箱 x に入れ直す 4 前の値 3 は消えて 4 に置きかわる(箱には1つの値しか入らない)
「x と x+1 が等しい」という意味ではない。右から左へ値が流れるイメージ

代入すると 前の値は上書きされて消える。2つの変数の値を入れかえる問題では、途中で値が消えないよう、別の変数に一時的に避難させる(または足し引きを工夫する)書き方が出てくる。

選択処理(if)

if (点数 ≧ 80)
  評価 ← "A"
elseif (点数 ≧ 60)
  評価 ← "B"
else
  評価 ← "C"
endif

上の条件から順に 調べ、最初に当てはまったところだけを実行して endif へ抜けます。点数が85なら最初の条件で “A” に決まり、2つ目の条件は調べません。

繰返し処理(while・do〜while・for)

while:前判定

while (条件式) は、先に条件を調べ、満たしている間だけ中の処理をくり返します。最初から条件を満たさなければ、1回も実行されません。

do 〜 while:後判定

do で始まる書き方は、先に1回処理してから 条件を調べます。そのため、最低1回は必ず実行 されます。

while(前判定) 条件? 満たす 処理 満たさない 0回のこともある do〜while(後判定) 処理 条件? 満たす 満たさない 必ず1回は実行
条件を調べるのが「処理の前」か「処理の後」かの違い

for:回数を決めてくり返す

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

i を 1、2、3、4、5 と変えながら中の処理を5回くり返します。「2 ずつ増やす」なら 1、3、5 の3回です。

書き方条件を調べるタイミング最低の実行回数向いている場面
while処理の前(前判定)0回終わる条件はわかるが、回数がわからない
do 〜 while処理の後(後判定)1回少なくとも1回は実行したい
for毎回、変数の値で判断0回くり返す回数が決まっている

配列:番号付きの箱の列

配列 は、同じ型の箱をまとめて番号を付けたものです。整数型の配列: a ← {7, 2, 9} なら、a[1]=7、a[2]=2、a[3]=9 です。

要素番号が 0から始まるか1から始まるか は、問題文に書かれる。「配列の要素番号は1から始まる」とあれば、先頭は a[1]。必ず確認しよう。

関数:処理をまとめて名前を付ける

よく使う処理は、関数 としてまとめて名前を付けられます。return で結果を呼び出し元に返します。

○整数型: 合計(整数型の配列: data)
  整数型: total ← 0
  整数型: i
  for (i を 1 から dataの要素数 まで 1 ずつ増やす)
    total ← total + data[i]
  endfor
  return total

合計({3, 5, 2}) と呼び出すと、data に {3, 5, 2} が渡され、3 + 5 + 2 = 10 が返ってきます。

トレース:表を書きながら読む

擬似言語の問題は、変数ごとに列を作った表(トレース表) を書きながら1行ずつ追うのが確実です。

整数型: n ← 13
整数型: k ← 0
while (n ≧ 4)
  n ← n − 4
  k ← k + 1
endwhile
判断時の nn ≧ 4 ?処理後の n処理後の k
13満たす91
9満たす52
5満たす13
1満たさない → 終了

結果は n = 1、k = 3。13 ÷ 4 の 商が k、余りが n になる処理です。

何をするプログラムなのか、最初からわかるようになりますか?

最初は無理にわからなくていいんだ。具体的な数字でトレースしてみると、あとから「あ、割り算をしているのか」と気づくことが多いよ。慣れるまでは表を書くのが一番の近道。

試験に出るポイント

  • ← は代入。右辺を計算してから左の変数に入れる。前の値は上書きされる
  • if 〜 elseif 〜 else 〜 endif は上から順に調べ、当てはまった1つだけ実行
  • while は前判定(0回もありうる)、do 〜 while は後判定(最低1回実行)
  • for は変数の最後の値まで実行するか(「まで」は含む)を確認
  • 配列の要素番号が 0始まりか1始まりか は問題文で確認
  • 迷ったら トレース表 を書いて1行ずつ追う

確認クイズ

選択肢をタップすると、すぐに正解と解説が表示されます。

Q1次のプログラムを実行した後の x と y の値はどれか。
整数型: x ← 3
整数型: y ← 5
x ← x + y
y ← x − y
x ← x − y

Q2次のプログラムを実行した後の s の値はどれか。
整数型: s ← 0
整数型: i
for (i を 1 から 10 まで 3 ずつ増やす)
  s ← s + i
endfor

Q3次のプログラムを実行した後の m の値はどれか。ここで、配列の要素番号は1から始まる。
整数型の配列: a ← {7, 2, 9, 4, 6}
整数型: m ← a[1]
整数型: i
for (i を 2 から aの要素数 まで 1 ずつ増やす)
  if (a[i] > m)
    m ← a[i]
  endif
endfor

Q4次のプログラム(while版)と、繰返し部分を do 〜 while (n < 10) に書きかえたプログラム(do版)がある。それぞれ実行した後の c の値の組合せはどれか。
整数型: n ← 10
整数型: c ← 0
while (n < 10)
  n ← n + 1
  c ← c + 1
endwhile