応用情報技術者過去問題 平成23年特別 午後問2
⇄問題文と設問を画面2分割で開く⇱問題PDF問2 プログラミング
集計表をHTMLに変換して出力するプログラムに関する次の記述を読んで,設問1~4に答えよ。
図1に示すような,都道府県及び支店ごとに整理された売上高一覧のCSVファイルを入力し,表1のような都道府県ごとの売上高の集計表をHTMLで出力するプログラムがある。ここで,一つの都道府県における支店数は500未満とする。〔使用するHTMLについて〕
使用するHTMLタグ及びその属性を表2に示す。 表1をHTMLで記述した例を図2に示す。〔プログラムの概要〕
プログラムの処理手順の概要を次の(1)~(5)に,使用する構造体,配列,変数及び関数の一部を表3に,構造体及び配列の使い方を表4に示す。
図1に示すような,都道府県及び支店ごとに整理された売上高一覧のCSVファイルを入力し,表1のような都道府県ごとの売上高の集計表をHTMLで出力するプログラムがある。ここで,一つの都道府県における支店数は500未満とする。〔使用するHTMLについて〕
使用するHTMLタグ及びその属性を表2に示す。 表1をHTMLで記述した例を図2に示す。〔プログラムの概要〕
プログラムの処理手順の概要を次の(1)~(5)に,使用する構造体,配列,変数及び関数の一部を表3に,構造体及び配列の使い方を表4に示す。
- CSVファイルを配列 CSVArray に読み込む。
- <table>の開始タグ及び集計表のヘッダー行を出力する。
- 配列 CSVArray の先頭要素から末尾まで1件ずつ読み,配列 shitenArray に支店名と売上高を追加していく。途中で都道府県が変わった場合,支店名と売上高を追加する前に,①都道府県,支店名,売上高,小計のHTMLタグ及びデータを出力し,配列 shitenArray の全要素を削除する。
- ②都道府県,支店名,売上高,小計のHTMLタグ及びデータを出力する。
- 合計及び<table>の終了タグを出力する。
- 図3のαでは,CSVファイルのデータを1行ずつ全行を配列に読み込んでいる。その結果,読み込むデータ量が多いほど,時間だけでなくクを多く消費してしまう,という問題がある。
- 図3のβでは,③都道府県のセルを出力するために,同一都道府県の各支店の情報をその都度出力するのではなく,順次配列 shitenArray に追加している。
設問1
図2中のア,イに入れる適切な字句を答えよ。
解答入力欄
- ア:
- イ:
解答例・解答の要点
- ア:rowspan="4"
- イ:colspan="2"
解説
表1「出力する集計表のイメージ」と、表2「使用するHTMLタグ及びその属性」をもとに考えます。
〔アについて〕
[ア]がある位置から、空欄にはタグの属性が入ることがわかります。表1を見ると、[ア]の<td>タグが表す"東京都"のセルは縦方向に4セル連結しているので、[ア]に入るのは縦方向に4セル連結するための属性です。表2の タグの説明には「属性rowspanによって,セルを指定数分,縦方向に連結できる」とあるので、属性rowspanに4を指定することになります。図2のHTMLの記述例を見るとわかるように、HTMLでは原則として「属性名="属性値"」の形式で属性を指定します。よって、[ア]には「rowspan="4"」が当てはまります。
∴ア=rowspan="4"
〔イについて〕
[ア]と同様に、空欄には<td>タグの属性が入ります。表1を見ると、[イ]のタグが表す"合計"のセルは横方向に2セル連結しているので、[イ]に入るのは横方向に2セル連結するための属性です。表2のタグの説明には「属性colspanによって,セルを指定数分,横方向に連結できる」とあるので、属性colspanに2を指定することになります。よって、[イ]には「colspan="2"」が当てはまります。
∴イ=colspan="2"
ちなみに、HTMLでは、属性値が半角英数字(0-9a-zA-Z)、ハイフン(-)、ピリオド(.)、アンダースコア(_)、コロン(:)のみから成るときはダブルクォーテーション(")若しくはクォーテーション(')で囲まなくても良いとされています。したがって、「rowspan=4」と「colspan=2」でも問題ないと思われます。
Pagetop
〔アについて〕
[ア]がある位置から、空欄には
∴ア=rowspan="4"
〔イについて〕
[ア]と同様に、空欄には<td>タグの属性が入ります。表1を見ると、[イ]のタグが表す"合計"のセルは横方向に2セル連結しているので、[イ]に入るのは横方向に2セル連結するための属性です。表2のタグの説明には「属性colspanによって,セルを指定数分,横方向に連結できる」とあるので、属性colspanに2を指定することになります。よって、[イ]には「colspan="2"」が当てはまります。
∴イ=colspan="2"
ちなみに、HTMLでは、属性値が半角英数字(0-9a-zA-Z)、ハイフン(-)、ピリオド(.)、アンダースコア(_)、コロン(:)のみから成るときはダブルクォーテーション(")若しくはクォーテーション(')で囲まなくても良いとされています。したがって、「rowspan=4」と「colspan=2」でも問題ないと思われます。
設問2
図3中のウ~オに入れる適切な字句を答えよ。
解答入力欄
- ウ:
- エ:
- オ:
解答例・解答の要点
- ウ:CSVArray.size-1
- エ:CSVArray[i].todofukenとkeyが等しくない
- オ:goukei ← goukei+CSVArray[i].uriage
解説
〔ウについて〕
空欄にはfor文におけるループ変数 i の最大値が入ります。
問題文の〔プログラムの概要〕より、[ウ]を含むforループは(3)の処理であることがわかります。(3)の処理では「配列 CSVArray の先頭要素から末尾まで1件ずつ読み,配列 shitenArray に支店名と売上高を追加していく」とあるように、配列 CSVArray の全要素(先頭から末尾まで)を対象にして i を1ずつ増やしながら処理を繰り返していきます。表4の配列の説明を読むと、配列は0始まりであり、要素数を「配列名.size」で取得できるとありますから、配列 CSVArray の末尾要素の添字は「CSVArray.size-1」と表すことができます。よって、[ウ]には「CSVArray.size-1」が当てはまります。
∴ウ=CSVArray.size-1
〔エについて〕
if文の条件式が入ります。
この条件式が真のときには、関数 printShitenArray を実行します。表3には、関数 printShitenArray は「shitenArray に入っている各支店の売上高及び小計を出力する関数。…〔プログラムの概要〕(3)の下線①及び(4)の下線②で使用する」と説明されています。下線①の処理(関数 printShitenArray)は「途中で都道府県が変わった場合,支店名と売上高を追加する前に」実行する処理であること、if文内で関数 printShitenArray が実行されていることより、if文の条件式には「途中で都道府県が変わった場合」を判定するための式が入ることがわかります。
現在参照している行(CSVArray[i])の都道府県は CSVArray[i].todohuken に、現在集計中の都道府県は key にそれぞれ格納されているので、この2つを比較することで都道府県が変わったことを判定できます。両者が異なれば次の都道府県に移ったということです。したがって、[エ]には「CSVArray[i].todofukenとkeyが等しくない」が当てはまります。
∴エ=CSVArray[i].todofukenとkeyが等しくない
〔オについて〕
表1の集計表を見ると売上高の合計が出力されていますが、図3のプログラムでは9行目で変数 goukei を0で初期化した後、全く更新していません。これだと最終的に println(goukei, …) で出力される金額が0になってしまいますから、行ごとの売上高を変数 goukei に加算する処理が必要であることがわかります。現在参照している行(CSVArray[i])の売上高は CSVArray[i].uriage に格納されていますから、[オ]には goukei に CSVArray[i].uriage を加算する処理が当てはまります。
∴オ=goukei ← goukei+CSVArray[i].uriage
空欄にはfor文におけるループ変数 i の最大値が入ります。
問題文の〔プログラムの概要〕より、[ウ]を含むforループは(3)の処理であることがわかります。(3)の処理では「配列 CSVArray の先頭要素から末尾まで1件ずつ読み,配列 shitenArray に支店名と売上高を追加していく」とあるように、配列 CSVArray の全要素(先頭から末尾まで)を対象にして i を1ずつ増やしながら処理を繰り返していきます。表4の配列の説明を読むと、配列は0始まりであり、要素数を「配列名.size」で取得できるとありますから、配列 CSVArray の末尾要素の添字は「CSVArray.size-1」と表すことができます。よって、[ウ]には「CSVArray.size-1」が当てはまります。
∴ウ=CSVArray.size-1
〔エについて〕
if文の条件式が入ります。
この条件式が真のときには、関数 printShitenArray を実行します。表3には、関数 printShitenArray は「shitenArray に入っている各支店の売上高及び小計を出力する関数。…〔プログラムの概要〕(3)の下線①及び(4)の下線②で使用する」と説明されています。下線①の処理(関数 printShitenArray)は「途中で都道府県が変わった場合,支店名と売上高を追加する前に」実行する処理であること、if文内で関数 printShitenArray が実行されていることより、if文の条件式には「途中で都道府県が変わった場合」を判定するための式が入ることがわかります。
現在参照している行(CSVArray[i])の都道府県は CSVArray[i].todohuken に、現在集計中の都道府県は key にそれぞれ格納されているので、この2つを比較することで都道府県が変わったことを判定できます。両者が異なれば次の都道府県に移ったということです。したがって、[エ]には「CSVArray[i].todofukenとkeyが等しくない」が当てはまります。
∴エ=CSVArray[i].todofukenとkeyが等しくない
〔オについて〕
表1の集計表を見ると売上高の合計が出力されていますが、図3のプログラムでは9行目で変数 goukei を0で初期化した後、全く更新していません。これだと最終的に println(goukei, …) で出力される金額が0になってしまいますから、行ごとの売上高を変数 goukei に加算する処理が必要であることがわかります。現在参照している行(CSVArray[i])の売上高は CSVArray[i].uriage に格納されていますから、[オ]には goukei に CSVArray[i].uriage を加算する処理が当てはまります。
∴オ=goukei ← goukei+CSVArray[i].uriage
設問3
図4中のカ,キに入れる適切な字句を答えよ。
解答入力欄
- カ:
- キ:
解答例・解答の要点
- カ:shitenArray.size-1
- キ:shitenArray.size+1
解説
〔カについて〕
空欄にはfor文におけるループ変数 i の最大値が入ります。
関数 printShitenArray は、shitenArray に入っている各支店の売上高と小計を出力する関数ですから、for文では配列 shitenArray の全要素(先頭から末尾まで)を対象に i を1ずつ増やしながら処理を繰り返すことになります。配列 shitenArray の末尾要素の添字は「shitenArray.size-1」ですから、[キ]には「shitenArray.size-1」が当てはまります。
∴カ=shitenArray.size-1
〔キについて〕
空欄を含む関数 print の処理は、都道府県名のセルを出力する部分です。<td>タグに「rowspan」の属性があることから、空欄には縦に連結するセルの数が入ることがわかります。表1を見ると、都道府県名を表示するセルは、支店数+小計用の1セル分だけ連結していることがわかります。よって、「キ」には「shitenArray.size+1」が当てはまります。
∴キ=shitenArray.size+1
空欄にはfor文におけるループ変数 i の最大値が入ります。
関数 printShitenArray は、shitenArray に入っている各支店の売上高と小計を出力する関数ですから、for文では配列 shitenArray の全要素(先頭から末尾まで)を対象に i を1ずつ増やしながら処理を繰り返すことになります。配列 shitenArray の末尾要素の添字は「shitenArray.size-1」ですから、[キ]には「shitenArray.size-1」が当てはまります。
∴カ=shitenArray.size-1
〔キについて〕
空欄を含む関数 print の処理は、都道府県名のセルを出力する部分です。<td>タグに「rowspan」の属性があることから、空欄には縦に連結するセルの数が入ることがわかります。表1を見ると、都道府県名を表示するセルは、支店数+小計用の1セル分だけ連結していることがわかります。よって、「キ」には「shitenArray.size+1」が当てはまります。
∴キ=shitenArray.size+1
設問4
〔プログラムに関する考察〕について,(1),(2)に答えよ。
- 本文中のクに入れる適切な字句を答えよ。
- 本文中の下線③のように処理する理由を,HTMLタグ及びその属性を用いて,40字以内で述べよ。
解答入力欄
- ク:
解答例・解答の要点
- ク:記憶領域 又は メモリ
- HTMLタグの<td>のrowspan属性の値を決める必要があるから (40文字)
解説
- 〔クについて〕
図3のプログラムでは、CSVファイルのデータを1行ずつ全行を配列 CSVArray に読み込んだ後に、その配列内のデータに対して処理を行っています。このため、CSVファイルのデータ量が多いほど、配列 CSVArray が必要とするメモリサイズも大きくなります。図3のプログラムは、CSVファイルのデータ量が多いほどメモリを多く消費する構造になっていると言えます。
∴ク=記憶領域 又は メモリ - 図2のHTMLを見ると、都道府県名を表示するセルを示す<td rowspan="●">タグは、各支店のセルを示す<td>タグよりも先に出力されています。
配列 CSVArray から1件ずつ読み込んでいくという処理の構造上、その都道府県の支店数が確定するのは都道府県が変わったときです。つまり、同じ都道府県の支店データを全て読むまでは、rowspan="●"の●が決まらないということです。rowspan="●"の部分は、各支店の情報よりも先に出力する必要がありますから、この値を先に確定させなければなりません。このため、読み込んだ各支店の情報をその都度出力するのではなく、一度、支店の情報を配列 shitenArray にまとめ、サブルーチンにて①都道府県名、②各支店の情報、③小計の順で出力するという処理手順になっています。
設問には「HTMLタグ及びその属性を用いて」という条件があるので、「<td>タグのrowspanの属性値を先に確定させる必要があるから」などの解答が適切となります。
∴HTMLタグの<td>のrowspan属性の値を決める必要があるから
平成23年特別 午後問題一覧
▲Pagetop