引数を設定する
文字列「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はカです。
ホームに戻るボタン↓