2011年 春期 応用情報技術者試験 問2
集計表をHTMLに変換して出力するプログラム
図1に示すような、都道府県及び支店ごとに整理された売上高一覧のCSVファイルを入力し、表1のような都道府県ごとの売上高の集計表をHTMLで出力するプログラムがある。ここで、一つの都道府県における支店数は500未満とする。
都道府県 | 支店名 | 売上高(千円) |
---|---|---|
東京都 | 千代田店 | 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に示す。
タグ | 説明 |
---|---|
<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) <table>の開始タグ及び集計表のヘッダ行を出力する。</p>
<p>(3) 配列CSVArrayの先頭要素から末尾まで1件ずつ読み、配列shitenArrayに支店名と売上高を追加していく。途中で都道府県が変わった場合、支店名と売上高を追加する前に、①都道府県、支店名、売上高、小計のHTMLタグ及びデータを出力し、配列shitenArrayの全要素を削除する。</p>
<p>(4) ②都道府県、支店名、売上高、小計のHTMLタグ及びデータを出力する。</p>
<p>(5) 合計及び<table>の終了タグを出力する。</p>
</div>
<figcaption>プログラムの処理手順の概要</figcaption>
</figure>
名称 | 種類 | 内容 |
---|---|---|
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)の下線②で使用する。 |
種類 | 使い方 |
---|---|
構造体 | 構造体の要素は"."を使った表記で表す。"."の左には、構造体を表す変数を書く。 例えば、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字以内で述べよ。