基本情報技術者過去問題 平成29年秋期 午後問8 解説

引数を設定する

文字列「ipa␣␣」でトレースします。
表2の仕様に基づいて引数を作ります。

input
[1]
input
[2]
input
[3]
input
[4]
input
[5]
i p a

len = 5

calcCheckCharacter

・N ← 30
N に 30 をいれます。
これは表1の文字種が30種だからです。

・sum ← 0
sum に 0 をいれます。
これは初期化のためです。

・is_even ← false
is_even は現在検査している文字が、文字列の偶数番目かどうかを判定するための変数です。
1文字目は奇数番目の文字なのですから false で初期化します。

ループ

・i: len, i > 0, -1
ループは、文字列のお尻から順に、文字数回繰り返します。

・value ← getValue(input[i])
これは input[i] を引数として副プログラム「getValue」を走らせて、戻ってきた値を value に代入する、という意味です。
input[5] は文字「␣」なので表1から value には「0」が代入されます。

・is_even = 空欄a1
偶数ならそのまま足し合わせ、奇数なら2倍してうんぬんということなのですから、空欄a1 は true です。

is_even は false なので下の処理をします。

0を2倍してNで割ると
(0 × 2 ) ÷ 30 = 0 余り 0

sum は sum + 0 + 0 で 0 になりました。

・is_even ← not is_even
not is_even は is_even を逆にして上書きしろ、という意味です。
is_even が false だったら true に、true だったら false に書き換えます。

ループの2回目から5回目

ループして2回目、今度もvalue には「0」が代入されます

is_even は true なので上の処理をします。

sum は sum + 0 で 0 になりました。

is_even をfalseにします。

このようにして最後までループを繰り返すと以下のような結果になります。

␣ : (0 × 2 ) ÷ 30 = 0 余り 0
␣ : 0
a : (4 × 2 ) ÷ 30 = 0 余り 8
p : 19
i  : (12 × 2 ) ÷ 30 = 0 余り 24

sum は 51 になりました。

後処理

・check_value ← 空欄b
Nから、sum を N で割った余りを引き、さらにその結果を N で割り余りを求めたいのですから、空欄bはウです。

sum を N で割る。
51 ÷ 30 = 1 余り 21

N から余りを引く
30 - 21 = 9

さらに N で割り余りを求める。
9 ÷ 30 = 0 余り 9

よって check_value は 9 になります。

・return getChar(check_value)
これは check_value を引数として副プログラム「getChar」を走らせて、戻ってきた値を「返す」という意味です。
getChar に 9 をいれると「f」が戻ってきますので、「f」を返してプログラムは終了です。

validateCheckCharacter

文字列「ipa␣␣f」でトレースします。

N と sum は先ほどと同じです。

・is_odd ← true
is_oddは現在検査している文字が、文字列の奇数番目かどうかを判定するための変数です。
1文字目は奇数番目の文字なのですから true で初期化します。

・ret_value ← true
ret_value はリターンバリューの略で、このプログラムを実行したときの最終的な検査結果のことです。
初期値を true としています。

ループのアルゴリズムは先ほどとほとんど同じです。

・is_even = 空欄a2
奇数ならそのまま足し合わせ、偶数なら2倍してうんぬんということなのですから、空欄a2 は true です。

ループを繰り返すと以下のような結果になります。

f : 9
␣ : (0 × 2 ) ÷ 30 = 0 余り 0
␣ : 0
a : (4 × 2 ) ÷ 30 = 0 余り 8
p : 19
i  : (12 × 2 ) ÷ 30 = 0 余り 24

sum は 60 になりました。

・空欄c
sum が N で割り切れないとき、検査文字付文字列に誤りがあると判定したいのですから、 空欄cはエです。

60 ÷ 30 = 2 余り 0

余りが 0 なので ret_value は true のままです。

・return ret_value
true を返してプログラムは終了です。

設問2

「ipa␣␣f」を奇数番目の文字と偶数番目の文字に分け、アルファベット順に並べて直してみます。
奇数:␣ai
偶数:␣fp

ケース1
奇数:␣bi
偶数:␣fp

ケース2
奇数:␣ai
偶数:␣fp

ケース3
奇数:␣ap
偶数:␣fi

ケース4
奇数:␣ai
偶数:␣fp

ケース2と4は「ipa␣␣f」と同じなので誤りがないと判定されてしまいます。

空欄dはオです。

設問3

␣ : (0 × 2 ) ÷ 30 = 0 余り 0
␣ : 0
s : (22 × 2 ) ÷ 30 = 1 余り 14
␣ : 0

sum = 15

15 ÷ 30 = 0 余り 15
30 - 15 = 15
15 ÷ 30 = 0 余り 15

よって check_value は 15 になります。

getChar に 15 をいれると「l」が返ってきます。

空欄eはウです。

設問4

行(横軸)の検査文字は、設問2にあるように、ケース2と4で同一になってしまいますが、 列(縦軸)の検査文字は、すべての列で同一となるケースはありません。

空欄fはカです。


ホームに戻るボタン↓