問問1 設問1
WebサーバとDBサーバについて,図1中の配置場所の組合せとして適切な答えを,解答群の中から選べ。
- ア Webサーバ:サーバ群X、DBサーバ:サーバ群X
- イ Webサーバ:サーバ群X、DBサーバ:サーバ群Y
- ウ Webサーバ:サーバ群Y、DBサーバ:サーバ群X
- エ Webサーバ:サーバ群Y、DBサーバ:サーバ群Y
基本情報技術者 2016年 秋期 午後の問題文32問です。図・表・別冊資料と正解は掲載していませんので、出典の公表資料またはアプリでご確認ください。
問1 販売支援システムの情報セキュリティに関する次の記述を読んで,設問1~3に答えよ。 中堅の商社である A 社では,営業員が顧客先で営業活動を行い,自社に戻ってから見積書を作成している。 この度,営業員がタブレット端末(以下,タブレットという)を携帯し,顧客先で要求を聞きながら,タブレットを使って見積書を作成し,その場で顧客に提示できる販売支援システムを構築することにした。 営業員は,タブレットの Web ブラウザからインターネット経由で HTTP over TLS(以下,HTTPS という)によって販売支援システムにアクセスする。このとき,営業員は,社員 ID とパスワードを入力してログインする。 〔販売支援システムの構成〕 (1) 販売支援システムは次のサーバで構成され,A 社のネットワークに設置される。 ① リバースプロキシサーバ(以下,RP サーバという)1 台 ② アプリケーションソフトウェアが稼働する Web サーバ 2 台 ③ 見積書作成に必要なデータを格納するデータベースサーバ(以下,DB サーバという)1 台 (2) Web サーバ 2 台はクラスタリング構成にして,1 台が故障してもサービスが継続できるようにする。 (3) DB サーバへのアクセスの監視は,PC と同じ LAN にある監視サーバで行う。 (4) インターネットから販売支援システムへの通信は,RP サーバを経由して行う。 RP サーバは,HTTPS を HTTP に変換し,販売支援システムの他のサーバと,HTTP で通信する。 A 社のネットワーク構成を図1に示す。 販売支援システムに関わる通信経路について,通信経路で利用するプロトコル及び宛先ポート番号を表1に示す。また,FW におけるフィルタリングの設定を表2に示す。 図1 A社のネットワーク構成。タブレットはインターネットにつながる。A社のFWはインターネット、DMZ、LANに接続される。DMZにはRPサーバとサーバ群X、LANにはPCとサーバ群Yが接続される。 表1 通信経路で利用するプロトコル及び宛先ポート番号 通信経路|プロトコル|宛先ポート番号 監視サーバからDBサーバ|監視専用|1600 タブレットからRPサーバ|HTTPS|443 RPサーバからWebサーバ|HTTP|80 WebサーバからDBサーバ|DB専用|1552 表2 FWにおけるフィルタリングの設定 項番|送信元|宛先|宛先ポート番号|動作 1|任意|RPサーバ|443|許可 2|任意|DBサーバ|1552|許可 3|任意|任意|任意|拒否 注記 項番が小さいものから順に突き合わせ,最初に一致したものが適用される。
WebサーバとDBサーバについて,図1中の配置場所の組合せとして適切な答えを,解答群の中から選べ。
表2に示したFWにおけるフィルタリングの設定では,インターネットからDBサーバに直接アクセスされるおそれがある。そこで,FWのフィルタリングの設定を変更することにした。フィルタリングの設定を変更する内容として適切な答えを,解答群の中から選べ。
A社では,システムを構築する際に,情報セキュリティの3要素である機密性,完全性及び可用性を確保するための対応を整理して,情報セキュリティ担当者の確認を受けることになっている。そこで,次の(i)~(vi)に示す販売支援システムに関する対応と情報セキュリティの3要素との関連を表3にまとめた。表3中の空欄に入れる適切な答えを,解答群の中から選べ。 表3 情報セキュリティの3要素との関連 空欄 3要素 a 機密性 b 完全性 c 可用性 a~cに関する解答群 ア (i) DBサーバ中のデータの正規化 イ (ii) RPサーバとWebサーバとの間でのHTTPの利用 ウ (iii) Webサーバのクラスタリング エ (iv) コンテンツが改ざんされていないことの定期的な確認 オ (v) 社員IDとパスワードによるログイン カ (vi) タブレットの利用
問2 コンパイラの字句解析と構文解析に関する次の記述を読んで,設問1,2に答えよ。 コンパイラの字句解析では,原始プログラムを文字列として読み込んで,文字列中の文字の並びが字句として認識できるかどうかを解析し,その結果を字句の並びとして出力する。字句とは,原始プログラム中の名前や定数など,構文規則で規定されている文字の並びの最小単位である。構文解析では,字句解析が出力した字句を読み込みながら,字句の並びが構文規則で規定されている文法に合っているかどうかを解析し,その結果を構文木などの中間表現で出力する。 字句規則の表記 字句規則の表記では,「→」は左側の構文要素が右側で定義されることを示す。「|」は「又は」を意味する。「[」と「]」で囲まれた部分は省略可能を意味する。 符号なし浮動小数点定数の構文規則 「符号なし浮動小数点定数」の構文規則: 符号なし浮動小数点定数 → 小数点定数 [指数部] | 数字列 指数部 小数点定数 → [数字列] . 数字列 | 数字列 . 指数部 → e [符号] 数字列 数字列 → 数字 | 数字列 数字 符号 → + | − 数字 → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 図1 符号なし浮動小数点定数の構文規則に対する状態遷移図 図1「符号なし浮動小数点定数の構文規則に対する状態遷移図」。状態0が初期状態、状態3と状態6が二重円で示された最終状態。文字は左から右へ1文字ずつ処理する。遷移は次のとおり:状態0から状態1へ「数字」、状態0から状態2へ「a」。状態1は「数字」で自己遷移し、状態1から状態3へ「.」、状態1から状態4へ「b」。状態2から状態3へ「数字」。状態3は「数字」で自己遷移し、状態3から状態4へ「e」。状態4から状態5へ「符号」、状態4から状態6へ「数字」。状態5から状態6へ「数字」。状態6は「数字」で自己遷移する。円内の数字は状態番号を表す。 字句解析の例 例として「123.」や「123.4e−1」などの符号なし浮動小数点定数を扱う。 状態遷移図による字句解析 構文規則は状態遷移図でも表現することができる。字句解析では、文字の並び中の文字を読み込みながら初期状態から状態を遷移させ、文字の並びを読み終えたときの状態が最終状態ならば、その文字の並びは符号なし浮動小数点定数であると判定する。 式の構文解析と図2の説明 構文規則で規定されている式を例として、式の構文解析を考える。式の構文解析では、式を構成する演算子や名前などの字句を式の左から右に読み込みながら、字句の並びが構文規則で規定されている文法に合っているかどうかを解析し、その結果を構文木として出力する。2項演算子op、名前v、w、xを構成要素とする式「v op w op x」は、演算順序①、②になるように解釈される。① vとwに対して演算opを施す。② ①の結果とxに対して演算opを施す。図2はこの式の構文木と演算順序の例であり、深さ優先でたどりながら、帰り掛けに節の演算子を評価する。 式の構文規則と例1 式の構文規則では、式の構文だけでなく演算子の優先順位も規定する。2項演算子op1とop2、名前v、w、x、y、zを構成要素とする。演算子op1の優先順位は演算子op2の優先順位よりも高い。構文規則:式 → 項 | c。項 → 因子 | 項 op1 因子。因子 → 名前。名前 → v | w | x | y | z。例1:v op2 w op1 x。 括弧を含む式の構文規則と例2 括弧を含む式では、括弧内の演算の優先順位は括弧外の演算より高い。この場合の因子の構文規則は「因子 → 名前 | ( d )」。例2:v op2 w op1 (x op2 y) op1 z。例2で示す式を解析したときに出力される構文木は、選択肢として図示されている。
字句解析の処理について,次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。 a、bに関する解答群 ア . イ e ウ 指数部 エ 数字 オ 符号
構文解析の処理について,次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。 cに関する解答群 ア 式 イ 式 op2 因子 ウ 式 op2 項 エ 式 op2 名前 dに関する解答群 ア 因子 イ 項 ウ 式 エ 名前 eに関する解答群 ア op2を根とし、左の子がv、右の子がop1。右の子op1の左の子がw、右の子がop1。その右の子op1は左の子がop2(子はx、y)、右の子がz。 イ op1を根とし、左の子がop2(子はv、w)、右の子がop1。その右の子op1は左の子がop2(子はx、y)、右の子がz。 ウ op2を根とし、左の子がv、右の子がop1。その右の子op1は左の子がop1(左の子w、右の子がop2(子はx、y))、右の子がz。 エ op1を根とし、左の子がop2(左の子v、右の子がop1(左の子w、右の子がop2(子はx、y)))、右の子がz。
問3 従業員の通勤情報を管理する関係データベースに関する次の記述を読んで、設問1~4に答えよ。 Y社では、従業員の1か月分の交通費の合計を通勤手当として支給している。交通費は、通勤に公共の交通機関を利用している場合は通勤経路の各区間運賃であり、自家用車を利用している場合は燃料費などの諸経費である。 通勤手当は図1に示す表で管理していたが、より詳細に情報を管理するために、図2のとおり変更した。下線付きの項目は、主キーを表す。 図1 図1 変更前の表構成とデータ格納例。従業員表の列は,従業員番号(主キー),氏名,住所,…,通勤手当。例として,00980125,情報太郎,東京都文京区○○○,…,10650 が示されている。ほかの行は省略記号で示されている。 図2 図2 変更後の表構成とデータ格納例。 従業員表の列は「従業員番号」「氏名」「住所」「…」。例の行は00980125、「情報太郎」、「東京都文京区○○○」、「…」。 通勤費表の列は「従業員番号」「交通機関コード」「交通費」。例の行は00980125・B02・4800、および00980125・S01・5850。後続行は省略記号で示されている。 交通機関表の列は「交通機関コード」「交通機関名」。例としてB01・○○バス、B02・△△バス、C01・自家用車が示され、ほかは省略記号で示されている。 下線付き項目は主キーを表す。図では、従業員表の従業員番号、通勤費表の従業員番号と交通機関コード、交通機関表の交通機関コードに下線が付いている。 図3 図3 講習会受講表とデータ格納例。列は「従業員番号」「受講日」。例の行は00980125・20160420。後続行は省略記号で示されている。
変更後の表を用いて通勤手当に関するデータを集計する。次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。 従業員ごとの通勤手当を求めるには,[a]グループ化して,集合関数[b]を用いればよい。また,交通機関ごとの利用者数を求めるには,[c]グループ化して,集合関数[d]を用いればよい。 a、cに関する解答群 ア 交通機関表を交通機関コードで イ 従業員表を従業員番号で ウ 通勤費表を交通機関コードで エ 通勤費表を従業員番号で b、dに関する解答群 ア AVG イ COUNT ウ MAX エ SUM
通勤にバスを利用している従業員の従業員番号と交通機関名を表示する。ここで、交通機関コードは3文字の固定長文字列であり、バスの交通機関コードだけが文字“B”で始まる。次のSQL文の空欄に入れる正しい答えを、解答群の中から選べ。 SELECT 通勤費表.従業員番号, 交通機関表.交通機関名 FROM 通勤費表, 交通機関表 WHERE 通勤費表.交通機関コード = 交通機関表.交通機関コード AND [e]
従業員の通勤圏内に新しい路線が開通することになった。この影響を確認するために、通勤経路が変わる可能性がある従業員の従業員番号を抽出することにした。同じ従業員番号は一つだけ表示する。新しい路線が影響する交通機関名は「情報都市線」と「駒込バス」であり、いずれも同名の交通機関名は他にないものとする。次のSQL文の空欄に入れる正しい答えを、解答群の中から選べ。 SELECT 通勤費表.従業員番号 FROM 通勤費表 WHERE [f]
Y社では、毎年4月に交通安全講習会を開催しており、通勤に自家用車(交通機関コード“C01”)を利用している従業員には受講を義務付けている。通勤に自家用車を利用していない従業員の受講は任意である。交通安全講習会を受講した従業員は、図3に示す講習会受講表で管理している。受講していない従業員のレコードは存在しない。 通勤に自家用車を利用している従業員のうち、2016年4月20日に開催された交通安全講習会を受講していない従業員の従業員番号を表示する。次のSQL文の空欄に入れる正しい答えを、解答群の中から選べ。 SELECT 通勤費表.従業員番号 FROM 通勤費表 WHERE 通勤費表.交通機関コード = 'C01' AND [g]
問4 Web画面の表示に要するデータ転送時間に関する記述。D社は自社のWebサイトをインターネット上に公開している。D社では、Web画面1ページを構成する全データの転送時間を5秒以内に収める基準を定めており、個々のデータの転送時間はD社が定めたデータ転送時間計算モデルに基づいて算出する。モデルでは、ターンアラウンドタイム(ブラウザとサーバ間で短いメッセージが往復するのに掛かる時間)t=0.005秒、実効転送速度(サーバとブラウザ間におけるデータ転送の速さ)e=1×10^6バイト/秒とする。ブラウザはキャッシュ機能をもち、Web画面表示に必要なデータがキャッシュされているときは、サーバにそのデータの再転送の要否確認を要求する。再転送が必要な場合は応答として当該データが転送される。ブラウザがサーバに要求を送信し始めてから、要求に対する結果の受信が完了するまでの時間は表1のとおりである。表1に関わる通信処理は逐次実行され、複数の通信処理が並行して行われることはない。また、表1に示した時間以外は無視する。 D社は、自社が取り扱う商品の情報を画像付きで一覧表示する機能をWebサイトに付加することにした。一覧表示画面1ページで表示する商品情報の最大数を、その画面を構成するデータの転送時間に基づいて決定する。一覧表示画面は、表示する商品数にかかわらず必要な固定データと、商品数に応じてデータサイズや個数が変動する変動データで構成される。固定データはJavaScriptファイルやスタイルシート、画面の装飾に使う画像データなど合計100個で、1個当たりの平均サイズは5×10^3バイトである。変動データは一つのHTML文書データと、表示する商品n個分の画像データから成る。HTML文書データのサイズは10^4+500×nバイトであり、商品の画像データ1個当たりの平均サイズは25×10^3バイトである。 固定データの全てがブラウザにキャッシュされているとき、それぞれのデータについてサーバに再転送の要否確認を要求したところ、全て再転送が不要であるとの応答を受け取った。最初の要求をしてから最後の要求に対する応答を受け取るまでの時間は[a]秒である。固定データのいずれもブラウザにキャッシュされていないとき、これらの固定データの総転送時間は[b]秒である。この場合、一覧表示画面1ページを構成するデータの転送時間が5秒以内となる商品の最大数nを求める。変動データもブラウザにキャッシュされていないものとする。 表1 表1「要求に対する結果の受信が完了するまでに掛かる時間」。列見出しは「データの状態」「要求」「結果」「時間(秒)」。データがキャッシュされていない場合:要求「データの転送」;結果「当該データ(vバイト)の受信」;時間「3×t+v÷e」。データがキャッシュされている場合:要求「データの再転送の要否確認」;結果「<再転送が不要な場合>再転送が不要であるとの応答」;時間「t」。同じ要求に対する結果として「<再転送が必要な場合>当該データ(vバイト)の受信」;時間「3×t+v÷e」。 転送時間の不等式 本文中の式:[b]+3×t+[c]+(3×t+[d])×n≦5。
本文中の空欄a,b,c,dに入れる正しい答えを,解答群の中から選べ。 a、bに関する解答群 ア 0.005 イ 0.015 ウ 0.02 エ 0.5 オ 0.515 カ 1 キ 1.5 ク 2 c、dに関する解答群 ア 10⁴+500 イ 10⁴+500×n ウ 25×10³ エ 25×10³×n オ (10⁴+500)÷e カ (10⁴+500×n)÷e キ (25×10³)÷e ク (25×10³×n)÷e
問5 レンタル業務システムの設計に関する次の記述を読んで,設問1~3に答えよ。 E社は,レンタル業務システムを利用して,CD,DVD,書籍などの貸出し用の各種資産(以下,レンタル商品という)をレンタルするサービスを行っている。レンタル業務システムによるレンタル業務の概要は,次のとおりである。 【レンタル業務の概要】 (1) 会員登録の手順 ① 担当者は,サービスの利用希望者から入会申込書を受け取り,氏名,住所,生年月日及び電話番号を,会員情報としてレンタル業務システムに登録する。 ② レンタル業務システムは,利用希望者に会員IDを割り当て,会員IDが印字された会員カードを発行する。会員情報の属性である登録年月日と最終来店年月日に本日日付を,累計支払額と貸出中延滞数に初期値として0を登録する。ここで,累計支払額は会員登録時からの支払額の累計(延滞料金を含む)であり,貸出中延滞数は現時点で返却予定年月日を過ぎているレンタル商品の件数である。 ③ 担当者は,レンタル業務システムから発行された会員カードを利用希望者に渡して,会員登録が完了する。 (2) レンタル商品の貸出し手順 E社は,全てのレンタル商品のそれぞれに,一意となる識別子として資産管理番号を割り当てている。また,同じ種類のレンタル商品の情報(以下,商品情報という)ごとにも一意となる識別子として商品コードを割り当てている。図1は商品名が「オブジェクト指向設計」である3冊の書籍のレンタル商品に対して,資産管理番号を三つ,商品コードを二つ,それぞれ割り当てた例である。 ① 会員は,会員カードと貸出しを希望するレンタル商品を担当者に渡す。E社では,会員が1回の貸出し手順で借り出せるレンタル商品は最大10件までとしている。 ② 担当者は,会員が提示した会員カードの会員IDをレンタル業務システムに入力して会員情報を画面に表示する。 ③ 担当者は,会員が貸出しを希望するレンタル商品に貼付された資産管理番号のバーコードをレンタル業務システムに読み込ませ,希望する貸出期間を会員から聞いて,レンタル業務システムに入力する。ここで,貸出期間は1日,2日,1週間のいずれかである。この作業を入力操作と呼ぶ。 ④ レンタル業務システムは,入力操作が行われる都度,レンタル商品の商品コード,貸出期間,商品名,商品概要,返却予定年月日,貸出料金及び貸出料金合計を画面に表示する。貸出料金はレンタル商品の種類ごとに貸出期間によって設定されている単価から,返却予定年月日は貸出期間と本日日付から自動計算する。 ⑤ 担当者は,会員が貸出しを希望するレンタル商品の数だけ入力操作を繰り返す。4件の入力操作を行った後の画面の表示例を図2に示す。 ⑥ 担当者が,会員から貸出料金を受領した後,図2に示す確定ボタンを押すと,レンタル業務システムは,貸し出すレンタル商品ごとに貸出明細番号を割り当てて貸出明細の情報として登録する。さらに,返却予定年月日ごとにまとめて,伝票番号を割り当てて貸出の情報として登録する。図2の例では,貸出は3件,貸出明細は4件を登録する。加えて,貸出明細とレンタル商品を関連付けて,レンタル商品の貸出可否状態を「貸出中」にする。同時に会員情報の内容も更新する。その後,伝票番号ごとに貸出伝票を出力する。 ⑦ 担当者が,貸出しを希望するレンタル商品と貸出伝票を会員に渡すことで,レンタル商品の貸出しが完了する。 (3) レンタル商品の返却手順 レンタル商品の返却では,貸出中の全てのレンタル商品が返却される場合と,貸出中のレンタル商品の一部だけが返却される場合とがある。 ① 担当者は,会員が返却するレンタル商品を受け取り,レンタル商品に貼付された資産管理番号のバーコードをレンタル業務システムに読み込ませる。 ② レンタル業務システムは,伝票番号,商品コード,商品名及び返却予定年月日を画面に表示する。返却予定年月日を過ぎている場合は,返却されるレンタル商品ごとに延滞料金を表示し,延滞料金の合計も表示する。 ③ 延滞料金が表示された場合,担当者は,会員から延滞料金を受領する。 ④ 担当者がレンタル商品の返却の確定ボタンを押すと,レンタル業務システムは,貸出明細に関連付けたレンタル商品の貸出可否状態を「貸出可」にする。同時に貸出明細と会員情報の内容を更新する。これによって,レンタル商品の返却が完了する。 (4) 貸出中のレンタル商品のチェック処理 レンタル業務システムは,閉店後に毎日,貸出中のレンタル商品の延滞チェックを行っており,延滞が発生した場合は,会員情報の貸出中延滞数を更新する。 【レンタル業務システムのUML図】 図3はレンタル業務システムのクラス図,図4はレンタル商品の貸出し手順における③の操作が行われたときのシーケンス図である。なお,図3のクラス図には,エンティティクラスだけを記載している。 図1 図1「資産管理番号と商品コードを割り当てた例」。商品名はいずれも「オブジェクト指向設計」。左から、商品コード:商品コード1/商品名:オブジェクト指向設計/著者名:試験太郎/資産管理番号:資産管理番号1;商品コード:商品コード1/商品名:オブジェクト指向設計/著者名:試験太郎/資産管理番号:資産管理番号2;商品コード:商品コード2/商品名:オブジェクト指向設計/著者名:情報花子/資産管理番号:資産管理番号3。 図2 図2「4件の入力操作を行った後の画面の表示例」。貸出年月日:2016-10-16。表の列は商品コード、貸出期間、商品名、商品概要、返却予定年月日、貸出料金。行は、C529157|1日|音楽 CD01|編曲者 A,63分|2016-10-17|130円;D700557|2日|映画 DVD01|監督 B,主演 C,122分|2016-10-18|200円;B905668|2日|UML基礎編|著者 X,100ページ,ISBN-xxxx|2016-10-18|100円;B905669|1週間|データベース応用編|著者 Y,240ページ,ISBN-yyyy|2016-10-23|150円。貸出料金合計:580円。「確定」ボタンがある。本文によれば、この例で登録する貸出は3件、貸出明細は4件。 図3 図3「レンタル業務システムのクラス図」。エンティティクラスのみを示す。会員情報の属性:会員ID、氏名、住所、生年月日、電話番号、最終来店年月日、累計支払額、貸出中延滞数、登録年月日。貸出の属性:伝票番号、貸出年月日、a、返却予定年月日。貸出明細の属性:貸出明細番号、貸出料金、返却年月日、延滞料金。レンタル商品の属性:資産管理番号、貸出可否状態。商品情報の属性:商品コード、商品名。貸出料金の属性:貸出期間、単価、1日分の延滞料金。CDの属性:編曲者、再生時間。DVDの属性:監督、主演、再生時間。書籍の属性:著者名、ページ数、ISBN。 関連と多重度:会員情報1―貸出0..*。貸出は貸出明細を集約し、貸出側1、貸出明細側1..10。貸出明細とレンタル商品間にはb1、b2の多重度欄がある。レンタル商品と商品情報は、レンタル商品側1..*、商品情報側1。貸出料金と商品情報の関連は、貸出料金側1..3、商品情報側0..*。CD、DVD、書籍は商品情報の下位クラスとして汎化されている。 図の凡例:長方形はクラスを表し,上段はクラス名,下段は属性の並びを記述する。クラス間を結ぶ線は関連を表す。関連を表す線の終端近くには,クラスのインスタンス間の多重度の範囲をx..yで表す。凡例の例では,クラスCの1個のインスタンスがクラスDの1個以上のインスタンスと関連する。関連を表す線の終端の黒いひし形は部分と全体の関係を表す。凡例の例では,クラスDはクラスCの部分であることを示している。「△」は汎化関係を表し,凡例では上位の一般的なクラスAと下位のより特殊なクラスCとの間の分類関係を示している。図中のa、b1、b2は設問の空欄。 図4 図4「入力操作が行われたときのシーケンス図」。参加者は左から担当者,画面,貸出処理,貸出,貸出明細,レンタル商品,商品情報,貸出料金。担当者から画面へ「入力操作」。画面から貸出処理へ「貸出情報を取得する(資産管理番号,貸出期間,本日日付)」。貸出処理の自己メッセージ「返却予定年月日を計算する(c)」,続いて自己メッセージ「レンタル商品を取得する(資産管理番号)」。貸出処理からレンタル商品へ「商品情報を取得する」,戻りメッセージ「商品情報」。貸出処理から商品情報へ「商品概要を取得する」,戻りメッセージ「商品概要」。この取得メッセージの箇所にαの注記。貸出処理から商品情報へ「貸出料金を取得する(d)」。商品情報から貸出料金へのメッセージと貸出料金から商品情報への戻りは,いずれも「省略」と記載。貸出料金の戻りは「貸出料金」。貸出処理から画面への戻りは「省略」,画面の自己メッセージは「画面を表示する」。図中に「省略」はメッセージの記述を省略していることを示すとの注記がある。c,dは図中の空欄。
図3中の空欄に入れる正しい答えを,解答群の中から選べ。ここで,b1とb2に入れる答えは,bに関する解答群の中から組合せとして正しいものを選ぶものとする。 aに関する解答群 ア 延滞日数 イ 延滞料金 ウ 貸出期間 エ 貸出料金 オ 登録年月日 bに関する解答群 ア b1:0、b2:1 イ b1:0、b2:1..* ウ b1:0..1、b2:1 エ b1:0..1、b2:1..* オ b1:1、b2:0 カ b1:1、b2:0..* キ b1:1..*、b2:1 ク b1:1..*、b2:1..*
図4中の空欄に入れる正しい答えを,解答群の中から選べ。 c、dに関する解答群 ア 貸出期間 イ 貸出期間,単価 ウ 貸出期間,単価,本日日付 エ 貸出期間,本日日付 オ 単価,返却予定年月日 カ 単価,返却予定年月日,本日日付
次の記述中の空欄に入れる適切な答えを,解答群の中から選べ。ここで,e1とe2に入れる答えは,eに関する解答群の中から組合せとして適切なものを選ぶものとする。 CDクラス,DVDクラス,書籍クラスは商品情報を特化して実現しているので,商品情報クラスを[e1]している。図4中のαの部分は,貸出処理クラスから商品情報クラスに対する商品概要を取得する要求のメッセージである。商品概要とは,CDならば編曲者と再生時間,DVDならば監督,主演及び再生時間,書籍ならば著者名,ページ数及びISBNから生成する当該商品の商品概要を表現する文字列である。商品概要を取得するためのメッセージを受信した商品情報インスタンスは,クラスに応じて異なる処理が実行される。一方,貸出処理クラスはクラスや処理の違いを意識せず,全てを商品情報として取り扱うことができる。この性質を[e2]という。
問6 単体テストにおける品質管理に関する次の記述を読んで,設問1,2に答えよ。 C社では,販売システムの構築を進めており,現在,単体テストを実施している。販売システムは,C社の情報システム部門によるプロジェクト管理の下で,ベンダL社が構築している。ベンダL社は,C社のシステムを構築するプロジェクトに,今回初めて参画している。 C社の品質管理基準では,テストケースの網羅性を示すテスト密度と,当該プログラムにおけるバグ摘出率という指標を用いてプログラムの品質を評価し,単体テストの完了を判断している。 表1 【単体テスト完了の判断基準】単体テストの完了を判断する際に用いる指標の算出方法とその標準値を示す。標準値は,C社のプログラム開発における過去の同一形態の実績値を基に定めている。テスト密度は標準値の80%以上,バグ摘出率は標準値の80%以上かつ120%以下を単体テストの完了の基準範囲とする。 表1「単体テストの完了の指標の算出方法と標準値」 列見出し:指標/算出方法/標準値 テスト密度:テストケース数(件)÷当該プログラムの開発規模(kステップ)/100 バグ摘出率:プログラムのバグ数(件)÷当該プログラムの開発規模(kステップ)/5 図1 図1「品質評価のグラフ」。横軸はテスト密度(件/kステップ)、縦軸はバグ摘出率(件/kステップ)。テスト密度の基準範囲の下限は80,バグ摘出率の基準範囲の下限は4,上限は6。図中の区分は,Iが上限6より上の横長領域,IIがテスト密度80より左でバグ摘出率6以下の縦長領域,IIIがテスト密度80より右でバグ摘出率4~6の領域,IVがテスト密度80より右でバグ摘出率4より下の領域。 表2 表2「サブシステムXの単体テストの結果」。列見出し:開発規模(kステップ)/テストケース数(件)/テスト密度(件/kステップ)/バグ数(件)/バグ摘出率(件/kステップ)/評価。 プログラム1:10/980/空欄b/70/網掛け(表示なし)/バグ摘出率が基準範囲の上限を超えた。 プログラム2:2/215/網掛け(表示なし)/9/網掛け(表示なし)/網掛け(表示なし)。 プログラム3:6/750/網掛け(表示なし)/20/網掛け(表示なし)/網掛け(表示なし)。 プログラム4:8/600/網掛け(表示なし)/30/網掛け(表示なし)/空欄c。 注記:網掛けの部分は表示していない。
C社の品質管理基準に関する次の記述中の空欄に入れる適切な答えを,解答群の中から選べ。 ここで,a1~a3に入れる答えは,aに関する解答群の中から組合せとして適切なものを選ぶものとする。 単体テストの完了は,表1に基づいて算出した,プログラムごとのテスト密度とバグ摘出率を,図1に示す品質評価のグラフにプロットして判断する。 図1の区分I~IVにおける単体テストの品質評価は次のとおりである。 I:バグ摘出率が基準範囲の上限を超えているので,[a1]である。 II:テスト密度が基準を満たしていないので,テスト不足である。 III:テスト密度,バグ摘出率とも基準を満たしているので,[a2]である。 IV:テスト密度は基準を満たしているが,バグ摘出率が基準範囲の下限に満たないので,[a3]。
販売システムの単体テストの結果と改善策の実施に関する次の記述中の空欄に入れる適切な答えを,解答群の中から選べ。 【単体テストの結果】 販売システムは,複数のサブシステムから構成されており,そのうちの一つであるサブシステムXに含まれるプログラム1~4の単体テストの結果を,表2に示す。 表2の結果から,プログラム1,プログラム3及びプログラム4は,“品質良好”と判断できないので,改善策を実施することにした。 【改善策の実施】 プログラム1は,バグ摘出率が基準範囲の上限を超えているので,バグの原因分析を行った。主な原因は,詳細設計書に曖昧な記述があり,プログラムで実現すべき機能に誤りが発生したことであった。そこで,詳細設計書の曖昧な記述を修正後,[d]。さらに,修正したプログラムについて,必要なテストケースを追加した上で,再度単体テストを実施し,バグ摘出率が基準を満たしていることを確認した。また,同一の観点で,他のプログラムに関しても点検を実施し,同様の問題が含まれていないことを確認した。 プログラム3については,[e]ことを確認し,テストケースの内容自体に問題がないことから,現在のバグ摘出で十分な品質が確保されていると判断したので,改善策は不要とした。 プログラム4については,[c]ことから,テストケースが不足していることが懸念されるので,テストケースの網羅性を点検した上で,[f],その結果から品質を再評価することにした。 bに関する解答群 ア 7 イ 98 ウ 980 エ 9,800 cに関する解答群 ア テスト密度は基準を満たしているが,バグ摘出率は基準範囲の下限に満たない イ テスト密度は基準を満たしているが,バグ摘出率は基準範囲の上限を超えている ウ バグ摘出率,テスト密度とも基準を満たしていない エ バグ摘出率,テスト密度とも基準を満たしている dに関する解答群 ア プログラムのソースコードが詳細設計書を正確に反映していることを点検した イ プログラムのソースコードに関する記述規定どおりに,プログラムが記述されていることを点検した ウ プログラムのソースコードに文法上の誤りがないことを点検した eに関する解答群 ア テストケースが特定の処理の流れを重点的に確認するように作成されている イ テストケースが全ての処理の流れを網羅的に確認できるように作成されている ウ テストケースについて,実データを使用した環境で確認している エ テストケースを実行する手順について,正しく定められている fに関する解答群 ア 摘出したバグが修正されていることを確認し イ テストの実施が不足している処理の流れに対してテストケースを追加して再度単体テストを実施し ウ テストの実施方法に問題がないことを確認し エ バグを摘出した処理の流れに対して,テストケースを追加して再度単体テストを実施し
問7 業務提携と出資の検討に関する次の記述を読んで,設問1~3に答えよ。 消費財メーカのB社は,同業のT社との物流業務での提携を考えており,そのためにT社への出資を検討している。B社では,T社への出資額を算定するための準備として,T社の財務状況を調査して,企業価値を算出することになった。表1~3は,B社が入手したT社の2016年度の損益計算書,貸借対照表及びキャッシュフロー(以下,CFという)計算書の予測である。 表1 T社の2016年度の損益計算書の予測 単位:億円。列は項目、値の順。 | 項目 | 値 | | 売上高 | 120 | | 売上総利益 | 40 | | 営業利益 | 7 | | 経常利益 | 9 | | 税引き前純利益 | 10 | | 税引き後純利益 | 7 | 表2 T社の2016年度の貸借対照表の予測 単位:億円。列は項目、値の順。 | 項目 | 値 | | 流動資産 | 50 | | 固定資産 | 100 | | 流動負債 | 40 | | 固定負債 | 30 | | 純資産 | 80 | 表3 T社の2016年度のCF計算書の予測 単位:億円。列は項目、値の順。 | 項目 | 値 | | 営業活動によるCF | 15 | | 投資活動によるCF | −5 | | 財務活動によるCF | −3 | 表4 T社の各年度のFCFの予測 単位:億円。年度は2017、2018、2019、2020、2021、2022、2023、…の順。FCF行は2017年は網掛けで値の表示なし、2018年に空欄d、2019年と2020年は網掛けで値の表示なし、2021年は13.12、2022年は13.51、2023年は13.91、以降は…。 注記:網掛け部分は表示していない。
表1~3に関する次の記述中の空欄に入れる適切な答えを,解答群の中から選べ。 B社では,出資する相手企業が次の条件(以下,出資条件という)のうち二つ以上を満たすことを,出資の検討を進めるための要件としている。 (1) 売上高営業利益率が5%以上である。 (2) 総資産経常利益率が5%以上である。 (3) 営業活動によるCFと投資活動によるCFの和(以下,FCFという)が負でない。 表1~3から,T社は出資条件の空欄aを満たしている。この結果から,B社では,T社への出資の検討を進めることにした。 また,B社は,T社の営業活動によるCFが正で,投資活動によるCFと財務活動によるCFが負であることから,T社は空欄bを進めている企業と考えた。 B社では,物流業務での提携に加えて,T社の情報システムの一部を廃止してB社の情報システムを利用することを検討している。それによってT社のシステム運用保守費を削減し,T社の販管費(販売費及び一般管理費)を圧縮できると想定しており,T社の売上高や総資産が変わらなければ空欄c上げられると考えている。 aに関する解答群 ア (1)と(2)の二つだけ イ (1)と(3)の二つだけ ウ (2)と(3)の二つだけ エ (1)~(3)の全て bに関する解答群 ア 本業で得た利益に加えて,銀行からの借入れを増やして投資 イ 本業で得た利益に加えて,手持ちの資産を現金化して債務返済や株主還元 ウ 本業で得た利益を投資に回すとともに,債務返済や株主還元 cに関する解答群 ア FCFだけは イ 売上高営業利益率と総資産経常利益率だけは ウ 売上高営業利益率,総資産経常利益率及びFCFの全てを
T社の企業価値の算出に関する次の記述中の空欄に入れる適切な答えを,解答群の中から選べ。 B社では,各年度のFCFの現在価値を合計することで企業価値を算出している。そこで,B社は,T社の企業価値を算出する準備として,T社の今後のFCFを次のように予測した。ここで,T社との業務提携と出資は2017年度の初日に行われるものとする。 (1) B社との業務提携によって,初年度(2017年度)に10%増加する。 (2) 2018年度から2020年度まで年率5%で増加する。 (3) 2021年度から2023年度まで年率3%で増加する。 (4) 2024年度からは一定である。 表4は,これらに基づくT社の各年度のFCFの予測である。 B社では,企業価値の算出に,割引率を使った現在価値の考え方を用いている。この考え方によると,割引率をrとして1年複利で計算し,n年後のFCFをCで表すとき,その現在価値は C/(1+r)^n と表せる。B社は,T社の企業価値を算出するために,各年度のFCFについて割引率を0.1として現在価値を計算した。2017年度のFCFの2016年度末時点の現在価値は空欄eである。ここで,各年度のFCFは各年度末に発生すると考える。 T社の企業価値は,B社と業務提携することによって大きくなると予想される。誤って,割引率を考慮せずに各年度のFCFをそのまま合計して,B社で定義している企業価値よりも空欄f計算してしまわないように,B社では定期的に担当者教育をしている。 d、eに関する解答群 ア 9.09 イ 9.84 ウ 10.00 エ 10.03 オ 10.50 カ 10.82 キ 11.00 ク 11.03 ケ 11.55 コ 12.10 fに関する解答群 ア 大きく イ 小さく
B社では,様々な条件を変更してT社の企業価値(各年度のFCFの現在価値の合計)がどのように変化するかを検証した。条件を変更する前に比べてT社の企業価値が大きくなるものを,解答群の中から選べ。
問8 関数 Edit による数値の編集。事務計算では、数値を見やすく表示(印字)するため、例えば3桁ごとに区切りの「,」を挿入するなどの編集処理がよく行われる。関数 Edit は、指定された編集パターンに従って数値を編集するプログラムである。 表1 関数 Edit を用いた編集例 表1「関数 Edit を用いた編集例」。例1の編集パターンは「␣□□,□□□」、例2は「*□□,□□□」、例3は「␣□□■.□□」。数値123では例1「␣␣␣␣123」、例2「****123」、例3「␣␣␣1.23」。数値1234では例1「␣␣1,234」、例2「**1,234」、例3「␣␣12.34」。数値12345では例1「␣12,345」、例2「*12,345」、例3「␣123.45」。「□」と「■」は数字に対応付けられた相異なる制御文字で、「␣」は空白文字を表す。 プログラムの説明(1)~(4) 関数 Edit は Edit(文字型:Pattern[], 文字型:Value[]) の形式で呼び出される。Pattern[] には編集パターンの文字列、Value[] には編集する数値を表す文字列が格納される。各配列の添字は0から始まり、Pattern[] の i 番目の文字は Pattern[i-1] と表記する。Value[] も同様。Pattern[] は1文字以上の表示可能な図形文字及び制御文字「□」「■」から成る。Value[] は数字「0」~「9」の並びの後に、数値が正又は0なら「+」、負なら「-」を付加した形式である。数字の個数は Pattern[] 中の「□」「■」の個数と一致させ、必要なら前方に「0」を付加する。例として Pattern[] が「*□□,□□□」のとき、数値123は「000123+」、0は「000000+」、-123は「000123-」。関数 Edit は Value[] の数値を Pattern[] に従って編集し、編集結果で Pattern[] を置き換える。 プログラムの説明(編集方法)(5)~(6) 編集方法:Pattern[] の各文字について先頭から順に1文字ずつ、次のいずれかを行う。①関数呼出し時の Pattern[] の先頭文字(fill文字)で置き換える。②Value[] 中の対応する桁の数字で置き換える。③置き換えずそのまま残す。論理型変数 signif は on または off を取り、実行開始時は off。Value[] 中で最上位から「0」が連続した後に「0」ではない数字が見つかると on になるなどの使い方をする。関数 Edit 呼出し時、各引数には正しい値が設定されているものとする。 プログラム プログラム:fill ← Pattern[0]、signif ← off、v ← 0。p を0から Length(Pattern[])未満まで1ずつ増やす反復を行う。Length() は引数の文字列長を返す。反復内で Pattern[p] が「□」又は「■」なら、表2のケース1~7に従って Pattern[p] と signif を更新する。次に v ← v+1。反復内の残りの処理(表2のケース8、9):signif=off のとき Pattern[p] ← fill。 表2 現在の変数・配列要素の内容に応じた更新処理 表2「現在の変数・配列要素の内容に応じた更新処理」。列はケース、Pattern[p]、signif、Value[v]、Value[v+1]、更新後のPattern[p]、更新後のsignif。ケース1:□、off、「0」、(網掛け・判定しない)、fill文字、off。ケース2:■、off、「0」、「+」以外、fill文字、on。ケース3:■、off、「0」、「+」、fill文字、off。ケース4:□又は■、off、「1」~「9」、「+」以外、Value[v]、on。ケース5:□又は■、off、「1」~「9」、「+」、Value[v]、off。ケース6:□又は■、on、「0」~「9」、「+」以外、Value[v]、on。ケース7:□又は■、on、「0」~「9」、「+」、Value[v]、off。ケース8:□と■以外、off、(網掛け・判定しない)、(網掛け・判定しない)、fill文字、off。ケース9:□と■以外、on、(網掛け・判定しない)、(網掛け・判定しない)、そのまま残す、on。注記:網掛け部分は内容を判定しない。 表3 関数Editの実行結果 列は実行前Pattern[]、実行前Value[]、実行後Pattern[]の順。1行目「␣␣□□,□□□」「01234+」「␣␣␣1,234」。2行目「*□□,□□□#」「00000+」「[a]」。3行目「*□□□.□□#」「00012−」「[b]」。4行目「*□□■.□□#」「00012+」「[c]」。「␣」は空白文字を表し、白四角「□」と黒四角「■」は別の制御文字。
引数Pattern[]及びValue[]に幾つかのデータを与えて関数Editを実行した結果を表3に示す。空欄a~cに入れる正しい答えを解答群の中から選べ。 aに関する解答群 ア 「*******#」 イ 「********」 ウ 「******0#」 エ 「******0*」 b、cに関する解答群 ア 「*****12#」 イ 「*****12*」 ウ 「****.12#」 エ 「****.12*」 オ 「***0.12#」 カ 「***0.12*」
問8 関数 Edit による数値の編集。事務計算では、数値を見やすく表示(印字)するため、例えば3桁ごとに区切りの「,」を挿入するなどの編集処理がよく行われる。関数 Edit は、指定された編集パターンに従って数値を編集するプログラムである。 表1 関数 Edit を用いた編集例 表1「関数 Edit を用いた編集例」。例1の編集パターンは「␣□□,□□□」、例2は「*□□,□□□」、例3は「␣□□■.□□」。数値123では例1「␣␣␣␣123」、例2「****123」、例3「␣␣␣1.23」。数値1234では例1「␣␣1,234」、例2「**1,234」、例3「␣␣12.34」。数値12345では例1「␣12,345」、例2「*12,345」、例3「␣123.45」。「□」と「■」は数字に対応付けられた相異なる制御文字で、「␣」は空白文字を表す。 プログラムの説明(1)~(4) 関数 Edit は Edit(文字型:Pattern[], 文字型:Value[]) の形式で呼び出される。Pattern[] には編集パターンの文字列、Value[] には編集する数値を表す文字列が格納される。各配列の添字は0から始まり、Pattern[] の i 番目の文字は Pattern[i-1] と表記する。Value[] も同様。Pattern[] は1文字以上の表示可能な図形文字及び制御文字「□」「■」から成る。Value[] は数字「0」~「9」の並びの後に、数値が正又は0なら「+」、負なら「-」を付加した形式である。数字の個数は Pattern[] 中の「□」「■」の個数と一致させ、必要なら前方に「0」を付加する。例として Pattern[] が「*□□,□□□」のとき、数値123は「000123+」、0は「000000+」、-123は「000123-」。関数 Edit は Value[] の数値を Pattern[] に従って編集し、編集結果で Pattern[] を置き換える。 プログラムの説明(編集方法)(5)~(6) 編集方法:Pattern[] の各文字について先頭から順に1文字ずつ、次のいずれかを行う。①関数呼出し時の Pattern[] の先頭文字(fill文字)で置き換える。②Value[] 中の対応する桁の数字で置き換える。③置き換えずそのまま残す。論理型変数 signif は on または off を取り、実行開始時は off。Value[] 中で最上位から「0」が連続した後に「0」ではない数字が見つかると on になるなどの使い方をする。関数 Edit 呼出し時、各引数には正しい値が設定されているものとする。 プログラム プログラム:fill ← Pattern[0]、signif ← off、v ← 0。p を0から Length(Pattern[])未満まで1ずつ増やす反復を行う。Length() は引数の文字列長を返す。反復内で Pattern[p] が「□」又は「■」なら、表2のケース1~7に従って Pattern[p] と signif を更新する。次に v ← v+1。反復内の残りの処理(表2のケース8、9):signif=off のとき Pattern[p] ← fill。 表2 現在の変数・配列要素の内容に応じた更新処理 表2「現在の変数・配列要素の内容に応じた更新処理」。列はケース、Pattern[p]、signif、Value[v]、Value[v+1]、更新後のPattern[p]、更新後のsignif。ケース1:□、off、「0」、(網掛け・判定しない)、fill文字、off。ケース2:■、off、「0」、「+」以外、fill文字、on。ケース3:■、off、「0」、「+」、fill文字、off。ケース4:□又は■、off、「1」~「9」、「+」以外、Value[v]、on。ケース5:□又は■、off、「1」~「9」、「+」、Value[v]、off。ケース6:□又は■、on、「0」~「9」、「+」以外、Value[v]、on。ケース7:□又は■、on、「0」~「9」、「+」、Value[v]、off。ケース8:□と■以外、off、(網掛け・判定しない)、(網掛け・判定しない)、fill文字、off。ケース9:□と■以外、on、(網掛け・判定しない)、(網掛け・判定しない)、そのまま残す、on。注記:網掛け部分は内容を判定しない。 表3 関数Editの実行結果 列は実行前Pattern[]、実行前Value[]、実行後Pattern[]の順。1行目「␣␣□□,□□□」「01234+」「␣␣␣1,234」。2行目「*□□,□□□#」「00000+」「[a]」。3行目「*□□□.□□#」「00012−」「[b]」。4行目「*□□■.□□#」「00012+」「[c]」。「␣」は空白文字を表し、白四角「□」と黒四角「■」は別の制御文字。 図の分岐:signif=off の場合、Pattern[p]=「□」かつ Value[v]=「0」なら何もしない。それ以外では Value[v+1]≠「+」なら signif ← on。次に、条件dなら Pattern[p] ← fill、そうでなければ Pattern[p] ← Value[v]。signif=on の場合、条件eなら signif ← off、その後 Pattern[p] ← Value[v]。
次の記述中の空欄に入れる正しい答えを、解答群の中から選べ。プログラム中の破線で囲んだ部分の処理(表2のケース1~7の処理)を、詳細なプログラムとして記述すると、図示された条件分岐となる。空欄d、eに入る条件を選べ。 d、eに関する解答群 ア 「1」≦Value[v] かつ Value[v]≦「9」 イ Value[v]=「0」 ウ Value[v+1]=「-」 エ Value[v+1]=「+」 オ Value[v+1]≠「-」 カ Value[v+1]≠「+」
問8 関数 Edit による数値の編集。事務計算では、数値を見やすく表示(印字)するため、例えば3桁ごとに区切りの「,」を挿入するなどの編集処理がよく行われる。関数 Edit は、指定された編集パターンに従って数値を編集するプログラムである。 表1 関数 Edit を用いた編集例 表1「関数 Edit を用いた編集例」。例1の編集パターンは「␣□□,□□□」、例2は「*□□,□□□」、例3は「␣□□■.□□」。数値123では例1「␣␣␣␣123」、例2「****123」、例3「␣␣␣1.23」。数値1234では例1「␣␣1,234」、例2「**1,234」、例3「␣␣12.34」。数値12345では例1「␣12,345」、例2「*12,345」、例3「␣123.45」。「□」と「■」は数字に対応付けられた相異なる制御文字で、「␣」は空白文字を表す。 プログラムの説明(1)~(4) 関数 Edit は Edit(文字型:Pattern[], 文字型:Value[]) の形式で呼び出される。Pattern[] には編集パターンの文字列、Value[] には編集する数値を表す文字列が格納される。各配列の添字は0から始まり、Pattern[] の i 番目の文字は Pattern[i-1] と表記する。Value[] も同様。Pattern[] は1文字以上の表示可能な図形文字及び制御文字「□」「■」から成る。Value[] は数字「0」~「9」の並びの後に、数値が正又は0なら「+」、負なら「-」を付加した形式である。数字の個数は Pattern[] 中の「□」「■」の個数と一致させ、必要なら前方に「0」を付加する。例として Pattern[] が「*□□,□□□」のとき、数値123は「000123+」、0は「000000+」、-123は「000123-」。関数 Edit は Value[] の数値を Pattern[] に従って編集し、編集結果で Pattern[] を置き換える。 プログラムの説明(編集方法)(5)~(6) 編集方法:Pattern[] の各文字について先頭から順に1文字ずつ、次のいずれかを行う。①関数呼出し時の Pattern[] の先頭文字(fill文字)で置き換える。②Value[] 中の対応する桁の数字で置き換える。③置き換えずそのまま残す。論理型変数 signif は on または off を取り、実行開始時は off。Value[] 中で最上位から「0」が連続した後に「0」ではない数字が見つかると on になるなどの使い方をする。関数 Edit 呼出し時、各引数には正しい値が設定されているものとする。 プログラム プログラム:fill ← Pattern[0]、signif ← off、v ← 0。p を0から Length(Pattern[])未満まで1ずつ増やす反復を行う。Length() は引数の文字列長を返す。反復内で Pattern[p] が「□」又は「■」なら、表2のケース1~7に従って Pattern[p] と signif を更新する。次に v ← v+1。反復内の残りの処理(表2のケース8、9):signif=off のとき Pattern[p] ← fill。 表2 現在の変数・配列要素の内容に応じた更新処理 表2「現在の変数・配列要素の内容に応じた更新処理」。列はケース、Pattern[p]、signif、Value[v]、Value[v+1]、更新後のPattern[p]、更新後のsignif。ケース1:□、off、「0」、(網掛け・判定しない)、fill文字、off。ケース2:■、off、「0」、「+」以外、fill文字、on。ケース3:■、off、「0」、「+」、fill文字、off。ケース4:□又は■、off、「1」~「9」、「+」以外、Value[v]、on。ケース5:□又は■、off、「1」~「9」、「+」、Value[v]、off。ケース6:□又は■、on、「0」~「9」、「+」以外、Value[v]、on。ケース7:□又は■、on、「0」~「9」、「+」、Value[v]、off。ケース8:□と■以外、off、(網掛け・判定しない)、(網掛け・判定しない)、fill文字、off。ケース9:□と■以外、on、(網掛け・判定しない)、(網掛け・判定しない)、そのまま残す、on。注記:網掛け部分は内容を判定しない。 表3 関数Editの実行結果 列は実行前Pattern[]、実行前Value[]、実行後Pattern[]の順。1行目「␣␣□□,□□□」「01234+」「␣␣␣1,234」。2行目「*□□,□□□#」「00000+」「[a]」。3行目「*□□□.□□#」「00012−」「[b]」。4行目「*□□■.□□#」「00012+」「[c]」。「␣」は空白文字を表し、白四角「□」と黒四角「■」は別の制御文字。
次の記述中の空欄に入れる正しい答えを、解答群の中から選べ。関数 Edit では、例えば fill 文字を「 」とする編集パターンを指定することによって、数値が正なら「 1,234 」、負なら「 1,234-」と編集できる。表2のケース1~7のうち、数値が正なら数値の後に続く文字を fill 文字で置き換えるために用意されたケースはどれか。
問9 次のCプログラムの説明及びプログラムを読んで、設問1、2に答えよ。 【プログラム1の説明】U社では、半年ごとに社内システムの見直しを行い、4月と10月に新たに開発又は改修するサブシステム(以下、対象サブシステムという)を決定し、開発又は改修作業(以下、開発作業という)を実施している。対象サブシステムは複数あり、それぞれに対して目標作業終了日が設定される。二つ以上の対象サブシステムの開発作業を同時に実施することはない。各対象サブシステムについて、開発リソースの制約があるので、必ずしも目標作業終了日までに開発作業を終了できるとは限らない。しかし、開発作業の終了が目標作業終了日よりも遅れる日数(以下、遅延日数という)の合計はできるだけ少なくしたい。そこで、対象サブシステムの開発作業順序を求める関数 job_scheduling を作成した。 関数 job_scheduling の仕様 関数 job_scheduling の仕様:機能は対象サブシステムの開発作業順序を求めること。引数は num_s(対象サブシステム数)、job(対象サブシステム情報の JOB 型配列)、job_sch(開発作業順序の int 型配列)。引数の値に誤りはないものとする。 JOB 型 JOB 型は、char pr_code[9](開発コード)、int job_term(開発作業日数)、int target_term(目標作業期間)をメンバーとする構造体。開発コードは対象サブシステムごとに一意となる長さ8の文字列。開発作業日数は開発作業に掛かる日数。目標作業期間は、半年ごとの一連の開発作業を開始する日から、この対象サブシステムの目標作業終了日までの日数。 job の格納順 job のデータは、①目標作業期間の昇順、②目標作業期間が同じなら開発作業日数の昇順、③目標作業期間も開発作業日数も同じなら開発コードの昇順、の順で格納されている。 開発作業順序を求める手順 (5)の手順で開発作業順序を求めると、job_sch[i] には、i+1番目(i=0, 1, …, num_s−1)に開発作業を実施する対象サブシステムの情報が格納された job[j] の添字 j(j=0, 1, …, num_s−1)が入る。手順は次のとおり。① job_sch を job の並び順に初期設定し、開発作業順序の添字 i に初期値0を設定する。② i < num_s−1 である間、③〜⑥を行う。③ i+1番目に開発作業を実施する対象サブシステム job[job_sch[i]] と i+2番目に開発作業を実施する対象サブシステム job[job_sch[i+1]] の開発作業を、順序どおりに実施した場合の二つの対象サブシステムの遅延日数の合計 wt_a と、順序を入れ替えて実施した場合の二つの対象サブシステムの遅延日数の合計 wt_b を求める。④順序を入れ替えることによって遅延日数の合計が減る場合(wt_a > wt_b)には、開発作業の実施順序を入れ替える。⑤順序を入れ替えた場合、i が0でなければ i を1減らす。⑥入れ替えなかった場合、i を1増やす。 遅延日数の式 i番目の対象サブシステムの開発作業が終わるまでの開発作業日数の合計を ft としたとき、i+1番目の対象サブシステムの開発作業が終わったときの遅延日数 wt は、次式で求められる。wt = ft + job_term − target_term(ft + job_term > target_term の場合)、wt = 0(ft + job_term ≤ target_term の場合)。ここで job_term と target_term は、i+1番目に開発作業を実施する対象サブシステムの開発作業日数と目標作業期間。 プログラム1 プログラム1のコード。空欄は原本どおり記号で示し、同じ記号の空欄には同じ解答欄が対応する。 typedef struct { char pr_code[9]; int job_term; int target_term; } JOB; void job_scheduling(int num_s, JOB job[num_s], int job_sch[num_s]) { int ft, ft_a, ft_b, wt_a, wt_b, job_no, i, j; for (i = 0; i < num_s; i++) { job_sch[i] = i; } ft = 0; i = 0; while (i < num_s - 1) { ft_a = ft; ft_b = ft; wt_a = 0; wt_b = 0; for (j = 0; j < 2; j++) { ft_a += job[job_sch[i + j]].job_term; if (ft_a > job[job_sch[i + j]].target_term) { wt_a += ft_a - job[job_sch[i + j]].target_term; } ft_b += job[job_sch[□a]].job_term; if (ft_b > job[job_sch[□a]].target_term) { wt_b += ft_b - job[job_sch[□a]].target_term; } } if (wt_a > wt_b) { job_no = job_sch[i]; job_sch[i] = job_sch[□b]; job_sch[□b] = job_no; if (i > 0) { ft -= job[job_sch[□c]].job_term; } } else { ft □d job[job_sch[i++]].job_term; } } } 図1 対象サブシステム情報 図1「対象サブシステム情報」。列は pr_code、job_term、target_term。行は job[0]: "APL12339", 25, 27;job[1]: "GGL08001", 27, 29;job[2]: "MSO16101", 21, 30;job[3]: "CAN03022", 28, 77;job[4]: "ORA14031", 12, 93。 図2 開発作業順序 図2「開発作業順序」。job_sch[0]=0、job_sch[1]=2、job_sch[2]=1、job_sch[3]=4、job_sch[4]=3。 関数 print_schedule の仕様 関数 print_schedule の仕様:機能は対象サブシステムの開発作業順序などを出力すること。引数は num_s(対象サブシステム数)、job(対象サブシステム情報の JOB 型配列)、job_sch(開発作業順序の int 型配列)。引数の値に誤りはないものとする。 プログラム2の処理と出力形式 プログラム2は ft=0、wt_sum=0 として i を0から num_s−1 まで順に処理する。各回で ft に job[job_sch[i]].job_term を加える。ft が job[job_sch[i]].target_term より大きい場合、wt=ft−job[job_sch[i]].target_term とし wt_sum に wt を加える。そうでない場合 wt=0 とする。その後 printf("%3d %10s %10d %10d\n", i+1, job[job_sch[i]].pr_code, wt, wt_sum) で出力する。 図3 print_schedule の出力結果の3行目 図3は関数 print_schedule の出力結果の3行目を示す。表示内容は「3 GGL08001 [e] [f]」。枠線は実際には出力されない。
プログラム1中の空欄に入れる正しい答えを、解答群の中から選べ。 aに関する解答群 ア i + j イ i + j − 1 ウ i − j エ i − j + 1 bに関する解答群 ア i + 1 イ i − 1 ウ job_no エ job_no + 1 オ job_no − 1 cに関する解答群 ア i + 1 イ i − 1 ウ i++ エ i-- オ ++i カ --i dに関する解答群 ア = イ += ウ −=
関数 job_scheduling を実行したときに得られる対象サブシステムの開発作業順序などを出力する関数 print_schedule を作成した。次の記述中の空欄に入れる正しい答えを、解答群の中から選べ。 e、fに関する解答群 ア 0 イ 27 ウ 44 エ 46 オ 57 カ 60 キ 73 ク 86
問10 次のCOBOLプログラムの説明及びプログラムを読んで、設問1、2に答えよ。 【プログラムの説明】 Z社では、毎年実施している従業員の健康診断を今年も実施した。健康診断の結果は、過去10回分が健康診断マスタファイルに記録されている。このプログラムは、今回の健康診断の結果が記録された結果ファイルを読み込み、健康診断マスタファイルに反映する。 図1 健康診断マスタファイルのレコード様式 図1「健康診断マスタファイルのレコード様式」。順ファイルのレコードは、従業員番号(6桁)と結果履歴から成る。結果履歴は、受診日(8桁)、身長(4桁)、体重(4桁)、最高血圧(3桁)、最低血圧(3桁)、胸部X線(1桁)の組を10回分繰り返す。 条件:①全ての従業員に対するレコードが、従業員番号の昇順に格納される。②結果履歴には、当該従業員の過去10回分の健康診断の結果が、受診日の降順に格納される。受診回数が10回に満たない場合、残りの結果履歴には全てゼロが設定される。③受診日には、年、月、日が、それぞれ4桁、2桁、2桁の西暦で格納される。④身長(cm)、体重(kg)、最高血圧(mmHg)、最低血圧(mmHg)には、それぞれの数値が格納される。身長と体重は小数点以下1桁までが格納される。胸部X線には、所見がない場合は0、所見がある場合は1が格納される。 図2 結果ファイルのレコード様式 図2「結果ファイルのレコード様式」。結果ファイルは順ファイル。先頭レコードは様式1が1件だけ格納される。様式1は受診日(8桁)と未使用域(13桁)から成る。受診日は年、月、日をそれぞれ4桁、2桁、2桁の西暦で格納し、健康診断マスタファイルに記録されているどの受診日よりも新しい。2件目以降は、受診した従業員の様式2のレコードが順不同で格納される。様式2は従業員番号(6桁)、身長(4桁)、体重(4桁)、最高血圧(3桁)、最低血圧(3桁)、胸部X線(1桁)から成る。受診していない従業員に対するレコードは存在しない。 プログラム(行番号1~62) 【プログラム】空欄a、b、c、dは原本の空欄のまま。 1 DATA DIVISION. 2 FILE SECTION. 3 SD SORT-FILE. 4 01 SORT-REC. 5 02 SORT-NO PIC 9(6). 6 02 SORT-ELM PIC X(15). 7 FD MST-FILE. 8 01 MST-REC. 9 02 MST-NO PIC 9(6). 10 02 MST-HISTORY OCCURS 10. 11 03 MST-DATE PIC 9(8). 12 03 MST-ELM. 13 04 MST-HEIGHT PIC 9(3)V9(1). 14 04 MST-WEIGHT PIC 9(3)V9(1). 15 04 MST-HIGHPRES PIC 9(3). 16 04 MST-LOWPRES PIC 9(3). 17 04 MST-XRAY PIC 9(1). 18 FD RSLT-FILE. 19 01 FIRST-REC. 20 02 RSLT-DATE PIC 9(8). 21 02 PIC X(13). 22 01 RSLT-REC PIC X(21). 23 WORKING-STORAGE SECTION. 24 77 CNT PIC 9(2). 25 77 NEW-DATE PIC 9(8). 26 77 RSLT-FLAG PIC X(1) VALUE SPACE. 27 88 RSLT-EOF VALUE “E”. 28 77 SORT-FLAG PIC X(1) VALUE SPACE. 29 88 SORT-EOF VALUE “E”. 30 PROCEDURE DIVISION. 31 MAIN-PROC. 32 OPEN I-O MST-FILE INPUT RSLT-FILE. 33 READ RSLT-FILE. 34 [空欄a]. 35 SORT SORT-FILE ASCENDING KEY SORT-NO 36 INPUT PROCEDURE IS REL-PROC 37 OUTPUT PROCEDURE IS RET-PROC. 38 CLOSE MST-FILE RSLT-FILE. 39 STOP RUN. 40 REL-PROC. 41 PERFORM UNTIL RSLT-EOF 42 READ RSLT-FILE AT END SET RSLT-EOF TO TRUE 43 NOT AT END [空欄b] 44 END-READ 45 END-PERFORM. 46 RET-PROC. 47 PERFORM UNTIL SORT-EOF 48 RETURN SORT-FILE AT END SET SORT-EOF TO TRUE 49 NOT AT END PERFORM MATCHING-PROC 50 END-RETURN 51 END-PERFORM. 52 MATCHING-PROC. 53 READ MST-FILE. 54 PERFORM TEST BEFORE UNTIL [空欄c] 55 READ MST-FILE END-READ 56 END-PERFORM. 57 PERFORM TEST BEFORE VARYING CNT [空欄d] UNTIL CNT = 0 58 MOVE MST-HISTORY(CNT) TO MST-HISTORY(CNT + 1) 59 END-PERFORM. 60 MOVE NEW-DATE TO MST-DATE(1). 61 MOVE SORT-ELM TO MST-ELM(1). 62 REWRITE MST-REC. 図3 確認結果の表示例 図3「確認結果の表示例」: 920186: NO-DATA 920189: 920221: WEIGHT BLOOD-PRESSURE XRAY 930015: WEIGHT 930016: 940047: NO-DATA … 確認結果の表示についての説明 【確認結果の表示についての説明】次に該当する従業員は、従業員番号に続けて該当する文字列を表示する。複数該当する場合は、その全てを表示する。①今回受診していない場合はNO-DATA。②今回と前回の体重を比較して、4kg以上の増減がある場合はWEIGHT。③今回の最高血圧が140 mmHg以上(高血圧症状)、又は90 mmHg以下(低血圧症状)である場合はBLOOD-PRESSURE。④今回の胸部X線の診断で所見がある場合はXRAY。 表1 プログラムの変更内容 表1「プログラムの変更内容」。行番号29と30の間に次を追加: 77 MST-FLAG PIC X(1) VALUE SPACE. 88 MST-EOF VALUE “E”. 01 DISP-WK PIC X(30). 空欄eで指定する箇所に次を追加: PERFORM UNTIL MST-EOF READ MST-FILE AT END SET MST-EOF TO TRUE NOT AT END DISPLAY MST-NO “: NO-DATA” END-READ END-PERFORM. 行番号54と55の間に追加:DISPLAY MST-NO “: NO-DATA” 行番号61と62の間に空欄fの文を追加。 その後、次の記述を追加: MOVE SPACE TO DISP-WK. IF MST-DATE(2) NOT = ZERO AND (空欄g) THEN MOVE “ WEIGHT” TO DISP-WK(CNT:) ADD 7 TO CNT END-IF. IF MST-HIGHPRES(1) >= 140 OR MST-HIGHPRES(1) <= 90 THEN MOVE “ BLOOD-PRESSURE” TO DISP-WK(CNT:) ADD 15 TO CNT END-IF. IF MST-XRAY(1) = 1 THEN MOVE “ XRAY” TO DISP-WK(CNT:) END-IF. DISPLAY MST-NO “:” DISP-WK.
プログラム中の空欄に入れる正しい答えを、解答群の中から選べ。 a、bに関する解答群 ア MOVE RSLT-DATE TO NEW-DATE イ MOVE ZERO TO CNT ウ MOVE ZERO TO NEW-DATE エ PERFORM RET-PROC オ RELEASE SORT-REC カ RELEASE SORT-REC FROM RSLT-REC cに関する解答群 ア MST-NO = SORT-NO イ MST-NO < SORT-NO ウ MST-NO > SORT-NO エ MST-NO NOT = SORT-NO dに関する解答群 ア FROM 0 BY 1 イ FROM 9 BY -1 ウ FROM 10 BY -1 エ FROM CNT BY 1
プログラムを変更して、健康診断の結果を健康診断マスタファイルに反映するときに、全ての従業員の確認結果を図3に示すように表示する。表1中の空欄に入れる正しい答えを、解答群の中から選べ。 eに関する解答群 ア 行番号34と35の間 イ 行番号45と46の間 ウ 行番号51と52の間 エ 行番号52と53の間 fに関する解答群 ア MOVE 1 TO CNT イ MOVE 10 TO CNT ウ MOVE MST-DATE(1) TO NEW-DATE エ MOVE ZERO TO NEW-DATE gに関する解答群 ア MST-WEIGHT(1) >= MST-WEIGHT(2) + 4 OR MST-WEIGHT(1) <= MST-WEIGHT(2) - 4 イ MST-WEIGHT(1) >= MST-WEIGHT(CNT) + 4 OR MST-WEIGHT(1) <= MST-WEIGHT(CNT) - 4 ウ MST-WEIGHT(10) >= MST-WEIGHT(9) + 4 OR MST-WEIGHT(10) <= MST-WEIGHT(9) - 4 エ MST-WEIGHT(10) >= MST-WEIGHT(CNT) + 4 OR MST-WEIGHT(10) <= MST-WEIGHT(CNT) - 4
問11 次のJavaプログラムの説明及びプログラムを読んで、設問1、2に答えよ。 (Javaプログラムで使用するAPIの説明は、この冊子の末尾を参照してください。) [プログラムの説明] 整数値の加減乗除を行う電卓のプログラムである。電卓は、数字キー、加減乗除の各演算キー、イコールキー及びクリアキーをもつ。プログラムは、キーが押されたとき、それぞれのキーに対応する処理を実行する。数値などの表示は、System.out.printlnを呼び出して行う。インタフェースKeyは、電卓のキーが押されたときの処理を実行するメソッドを定義する。メソッドoperateOnは、引数で与えられたクラスjava.util.Stackのインスタンス(以下、スタックという)に対して、キーに対応する処理を実行する。列挙DigitKeyは、数字キーを表す定数DIGIT0~DIGIT9を定義する。メソッドoperateOnは、キーを10進数の入力として処理する。スタックの先頭に格納されている値は0(初期値)又は入力中の数値であり、その値を更新する。列挙OperationKeyは、加減乗除の各演算キー、イコールキー及びクリアキーを表す定数ADD、SUBTRACT、MULTIPLY、DIVIDE、EQUAL及びCLEARを定義する。メソッドoperateOnは、加減乗除の各演算キーに対応する演算をスタックの内容に対して実行する。クラスCalculatorは電卓本体を表す。フィールドstackは電卓内部の数値の状態を表すスタックを保持する。フィールドpendingKeyは、演算に必要な数値の入力が終わるまで演算キーを保持する。また、イコールキーが押されたときはイコールキーを保持する。例えば、DIGIT2、ADD、DIGIT4が順に処理されると、スタックに格納されている値は先頭から4、2であり、pendingKeyの値はADDである。次にEQUALが処理されたとき、演算キーADDの加算処理が実行され、スタックに格納されている値は6となり、pendingKeyの値はEQUALとなる。二つの数値に対する加減乗除の演算結果は、Javaのint型の演算結果に一致するものとする。メソッドonKeyPressedは、電卓のキーが押されたときに呼び出される。押されたキーは引数で与えられ、押されたキー及び電卓の内部状態に基づいて処理を実行する。クラスCalculatorTestはクラスCalculatorをテストするプログラムである。メソッドmainは、文字と電卓の各キーとの対応を作成し、クラスCalculatorのインスタンスを生成する。次に、引数で与えられた文字列の各文字をキーの定数に変換し、そのキーの定数を引数としてCalculatorインスタンスのメソッドonKeyPressedを呼び出す。例えば、mainの引数として文字列「2*3=」が与えられたとき、各文字をキーの定数DIGIT2、MULTIPLY、DIGIT3、EQUALに変換し、逐次それぞれを引数としてonKeyPressedを呼び出す。mainを実行したときの出力例は図1のとおりである。 プログラム1 プログラム1:import java.util.Stack;。public interface Key { public void operateOn(Stack<Integer> stack); } プログラム2 プログラム2:import java.util.Stack; enum DigitKey[a] Key { DIGIT0, DIGIT1, DIGIT2, DIGIT3, DIGIT4, DIGIT5, DIGIT6, DIGIT7, DIGIT8, DIGIT9; public void operateOn(Stack<Integer> stack) { stack.push([b] * 10 + [c]); } } プログラム3 プログラム3:import java.util.Stack; enum OperationKey[a] Key { ADD, SUBTRACT, MULTIPLY, DIVIDE, EQUAL, CLEAR; public void operateOn(Stack<Integer> stack) { if (this == EQUAL || this == CLEAR) { return; } int val2 = stack.pop(); int val1 = stack.pop(); stack.push(calculate(val1, val2)); } private int calculate(int val1, int val2) { switch ([d]) { case ADD: return val1 + val2; case SUBTRACT: return val1 - val2; case MULTIPLY: return val1 * val2; case DIVIDE: return val1 / val2; default: throw new AssertionError(toString()); } } } プログラム4 プログラム4:import java.util.Stack; public class Calculator { private final Stack<Integer> stack = new Stack<Integer>(); private Key pendingKey; public Calculator() { stack.push(0); } public void onKeyPressed(Key key) { System.out.println(key); if (key instanceof DigitKey) { if (pendingKey == OperationKey.EQUAL) { reset(); } key.operateOn(stack); System.out.println(stack.peek()); } else if (key == OperationKey.CLEAR) { reset(); System.out.println(stack.peek()); } else { try { if (pendingKey != null) { pendingKey.operateOn(stack); } System.out.println(stack.peek()); pendingKey = key; if (key != OperationKey.EQUAL) { stack.push(0); } } catch (ArithmeticException e) { System.out.println("Error"); reset(); } } } private void reset() { stack.clear(); stack.push(0); pendingKey = null; } } プログラム5 プログラム5:import java.util.HashMap; import java.util.Map; public class CalculatorTest { public static void main(String[] args) { Map<Character, [e]> map = new HashMap<Character, [e]>(); // 文字と列挙OperationKeyの定数の対応をmapに格納する。 for (OperationKey key : OperationKey.values()) map.put("+-*/=C".charAt(key.ordinal()), key); // 数字と列挙DigitKeyの定数の対応をmapに格納する。 for (DigitKey key : DigitKey.values()) map.put("0123456789".charAt(key.ordinal()), key); Calculator calc = new Calculator(); String chars = args[0]; // charsの各文字をキーの定数に変換し、メソッドonKeyPressedを呼び出す。 for (int i = 0; i < chars.length(); i++) { calc.onKeyPressed(map.get(chars.charAt(i))); } } } 図1 図1「メソッドmainを実行したときの出力」。表示行は上から順に DIGIT2、2、MULTIPLY、2、DIGIT3、3、EQUAL、6。 表1 表1「文字列(引数)と出力(最後の行)」の列は「文字列(引数)」「出力(最後の行)」。行は「2*6/3=」→4、「-2=」→-2、「2*4==」→8、「2*4C2=」→[f]、「8/2/=」→[g]。 関連API:Map、HashMap(物理PDFページ69) 物理PDFページ69のAPI説明。java.util.Map<K,V>:型Kのキーに型Vの値を対応付けて保持するインタフェース。各キーは一つの値としか対応付けられない。public V get(Object key):指定されたキーに対応付けられた型Vの値を得る。対応付けがなければnullを返す。public V put(K key, V value):キーに値を対応付けて登録する。キーに既にほかの値が対応付けられていれば、その値を指定された値に置き換える。戻り値は以前の値で、対応付けがなければnull。java.util.HashMap<K,V>:Mapインタフェースのハッシュを用いた実装。public HashMap() は空のHashMapを作る。 関連API:Stack(物理PDFページ70) 物理PDFページ70のAPI説明。java.util.Stack<E>:オブジェクトの後入れ先出し(LIFO)スタックを表す。public Stack() は空のスタックを生成する。public E push(E item) は指定されたオブジェクトをスタックの先頭に追加し、そのオブジェクトを返す。public E pop() はスタックの先頭のオブジェクトを削除して返す。public E peek() は先頭のオブジェクトを削除せずに返す。public void clear() は全オブジェクトを削除し、スタックを空にする。
プログラム中の空欄に入れる正しい答えを、各解答群の中から選べ。 aに関する解答群 ア extends イ implements ウ imports エ inherits オ requires カ throws b、cに関する解答群 ア ordinal() イ stack.peek() ウ stack.pop() エ stack.push(0) オ stack.push(ordinal()) カ values() dに関する解答群 ア DigitKey イ Key ウ stack.pop() エ this オ val1 カ val2 eに関する解答群 ア Calculator イ Character ウ DigitKey エ Integer オ Key カ OperationKey
表1は、文字列を引数としてメソッドmainを実行したときの出力の最後の行(図1の場合は6)を表している。表中の空欄に入れる正しい答えを、解答群の中から選べ。プログラム中の空欄には、全て正しい答えが入っているものとする。 f、gに関する解答群 ア 0 イ 2 ウ 4 エ 8 オ 16 カ 32 キ 64 ク ArithmeticException ケ Error
問12 次のアセンブラプログラムの説明及びプログラムを読んで,設問1~3に答えよ。 プログラム1の説明、図1、表1 【プログラム1の説明】リストに対して,要素を挿入又は削除する副プログラム LPROC である。リストの構造を図1に示す。 (1) リストは一つ以上の要素をもち,一つの要素は連続する2語から成る。1語目には次の要素の先頭アドレス(図中では矢印で表す)が,2語目にはその要素の保持する値が格納される。要素は主記憶の0番地以外に配置され,最後の要素の1語目には,次の要素がないことを表すために0が設定される。 (2) ROOTは1語から成り,最初の要素(要素1)の先頭アドレスが格納される。 (3) 主プログラムは,表1に示す値を各レジスタに設定して LPROC を呼ぶ。 ① n は操作対象とする要素が,リストの先頭から何番目かを指定する正の整数である。 ② 要素の挿入の場合は,その要素が先頭から n 番目となる位置(要素 n の直前)に挿入される。削除の場合は,先頭から n 番目の要素(要素 n)が削除される。 ③ n として,リストの現在の要素の個数 N よりも大きい値が与えられたとき,LPROC は何もせずに呼出し元に戻る。 表1 LPROC呼出し時のレジスタ設定:列は「操作、GR0、GR1、GR2、GR3」。挿入:挿入する値、ROOTのアドレス、n、0。削除:—、ROOTのアドレス、n、1。 図1 リストの構造:ROOTは最初の要素の先頭アドレスを指す。要素1、要素2、要素3、…、要素Nが矢印で順につながる。各要素は上段に次要素の先頭アドレス、下段に「値1」「値2」「値3」…「値N」を保持する。最後の要素の上段は0。リストは要素1から要素Nまでを含む。 EGET、EFREE、LPROCの動作とレジスタ保存 LPROC は,要素を挿入又は削除するとき,それぞれ別に用意された副プログラム EGET 又は EFREE を呼ぶ。 EGET は,挿入される要素に必要な領域を記憶管理領域から割り当てるために呼び出され,新たに割り当てられた連続する2語から成る領域の先頭アドレスを GR2 に設定して呼出し元に返す。 EFREE は,削除された要素の先頭アドレスを GR2 に設定して呼び出され,当該要素が使用していた領域を記憶管理領域に戻す。 副プログラム EGET から戻るとき,GR2以外の汎用レジスタの内容は元に戻る。副プログラム EFREE から戻るとき,汎用レジスタ GR1~GR7 の内容は元に戻る。副プログラム LPROC から戻るとき,汎用レジスタ GR1~GR7 の内容は元に戻る。 プログラム1 プログラム1(LPROC)。空欄 a、b、c は原本のまま空欄として示す。 1 LPROC START 2 RPUSH 3 LD GR4,GR2 ; GR4 ← n 4 LP LD GR2,0,GR1 ; 次の要素をたどる 5 JZE FIN ; n > N か? 6 SUBA GR4,=1 7 JZE NEXT ; 要素 n に達したか? 8 [a] 9 JUMP LP 10 NEXT LD GR3,LTBL,GR3 11 JUMP 0,GR3 ; 指定された処理にジャンプ 12 LINS LD GR4,GR2 13 CALL EGET ; GR2 ← 挿入される要素の先頭アドレス 14 [b] 15 ST GR4,0,GR2 ; 挿入される要素の1語目を設定 16 ST GR0,1,GR2 17 JUMP FIN 18 LDEL [c] ; GR4 ← 要素 n+1 の先頭アドレス 19 ST GR4,0,GR1 ; 要素 n-1 の1語目を再設定 20 CALL EFREE ; 削除された要素 n の領域を解放 21 FIN RPOP 22 RET 23 LTBL DC LINS ; 処理の分岐先アドレステーブル 24 DC LDEL 25 END 設問1の解答群 設問1の解答群。 aに関する解答群:ア JMI FIN、イ LAD GR1,1,GR1、ウ LAD GR4,1,GR4、エ LD GR1,GR2、オ LD GR1,0,GR2。 bに関する解答群:ア LD GR4,0,GR1、イ LD GR4,0,GR2、ウ ST GR2,0,GR1、エ ST GR2,0,GR2、オ ST GR4,0,GR1、カ ST GR4,0,GR2。 cに関する解答群:ア LD GR4,0,GR1、イ LD GR4,0,GR2、ウ LD GR4,2,GR1、エ LD GR4,2,GR2、オ LD GR4,GR1、カ LD GR4,GR2。 図2、設問2の解答群 図2 要素数が3個のリスト:ROOTから要素1、要素2、要素3の順に矢印でつながり,要素3の次要素アドレス欄は0。各要素は2語から成る。設問2では,n=3で LPROC を実行して要素を挿入する。行番号12のラベル LINS の命令を実行するとき,GR2に格納されている値を問う。 設問2の解答群:ア 挿入する要素の先頭アドレス、イ 要素2の先頭アドレス、ウ 要素3の先頭アドレス、エ 0。 プログラム2、設問3の解答群 プログラム2(MAIN): MAIN START LD GR0,=1 LD GR2,=3 ; n=3 LD GR3,=0 LAD GR1,ROOT CALL LPROC LD GR0,=2 CALL LPROC LD GR3,=1 CALL LPROC RET ROOT DC LIST LIST DC E3,#000A ; リストの最初の要素(要素1) E1 DC E2,#000B E2 DC #0000,#000D ; リストの最後の要素 E3 DC E1,#000C END 設問3では,ラベル LIST 以降に格納されている要素数が4個のリストについてプログラム2の MAIN を実行する。実行後のラベル E3 で示される番地の内容を問う。EGETで割り当てられた要素の先頭アドレスは,割り当てられた順に α1,α2 とする。 設問3の解答群:ア α1、イ α2、ウ E1、エ E2、オ 0。 関連するCOMET II命令・マクロの仕様 この問題のプログラムに関係する COMET II の仕様: レジスタは GR0~GR7。LD r1,r2 は r1←(r2)、LD r,adr[,x] は r←(実効アドレス)。ST r,adr[,x] は実効アドレス←(r)。LAD r,adr[,x] は r←実効アドレス。adr はアドレスを表し,x は指標レジスタ(GR1~GR7)。 SUBA r1,r2 は r1←(r1)-(r2)。JMI adr[,x] は SF=1 のとき分岐し,JZE adr[,x] は ZF=1 のとき分岐する。JUMP adr[,x] は無条件分岐する。 CALL adr[,x] は副プログラムを呼び出し,RET は副プログラムから戻る。PUSH adr[,x] は実効アドレスをスタックに積む。POP r はスタックから取り出して r に格納する。 RPUSH マクロは GR1、GR2、…、GR7 の内容をこの順でスタックに格納する。RPOP マクロはスタックから順次取り出し,GR7、GR6、…、GR1 の順に格納する。
プログラム1中の空欄に入れる正しい答えを,解答群の中から選べ。 aに関する解答群 ア JMI FIN イ LAD GR1,1,GR1 ウ LAD GR4,1,GR4 エ LD GR1,GR2 オ LD GR1,0,GR2 bに関する解答群 ア LD GR4,0,GR1 イ LD GR4,0,GR2 ウ ST GR2,0,GR1 エ ST GR2,0,GR2 オ ST GR4,0,GR1 カ ST GR4,0,GR2 cに関する解答群 ア LD GR4,0,GR1 イ LD GR4,0,GR2 ウ LD GR4,2,GR1 エ LD GR4,2,GR2 オ LD GR4,GR1 カ LD GR4,GR2
図2に示す要素数が3個のリストについて,n=3で LPROC を実行し,要素を挿入する。行番号12のラベル LINS の命令を実行するとき GR2に格納されている値として,正しい答えを解答群の中から選べ。
ラベル LIST 以降に格納されている要素数が4個のリストについて,プログラム2の MAIN を実行した。実行後のラベル E3 で示される番地の内容として,正しい答えを解答群の中から選べ。ここで,EGET で割り当てられた要素の先頭アドレスは,割り当てられた順に α1,α2 とする。
問13「表計算ソフトを用いた作業工程の計算」。A社では、建物の改築作業を効率的に遂行するスケジュールを決定するため、表計算ソフトを用いている。作業とは、建物の改築状態をある状態から別の状態にする行為である。状態は20種類あり、それぞれに状態ID 1~20が割り振られている。改築作業の作業工程は、一つ以上の作業を順に施すことをいう。一連の作業による改築状態の遷移を状態IDの列で表し、状態遷移列と呼ぶ。まず、作業による状態遷移の関係と各作業の日数を入力するワークシート「状態遷移」を作成した。次に、状態遷移列を入力すると、その状態遷移列が存在するかを判定し、存在する場合は作業工程の総日数を算出するワークシート「作業工程」を作成した。さらに、開始状態IDと終了状態IDを入力すると、総日数が最小となる状態遷移列を求める機能を追加したワークシート「作業工程(拡張)」を作成し、マクロCalculateMinimumとDisplayMinimumPathを格納した。 図1 状態遷移表 図1「ワークシート『状態遷移』」。列見出しはC~Vに「作業開始時の状態ID」1~20、行見出しはB3~B22に「作業終了時の状態ID」1~20。C3:V22は対応する作業が存在する場合に作業日数、存在しない場合は0。日数は100日以下の整数。例:C4=5は開始状態ID 1から終了状態ID 2への作業が存在し、5日かかることを表す。C6=0は開始状態ID 1から終了状態ID 4への作業が存在しないことを表す。全作業で終了時の状態IDは開始時の状態IDより大きい。 図2 作業工程ワークシート 図2「ワークシート『作業工程』」の例。列Aは状態遷移列の状態ID、列Bは日数、列Cは総日数。存在する例ではA3=3、A4=4、A5=6、A8=11、B3:B8は0,8,8,…,5、C3:C8は0,8,16,…,35。B22=0、C22=35、B23は「計」、C23=35。存在しない例ではA3=3、A4=4、A5=7、A8=15、A9=17で、B5、C5、B8、C8、C22、C23は「×」。A3:A22には状態遷移列の状態IDを順に入力し、最後の状態IDの下は空欄。同じ状態IDを2回以上入力しない。B3=0。B4:B22は、直前の状態から同じ行の状態へ直接遷移する作業の日数。作業がなければ「×」、同じ行のA列が空欄なら0。C3=0。C4:C22はA3の状態から同じ行のA列の状態までに必要な作業の総日数。直接遷移がなければ「×」、一つ上のC列が「×」なら「×」、同じ行のA列が空欄なら一つ上のセルと同じ値。C23は状態遷移列が存在すれば総日数、存在しなければ「×」。 図3 拡張作業工程ワークシート 図3「ワークシート『作業工程(拡張)』」の例。A~C列は図2と同様。E2は開始状態IDの見出し、E3は終了状態IDの見出し。入力値は例ではF2=3、F3=13。H列は状態ID、I列は最小日数、J列はその最小日数となる状態遷移列での直前状態ID。例ではH3=1、I3=9999、H4=2、I4=9999、H5=3、I5=0、J5=0、H9=7、I9=19、J9=6、H10=8、I10=21、J10=6、H11=9、I11=28、J11=8、H15=13、I15=47、H16=14、I16=51、J16=13、H22=20、I22=80、J22=19。B23は「計」、C23=47。 図3およびマクロ仕様 マクロCalculateMinimumの仕様:H3:H22に状態IDを1から順に格納する。I3:I22には、開始状態IDから各行H列の状態IDまで遷移するのに必要な作業の総日数の最小値を格納し、状態遷移列が存在しない場合は9999を格納する。J3:J22には、その最小値を与える状態遷移列における直前の状態IDを格納し、開始状態IDに対応するセルは0、状態遷移列が存在しない場合は空欄とする。マクロDisplayMinimumPathの仕様:A3:A22に、作業工程の総日数が最小となる状態遷移列を格納する。終了状態IDを格納したセルより下は空欄。開始状態IDから終了状態IDまでの状態遷移列が存在しない場合、A3:A22は全て空欄。 公式別添の関連仕様 公式別添(物理PDF 77~82頁)のうち本問に関係する表計算仕様。セル範囲は左上端:右下端で表し、他シートの参照は「シート名!セル範囲」。相対参照は複写先に応じ行・列位置の差を加え、絶対参照は行・列番号の前に$を付けて固定する。IF(論理式, 式1, 式2)は論理式がtrueなら式1、falseなら式2を返す。論理積は全条件がtrueのときtrue、論理和は少なくとも一つがtrueのときtrue。表引き(セル範囲, 行位置, 列位置)は範囲内の指定位置のセル値を返す。照合検索(式, 検索セル範囲, 抽出セル範囲)は、検索範囲を左端列から下へ検索し、式と一致する最初のセルについて、同位置にある抽出範囲の値を返す。マクロはマクロ名を宣言し、数値型変数を宣言して使用する。セル変数は宣言なしで使用可能。相対(基準セル, 行位置, 列位置)は基準セルから指定した相対位置のセルを表す。反復処理の図示された形式は、反復変数の初期値、継続条件、増分を指定し、条件成立中に本体を実行する。 マクロDisplayMinimumPathの処理図 数値型:I, NumWork, Current。I: 1, I≦20, 1の間、相対(A2, I, 0)←null。相対(I2, F3, 0)<9999の場合、NumWork←0、Current←F3。作業数を算出する空欄dの反復内でCurrent←[e]、NumWork←NumWork+1。次に状態遷移列を格納するためCurrent←F3。空欄fの反復内で相対(A3, I, 0)←Current、Current←[e]。
ワークシート「作業工程」の作成手順(1)~(4)中の空欄に入れる正しい答えを、解答群から選べ。(1)セルB3及びセルC3に0を入力する。(2)次の式をセルB4に入力し、セルB5~B22に複写する。IF(A4=null, 0, IF(a>0, a, '×'))。(3)次の式をセルC4に入力し、セルC5~C22に複写する。IF(b, '×', c)。(4)次の式をセル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
マクロDisplayMinimumPath中の空欄に入れる正しい答えを、解答群から選べ。 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
各問題の下に出典を記載しています。