H20春午後の解答と解説
X社では,ハードディスク装置である製品Aと製品Bを生産している。製品Aと 製品Bの仕様を表に示す。
表 製品Aと製品Bの仕様
| 仕様 | 製品A | 製品B |
| 記憶容量 | 60G バイト | 80G バイト |
| 回転数 | 4,200 回/分 | 5,400 回/分 |
| 平均位置決め時間 | 14.0 ミリ秒 | 12.0 ミリ秒 |
| データ転送速度 | 20M バイト/秒 | 30M バイト/秒 |
注 1G バイト=1,000M バイト, 1M バイト=1,000k バイト
設問1
次の記述中の ( ) に入れる正しい答えを, 解答群の中から選べ。 解答は小数第2位以下を切り捨てるものとする。
製品Aでは,平均回転待ち時間は(a) ミリ秒であり, 100k バイトのデータを転送する時間は(b) ミリ秒である。
一方,製品Bでは,平均回転待ち時間が 5.5 ミリ秒であり,100k バイトのデータを転送する時間が 3.3 ミリ秒であることから,100k バイトの平均アクセス時間 (平均位置決め時間+平均回転待ち時間+データ転送時間)は, 製品Aに比べて(c) ミリ秒短い。
解答群
ア 3.3 イ 5.0 ウ 5.3 エ 5.5 オ 7.1 カ 11.1 キ 14.2
設問2
次の記述中の ( ) に入れる正しい答えを, 解答群の中から選べ。解答は小数第2位以下を切り捨てるものとする。
読取り時のアクセス時間を短縮するために,ディスクキャッシュを搭載した製品Cを開発した。 ディスクキャッシュヘの書込みと読取りは,2k バイトのブロック単位で行う。 あるブロックに対するデータの読取り要求があった場合,ディスクキャッシュを 検索し,ディスクキャッシュ上にそのブロックのデータがあればディスクキャッシュ上の データを返す。ディスクキャッシュ上にそのブロックのデータがなければ, 磁気ディスクからデータを読み込み,データを返すと同時に ディスクキャッシュ上の最も古いブロックのデータと交換する。
ディスクキャッシュを検索する平均時間は 1.0 ミリ秒,ディスクキャッシュの 平均ヒット率は 0.4 ,デイスクキャッシュからの1ブロック当たりのデータの 平均読取り時間は 0.4 ミリ秒とする。ディスクキャッシュがヒットしなかったとき, 磁気ディスクからの1ブロック当たりのデータの平均読取り時間は,ディスクキャッシュ上の 最も古いブロックのデータと交換する時間も含めて 17.0 ミリ秒とする。このとき, 製品Cの1ブロック当たりの読取り時の平均アクセス時間は(d) ミリ秒となる。
解答群
ア 7.0 イ 8.0 ウ 10.3 エ 11.3 オ 13.2 カ 14.2〔プログラムの説明〕
長さが Textlen の文字列 SourceText の中で,長さが Patlen の文字列 Pattern と一致する部分の文字列(以下,部分文字列という)の出現回数を数える 関数 MatchCounter である。ここで, 0 < Patlen ≦ Textlen である。
(1) MatchCounter の処理手順は,次のとおりである。
① 一致する部分文字列の出現回数を数える変数 Counter の値を0に初期化する。
② SourceText の比較開始位置を先頭から順に1文字ずつ後ろにずらしながら, その比較開始位置から始まる長さ Patlen の文字列と Pattern が一致するかどうかを調べ, 一致したら出現回数 Counter の値に1を加算する。
③ Counter の値を返す。
(2) MatchCounter の引数と返却値の仕様を表に示す。文字列は文字型配列の各要素に 1文字ずつ格納されている。また,各配列の添字は0から始まる。
表 MatchCounter の引数と返却値の仕様
| 引数/返却値 | データ型 | 入力/出力 | 意味 |
| SourceText[ ] | 文字型 | 入力 | 検索される文字列が格納されている1次元配列 |
| Textlen | 整数型 | 入力 | 検索される文字列の長さ |
| Pattern[ ] | 文字型 | 入力 | 検索する文字列が格納されている1次元配列 |
| Patlen | 整数型 | 入力 | 検索する文字列の長さ |
| 返却値 | 整数型 | 出力 | SourceText の中で Pattern と一致した部分 文字列の出現回数 |
〔プログラム〕
設問1
プログラム中の ( )に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
ア i + Patlen ≦ Textlen イ i + Patlen < Textlenウ i + Textlen ≦ Patlen エ i + Textlen < Patlen
b に関する解答群
ア SourceText[j] = Pattern[k] イ SourceText[j] = Pattern[k]
ウ SourceText[k] = Pattern[i] エ SotrceText[k] = Pattern[j]
設問2
Pattern と一致した部分文字列は以降の検索対象から外すように, このプログラムを変更する。
例えば, SourceText とPattern が図に示す文字列であるとき,プログラムでは, 比較開始位置を①,②,③,...と移動して,一致する部分文字列の出現回数を求めるので, 下線の部分文字列と二重下線の部分文字列がともに数えられる。 これに対して,一致した部分文字列を検索対象から外す場合は,比較開始位 置を①,②,⑤,...と移動するので,二重下線の部分文字列は数えられない。
このとき,プログラム中のα部分の変更内容として正しい答えを,解答群の中から選べ。
解答群
Y社では,業務系システムが使用する業務データを磁気テープにバックアップすることを 検討している。
この業務系システムのサービス運用時間は,営業日(月曜日~土曜日)の 9:00~19:00 である。 全体で 18G バイトからなる業務データは,共通ファイルと,月曜日~土曜日の各曜日に 利用する六つの曜日ファイル群からなる。各営業日には,共通ファイル全体( 0.6G バイト)及び その曜日の曜日ファイル群の一部(場所は不定で 0.6G バイト)の計 1.2G バイトを更新する。 データの更新状況を図に示す。ここで, 1G バイト=1,000M バイトとする。
このシステムにおいて,バックアップ方式を次のとおり検討している。
(1) 週1回,日曜日にすべての業務データのバックアップ(フルバックアップ)を実施する。
(2) 月曜日~土曜日に実施する部分バックアップは,次のいずれかの方式とする。
① 方式A
日曜日のフルバックアップの時点以後に更新された業務データをすべてバックアップする。
② 方式B
前日のバックアップの時点以後に更新された業務データだけをバックアップする。
(3) その他の条件は,次のとおりである。
① バックアップは,その日の業務終了後に実施し,その日のうちに終了する。
② 磁気ディスクから磁気テープヘのバックアップの速度は 2M バイト/秒, 磁気テープから磁気ディスクヘのリストアの速度も同じく 2M バイト/秒である。
③ フルバックアップと各営業日の部分バックアップはそれぞれ別の磁気テープに 保存することとし,それぞれのバックアップデータは1本に収まるものとする。
設問1
バックアップ時間に関する次の記述中の( ) に入れる正しい答えを, 解答群の中から選べ。
日曜日のフルバックアップに要する時間は 150 分である。
月曜日~土曜日の部分バックアップは,方式Aの場合で最も時間がかかる曜日 には(a)分、方式Bの場合で毎日(b)分かかる。
なお,磁気テープはバックアップ開始までにセットされているものとする。
解答群
ア 5 イ 10 ウ 30 エ 35 オ 145 カ 150
設問2
障害発生時のデータ復旧に関する次の記述中の( )に 入れる正しい答えを,解答群の中から選べ。
障害発生時のデータ復旧に使用する磁気テープの最大本数は,フルバックアップされた 磁気テープを含めると,方式Aでは(c)本、方式Bでは(d)本である。
方式Aを採用した場合,復旧には最長で(e)分かかる。
なお,磁気テープの交換時間は3分とする。また,復旧の時間には,最初の磁気テープを セットする時間と最後の磁気テープを取り出す時間は含まない。
c,d に関する解答群
ア 1 イ 2 ウ 6 エ 7 オ 8
e に関する解答群
ア 38 イ 183 ウ 185 エ 188 オ 193
〔プログラムの説明〕
(1) リストを作成するのに用いる副プログラム MakeList と,作成したリストを 逐次探索する関数 OrganizingSearch である。OrganizingSearch は, 見つかった要素がリストの先頭にくるように要素を並べ替える。
(2) リストは構造体の配列で表現する。構造体の定義は,次のとおりである。
構造体型: List[100] {
整数型: Next = -1, /* 次の要素の添字,初期値は-1 */
文字列型: Value /* 要素の値,可変長文字列 */
}
ここで,List は大域変数であり,配列の添字は0から始まる。添字が n の要素 List[n] の Next と Value は, それぞれ List[n].Next, List[n].Value で表す。
(3) 副プログラム MakeList は,1回の呼出しで,引数の文字列を値とする要素を作成し, リストの最後に追加する。MakeList は探索対象のリストが完成するまで 続けて呼び出される。整数型の大域変数 Listsize には,作成したリストの要素数を 格納する。リストの要素は,List[0] から,List[Listsize-1] に格納する。
リストに登録する要素の個数は,配列の大きさ以下とする。また, リストの先頭の要素が格納されている配列 List の添字は, 整数型の大域変数 First に格納する。First の初期値は-1とする。 リストが空の状態から,MakeList の引数として,'cpu','ram','dos','vpn','dvd' を 順に与えて作成したリストの例を図1に示す。
(4) 副プログラム MakeList の引数の仕様を表1に示す。
表1 MakeList の引数の仕様
| 引数 | データ型 | 入力/出力 | 意味 |
| Mvalue | 文字列型 | 入力 | リストに追加する文字列 |
(5) 関数 OrganizingSearch は,リストの先頭から引数で与えられた文字列を探索し, 文字列が見つかれば,見つかった要素がリストの先頭になるようにリストの要素を並べ替え, 見つかった要素が格納されている配列 List の添字を返却する。 見つからなければ-1を返却する。図1のリストの例で,文字列 'dos' を見つけた 直後のリストの状態を図2に示す。この例では,OrganizingSearch の返却値は2となる。
<表2 OrganizingSearch の引数と返却値の仕様
| 引数/返却値 | データ型 | 入力/出力 | 意味 |
| Svalue | 文字列型 | 入力 | 探索する文字列 |
| 返却値 | 整数型 | 出力 | Svalue と一致した文字列を Value として
もつ要素の添字 一致する要素がなければ-1 |
〔プログラム〕
設問1 プログラム中の( ) に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
ア First イ First+1 ウ First-1 エ Listsize オ Listsize+1 カ Listsize-1
b~d に関する解答群
ア Current イ First ウ List[Current].Next エ List[First].Next オ List[Temp].Next カ Temp
設問2
図3に示すリストに対して,文字列 'cgi','cpu','dos' の順に探索した 場合,プログラム中の α の部分が実行された直後の List[Temp].value の値を 順に並べたものとして正しい答えを,解答群の中から選べ。
解答群
ア cgi,cpu,usb
イ usb,cgi,cpu
ウ usb,cgi,usb,cgi,cpu,usb,cgi,cpu,dos
エ usb,cgi,usb,cpu,cgi
オ usb,cgi,usb,cpu,cgi,usb
カ usb,usb,cgi,usb,cgi,cpu
小売企業のA社には,本社と 20 か所の店舗がある。店舗では商品を販売しており, 販売結果は販売データとして本社にある販売システムで管理されている。今回,A社では, 販売データを基に販売構成一覧を作成することにした。
〔販売構成一覧作成プログラムの概要〕
(1) 販売データは,販売番号と商品コードをキーとして販売ファイルに記録される。 販売番号は,1回の販売ごとに割り当てる全社で一意となる番号である。 販売ファイルのレコード様式を図1に示す。
| 販売番号 | 商品コード | 店舗コード | 販売日時 | 販売数 | 販売金額 |
図1 販売ファイルのレコード様式
(2) 商品名,商品カテゴリ名及びメーカコードは,商品コードをキーとして商品ファイルに 記録されている。商品ファイルのレコード様式を図2に示す。
| 商品コード | 商品名 | 商品カテゴリ名 | メーカコード |
図2 商品ファイルのレコード様式
(3) 販売構成一覧には,商品カテゴリを集計種別として商品カテゴリ名(項目)ごと に集計したものと,メーカを集計種別としてメーカコード(項目)ごとに集計した ものとの2種類がある。集計種別を商品カテゴリ,すなわち集計する項目(以下, 集計項目という)を商品カテゴリ名として集計したときの販売構成一覧の例を,図3に示す。
(4) 利用者は,販売データの集計期間を指定する。指定した期間の販売データは必ず 1件以上あるものとする。また,利用者は,集計種別として商品カテゴリ又は メーカのどちらかを指定する。
(5) 販売構成一覧の作成手順は,次のとおりである。
① 集計期間の販売データを販売ファイルから抽出し,商品コードの昇順に並べ替える。
② ①の結果の販売データ及び商品ファイルのレコードを,商品コードをキーと して突き合わせる。キーが一致した場合,商品ファイルのレコードと販売データ のレコードから必要な項目の値を取り出して,それらを中間ファイルAに出力する。
③ 中間ファイルAのレコードから,販売数と販売金額の値を取り出す。さらに, 集計項目の値を取り出し,それら二つの値からなるレコードを中間ファイルBに出力する。
④ 中間ファイルBのレコードを並べ替えて,集計項目ごとに販売数と販売金額を 合計し,中間ファイルCに出力する。中間ファイルBの全レコードの販売金額を 合計し,中間ファイルDに出力する。
③ 集計項目ごとに合計した販売金額の高い順に順位を付ける。
⑥ 集計項目ごとに合計した販売金額の,すべての販売金額の合計に対する百分率を 算出する。これを,販売構成一覧で表示する集計項目ごとの構成比率とする。
④ 販売構成一覧の形式に合わせて作表する。
(6) 中間ファイルAと中間ファイルBのレコード様式を図4に示す。
中間ファイルA
| 商品カテゴリ名 | メーカコード | 販売数 | 販売金額 |
中間ファイルB
| 集計項目 | 販売数 | 販売金額 |
図4 中間ファイルAと中間ファイルBのレコード様式
(7) 販売構成一覧の作成の流れを図5に示す。
設問1
図5の"利用者指定値の読込み"で入力する項目として正しい答えを,解答群の中から選べ。
解答群
ア 集計開始日付,集計終了日付
イ 集計開始日付,集計終了日付,構成比率
ウ 集計開始日付,集計終了日付,集計種別
エ 集計開始日付,集計終了日付,順位
設問2
図5の"整列2"と"整列3"で行う並替えのキー項目として,図5中の( ) に入れる正しい答えを,解答群の中から選べ。
解答群
ア 合計した販売金額 イ 合計した販売数 ウ 集計項目
エ 商品カテゴリ名 オ メーカコード
設問3
次の記述中の( ) に入れる正しい答えを,解答群の中から選べ。
利用者が指定できる集計種別として店舗を追加し,店舗コード別販売構成一覧を作成する場合を考える。図5中の α 部分を図6に置き換えることで,既存の処理を変更せずに店舗コード別販売構成一覧が作成できる。図5の "抽出した販売データ"の項目には店舗コードはあるが,中間ファイルAには店舗コードがない。中間ファイルBの集計項目には,店舗コードの値が必要である。そこで,集計種別が店舗の場合に実行する処理として(c) を追加する。その実行条件は(d) である。
c に関する解答群
ア 集計期間のレコードの再抽出
イ 順位の付与
ウ 商品ファイルとの突合せ
エ 中間ファイル B の様式への変換
オ 店舗コードの昇順に整列
d に関する解答群
ア (集計種別="商品カテゴリ") AND (集計種別="メーカ")
イ (集計種別≠"商品カテゴリ") OR (集計種別≠"メーカ")
ウ 集計種別="店舗"
エ 集計種別≠"店舗"
設問4
次の記述中の( ) に入れる正しい答えを,解答群の中から選べ。解答は,重複して選んでもよい。
販売構成一覧の表示について,利用者から次の要求①~③が発生した。
① 順位が 10 位までのデータだけが表示されるようにする。
② 構成比率で5%以上のデータだけが表示されるようにする。
③ 順位が同じデータの場合,販売数で降順に表示されるようにする。
要求①~③を最も効率よく満たす方法を考えると要求①に対しては,図5中の(e) の処理に,順位の値が 10 以下のレコードだけを出力する機能を追加すればよい。また,要求②に対しては,図5中の(f) の処理に,構成比率の値が5以上のレコードを出力する機能を追加すればよい。一方,要求③に対しては,第1キーを順位の昇順,第2キーを販売数の降順として,読み込んだレコードを並べ替えて出力する。 "整列4"を,新規の処理として図5中の(g) の直前に追加すればよい。
解答群
ア 構成比率の算出 イ 集計 ウ 順位の付与
エ 整列2 オ 整列3
〔プログラムの説明〕
関数 markup_referenceは,文書から参考資料名を抜き出して,参照番号に置き換えるとともに,文書の末尾に参考資料名の一覧を追加して,出力するプログラムである.
(1)元の文書中では、参考資料名は文字"\"で囲まれている。文字"\"がこれ以外の用途で使用されることはない.
(2)参照番号は,元の文書中の異なる参考資料名に対して,出現順に1から順に割り 当てる番号である。
(3)プログラムの実行例は,図のとおりである。図中の,処理後の文書の例に示すように,参考資料名の一覧は、"References"以降に,参照番号と参考資料名を対にして出力する。
(4)参考資料名は255文字以下であり,途中で改行されることはない。個数は50以下である。
(5)元の文書に含まれる文字‡も次のとおりである。
① 英数字
② 図形文字( ! " # % & ' ( ) * + , - . / : ; < = > ? [ ] ^ _ { | } )
③ 空白文字
④ 改行文字
(6)関数markup_referenceの引数は、次のとおりである。ただし,ファイルの名称に誤りはないものとする。
in_filename 元の文書が格納されているファイルの名称
out_filename 処理後の文書を格納するファイルの名称
[プログラム]
}
設問 プログラムの中の( )に入れる正しい答えを、解答群のなかから選べ
〔プログラムの説明〕
(1)正の有限小数又は循環小数を既約分数(分子と分母がともに整数で共通の約数をもたない分数)に変換するプログラムである.
(2)有限小数とは,小数点以下のけた数が有限けたである小数をいう。一方、循環小数とは、小数鼓の特定の位置以降は、同じ数字列が無限に繰り返される小数鼓をいう。
例えば、3/14は0.2142857142857...と表記され.142857が繰り返されるので循環小数である。この小数部における繰り返し部分を循環節と呼ぷ。
(3)プログラムでは、循環節を除く小数部のけた数がn、循環節のけた数がkの場合、その小数を10(n+k) 倍したものから10n 倍したものを引くと、整数となることを用いて既約分数への変換を行う。
3/14の小数表記を図に示す。
X=0.2142857142857...
↑ ↑__↑___循環節
|________循環節を除く小数部
この場合,n=1,k=6なので,10(1+n) Xー101 Xを計算すると次のとおりになる。
10000000X=2142857.142857142857...
- 10X= 2.142857142857...
9999990X=2142855
したがって,X=2142855/9999990となる。さらに、,分子と分母の最大公約数で約分する
と,既約分数であるX=3/14を得る。
(4)プログラムヘの入力では,循環節"{"と"}"'で囲んで表す。例えば,0.2142857142857...は0.2{142057}と入力する。
(5)プログラムへは、整数(小数点を含まない)を入力することもできる。
(6)プログラムの実行例を表に示す。
(7)プログラム中で定義されている関数の仕様は,次のとおりである。
void tofraction{char *str} ;
引数:基数,有限小数,循環小数のいずれかを表現した文字列str
機能:strを既約分数に変換して表示する。strに含まれる数字は9個以下とする.また,誤った文字列が与えられることはない。
(8)次の関数があらかじめ定義されているものとする。
①long gcd(long a, long b);
引数:自然数a,b
返却値:aとbの最大公約数
②long power10(int num);
引数:0~9の整数num
返却値:10のnum乗
(9)次のライブラリ関数を用いる。
int isdigit(int c);
返却値:文字cが10進数字であれば0以外,そうでなければ0
[プログラム]
設問
プログラムの中の()に入れる正しい答えを、解答群の中から選べ。