H19秋午後の解答と解説
A ×2B の浮動小数点数( A は仮数, B は指数)を,図1に 示す規格 IEEE 754(IEC60559)による単精度の浮動小数点形式では,次のように表現する。
(1) ビット番号 31 :符号部
A (仮数)の符号を表す。0のときは正を,1のときは負を示す。
(2) ビット番号 30 ~ 23 :指数部
B (指数)に 127 を加えた値を,2進数で表す。
(3) ビット番号 22 ~ 0 :仮数部
B を調整することによって,1≦|A|<2となるように正規化を行い,更に整数
部分の1を省略して,ビット番号 22 が小数第1位となるようにした2進数である。
ただし,数値が0の場合は,符号部,指数部,仮数部とも0とする。
設問1 次の記述中の( ) に入れる正しい答えを, 解答群の中から選べ。
10 進数の 45.625 を2進数で表すと,(101101.101)2となる。これを正規化した 指数表現にすると,(1.01101101)2×25 となるので,IEEE 754 の形式で表すと, 図2に示すとおり符号部は(0)2,指数部は指数の5に 127 を加えて(10000100)2 と なり,仮数部は整数部分を省略するので,(011011010...0)2 となる。
同様の手順で, 10 進数の -0.75 を IEEE 754 の形式で表すと,符号部は (a)2 ,指数部は (b)2,仮数部の上位8けた(ビット番号 22 ~ 15 )は (c)2となる。
解答群
ア 0 イ 1ウ 01111110 エ 01111111
オ 10000000 カ 11000000
設問2 IEEE 754 の形式で表した,次の二つの浮動小数点数を加算した結果として正しい答えを, 解答群の中から選べ。
運送事業を営むX社は,集配場所として,ある地域を網羅するように配置された 支店と,それらの支店を管理する集配センタをもつ。支店が配達を受けもつ地域(以下, 管轄地区という)は,重複せずに割り振られている。支店では,顧客から届け先に 配達する品物(以下,配達品という)を受け付け,預り番号というX社全体で一意の番号を付与する。
支店は,配達品の届け先がその支店の受けもつ管轄地区にあれば配達を行い,そうでなければ,
その支店を管理する集配センタに配達品を移送する。支店から支店への配達品の移送は
必ず集配センタを経由する。集配センタでは,支店から移送された配達品を受け入れ,
配達品の届け先を受けもつ支店がその集配センタの管理する支店であればその支店に,
そうでなければ届け先を受けもつ支店を管理している集配センタに配達品を移送する。
図1に配達品移送時の支店と集配センタの関係を示す。
X社では,図2に示す構造の関係データベースを用いて,配達品の状態を把握している。 図中の下線はキー項目を表す。
配達地域表: 管轄地区ごとに,配達を受けもつ支店コード( S で始まる3けた)をもつ。
支店表: 支店コードごとに,支店を管理する集配センタコード( A で始まる3けた)をもつ。
配達品表: 預り番号ごとに,配達品の依頼元や届け先などの情報を保持する。
移送履歴表: 配達品が集配場所(支店や集配センタ)を出入りするごとに,その日時と出入りした履歴を保持する。入出区分には配達品が集配場所に入るときには 'I' を,出るときには 'o',を格納する。
設問1 集配センタ A01 が管理している支店の数を求める SQL 文として正しい答えを,解答群の中から選べ。解答群
ア SELECT COUNT(支店コード) FROM 支店表
WHERE 集配センタコード NOT IN ('A01')
イ SELECT COUNT(支店コード) FROM 支店表
WHERE 集配センタコード = 'A01'
ウ SELECT COUNTS(支店コード) FROM 支店表 WHERE 支店コード = 'A01'
エ SELECT 支店コード FROM 支店表 WHERE 集配センタコード = 'A01'
オ SELECT 集配センタコード FROM 支店表
WHERE 支店コード = 'A01' ORDER BY 集配センタコード
設問2 次の SQL 文は,支店 S11 でこれまでに受け付けた配達品のうち,その支店が 直接配達を受けもった届け先の一覧を作成するものである。SQL 文中の( )に入れる正しい答えを,解答群の中から選べ。
SELECT 届け先管轄地区,届け先住所,届け先氏名 FROM (a)WHERE 受付支店コード = 'S11' (b)
届け先管轄地区(c) ( SELECT 管轄地区 FROM 配達地域表
WHERE 支店コード = 'S11')
解答群
ア 移送履歴表 イ 支店表 ウ 配達地域表
エ 配達品表 オ AND 力 IN
キ NOT IN ク OR
設問3 移送履歴表に対して次の SQL 文による問合せを行った。この問合せの結果として判明することを,解答群の中から選べ。
SFLECT 通過日時,通過店コード,入出区分 FROM 移送履歴表
WHERE 預り番号 = '0000004' AND
通過日時 = (SELECT MAX(通過日時) FROM 移送履歴表
WHERE 預かり番号 = '0000004')
解答群
ア 預り番号が 0000004 である配達品が最も長い期間保管されていた支店
イ 預り番号が 0000004 である配達品の依頼元
ウ 預り番号が 0000004 である配達品のすべての移送履歴
エ 預り番号が 0000004 である配達品の最新の集配場所と日時
オ 預り番号が 0000004 である配達品を受け付けてから配達するまでに経過した日数と時間
A社は,本社と工場を結ぶ, X, Y, Z の3系統の独立した通信回線をもっている。
〔回線 X, Y, Z の説明〕
(1) X, Y, Z は,それぞれ運用開始年は異なるが,3系統とも運用開始年の1月の 始業とともに運用が開始されている。3系統とも,昨年1年間の運用時間は 6,240 時間であった。
(2) X は,導入した年から数えて(導入した年を1年目として) 13 年経過し, 14 年目に 入った回線であり,今年の 12 月いっぱいで運用をやめることになっている。 一昨年( 12 年目の1年間)と昨年( 13 年目の1年間)の故障頻度は, 安定的に推移していたそれまでの数年間より増える傾向にあった。 X の昨年の MTTR (平均修復時間)は6時間であり,故障時間の合計は Y の6倍であった。
(3) Y は,導入後7年目の回線であり,3年前(4年目)から故障頻度は安定している。 Y の昨年(6年目の1年間)の MTTR は4時間であり,故障回数は3回であった。
(4) Z は,導入後2年目の最も新しい回線であり,Z の昨年(1年目の1年間)の MTTR は6時間であり,故障頻度は Y より高い値であった。
〔バスタブ曲線の説明〕
ハードウェアの故障頻度は,横軸に導入からの経過時間,縦軸に故障頻度をとると, 図のようなバスタブを縦に切った断面のような形球の曲線に従うことが知られており, この曲線をバスタブ曲線と呼んでいる。
バスタブ曲線では,運用開始直後から時間の経過とともに故障頻度が減少する期間 を初期故障期間,老朽化によって故障頻度が増加する期間を摩耗故障期間,この二つ の期間の間で,偶発故障が主になり故障頻度が安定する期間を偶発故障期間と呼ぶ。
X, Y, Z の3系統の回線の故障頻度は,同じバスタブ曲線に従うとする。
バスタブ曲線の特徴から,Y と Z の故障頻度が両方ともに安定する時期は,今年から数えて(a) 年目から,(b)年間であるいえる。
表中の昨年の X の MTBF (平均故障間隔)は ,(c) 時間であり, Y の故障時間の合計は,(d) 時間である。
MTBF ,MTTR は,それぞれ次式で求められる。
MTBF = 稼働時間の合計/故障回数
MTTR = 故障時間の合計/故障回数
a,b に関する解答群
ア 1 イ 2 ウ 3 エ 4 オ 5
c に関する解答群
ア 72 イ 514 ウ 516 エ 520 オ 2,074
d に関する解答群
ア 1.3 イ 12 ウ 1,558 エ 2,080 オ 6,228
〔プログラムの説明〕
スタックを使って,実数値を 10 進数字列(文字列)に変換する副プログラム FloatFormat である。
(1) FloatFormat は,実数 Float の値を 10 進数字列に変換し,その先頭の数字から順に 1文字ずつ文字型配列 Out[] に格納する。
(2) 小数点以下は,引数 Num(Num≧1)で指定されたけた数までを格納する。
(3) FloatFormat の引数の仕様を表に示す。
表 FloatFormat の引数の仕様
| 引数 | データ型 | 入力/出力 | 意味 |
| Float | 実数型 | 入力 | 変換対象の実数 |
| Num | 整数型 | 入力 | 文字列に変換する際の小数点以下のけた数(Num≧ 1) 小数第 Num十1 位以下は切捨て |
| Out[] | 文字型 | 出力 | 変換結果を格納する文字型の配列 |
| Len | 整数型 | 出力 | 配列 Oul[] に格納された変換結果の文字数 |
(4) 実数 Floatの 値を 10 進数字列に変換する手順は,次のとおりである。
① Float の値が負の場合は,負符号を表す"-"を Out[] に格納し,Float の値を正数に変換する。
② 整数部を,1の位から上位に向かって,1けたずつ 10 進数字に変換し,スタックに積む。
③ スタックに積み終わったら,スタックに積んだ文字を順番に取り出して
Out[] に格納することによって,整数部の 10 進数字を正しい順番に並べ替える。
④ 整数部が0の場合は "0" を Out[] に格納する。
⑤ 小数点を表す "." を Out[] に格納する。
⑥ 小数部を,小数第1位から第 Num 位まで,1けたずつ 10 進数字に変換し,
Out[] に格納する。
(5) Push() はスタックに1文字を積む関数,Pop() はスタックから1文字を取り出す関数である。 Int() は小数点以下を切り捨てる関数である。
(6) 配列の添字は0から始まり,文字型配列 Out[] の要素数は十分に大きいものとする。 また,プログラム中の各演算であふれは発生しないものとする。
(7) FloatFormat の変換例を図に示す。
設問1 プログラム中の に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
ア Fint - 10
イ Fint - Fint ÷ 10
ウ Fint - (Fint ÷ 10)× 10
エ Fint ÷ 10
オ (Fint ÷ 10)× 10
b に関する解答群
ア L = 0
イ L = 0 or Out[0] = "-"
ウ L = 0 or (L =1 and out[0] = "-")
エ L = 1
オ L = 1 and Out[0] ="-"
c,d に関する解答群
ア Fdec - Int(Fdec)
イ Fdec - Int(Fdec × 10)
ウ Fdec - Int(Fdec ÷ 10)
エ Fdec × 10
オ Fdec ÷ 10
設問2 次の記述中の( ) に入れる正しい答えを,解答群の中から選べ。
Float = -0.012,Num = 2 として FloatFormat を呼び出した場合,プログラム中のαの部分は(e) 回実行され, βの部分は(f) 回実行される。
解答群
ア 0 イ 1 ウ 2 エ 3 オ 4
Z社は Web を使った通信販売システムによって,会員に商品を販売している。会員は, Z社の提供する通信販売システムを利用して商品を購入する。今回,Z社では, 会員ごとの購入実績を用いて,購入の可能性が高いと判定された商品を表示する関連商品表示プログラムを 開発した。
〔通信販売システムの概要〕
(1) 通信販売システムはZ社の会員だけが利用でき,会員は一意の会員 ID をもつ。
(2) 通信販売対象の商品は商品表に登録されている。商品表のレコード様式を図1に示す。
商品表| 商品コード | 商品名 | 商品カテゴリ | 登録日時 | 商品価格 |
図1 商品表のレコード様式
(3) 会員は次の手順で,商品の購入操作を行う。
① 通信販売システムに会員 ID とパスワードを入力し,ログインする。
② 購入を希望する商品を検索する。
③ 購入する商品を指定し,購入数量を入力する。商品価格と購入数量の乗算が行われ,
購入金額に加えられる。購入する商品がほかにもある場合は,②に戻る。
④ 購入金額を確認し,支払方法を入力する。このときの日時が購入日時として記録される。
⑤ ログアウトする。
(4) 会員が支払方法を入力したとき,商品の購入が成立し,その際に一意な購入番号を 割り当てる。購入番号をキーとして,購入日時,会員 ID 及び購入金額を,購入表に登録する。 また,会員が購入した商品は,商品ごとに購入番号と商品コードをキー項目として購入明細表に登録する。
なお,1回のログインで同一商品を複数回に分けて指定したときには,その商品の 購入数量を合計し,1件のレコードとして購入明細表に登録する。購入表と購入明細表の レコード様式を図2に示す。
購入表
| 購入明細表
|
注 下線はキー項目を表す。
図2 購入表と購入明細表のレコード様式
〔関連商品表示プログラムの概要〕
(1) 新規登録商品の表示機能
会員がログインしたとき,その会員 ID で最近購入した商品と同一商品カテゴリの
商品の情報を,商品表から最大 10 件表示する機能である。ただし,表示する商品の情報は,
その会員の最も新しい購入日時以降に商品表に登録されたものだけとする。
① 最新購入実績の抽出
ログイン時に入力された会員 ID を用いて,購入表と購入明細表からその会員の最も
新しい購入の実績をすべて取り出す。
② 商品カテゴリの抽出
①で取り出した購入の実績のレコードと商品表のレコードを,商品コードを
キーとして突き合わせ,一致したときに商品表から商品カテゴリを取り出す。
③ 登録商品の抽出
②で取り出した商品カテゴリのすべてと,商品表の商品カテゴリを突き合わせ,
等しい商品カテゴリをもつ商品表のレコードをすべて取り出す。
④ 新規登録商品の表示
③の結果を基に,その会員の最も新しい購入日時以降に商品表に登録された
商品のうち,登録日時が新しいものから最大 10 件の情報を表示する。
(2) 検索した商品に関連する商品の表示機能
会員がある商品を検索したとき,その商品を既に購入した他会員が同時に購入した商品の情報を,
最大 10 件表示する機能である。ただし,表示する商品の情報はその会員が
まだ購入していない商品だけとする。
① 購入番号の抽出
検索した商品の商品コードを用いて,購入明細表からその商品コードをもつすべての
レコードの購入番号を取り出す。その購入番号とログイン時に入力された会員 ID を用いて,
購入表を検索し,他会員の購入番号だけを取り出す。
② 同時購入商品の抽出
①で取り出した他会員の購入番号ごとに購入明細表を検索し,その購入番号を
もつレコードをすべて取り出す。
③ 検索した商品の削除
②で取り出したレコードの商品コードと,会員が検索した商品の商品コードを
突き合わせ,検索した商品の商品コードをもつレコードをすべて取り除く。
④関連商品の抽出
③で残ったレコードの商品コードのすべてと商品表のレコードを,商品コードを
キーとして突き合わせ,一致したレコードを商品表から取り出す。
⑤ 購入済商品の削除
④の結果を基に,その会員が既に購入した商品の商品コードをもつレコードをすべて取り除く。
⑥ 関連商品の表示
⑤の結果を基に,登録日時が新しいものから最大 10 件の商品の情報を取り出し表示する。
設問1 図3中の中間表 A 及び中間表 B で保持する項目のうち,"商品カテゴリの抽出", "登録商品の抽出"で必要とする項目の組合せとして正しい答えを,解答群の中から選べ。
解答群
| 中間表 A | 中間表 B | |
| ア | 会員 ID | 商品カテゴリ |
| イ | 会員 ID | 商品名 |
| ウ | 商品コード | 商品価格 |
| エ | 商品コード | 商品カテゴリ |
| オ | 商品コード | 商品名 |
設問2 図3中の"最新購入実績の抽出"に関する次の説明中の に入れる正しい答えを,解答群の中から選べ。
ログイン時に入力された会員 ID を用いて,購入表からその会員の を1件取り出す。取り出したレコードの購入番号をもつレコードを購入明細表からすべて取り出す。取り出した結果を中間表 A のレコード様式に編集し,中間表 A に出力する。購入表に該当するレコードが存在しない場合は,何も出力しない。
解答群
ア 最も新しい購入日時をもつレコード<
イ 最も多い購入数量をもつレコード
ウ 最も大きい購入金額をもつレコード
エ 最も小さい購入金額をもつレコード
オ 最も古い購入日時をもつレコード
設問3 図4中の"購入済商品の削除"に関する次の説明中の( ) に入れる正しい答えを,解答群の中から選べ。
中間表 G から読み込んだレコードの商品コードを用いて,(b) を検索し,等しい商品コードをもつ(c) をすべて取り出す。 (c) ごとに(d)を検索し,ログインのときに入力した会員 ID をもつレコードが一つでもあれば,商品は既に購入済みと判定し,取り除く。
b,d に関する解答群
ア 購入表 イ 購入明細表 ウ 商品表
c に関する解答群
ア 会員 ID イ 購入番号 ウ 商品コード
〔プログラムの説明〕
引数の配列 in に格納された8文字×6文字の文字パターンを,引数 invtype の値 (1~4)に従って,回転又は反転して標準出力に出力する関数 invert である。
(1) 引数 invtype の値と文字パターンの回転又は反転種別の関係は,表のとおりである。
表 引数 invtype の値と文字パターンの回転・反転種別| invtype | 回転・反転種別 |
| 1 | 90 度右回転 |
| 2 | 90 度左回転 |
| 3 | 上下反転 |
| 4 | 左右反転 |
(2) 関数 main の実行結果をまとめた文字パターンの印字例を図に示す。
(3) 回転及び反転操作の手順を,8行6列の配列 dat[8][6] を例として説明する。
90 度回転では,回転後は行と列の数が入れ替わることになる。
90 度右回転の場合には,次に示すように先頭の行データ群は,右端の列データ群に移る。次の行データ群が右から二つ目の列に移り,同様の手順で移動が進み,最後に最下段の行データ群が左端の列データ群に移る。
先頭行: dat[0][0], dat[0][1], ... , dat[0][4], dat[0][5]
↓ ↓ ↓ ↓
右端列: dat[0][7], dat[1][7], ... , dat[4][7], dat[5][7]
90 度左回転の場合には,先頭の行データ群は,左端の列データ群 dat[5][0], dat[4][0], ..., dat[1][0], dat[0][0] に移る。次の行データ群が左から二つ目の列に移り,同様の手順で移動が進み,最後に最下段の行データ群が右端の列データ群に移る。
上下反転では,先頭の行データ群は,最下段の行データ群 dat[7][0], dat[7][1], ..., dat[7][41, dat[7][5] に移る。次の行データ群が下から二つ目の行に移り,同様の手順で移動が進み,最後に最下段の行データ群が先頭の行データ群に移る。
左右反転では,行内で入れ替わるので,先頭の行データ群は,dat[0][5], dat[0][4], ..., dat[0][1], dat[0][0] に移る。以降の行データ群も同様の手順で行内で順序が入れ替わる。
[プログラム]
設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
ア invtype == 1
イ invtype == 2
ウ invtype == 3
エ invtype == 4
オ (invtype == 1) || (invtype == 2)
力 (invtype == 3) || (invtype == 4)
b,c に関する解答群
ア in[RSZ - i - 1][j]
イ in[RSZ - j - 1][i]
ウ in[i][CSZ - j - 1]
エ in[i][RSZ - j - 1]
オ in[j][CSZ - i - 1]
力 in[j][RSZ - i - 1]
〔プログラムの説明〕
関数 calc_carriage は,直方体の配送物の配送種別及び配送料金を求めるプログラムである。
(1) 関数 calc_carriage の引数は,次のとおりである。
weight: 配送物の重量(単位はグラム)
size: 配送物の大きさ(縦,横,高さの合計,単位は cm )
dist_mode: 配送先までの距離区分(0: 近距離,1: 中距離,2: 遠距離)
class: 配送種別
price: 配送料金(単位は円)
(2) 配送種別は,配送物の重量及び大きさから,1, 2, 3, -1, -2 のいずれか一つの値に定まる。 配送種別が -1 又は -2 の配送物は,受け付けない。
(3) 配送料金は,配送種別ごとに用意された計算式によって求められる。
〔プログラム〕
解答群
ア 1,600 イ 1,750 ウ 1,900 エ 2,100 オ 2,300
設問2 配送種別及び配送料金に関する次の記述中の( ) に入れる正しい答えを,解答群の中から選べ。
(1) 重量 600 グラム,大きさ 180cm の配送物を送る場合,配送種別は(b) となる。
(2) 重量 3,000 グラム,大きさ 180cm の配送物を送る場合,配送種別は(c) となる。
(3) 重量 12,000 グラム,大きさ 180cm の配送物を送る場合,配送種別は(d) となる。
(4) 重量 80 グラム,大きさ 30cm の配送物を中距離の場所に送る場合,配送料金は(e) 円となる。
(5) 重量 400 グラム,大きさ 30cm の配送物を中距離の場所に送る場合,配送料金は(f) 円となる。
b~d に関する解答群
ア -2 イ -1 ウ 1 エ 2 オ 3
e,f に関する解答群
ア 80 イ 150 ウ 250
エ 500 オ 1,000 カ 2,000