問題 #20 ・ 配列 ・ 難易度 3
次のプログラムは、要素数 N の配列 buf を用いたリングバッファを実装したものである。enqueue はリングバッファの末尾に値を追加し、dequeue は先頭から値を取り出して返す。変数 head は取り出し位置、tail は次に格納する位置、count は現在の要素数を表す。プログラム中の〔 a 〕と〔 b 〕に入れる字句の正しい組合せを、選択肢の中から選べ。 ここで、配列の要素番号は 1 から始まる。
大域: 整数型: N ← 5大域: 整数型の配列: buf /* 要素数 N の配列 */大域: 整数型: head ← 1大域: 整数型: tail ← 1大域: 整数型: count ← 0○enqueue(整数型: val)if (count < N)buf[tail] ← valtail ← 〔 a 〕count ← count + 1endif○整数型: dequeue()整数型: valif (count > 0)val ← buf[head]head ← 〔 b 〕count ← count - 1return valendifreturn -1
リングバッファでは、要素番号を 1〜N の範囲で循環させる必要がある。要素番号が 1 始まりの場合、現在の位置 p の次の位置は「p mod N + 1」で求まる。 【式の仕組み】 ・p mod N は、p が 1〜N-1 のとき p そのまま、p が N のとき 0 を返す。 ・これに 1 を足すと、p が 1〜N-1 のとき p+1、p が N のとき 1 となり、正しく循環する。 【トレース例(N=5)】 初期状態: head=1, tail=1, count=0 enqueue(10): buf[1]←10, tail← 1 mod 5 + 1 = 2, count=1 enqueue(20): buf[2]←20, tail← 2 mod 5 + 1 = 3, count=2 enqueue(30): buf[3]←30, tail← 3 mod 5 + 1 = 4, count=3 dequeue(): val←buf[1]=10, head← 1 mod 5 + 1 = 2, count=2, 返却値 10 dequeue(): val←buf[2]=20, head← 2 mod 5 + 1 = 3, count=1, 返却値 20 enqueue(40): buf[4]←40, tail← 4 mod 5 + 1 = 5, count=2 enqueue(50): buf[5]←50, tail← 5 mod 5 + 1 = 1, count=3 ← 末尾から先頭へ循環 dequeue(): val←buf[3]=30, head← 3 mod 5 + 1 = 4, count=2, 返却値 30 以上のとおり、head と tail が配列の末尾(要素番号 N)を超えると先頭(要素番号 1)に戻ることが確認できる。
登録すると解いた結果が残り、間違えた問題は日をおいて復習に出ます。
この問題は AI が作り、別の AI に解かせて検証し、人が確認したうえで公開しています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。
記号の意味に迷ったら擬似言語の記法で確かめられます。