平成28年秋期試験午前問題 午後問13

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】

問13 ソフトウェア開発(表計算)

次の表計算のワークシート及びマクロの説明を読んで,設問1,2に答えよ。

〔表計算の説明〕
 A社では,建物の改築作業を効率的に遂行するスケジュールを決定するために表計算ソフトを用いている。

〔ワークシート:状態遷移〕
 作業とは,建物の改築状態をある状態から別の状態にするための行為とする。20種類の状態があり,各状態には,1~20の番号(以下,状態IDという)が振られている。
 改築作業の作業工程は,一つ以上の作業を順に施すことをいう。一連の作業による改築状態の遷移を,状態IDの列で表現する。これを,状態遷移列と呼ぶ。
 はじめに,作業による改築状態の遷移の関係,及び各作業の作業日数を入力したワークシート"状態遷移"を作成した。ワークシート"状態遷移"を,図1に示す。
pm13_1.gif
  • セル C2~V2 には,作業開始時の状態IDを1から順に入力する。同様にセル B3~B22 には,作業終了時の状態IDを1から順に入力する。
  • セル C3~V22 には,対応する状態間を直接遷移する作業が存在すれば作業に掛かる日数(以下,作業日数という)を,存在しなければ0を入力する。作業日数は,100日以下の整数値である。例えば,図1のセル C4 の値は,作業開始時の状態IDが1であって,作業終了時の状態IDが2となる作業が存在し,その作業は5日掛かることを表している。また,セル C6 の値は,作業開始時の状態IDが1であって,作業終了時の状態IDが4となる作業が存在しないことを表している。
  • 全ての作業について,作業開始時の状態IDよりも作業終了時の状態IDの方が大きい。
〔ワークシート:作業工程〕
 状態遷移列を入力すると,その状態遷移列が存在するかどうかを判定し,存在する場合は作業工程の総日数を算出するワークシート"作業工程"を作成した。ワークシート"作業工程"において,状態遷移列が存在する場合の例と状態遷移列が存在しない場合の例を,図2に示す。
pm13_2.gif
  • セル A3~A22 には,状態遷移列を構成する状態IDをセル A3 から順に入力する。最後の状態IDが入力されているセルよりも下のセルには空値が入力されている。同じ状態IDが2回以上入力されることはない。
  • セル B3 には,0を入力する。セル B4~B22 には,同じ行の列Aの状態IDへ1行上の列Aの状態IDから直接遷移するのに必要な作業日数が表示される。直接遷移する作業が存在しない場合は,"×"が表示される。同じ行の列Aのセルの値が空値の場合は0が表示される。
  • セル C3 には,0を入力する。セル C4~C22 には,セル A4~A22 の各状態IDへ,セル A3 に入力されている状態IDから遷移するのに必要な作業の総日数が表示される。同じ行の列Aの状態IDへ1行上の列Aの状態IDから直接遷移する作業が存在しない場合は,"×"が表示される。一つ上のセルの値が"×"の場合は,"×"が表示される。同じ行の列Aのセルの値が空値の場合は,一つ上のセルと同じ値が表示される。
  • セル C23 には,状態遷移列が存在する場合は,作業工程の総日数が表示され,存在しない場合は"×"が表示される。

設問1

ワークシート"作業工程"の作成手順(1)~(4)中の に入れる正しい答えを,解答群の中から選べ。
  • セル B3 及びセル C3 に0を入力する。
  • 次の式をセル B4 に入力し,セル B5~B22 に複写する。
     IF(A4=null,0,IF(a>0,a,'×'))
  • 次の式をセル C4 に入力し,セル C5~C22 に複写する。
     IF(b,'×',c)
  • 次の式をセル C23 に入力する。
     C22
a に関する解答群
  • 表引き(状態遷移!C$3:V$22,A$4,A3)
  • 表引き(状態遷移!C$3:V$22,A4,A$3)
  • 表引き(状態遷移!C$3:V$22,A4,A3)
  • 表引き(状態遷移!C3:V$22,A$4,A3)
  • 表引き(状態遷移!C3:V$22,A4,A$3)
  • 表引き(状態遷移!C3:V$22,A4,A3)
b に関する解答群
  • B4='×'
  • C3='×'
  • 論理積(B4='×',C3='×')
  • 論理積(B4≠'×',C3≠'×')
  • 論理和(B4='×',C3='×')
  • 論理和(B4≠'×',C3≠'×')
c に関する解答群
  • B3+B4
  • C3+B4
  • C5-B4
  • C5-B5
解答選択欄
  • a:
  • b:
  • c:
  • a=
  • b=
  • c=

解説

aについて〕
B4~B22の表示内容は〔ワークシート:作業工程〕(2)で説明されています。

「セル B4~B22 には,同じ行の列Aの状態IDへ1行上の列Aの状態IDから直接遷移するのに必要な作業日数が表示される。直接遷移する作業が存在しない場合は,"×"が表示される。同じ行の列Aのセルの値が空値の場合は0が表示される。」

あらかじめ用意されたセルB4に入力する式のうち、aを選択します。
IF A4が空値
 真の場合:'0'を表示
 偽の場合:IF(a>0, a, '×')を行う。
ワークシート"状態遷移"上のセルには、直接遷移する作業が存在する場合にはその必要作業日数が、存在しない場合には0が格納されています。つまり、作業前の状態IDと遷移先の状態IDをもとにワークシート"状態遷移"を"表引き"で参照し、その値が0以上ならばその日数を、0ならば'×'を表示することとなります。

選択肢を見ると、各式は相対参照と絶対参照が部分的に異なるだけです。この設問では絶対参照指定の整合性が問われています。

まず、B4の内容がB5~B22までに複写されても、ワークシート"状態遷移"上のセル範囲は常に固定されている必要があります。この点でC3の行番号が相対参照になっている「エ」「オ」「カ」は誤りです。
そして、作業前の状態IDと遷移先の状態IDは複写先セルに応じて変化しなければなりません。例えば、B4では作業前の状態IDとしてA3を、遷移先の状態IDとしてA4を参照しますが、B5に複写されたときは作業前の状態IDとしてA4を、遷移先の状態IDとしてA5を参照することとなります。よって、A4とA3の行番号はともに相対参照でなければなりません。したがって「ウ」が正解です。
pm13_5.gif

bについて〕
セルC4には状態IDから遷移するのに必要な作業の総日数を表示する式が入力されます。
(3)の説明には以下のようにあります。

「セル C4~C22 には,セル A4~A22 の各状態IDへ,セル A3 に入力されている状態IDから遷移するのに必要な作業の総日数が表示される。同じ行の列Aの状態IDへ1行上の列Aの状態IDから直接遷移する作業が存在しない場合は,"×"が表示される。一つ上のセルの値が"×"の場合は,"×"が表示される。同じ行の列Aのセルの値が空値の場合は,一つ上のセルと同じ値が表示される。」

bが真のときに'×'が表示されるには、
  1. 同じ行の列Aの状態IDへ1行上の列Aの状態IDから直接遷移する作業が存在しない場合()
    → B4~B22の値が'×'である
    B4 = '×'
  2. 一つ上のセルの値が"×"の場合
    C3 = '×'
という条件の少なくとも一方を満たすときに真となる条件式である必要があります。「少なくとも一方を満たす」ですから、2つの条件を論理和で囲えば適切な条件式となります。したがって正解は「オ」です。
pm13_6.gif

cについて〕
表示したいのは、「セル A4~A22 の各状態IDへ,セル A3 に入力されている状態IDから遷移するのに必要な作業の総日数」です。これは、直前の総日数に直前の状態IDから遷移するのに必要な作業日数を加算して求めます。直前までの総日数は1つ上のセル(C3)に、直前の状態IDから遷移するのに必要な作業日数は1つ左のセル(B4)に、格納されているので「C3+B4」が適切です。
pm13_7.gif
〔ワークシート:作業主程(拡張)〕
 状態遷移列の先頭になる状態ID(以下,開始状態IDという)と状態遷移列の最後になる状態ID(以下,終了状態IDという)を入力すると,作業工程の総日数が最小になる状態遷移列を求める機能を追加したワークシート"作業工程(拡張)"を作成し,マクロ CalculateMinimum とマクロ DisplayMinimumPath を格納した。作成したワークシート"作業工程(拡張)"の例を,図3に示す。
 なお,ワークシート"作業工程"を拡張することによって,関数"表引き"の引数で与えられた行又は列の位置の値が空値になることがある。その場合は,関数"表引き"は空値を返す。
pm13_3.gif
  • セル F2 に開始状態IDを,セル F3 に終了状態IDを入力し,マクロ CalculateMinimum を実行した後,マクロ DisplayMinimumPath を実行する。
  • マクロ CalculateMinimum の仕様は,次のとおりである。
    1. セル H3~H22 には,1から順に状態IDを格納する。
    2. セル I3~I22 には,開始状態IDから各行の列Hで示す状態IDまで遷移するのに必要な作業の総日数の最小値を格納する。状態遷移列が存在しない場合は9999を格納する。
    3. セル J3~J22 には,開始状態IDから各行の列Hで示す状態IDまで遷移するのに必要な作業の総日数が最小となる状態遷移列における,その状態IDの直前の状態IDを格納する。開始状態IDに対応するセルの場合は0を格納する。また,状態,遷移列が存在しない場合は空値を格納する。
  • マクロ DisplayMinimumPath は,セル A3~A22 に作業工程の総日数が最小となる状態遷移列を格納する。終了状態IDを格納したセルよりも下のセルには空値を格納する。開始状態IDから終了状態IDまでの状態遷移列が存在しない場合は,セル A3~A22 には全て空値を格納する。

設問2

マクロ DisplayMinimumPath 中の に入れる正しい答えを,解答群の中から選べ。
pm13_4.gif
d に関する解答群
  • Current<F2
  • Current<F3
  • Current<F3-F2
  • Current=0
  • Current=F2
  • Current≠F2
e に関する解答群
  • 照合検索(Current,H3:H22,J3:J22)
  • 照合検索(Current,J3:J22,H3:H22)
  • 照合検索(NumWork,H3:H22,J3:J22)
  • 照合検索(NumWork,J3:J22,H3:H22)
f に関する解答群
  • I: 0,I<NumWork,1
  • I: 0,I≦NumWork,1
  • I: 1,I≦NumWork,1
  • I: NumWork-1,I≧0,-1
  • I: NumWork,I>0,-1
  • I: NumWork,I≧0,-1
解答選択欄
  • d:
  • e:
  • f:
  • d=
  • e=
  • f=

解説

マクロ DisplayMinimumPath の動作に関する(3)の記述を下にまとめます。
  1. セルA3~A22に作業工程の総日数が最小となる状態遷移列を格納する。
  2. 終了状態IDを格納したセルよりも下のセルには空値を格納する。
  3. 開始状態IDから終了状態IDまでの状態遷移列が存在しない場合は、セルA3~A22には全て空値を格納する。
マクロのソースを見ると、冒頭部でセル A3~A22 に空値(null)を代入して初期値しています。つまり、更新する必要があるセルに対してのみ更新を行えば、①②の要求を満たす有効な処理となります。

dについて〕
ループの継続条件式が入ります。
反復処理では NumWork(作業工程の作業数)をカウントしています。Current の初期値はF3(終了状態の状態ID)ですから、前作業IDを参照しながら開始状態の状態IDに至るまでの作業数(遷移数)をカウントすれば実現できます。図3を例にすると、13→11→…6→4→3 というように作業遷移列を遡ることとなります。
求めるべき作業数は「遷移する状態数-1」ですので、Current がF2(開始状態の状態ID)と同じになったときにループを終了すれば、作業ID間の遷移数を数えられます。よって、dには「Current ≠ F2」が入ります。

他の選択肢は、Currentに初期値のF3の値を当てはめて考えると、どれも反復処理を1回もせずにループを抜けてしまうことがわかります。

eについて〕
変数 Current を更新する式が入ります。前述のように、反復処理では前状態のIDを参照することを繰り返して開始状態IDまでの作業数を算出するものですので、前状態のIDを正しく取得可能な式を選択する必要があります。"照合検索"を使用してH列の中からCurrentの値と一致する行を探索し、その行のJ列の値を取得する「ア」の式が適切です。

「イ」は、検索するセル範囲と抽出のセル範囲の指定が逆です。
「ウ」「エ」は、NumWork は作業数を保持する変数(初期値は0)ですから、0や1の作業IDを持つ行を探索することとなります。よって誤りです。
pm13_8.gif
fについて〕
状態遷移列を格納する処理の反復文の式を選択します。
直前に、変数 Current にセル F3(終了状態ID)の値を格納しているので、セル A3~A22 には終了状態から開始状態に遡って値を代入していきます。
pm13_9.gif
総作業数は NumWork に格納されているので、
  • 相対(A3, NumWork, 0)
  • 相対(A3, NumWork-1, 0)
  • 相対(A3, 0, 0)
という順で作業IDが大きい順に値を代入していきます。これには、IをNumWorkから0まで減らしながらループを繰り返す必要があるので、ループ変数の初期値を「NumWork」、継続条件を「0以上」、増分を「-1」としている「カ」の式が適切です。

Pagetop