H18秋午後の解答と解説
X社は,同型のハードディスク装置 1,200 台で構成されるデータセンタを運営している。 このうち,1年当たり平均 24 回の装置が故障し,置き換えられる(以下,交換という)。 故障によるハードディスク装置の交換には,1回当たり 10 万円の交換費用がかかるが, 装置購入費(装置価格)はかからない。 また,データセンタを構成するハードディスク装置は,耐用年数に達する前に,
毎年 200 台ずつ計画的に置き換えられる(以下,入替えという)。 この入替台数は,故障の発生数とは無関係である。 入替費用は,次式で計算される。作業費は1万円である。
入替費用 =(装置価格+作業費)× 入替台数
X社は,来年ハードディスク装置の総入替えを行うことになり,新たに利用する
ハードディスク装置を,表に示す機種の中から選定する。各機種は, MTTF ( Mean Time To Failure :故障までの平均時間)と装置価格が異なる。 表中の y は現在使用しているハードディスク装置の MTTF と同じ値である。 MTTFは,次式で計算される。
MTTF = 延べ稼働時間 ÷ 故障台数 表 選定候補機種リスト
機種 |
装置価格(円) |
MTTF(年) |
A |
50,000 |
y |
B |
52,500 |
1.2 y |
C |
54,000 |
1.6 y |
D |
56,000 |
2 y |
設問 次の記述中の( )に入れる正しい答えを, 解答群の中から選べ。
X社のデータセンタが現在利用しているハードディスク装置の MTTF は,(a)年である。 また,ハードディスク装置を,MTTF が 100 年の機種に総入替えすると, 1年当たりの平均故障台数は(b)台になると見込まれる。 データセンタで利用するハードディスク装置を,表中のいずれかの機種に総入替えした後の, ハードディスク装置の年間の入替え及び故障による交換にかかる総費用が最も安くなると 見込まれる機種は(c)であり, 最も高くなる機種は(d)である。 総費用は,機種の違いによって,次式で計算される額だけ差が出る。
機種の違いによる総費用の差額=(装置価格の差 × 入替台数)+(交換費用 × 故障台数の差)
=(装置価格の差 × 200 )+( 100,000 × 故障台数の差)
a,b に関する解答群
ア 0 イ 1 ウ 2 エ 5
オ 6 カ 12 キ 24 ク 50
c,d に関する解答群
ア A イ B ウ C エ D
ある酒屋では,次に示すファイル様式で管理していた会員への販売データを データベース化することにした。
伝票番号は,1回の支払いに対して一つ割り振られる。 管理すべき情報を精査し,情報を追加するとともに正規化を実施して,次に示す
四つの表からなるデータベースを設計した。網掛けした項目は主キーである。
会員表会員 ID |
氏名 |
電話番号 |
住所 |
020001 | 山田太郎 | 03-0000-0001 | 東京都文京区... |
020002 | 中村二郎 | 03-0000-0002 | 東京都新宿区... |
... |
... |
... |
... |
|
販売表
|
販売明細表
伝票番号 |
商品コード |
個数 |
00000001 |
BE0001 |
3 |
00000001 |
NI0002 |
1 |
00000002 |
WI0001 |
1 |
... |
... |
... |
商品表
商品コード |
分類 |
商品名 |
単価 |
BE0001 |
ビール |
A ビール |
230 |
BE0002 |
ビール |
B ビール |
230 |
WI0001 |
ワイン |
C ワイン |
2000 |
... |
... |
... |
... |
設問1 データベース設計における第1正規化の考えに基づいて実施した操作を, 解答群の中から選べ。
解答群
ア 会員表を作成し,データの重複をなくした。
イ 商品表を作成し,情報の独立性を高めた。
ウ 販売明細表を作成し,販売情報から繰返し要素を排除した。
設問2 データベース設計における正規化による直接の効果として適切なものを, 解答群の中から選べ。
解答群
ア 会員情報の集約によって,セキュリティが強化できる。
イ 表間の独立性が高まり,会員情報や商品情報を更新する際の影響を局所化できる。
ウ 将来, OS や DBMS などを変更する際,移行が容易になる。
エ 会員の購入歴など,複数の表を連結してデータを検索する際,処理性能が向上する。
設問3 作成したデータベースを利用して,販売促進のためのデータを抽出する。 1回の支払いが1万円以上の買物をした会員の氏名と住所を抽出したい。 次の SQL 文の( )に入れる正しい答えを,解答群の中から選べ。
SELECT DISTINCT 会員表.氏名, 会員表.住所
FROM 会員表, 販売表 WHERE ( )
解答群
ア MAX (販売表.販売額) >= 10000
イ SUM (販売表.販売額) >= 10000
ウ 販売表.販売額 >= 10000
エ 会員表.会員ID = 販売表.会員ID AND 販売表.販売額 >= 10000
オ 会員表.会員ID = 販売表.会員ID AND MAX (販売表.販売額) >= 10000
カ 会員表.会員ID = 販売表.会員ID AND SUM (販売表.販売額) >= 10000
設問4 過去にワインの購入歴がある会員の氏名と住所を抽出したい。 次の SQL 文の ( ) に入れる正しい答えを,解答群の中から選べ。
SELECT DISTINCT 会員表.氏名, 会員表.住所
FROM 会員表, 販売表, 販売明細表, 商品表 WHERE ( )
ア 会員表.会員 ID IN ( SELECT 販売表.会員 ID FROM 販売表, 商品表
WHERE 商品表.分類 = 'ワイン')
イ 会員表.会員 ID = ( SELECT 販売表.会員 ID FROM 販売表, 商品表
WHERE 商品表.分類 = 'ワイン')
ウ 会員表.会員 ID = 販売表.会員 ID
AND 販売明細表.商品コード = 商品表.商品コード
AND 商品表.分類 = 'ワイン'
エ 会員表.会員 ID = 販売表.会員 ID
AND 販売表.伝票番号 = 販売明細表.伝票番号
AND 販売明細表.商品コード = 商品表.商品コード
AND 商品表.分類 = 'ワイン'
〔プログラムの説明〕
次の n 元連立1次方程式の解,すなわち xi ( i = 1,2,..., n ) の値を求める副プログラム Gauss である。
(1) Gauss は,前進消去と後退代入の二つの段階からなる。
① 前進消去
次の計算を k = 1,2,..., n - 1 の順に行う。 k は前進消去の計算回数であり,変数の右肩に括弧付きの添字で示す。 ここで, aij (0) = aij , bi (0) = bi とする。 akk ( k -1) をピボット( Pivot )と呼び, 計算の途中で0にならないものとする。
② 後退代入
①の結果から, n 元連立1次方程式の解 xi を i = n , n -1,...,1 の順に求める。
(2) 次の連立方程式を例として,前進消去と後退代入の計算を示す。
① 前進消去の計算を k = 1,2 の順に行う。
k = 1 のとき, a 22(1) は次のとおりに計算される。
同様に a 23(1) , b 2(1) , a 32(1) , a 33(1) , b 3(1) を計算すると,連立方程式は次のとおりになる。
k = 2のとき, a 33(2) , b 3(2) を計算すると,連立方程式は次のとおりになる。
② 後退代入によって, x 3, x 2 , x 1 の値を得る。
(3) Gauss の引数の仕様を表に示す。
なお,各配列の添字は1から始まる。
表 Gauss の引数の仕様
引数 |
データ型 |
入力/出力 |
意味 |
| n | 整数型 | 入力 | 連立方程式の元数(未知数の個数) |
| a[,] | 実数型 | 入力 | 係数 aij が格納されている2次元配列 |
| b[] | 実数型 | 入力 | 定数 bi が格納されている1次元配列 |
| x[] | 実数型 | 出力 | 解 xi の値を格納する1次元配列 |
〔プログラム〕
設問 プログラム中の( )に入れる正しい答えを, 解答群の中から選べ。
a の解答群
ア Pivot ← a[1,1] イ Pivot ← a[1,k]
ウ Pivot ← a[k,k] エ Pivot ← a[n,n]
b,c の解答群
ア i: 1, i ≦ n, 1 イ i: n-1, i ≧ 1, -1
ウ j: 1, j ≦ i, 1 エ j: 1, j ≦ n-1, 1
オ j: i+1, j ≦ n, 1
〔プログラム1の説明〕
副プログラム TabSpc1 は,タブ文字を展開するプログラムである。
(1) TabSpc1 は,文字型配列 Src を先頭から調べ,Src 中のすべてのタブ文字を それぞれ一つ以上の間隔文字(スペース)に置換して,文字型配列 Dst に格納する 。 タブ文字以外の文字は,そのままDstに格納する。
(2) 文字型配列の各要素には,文字を1文字ずつ順に格納し, 最後の文字の次の要素にはシステム定数である EOS を格納する。 なお,配列の添字は1から始まり,添字の値を文字位置と呼ぶ。
(3) Src 中にタブ文字が出現した場合,次の文字が最も近い右のタブ位置に格納されるように,
タブ文字を一つ以上の間隔文字に置換して,Dst に格納する。
ここで,タブ位置とは,引数で渡されるタブ間隔(≧ 2 )を用いた次の式で計算される文字位置である。
タブ位置 = タブ間隔 × n + 1 ( n = 1,2,... )
(4) タブ間隔が4のときの実行例を図1に示す。
"j"を Dst のタブ位置である文字位置 13(= 4 × 3 + 1 )に格納したのでは,
タブ文字が間隔文字に置き換わらないので,最も近い右のタブ位置で
ある文字位置 17(= 4 × 4 + 1 )に格納する。
(5) Dst は十分に大きいものとする。
(6) 副プログラム TabSpc1 の引数の仕様を表1に示す。
表1 TabSpc1 の引数の仕様
引数 |
データ型 |
入力/出力 |
意味 |
| Src[] | 文字型 | 入力 | 対象となる文字型配列 |
| Dst[] | 文字型 | 出力 | 出力する文字型配列 |
| TabGap | 整数型 | 入力 | タブ間隔(≧ 2 ) |
〔プログラム1〕
設問1 プログラム1中の( )に入れる正しい答えを, 解答群の中から選べ。
a に関する解答群
ア Didx + 1 イ Didx - 1
ウ Didx + TabGap + 1 エ Didx + TabGap - 1
b,c に関する解答群
ア Didx ← Didx + 1 イ Dst[Didx] ← Src[Sidx]
ウ Dst[Didx + 1] ← Src[Sidx] エ Dst[Didx] ← Src[Sidx + 1]
設問2 プログラム1を改造して,タブ位置を任意の文字位置に指定できるような プログラム2を作成した。 ただし,タブ位置は2以上の値で,隣り合うタブ位置の間隔も2以上とする。 タブ位置は引数で渡される整数型配列 TabSet に昇順に格納され,最後のタブ位置が 格納された次の配列要素には -1が格納されている。
なお,最後のタブ位置以降にタブ文字が出現した場合は,一つの間隔文字に置換する。
図1と同じ動作をさせる場合の TabSet の内容を図2に, プログラム2に示す副プログラム TabSpc2 の引数の仕様を表2に示す。
プログラム2中の( )に入れる正しい答えを,解答群の中から選べ。
ただし,(b)(c)には設問1の正しい答えが入っているものとする。
TabSet[1] |
TabSet[2] |
TabSet[3] |
TabSet[4] |
: |
TabSet[m] |
5 |
9 |
13 |
17 |
: |
-1 |
図2 整数型配列 TabSet の内容(図1と同じ動作をさせる場合)
表2 TabSpc2 の引数の仕様
引数 |
データ型 |
入力/出力 |
意味 |
| Src[] | 文字型 | 入力 | 対象となる文字型配列 |
| Dst[] | 文字型 | 出力 | 出力する文字型配列 |
| TabSet[] | 整数型 | 入力 | タブ位置を格納した整数型配列 |
〔プログラム2〕
d,e に関する解答群
ア TabPos ← TabSet[Tidx]
イ TabPos ← TabSet[Tidx] + Didx
ウ TabPos ← TabSet[Tidx] - Didx
エ Tidx ← Didx + 1
オ Tidx ← TabPos + 1
カ Tidx ← Tidx + 1
B 社は,バター,チーズ,ヨーグルトなど,牛乳を主な原料とする乳製品を製造している。
牛乳は,J 牧場,K 牧場及び L 牧場から仕入れ,個別のタンクに保存されている。 製造計画で,ロット番号と呼ばれるコードで識別される製造単位ごとに, 単一の牧場の牛乳を使うか,又は標準の混合割合で混合して使うかを決める。 ロット番号は,同一製品の同一製造日の製造単位ごとに付けられるコードである。
B 社では,製造計画で決められた,製造日ごとの各牧場の牛乳の必要量を集計するプログラムを 作成することになった。
〔必要量ファイルの説明〕
製造計画で決められた,製造日,製品コード,ロット番号ごとに,原料牛乳の "必要量"(正の整数値)と,単一か混合かを表す"牧場区分"が格納されている。
牧場区分は,J 牧場,K 牧場及びL牧場を表す"J","K","L",又は混合を 表す"M"のどれかである。
必要量ファイルの様式を図1に示す。
レコードは,"製造日","製品コード","ロット番号"を,この順で整列キーとして,
昇順に整列されている。
製造日 |
製品コード |
ロット番号 |
牛乳の必要量 |
牧場区分 |
〔標準混合割合ファイルの説明〕
"製品コード"をキーとする索引ファイルである。 製品ごとに各牧場の牛乳の標準混合割合が,合計で 100 %となるように, 百分率( 0 ~ 100 の整数値)で格納されている。
標準混合割合ファイルの様式を図2に示す。
製品コード |
J 牧場の割合 |
K 牧場の割合 |
L 牧場の割合 |
〔集計ファイルの説明〕
製造日ごとの各牧場の牛乳の必要量を集計して,総必要量として格納する。
集計ファイルの様式を図3に示す。
製造日 |
J 牧場の総必要量 |
K 牧場の総必要量 |
L 牧場の総必要量 |
〔プログラムの説明〕
必要量ファイルを読み,レコードごとに,次の処理 ① ~ ③ のどれかを行う。
① 牧場区分が"M"のときは,"混合"であり,標準混合割合ファイルと必要量ファイルの情報から, J 牧場,K 牧場及び L 牧場のそれぞれの必要量を計算する。 この計算は,小数点以下切捨てとし,切捨て誤差は,L 牧場の牛乳の必要量で補正する。
② 牧場区分が"J","K"及び"L"のときは,"単一"であり,必要量の全量を, "J"のときはJ牧場,"K"のときは K 牧場,"L"のときは L 牧場の牛乳とする。
③ 牧場区分が"J","K","L"及び"M"以外のときは,エラーであり,
このレコードの内容をエラーファイルに出力する。
エラーとなったものを除き,製造日ごとに J 牧場,K 牧場及び L 牧場の牛乳の 必要量をそれぞれ集計し,集計ファイルに出力する。
入出力関連図を図4に,モジュール構造図を図5に示す。
設問1 図6は,主処理と必要量計算の流れ図である。 図中の( )に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
ア 製造日が変わる イ 製品コードが変わる
ウ 牧場区分が変わる エ ロット番号が変わる
b,c に関する解答群
ア (牧場区分≠"J") or (牧場区分≠"K") or (牧場区分≠"L")
イ (牧場区分≠"M") or ((牧場区分≠"J") and (牧場区分≠"K") and (牧場区分≠"L"))
ウ (牧場区分≠"M") or (牧場区分≠"J") or (牧場区分≠"K") or (牧場区分≠"L")
エ (牧場区分="J") or (牧場区分="K") or (牧場区分="L")
オ (牧場区分="M") or ((牧場区分≠"J") and (牧場区分≠"K") and (牧場区分≠"L"))
カ 牧場区分≠"M"
キ 牧場区分="M"
設問2 図7は,混合の流れ図である。 図中の( ) に入れる正しい答えを,解答群の中から選べ。
解答群
ア 牛乳の必要量 - wj
イ 牛乳の必要量 - wj - wk
ウ 牛乳の必要量 - wk
エ 牛乳の必要量 ×( 100 - J 牧場の割合- K 牧場の割合)÷ 100
オ 牛乳の必要量 × L 牧場の割合 ÷ 100
設問3 図5中の初期化を除く第3階層及び第4階層の最下位のモジュールのうち, "牧場区分"によって処理を分ける必要があるものを,解答群の中から選べ。
ここで,初期化モジュールは,作業用記憶の初期化だけを行うものとする。
解答群
ア エラー イ 混合 ウ 集計 エ 単一
〔プログラムの説明〕
プログラムが生成した各けたの数字が異なる4けたの目標数を, なるべく少ない回数の推測で当てるゲーム GuessNumber である。 回答者は,各けたが異なる4けたの推測数を入力し,当たらなかった場合,次の情報を得ることができる。
① 目標数に含まれていて,けたも一致している数字の個数(以下,Hit 数という)
② 目標数に含まれているが,けたが一致していない数字の個数(以下,Blow 数という)
例えば,目標数が" 1 6 3 2 "で推測数が" 7 6 1 3 "の場合," 6 "はけたも一致しているので Hit 数が 1," 1 "と" 3 "はけたが一致していないので Blow 数が2となる。
(1) 目標数はプログラムが自動的に生成する。生成した数字列は char 型の配列 target に格納される。 推測数を文字列として標準入力から読み込み,char 型の配列 num に格納したうえで照合する。 目標数と完全に一致するまで繰り返す。
(2) 次の関数が用意されている。
void createRandomNumber(char[] target)
機能: 4けたの目標数を文字列として左のけたから順に配列 target に格納する。
各けたの数字はすべて異なっている。
int isValidNumber(char[] num)
機能:文字列 num 中の各文字がすべて異なる数字のとき TRUE を,それ以外のとき FALSE を返す。
〔プログラム〕
a,b に関する解答群
ア isMatch(target, num) == FALSE
イ isMatch(target, num) == TRUE
ウ isValidNumber(num) == FALSE
エ isValidNumber(num) == TRUE
c に関する解答群
ア num[i] == num[j] イ target[i] == num[i]
ウ target[i] == num[j] エ target[i] == target[j]
オ target[j] == num[j]
d に関する解答群
ア i != j イ i < j ウ i <= j
エ i == j オ i > j カ i >= j
e に関する解答群
ア numHit != DIGITS イ numHit + numBlow == DIGITS
ウ numHit + numBlow >= DIGITS エ numHit == DIGITS
オ numHit == numBlow カ numHit > numBlow
〔プログラムの説明〕
関数 pattern_match_string は,対象文字列を先頭から1文字ずつ順に調べ, パターン文字列が表現している条件を満足しているかどうかを判定するプログラムである。
(1) 条件文字列は,対象文字列の各文字(対象文字)に対する条件を表現した1文字以上の文字列
(パターン文字列)を連結したものである。
対象文字とパターン文字列の対応関係は,図のとおりである。
(2) 関数 pattern_match_string の引数は,次のとおりである。
target:対象文字列
cond:条件文字列
(3) 対象文字は,英数字だけである。
(4) パターン文字列に含まれる文字は,次のとおりである。
① 英数字
② " $ "," [ "," ] "," { "," } "," @ "
(5) 対象文字列及び条件文字列に誤りはない。
(6) 表の例では,対象文字列はいずれの条件文字列で表現される条件も満足している。
表 対象文字列と条件文字列の例
| 対象文字列 | FE2006 |
| 条件文字列 | FE2@06 |
| F$U2006] |
設問1 パターン文字列に関する次の説明中の( )に入れる正しい答えを,解答群の中から選べ。
(1) 対象文字が任意の英数字であることを表現するパターン文字列は,(a)である。
(2) 対象文字が数字であることを表現するパターン文字列は, (b)である。
(3) 対象文字が" X "," Y "," Z "のいずれかの文字であることを表現するパターン文字列は,(c)である。
(4) 対象文字が" X "," Y "," Z "のいずれの文字でもないことを表現するパターン文字列は, (d)である。
a,b に関する解答群
ア " @ " イ " $A " ウ " $L " エ " $LU "
オ " $N " カ " $U " キ " $@ "
c,d に関する解答群
ア " [XYZ] " イ " {XYZ} " ウ " $XYZ$ "
エ " $[XYZ$] " オ " ${XYZ$} "
設問2 関数pattern_match_stringの返却値に関する次の説明中の( )に入れる正しい答えを,解答群の中から選べ。
(1) 対象文字列のすべての文字が条件文字列で与えた条件を満足している場合, 返却値として(e)を返す。
(2) 対象文字列の途中の文字に条件文字列で与えた条件を満足しないものがあった場合, そこで判定を終了し,返却値として(f)を返す。
(3) 対象文字列と条件文字列のいずれかが途中で終了してしまった場合('\0'が見つかった場合), そこで判定を終了し,返却値として -1を返す。
解答群
ア 0
イ -1
ウ 対象文字列の文字数
エ 検査した対象文字数
オ 検査して条件を満足していた対象文字数
カ 検査していない対象文字数 + 1
キ 検査していない対象文字数