2011年 春期 応用情報技術者試験 問2

集計表をHTMLに変換して出力するプログラム

図1に示すような、都道府県及び支店ごとに整理された売上高一覧のCSVファイルを入力し、表1のような都道府県ごとの売上高の集計表をHTMLで出力するプログラムがある。ここで、一つの都道府県における支店数は500未満とする。

表1 出力する集計表のイメージ
都道府県支店名売上高(千円)
東京都千代田店23,500
中央店33,500
港店18,500
[小計]75,500
埼玉県川口店28,000
蕨店9,500
[小計]37,500
合計113,000
<figure>
  <div class="number-figure">
    <p>東京都, 千代田店, 23500</p>
    <p>東京都, 中央店, 33500</p>
    <p>東京都, 港店, 18500</p>
    <p>埼玉県, 川口店, 28000</p>
    <p>埼玉県, 蕨店, 9500</p>
  </div>
  <figcaption>図1 入力するCSVファイルの例</figcaption>
</figure>

【使用するHTMLについて】

使用するHTMLタグ及びその属性を表2に示す。

表2 使用するHTMLタグ及びその属性
タグ説明
<table>タグ<tr>、<th>、<td>と組み合わせて表を作成する。
属性borderによって、枠線の太さを指定できる。
<tr>表の行を記述する。
<th>表のヘッダ部分のセルの内容を記述する。
<td>表のセルの内容を記述する。
属性alignによって、セル内データの横方向の配置が指定できる。centerで中央、rightで右寄せ、何も指定しないと左寄せ、となる。
属性colspanによって、セルを指定数分、横方向に連結できる。
属性rowspanによって、セルを指定数分、縦方向に連結できる。

表1をHTMLで記述した例を図2に示す。

<table border="1">
<tr><th>都道府県</th><th>支店名</th><th>売上高(千円)</th></tr>
<tr><td >東京都</td><td>千代田店</td><td align="right">23,500</td></tr>
<tr><td>中央店</td><td align="right">33,500</td></tr>
<tr><td>港店</td><td align="right">18,500</td></tr>
<tr><td align="center"> [小計] </td><td align="right">75,500</td></tr>
<tr><td rowspan="3">埼玉県</td><td>川口店</td><td align="right">28,000</td></tr>
<tr><td>蕨店</td><td align="right">9,500</td></tr>
<tr><td align="center"> [小計] </td><td align="right">37,500</td></tr>
<tr><td  align="center">合計</td><td align="right">113,000</td></tr>
</table>
<figure>
  <figcaption>図2 表1をHTMLで記述した例</figcaption>
</figure>

【プログラムの概要】

プログラムの処理手順の概要を次の(1)~(5)に、使用する構造体、配列、変数及び関数の一部を表3に、構造体及び配列の使い方を表4に示す。

<figure>
  <div class="number-figure">
    <p>(1) CSVファイルを配列CSVArrayに読み込む。</p>
    <p>(2) &lt;table&gt;の開始タグ及び集計表のヘッダ行を出力する。</p>
    <p>(3) 配列CSVArrayの先頭要素から末尾まで1件ずつ読み、配列shitenArrayに支店名と売上高を追加していく。途中で都道府県が変わった場合、支店名と売上高を追加する前に、①都道府県、支店名、売上高、小計のHTMLタグ及びデータを出力し、配列shitenArrayの全要素を削除する。</p>
    <p>(4) ②都道府県、支店名、売上高、小計のHTMLタグ及びデータを出力する。</p>
    <p>(5) 合計及び&lt;table&gt;の終了タグを出力する。</p>
  </div>
  <figcaption>プログラムの処理手順の概要</figcaption>
</figure>
表3 使用する構造体、配列、変数及び関数(一部)
名称種類内容
LineData構造体入力したCSVファイル1行のデータを格納する構造体。次の要素を管理する。
todofuken…都道府県 shiten…支店名
uriage…売上高
CSVArray配列構造体LineDataの値を要素とする配列
line変数構造体LineDataの値を格納する変数
readCSV(line)関数CSVファイルから1行読み込み、構造体LineDataの値として引数lineに値を代入する関数。読み込むデータが無い場合は、lineにnullを代入して偽を返す。データの読み込みが成功したときは真を返し、読み込み位置を次のデータへ移す。
print(d1, d2, …)関数d1から順に出力する。引数が文字列の場合はそのまま、数値の場合はけた区切りを付与して出力する。プログラム中の文字列定数は、シングルクォート(')で囲む。
println(d1, d2, …)関数関数printの出力に加え、末尾に改行を出力する。
ShitenUriage構造体支店名及び売上高を格納する構造体。次の要素を管理する。
shiten…支店名 uriage…売上高
shitenArray配列構造体ShitenUriageの値を要素とする配列
printShitenArray
(key, shitenArray)
関数shitenArrayに入っている各支店の売上高及び小計を出力する関数。これらの支店の都道府県はすべてkeyに等しい。〔プログラムの概要〕(3)の下線①及び(4)の下線②で使用する。
表4 構造体及び配列の使い方
種類使い方
構造体構造体の要素は"."を使った表記で表す。"."の左には、構造体を表す変数を書く。
例えば、LineDataには、要素名を書く。
new "構造体名"(値1, 値2, …)と記述することで、構造体を生成し、さらに各要素の値をセットすることができる。
配列の各要素は、"配列名[n]"と表記する(nは配列の添字)。配列の添字は0から始めるものとする。配列の初期の要素数は0で、次に示す操作が可能である。
配列名.add(追加したい要素) … 配列の末尾へ要素を動的に追加する。
配列名.clear() … 配列のすべての要素を削除する。
配列名.size … 配列の現在の要素数を取得する。

メインプログラムを図3に、関数printShitenArrayのプログラムを図4に示す。ここで、図3のには、図2のと同じ字句が入る。

while (readCSV(line)) // CSVファイルから1行読み込む
  CSVArray.add(line) // CSVファイルから読み込んだ1行を配列に追加する     ←α
endwhile
if(CSVArray.size と 0 が等しい)
  0行のときの処理を行い、プログラムを終了する
endif
println('<table border="1">')
println('<tr><th>都道府県</th><th>支店名</th><th>売上高(千円)</th></tr>')
goukei ← 0
for(i を 0 から  まで 1 ずつ増やす)
  if(i と 0 が等しい)
    key ← CSVArray[i].todofuken
  else
    if(  )
      printShitenArray(key, shitenArray)
      shitenArray.clear()
      key ← CSVArray[i].todofuken
    endif
  endif
  shitenArray.add(new ShitenUriage(CSVArray[i].shiten, CSVArray[i].uriage))     ←β
  
endfor
printShitenArray(key, shitenArray)
print('<tr><td  align="center">合計</td><td align="right">')
println(goukei, '</td></tr>')
println('</table>')
<figure>
  <figcaption>図3 メインプログラム</figcaption>
</figure>
function printShitenArray(key, shitenArray)
  shoukei ← 0
  for(i を 0 から  まで 1 ずつ増やす)
    print('<tr>')
    if(i と 0 が等しい)
      print('<td rowspan="',  , '">', key, '</td>')
    endif
    print('<td>', shitenArray[i].shiten, '</td>')
    println('<td align="right">', shitenArray[i].uriage, '</td></tr>')
    shoukei ← shoukei + shitenArray[i].uriage
  endfor
  print('<tr><td align="center"> [小計] </td>')
  println('<td align="right">', shoukei, '</td></tr>')
endfunction
<figure>
  <figcaption>図4 関数printShitenArrayのプログラム</figcaption>
</figure>

【プログラムに関する考察】

・図3のαでは、CSVファイルのデータを1行ずつ全行を配列に読み込んでいる。その結果、読み込むデータ量が多いほど、時間だけでなくを多く消費してしまう、という問題がある。

・図3のβでは、③都道府県のセルを出力するために、同一都道府県の各支店の情報をその都度出力するのではなく、順次配列shitenArrayに追加している。

設問1 図2中のに入れる適切な字句を答えよ。

設問2 図3中のに入れる適切な字句を答えよ。

設問3 図4中のに入れる適切な字句を答えよ。

設問4 〔プログラムに関する考察〕について、(1)、(2)に答えよ。

(1) 本文中のに入れる適切な字句を答えよ。

(2) 本文中の下線③のように処理する理由を、HTMLタグ及びその属性を用いて、40字以内で述べよ。

出典:平成23年度 特別 応用情報技術者試験 午後問題 問2