全国5万人が受講している「サイタ」

基本情報技術者試験対策・合格講座

基本情報技術者試験対策・合格講座を選ぶ

初回60分無料体験OK

まずは60分の体験レッスンからスタート。
無料で実際のレッスンを体感できます。

月々4,900円〜の低料金

先生ひとりじめの個人レッスンを、この価格でご提供。レッスンは全てプライベート形式の60分間です。

通わない月は0円

曜日と時間を選べるので、
無理なくマイペースに通えます。

詳しくはこちら

パソコン教室・IT資格情報処理技術者試験対策講座基本情報技術者試験神奈川 基本情報技術者試験対策セミナー スクールブログ 2016年度秋...

2016年度秋期午後 問8(アルゴリズム問題)の解説

源田です。

前回に引き続き、この前の秋期試験の午後問題の解説を記載します。

今回は、午後問題の中で一番のポイントとなる問8(データ構造とアルゴリズム)の解説です。

□ 問8
【テーマ】

数字列変換のアルゴリズム

【プログラムの概要】

入力された数値を、指定された編集パターンに従って変換後、出力するプログラムです。

上記の変換を、関数Editの中で実行しています。

【関数Editの仕様】

Pattern[]の中身を、ケース1~9で示されたルールに沿って更新する関数です。

Pattern[]内の□と■の合計文字数は、Value[]内の数字の文字数と一致するようになっています。

これは、Pattern[p]の中身が□か■の場合だけValue[v]に入っている数字を確認する仕様との整合性のため。

Value[v]を確認した場合は、v を1加算します。


・ 内部変数signifの意味

原則、以下のいずれかが1度でも出現したかを示すものです。

 ・ Value[]中における'1'~'9'の数字
 ・ Pattern[]中における■

出現したらonにします。1度も現れていなければ、現れるまでoffのまま。初期状態はoffです。

signifがoff の時に、fill文字で置き換えます。この際、fill文字はPattern[0]の文字になります。

但し、Valueの最後の符号判定の時だけ以下の意味に変わります。

 - 数値が出力されないケース(符号の前が全て0の時)のときは、意味を持たない(これが、設問3に関わる)
 - 数値が出力されるケースのときは、以下の通り
  - off: 正を示す
  - on : 負を示す


【例】

Pattern[]="*□□■.□□$"、Value[]="01204+" の時

 fill文字: Pattern[0]である'*'となる。

 Pattern[0]:
  文字が'*'、signifがoffなので、ケース9に従い'*'にする
 Pattern[1]:
  文字が□、Value[0]が'0'、signifがoffなので、ケース1に従い'*'にする
 Pattern[2]:
  文字が□、Value[1]が'1'、Value[2]が'2'、signifがoffなので、ケース4に従い'1'にした上でsignifをonにする
 Pattern[3]:
  文字が■、Value[2]が'2'、Value[3]が'0'、signifがonなので、ケース6に従い'*'にする'2' にする
 Pattern[4]:
  文字が'.'(□と■以外)、signifがonなので、ケース8に従い'.'のまま
 Pattern[5]:
  文字が□、Value[3]が'0'、Value[4]が'4'、signifがonなので、ケース6に従い'0'のまま
 Pattern[6]:
  文字が□、Value[4]が'4'、Value[5]が'+'、signifがonなので、ケース7に従い'4'のままでsignifをoffにする
 Pattern[7]:
  文字が'$'、signifがoffなので、ケース9に従い'*'にする

更新後のPattern[]は"*12.04*" となる。


設問1 a: イ b: ア c: エ

上記の例のように、Pattern[]の内容とsignifの内容、必要に応じてValue[v]とValue[v+1]をチェックしつつ更新後のPattern[]を求めます。

a: 以下のように"********"となるので、イが正解です。

 fill文字: '*'

 Pattern[0]:
  ケース8に従い、'*'のまま
 Pattern[1]~[2]:
  ケース1に従い、'*'にする
 Pattern[3]:
  ケース8に従い、'*'にする
 Pattern[4]~[6]:
  ケース1に従い、'*'にする
 Pattern[7]:
  ケース8に従い、'*'にする

b: 以下のように"*****12#"となるので、アが正解です。

 fill文字: '*'

 Pattern[0]:
  ケース8に従い、'*'のまま
 Pattern[1]~[3]:
  ケース1に従い、'*'にする
 Pattern[4]:
  ケース8に従い、'*'にする
 Pattern[5]:
  ケース4に従い、'1'にした上でsignifをonにする
 Pattern[6]:
  ケース6に従い、'2'にする。signifはonのまま
 Pattern[7]:
  ケース9に従い、'#'のまま

c: 以下のように"****.12*"となるので、エが正解です。

 fill文字: '*'

 Pattern[0]:
  ケース8に従い、'*'のまま
 Pattern[1]~[2]:
  ケース1に従い、'*'にする
 Pattern[3]:
  ケース2に従い、'*'にした上でsignifをonにする
 Pattern[4]:
  ケース9に従い、'.'のまま
 Pattern[5]:
  ケース6に従い、'1'にする。signifはonのまま
 Pattern[6]:
  ケース7に従い、'2'にした上でsignifをoffにする
 Pattern[7]:
  ケース8に従い、'*'にする


設問2 d: イ e: エ

まずd ですが、ここには表2のケース1~7のうち、signifがoffの場合にfill文字を出力する条件が入ります。

これはケース1~3で、共通する条件はValue[v]が'0'であることです。したがって、イが正解です。


次にe ですが、ここには表2のケース1~7のうち、signifがonの場合にoffにする条件が入ります。

これはケース7に該当します。共通する条件のうち、選択肢にあるのはValue[v+1]が'+'であることです。したがって、エが正解です。


設問3: エ

内部変数signifの意味で触れたように、Value[]の最後に入っている符号の処理の時にsignifの内容が変更されます。

'+'ならoff、そうでなければonになります。

このうち、数値が正なら数値の後に続く文字をfill文字にするのは前者。ケースでいえば3、5、7になります。

ではイが正解かというと、実は3の場合は数値自体が出力されないケースもあり得るので誤りになります。

【例】
 Pattern[]="*□□□,□■#"、Value[]="00000+"の時。

 この時、更新後のPattern[]は"********"となる。
 数値そのものが出力されないことに注意。

5と7のケースのみが正しいので、エが正解となります。

 

(2016年11月7日(月) 16:08)

前の記事

この記事を書いたコーチ

実体験で培ったノウハウで、あなたの合格を戦略的にアシストします

基本情報技術者試験対策セミナー
源田雄一 (基本情報技術者試験)

品川・横浜・戸塚・目黒・渋谷・新宿・武蔵中原・溝の口・立川・北府中・新横浜・中山・長...

ブログ記事 ページ先頭へ