基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成29年 秋期 基本情報技術者 午後 問08
問08   必須問題

 次のプログラムの説明及びプログラムを読んで,設問1〜4に答えよ。

 

 文字列の誤りを検出するために,N 種類の文字に 0,1,…,N-1 の整数値を重複なく割り当て, 検査文字を生成するプログラムと,元となる文字列の末尾に検査文字を 追加した検査文字付文字列を検証するプログラムである。 ここで扱う 30 種類の文字,及び文字に割り当てた数値を,表1に示す。 空白文字は“␣”と表記する。

 

表1 文字,及び文字に割り当てた数値

 

〔プログラムの説明〕

 検査文字の生成と検査文字付文字列の検証の手順を示す。

 

(1) 検査文字の生成 @ 文字列の末尾の文字を1番目の文字とし,文字列の先頭に向かって奇数番目の文字に 割り当てた数値を 2 倍して N で割り,商と余りの和を求め,全て足し合わせる。

A 偶数番目の文字に割り当てた数値は,そのまま全て足し合わせる。

B @とAの結果を足し合わせる。

C N から,Bで求めた総和を N で割った余りを引く。さらにその結果を,N で割り, 余りを求める。求めた数値に対応する文字を検査文字とする。

(2) 検査文字付文字列の検証 @ 検査文字付文字列の末尾の文字を1番目の文字とし,文字列の先頭に向かって 偶数番目の文字に割り当てた数値を 2 倍して N で割り,商と余りの和を求め, 全て足し合わせる。

A 奇数番目の文字に割り当てた数値は,そのまま全て足し合わせる。

B @とAの結果を足し合わせる。

C Bで求めた総和が N で割り切れる場合は,検査文字付文字列に誤りがないと判定する。 N で割り切れない場合は,検査文字付文字列に誤りがあると判定する。

 

〔検査文字付文字列の生成例〕

 表1及び検査文字の生成の手順を用いることによって,文字列 ipa␣␣ に対し, 生成される検査文字は f である。

 検査文字付文字列は,文字列の末尾に検査文字を追加し,ipa␣␣f となる。

 

〔プログラムの仕様〕

 各関数の仕様を (1)〜(4) に示す。ここで,配列の添字は 1 から始まるものとする。

(1) 関数 calcCheckCharacter は,文字列及び文字列長を用いて生成した検査文字を返す。 関数 calcCheckCharacter の引数及び返却値の仕様は,表2のとおりである。

 

表2 関数 calcCheckCharacter の引数及び返却値の仕様
 引数/返却値   データ型  入力/出力        説明 
 input[]  文字型   入力  文字列が格納されている1次元配列 
 len  整数型  入力   文字列の文字列長( 1 以上) 
 返却値  文字型  出力   生成した検査文字を返す。 

 

 関数 calcCheckCharacter は,関数 getValue,関数 getChar を使用する。

(2) 関数 validateCheckCharacter は,検査文字付文字列を検証し,検証結果を返す。 関数 validateCheckCharacter の引数及び返却値の仕様は,表3のとおりである。

 

表3 関数 validateCheckCharacter の引数及び返却値の仕様
 引数/返却値   データ型  入力/出力       説明 
 input[]  文字型  入力 検査文字付文字列が格納されている1次
元配列  
 len  整数型  入力 検査文字付文字列の文字列長( 2 以上) 
 返却値  論理型  出力 検査文字付文字列に誤りがないと判定し
た場合は true,誤りがあると判定した場
合は false を返す。 

 

 関数 validateCheckCharacter は,関数 getValue を使用する。

(3) 関数 getValue は,表1に従い,引数として与えられた文字に割り当てた数値を返す。

(4) 関数 getChar は,表1に従い,引数として与えられた数値に対応する文字を返す。

 

設問1   プログラム中の に入れる正しい答えを,解答群の中から選べ。 ここで,a1 と a2 に入れる答えは,a に関する解答群の中から組合せとして正しいものを選ぶものとする。

〔プログラム〕


 

a に関する解答群
     a1          a2    
 ア  false  false 
 イ  false  true 
 ウ  true  false 
 エ  true  true 

 

b に関する解答群 ア N − sum % N       イ sum % N

ウ (N − sum % N ) % N       エ (sum − N) % N

 

c に関する解答群 ア sum ÷ N = Ø       イ sum ÷ N ≠ Ø

ウ sum % N = Ø       エ sum % N ≠ Ø

 

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

基本情報技術者試験


設問2   次の記述中の に入れる正しい答えを,解答群の中から選べ。

 

 本プログラムでは,検査文字付文字列の誤りが1文字であれば,誤りを検出できる。 しかし,複数の文字に誤りがある場合には,誤りがないと判定されることがある。 例えば,関数 validateCheckCharacter で表4に示す検査文字付文字列を検証した場合, 誤りがないと判定されるケースは 。 ここで,文字列 ipa␣␣ に対し生成される検査文字は f である。

 

表4 検査文字付文字列
 ケース   検査文字付文字列 
   1  ipb␣␣f 
   2  api␣␣f 
   3  pia␣␣f 
   4  ␣␣apif 

 

d に関する解答群 ア 1 と 2 と 3 と 4 である      イ 2 である        ウ 2 と 3 である

エ 2 と 3 と 4 である        オ 2 と 4 である      カ ない

 

解答 d ←クリックすると正解が表示されます

基本情報技術者試験


設問3   次の記述中の に入れる正しい答えを,解答群の中から選べ。

 

 本プログラムを文字列長が同じである複数の文字列に対して適用することを考える(図1参照)。

 

図1 作成中の検査文字付表

 

〔考え方〕

 文字列長が n である m 個の文字列について考える。文字列に対して, ( m + 1 )行( n + 1 )列の表を用意する。以後,この表を検査文字付表という。

(1) 検査文字の生成

 例えば,文字列長が 5 である 4 個の文字列 ipa␣␣,tests,make␣,it.␣␣ を, 図1の大枠内のように,各文字列の先頭の位置を最左列に揃え,各文字列を 上の行から順に格納して,表を作成する。この表の太枠内の各行各列を それぞれ文字列とみなして検査文字を生成し,最右列と最下行に格納する。

 この手順で作成した検査文字付表を図2に示す。作成した検査文字付表の 5 行 5 列目(網掛け部分)の検査文字は である。

 

図2 完成した検査文字付表

 

(2) 検査文字付表の検証

 (1)で作成した検査文字付表の,最下行を除く各行と最右列を除く各列を 文字列とみなし,それぞれ関数 validateCheckCharacter で検証した結果, 全て誤りがないと判定された場合には,検査文字付表に誤りがないと判定する。 一つでも誤りがあると判定された場合は,検査文字付表に誤りがあると判定する。

 

e に関する解答群 ア j      イ k      ウ l      エ m

 

解答 e ←クリックすると正解が表示されます

基本情報技術者試験


設問4   次の記述中の に入れる正しい答えを,解答群の中から選べ。

 

 図2の1行目の検査文字付文字列を取り除いた,図3の検査文字付表について考える。 表4のケース1〜4の検査文字付文字列を順に,図3の1行目に格納して検証した場合, 検査文字付表に誤りがないと判定されるケースは

 

図3 1行目を取り除いた検査文字付表

 

f に関する解答群 ア 1 と 2 と 3 と 4 である     イ 2 である       ウ 2 と 3 である

エ 2 と 3 と 4 である       オ 2 と 4 である     カ ない

 

解答 f ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]