総視聴再生時間43万分以上(2017年5月13日現在)の動画で基本情報技術者試験の過去問&キーワード解説!スキマ時間に動画!〜これじょIT〜

PR広告

平成28年度秋 基本情報技術者試験午後 過去問8設問1 データ構造及びアルゴリズム 合格率アップ!動画付き解説!

次のプログラムの説明及び、プログラムを読んで、設問1~3に答えよ。

 事務計算においては、数値を見やすく表示(印字)するために、例えば3桁ごとに区切りの","を挿入するなどの編集処理がよく行われる。

 関数 Edit は、指定された編集パターンに従って、数値を編集するプログラムである。表1に、関数 Edit を用いた編集例を示す。例lでは、3桁ごとに区切りの","を挿入している。例2では、例1の編集に加え、上位の空いた桁を"*"で埋めている。例3では、数値の右端から2桁目と3桁目の間に"."を挿入している。

表1 関数Editを用いた編集例

編集パターン
例1 例2 例3
"_□□,□□□" "*□□,□□□" "_□□■.□□"
数値 123 "____123" "****123" "___1.23"
1234 "__1,234" "**1,234" "__12.34"
12345 "_12,345" "*12,345" "_123.45"

 ここで、編集パターン中の文字"□"及び"■"は、数字と対応付けされた制御文字を表している。また、"_"は空白文字を表している。

※実際の問題文は下カッコだが、この説明では_(アンサースコア)を利用しています。ご了承ください。

〔プログラムの説明〕

(1) 関数 Edit は、次の形式で呼び出され、二つの引数をもつ。

  関数:Edit(文字型: Pattern[]、文字型:Value[])

 Pattern[] には、編集パターンの文字列が格納されている。Value[] には、編集する数値を表す文字列が格納されている。各配列の添字は、0から始まる。文字列 Pattern[] のi番目の文字は Pattern[i-1] と表記する。文字列 Value[] についても同様である。

(2) Pattern[] は、1文字以上から成る文字列であって、表示可能な図形文字及び制御文字(""及び"")から構成される。

(3) Value[] は、数値を表す文字列であって、数字"0"~"9"の並びの後に、数値が正又は0なら"+"を、負なら"-"を付加した形式である。数字の個数は、Pattern[] 中の文字""及び""の個数と一致するように、必要であれば前方に"0"を付加する。例えば、Pattern[] の内容が""のとき、Value[] には、数値が123なら"00123+"、0なら"00000+"、-123なら"00123-"を指定する。

(4) 関数 Edit は、Value[] で与えられた数値を Pattern[] に従って編集し、編集結果で Pattern[] を置き換える。

〔編集方法〕

 Pattern[] 中の各文字について、先頭から順に1文字ずつ、次の①~③のいずれか一つの操作を実行していく。

① 関数 Edit が呼び出されたときの Pattern[] 中の先頭の文字(以下、fill文字という)で置き換える。

② Value[] 中の対応する桁の数字で置き換える。

③ 置き換えないで、そのまま残す。

(5) 論理型変数 signif は、on 又は off の値を取る。この変数の実行開始時の値は off であり、Value[] 中に最上位から"0"が連続した後に"0"でない数字が見つかると on になる、などの使い方をする。

(6) 関数 Edit が呼び出されるとき、各引数には正しい値が設定されているものとする。

[プログラム]

○関数:Edit(文字型: Pattern[], 文字型: Value[])

○文字型: fill

○論理型: signif

○整数型: p, v

・fill ← Pattern[0]

・signif ← off

・v ← 0

■ p: 0, p < Length(Pattern[]), 1 /* Length()は引数の文字列長を返す */

|▲ Pattern[p] = "□" or Pattern[p] = "■" /* 表2のケース1〜7の処理 */

||/* 現在の変数・配列要素の内容が。表2のケース1〜7の

|| * どれに該当するかを決定し、そのケースに従って

|| * Pattern[p]とsignifの更新処理を行う。*/

||・v ← v + 1

||ー /* 表2のケース8,9の処理 */

||▲signif = off

|||・Pattern[p] ← fill

||▼

|▼

表2 現在の変数・配列要素の内容に応じた行進処理

平成28年度秋 基本情報技術者試験午後問8 データ構造及びアルゴリズム

注記 網掛け部分は、内容を判定しない。

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

 引数 Pattern[] 及び Value[] に幾つかのデータを与えて、関数 Edit を実行した結果を、表3に示す。

表3 関数Editの実行結果

実行前の内容 実行後の内容
Pattern[] Value[] Pattern[]
"__□□,□□□" "01234+" "___1,234"
"*□□,□□□#" "00000+" a
"*□□□.□□#" "00012-" b
"*□□■.□□#" "00012+" c

a に関する解答群

  • ア:"*******#"
  • イ:"********"
  • ウ:"******0#"
  • エ:"******0*"

b、c に関する解答群

  • ア:"*****12#"
  • イ:"*****12*"
  • ウ:"****.12#"
  • エ:"****.12*"
  • オ:"***0.12#"
  • カ:"***0.12*"

解説 設問1

aの正解は「イ:"********"」です!

Pattern[] = "*□□,□□□#"

Value[] = "00000+"

fill ← * // Pattern[0] = *

singnif ← off

v ← 0

p:0, p < Length(Pattern[]), 1 のループ

0 〜 7まで1を加算してループ

ループ1回目

Pattern[0] = "*"なので

Pattern[0] = "□" or Pattern[0] = "■"はスキップ

signif = offなので

Pattern[0] ← * // Pattern[0] = *

ループ2回目

Pattern[1] = "□"なので表2の処理

Pattern[1] = "□"

signif = off

Value[0] = "0"

なので更新処理後は

Pattern[1] ← * // fill文字が入る

singifはoff

v = 1 // v = 0 + 1

ループ3回目

Pattern[2] = "□"なので表2の処理

Pattern[2] = "□"

signif = off

Value[1] = "0"

なので更新処理後は

Pattern[2] ← * // fill文字が入る

singifはoff

v = 2 // v = 1 + 1

ループ4回目

Pattern[3] = ","なので表2の処理をスキップ

signif = offなので更新処理後は

Pattern[3] ← * // fill文字が入る

ループ5回目

Pattern[4] = "□"なので表2の処理

Pattern[4] = "□"

signif = off

Value[2] = "0"

なので更新処理後は

Pattern[4] ← * // fill文字が入る

singifはoff

v = 3 // v = 2 + 1

ループ6回目

Pattern[5] = "□"なので表2の処理

Pattern[5] = "□"

signif = off

Value[3] = "0"

なので更新処理後は

Pattern[5] ← * // fill文字が入る

singifはoff

v = 4 // v = 3 + 1

ループ7回目

Pattern[6] = "□"なので表2の処理

Pattern[6] = "□"

signif = off

Value[4] = "0"

なので更新処理後は

Pattern[6] ← * // fill文字が入る

singifはoff

v = 5 // v = 4 + 1

ループ8回目

Pattern[7] = "#"なので表2の処理をスキップ

signif = offなので更新処理後は

Pattern[7] ← * // fill文字が入る

従って、aの正解は「イ:"********"」です!


bの正解は「ア:"*****12#"」です!

Pattern[] = "*□□□.□□#"

Value[] = "00012-"

fill ← * // Pattern[0] = *

singnif ← off

v ← 0

p:0, p < Length(Pattern[]), 1 のループ

0 〜 7まで1を加算してループ

ループ1回目

Pattern[0] = "*"なので

Pattern[0] = "□" or Pattern[0] = "■"はスキップ

signif = offなので

Pattern[0] ← * // Pattern[0] = *

ループ2回目

Pattern[1] = "□"なので表2の処理

Pattern[1] = "□"

signif = off

Value[0] = "0"

v = 1 // v = 0 + 1

なので更新処理後は

Pattern[1] ← * // fill文字が入る

singifはoff

ループ3回目

Pattern[2] = "□"なので表2の処理

Pattern[2] = "□"

signif = off

Value[1] = "0"

v = 2 // v = 1 + 1

なので更新処理後は

Pattern[2] ← * // fill文字が入る

singifはoff

ループ4回目

Pattern[3] = "□"なので表2の処理

Pattern[3] = "□"

signif = off

Value[2] = "0"

v = 3 // v = 2 + 1

なので更新処理後は

Pattern[3] ← * // fill文字が入る

singifはoff

ループ5回目

Pattern[4] = "."なので表2の処理をスキップ

singif = offなので更新処理後は

Pattern[4] ← * // fill文字が入る

singifはoff

ループ6回目

Pattern[5] = "□"なので表2の処理

Pattern[5] = "□"

signif = off

Value[3] = "1"

Value[4] = "2"

なので更新処理後は

Pattern[5] ← 1 // Value[3] = 1

singifはon

v = 4 // v = 3 + 1

ループ7回目

Pattern[6] = "□"なので表2の処理

Pattern[6] = "□"

signif = on

Value[4] = "2"

Value[5] = "-"

なので更新処理後は

Pattern[6] ← 2 // Value[4] = 2

singifはonのまま

ループ8回目

Pattern[7] = "#"なので表2の処理をスキップ

signif = onなので更新処理後は

Pattern[7] ← # // そのままの文字が入る

従って、bの正解は「ア:"*****12#"」です!


cの正解は「エ:"****.12*"」です!

Pattern[] = "*□□■.□□#"

Value[] = "00012+"

fill ← * // Pattern[0] = *

singnif ← off

v ← 0

p:0, p < Length(Pattern[]), 1 のループ

0 〜 7まで1を加算してループ

ループ1回目

Pattern[0] = "*"なので

Pattern[0] = "□" or Pattern[0] = "■"はスキップ

signif = offなので

Pattern[0] ← * // Pattern[0] = *

ループ2回目

Pattern[1] = "□"なので表2の処理

Pattern[1] = "□"

signif = off

Value[0] = "0"

v = 1 // v = 0 + 1

なので更新処理後は

Pattern[1] ← * // fill文字が入る

singifはoff

ループ3回目

Pattern[2] = "□"なので表2の処理

Pattern[2] = "□"

signif = off

Value[1] = "0"

v = 2 // v = 1 + 1

なので更新処理後は

Pattern[2] ← * // fill文字が入る

singifはoff

ループ4回目

Pattern[3] = "■"なので表2の処理

Pattern[3] = "■"

signif = off

Value[2] = "0"

v = 3 // v = 2 + 1

なので更新処理後は

Pattern[3] ← * // fill文字が入る

singifはon

ループ5回目

Pattern[4] = "."なので表2の処理をスキップ

singif = onなので更新処理後は

Pattern[4] ← "." // そのままの文字が入る

singifはon

ループ6回目

Pattern[5] = "□"なので表2の処理

Pattern[5] = "□"

signif = on

Value[3] = "1"

Value[4] = "2"

なので更新処理後は

Pattern[5] ← 1 // Value[3] = 1

singifはon

v = 4 // v = 3 + 1

ループ7回目

Pattern[6] = "□"なので表2の処理

Pattern[6] = "□"

signif = on

Value[4] = "2"

Value[5] = "+"

なので更新処理後は

Pattern[6] ← 2 // Value[4] = 2

singifはoff

ループ8回目

Pattern[7] = "#"なので表2の処理をスキップ

signif = offなので更新処理後は

Pattern[7] ← * // fill文字が入る

従って、cの正解は「エ:"****.12*"」です!

設問2

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

 プログラム中の破線で囲んだ部分の処理(表2のケース1~7の処理)を、詳細なプログラムとして記述すると、次のようになる。

[プログラム中の/* 現在の変数・配列要素の内容が... */部分の処理]

▲signif = off

|▲Pattern[p] = "□" and Value[v] = "0"

||/* 何もしない */

||ー

||▲Value[v + 1] ≠ "+"

|||・signif ← on

||▼

|▼

|▲d

||・Pattern[p] ← fill

||ー

||・Pattern[p] ← Value[v]

|ー

|▲e

||・signif ← off

|▼

|・Pattern[p] ← Value[v]

d、e に関する解答群

  • ア:"1" ≦ Value[v] and Value[v] ≦ "9"
  • イ:Value[v] = "0"
  • ウ:Value[v + 1] = "-"
  • エ:Value[v + 1] = "+"
  • オ:Value[v + 1] ≠ "-"
  • カ:Value[v + 1] ≠ "+"

解説 設問2

dの正解は「イ:Value[v] = "0"」です!

表2をみながら考えます。

表2 現在の変数・配列要素の内容に応じた行進処理

平成28年度秋 基本情報技術者試験午後問8 データ構造及びアルゴリズム

注記 網掛け部分は、内容を判定しない。

dの部分はPattern[p]にfillが入るか、Value[v]が入るかです。

表2を見ると、ケース1から7でfillになるのは、更新処理のPattern[p]がfill文字になるケースなので、ケース1, 2, 3です。

これらの現在の変数・配列要素の内容の共通点は

signifがoffであること

Value[v]が"0"であること

です。プログラムはsignif = offが前提なので、Value[v] = 0であれば、fillになります。

従って、dの正解は「イ:Value[v] = "0"」です!

eの正解は「エ:Value[v + 1] = "+"」です!

eはsignif = onである時に処理が実行されます。

eが該当する場合に、signifがoffとなることに注目します。

ケース1から7でsignifがonはケース6, 7です。

ケース6と7のうちsignifがoffとなるのは、現在の変数・配列要素の内容でValue[v + 1]が"+"となる場合です。

従って、eの正解は「エ:Value[v + 1] = "+"」です!

【参考】コメント入りのプログラム

▲signif = off
|▲Pattern[p] = "□" and Value[v] = "0"
||/* 何もしない */ // ケース1
||ー
||▲Value[v + 1] ≠ "+"
|||・signif ← on // ケース2, 4, 6の場合はsignif = onとなる
||▼
|▼
|▲d イ Value[v] = "0"
||・Pattern[p] ← fill // ケース1, 2, 3の場合はPattern[p] = fill文字となる
||ー
||・Pattern[p] ← Value[v]
|ー // 以下はsignif = on
|▲e エ Value[v + 1] = "+"
||・signif ← off // ケース7の場合はsignif = offとなる
|▼
|・Pattern[p] ← Value[v]
▼

設問3

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

 関数 Edit では、例えば、fill文字を"_"とする編集パターンを指定することによって、数値が正なら"__1,234_"、負なら"__1,234-"と編集することができる。表2のケース1~7のうち、数値が正なら数値の後に続く文字をfill文字で置き換えるために用意されたケースはfである。

f に関する解答群

  • ア:2、4及び7
  • イ:3、5及び7
  • ウ:4及び7
  • エ:5及び7

解説 設問3

正解は「エ:5及び7」です!

問題は「表2のケース1~7のうち、数値が正なら数値の後に続く文字をfill文字で置き換えるために用意されたケースはfである。」です。

「数値が正なら数値の後に続く文字をfill文字で置き換えるために用意されたケース」がポイントです。

後に続く文字をfill文字で置き換えるためには、signifがoffになる必要があります。

signifがoffになるのはケース1, 3, 5, 7です。

Value[v + 1]の処理がないが無いため、ケース1は数値が正ならという判断をしませんので除外されます。

数値が正ならということでいくつか数字が並んでいることが想定されるため、ケース3も除外されます。

従って、正解は「エ:5及び7」です

PR広告

フェイスブックコメント

平成28年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成28年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成28年度春 基本情報技術者試験 午後 テキスト・動画解説

平成28年度春 基本情報技術者試験 午前 テキスト・動画解説

平成27年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午前 テキスト・動画解説

平成26年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成26年度春 基本情報技術者試験 午前 テキスト・動画解説