• 検索結果がありません。

7 プログラムの説明を読んで, プログラムの (1)(5) を答えなさい < プログラムの説明 > 処理内容 CSV ファイル ( 作品名データと入場者数データ ) を読み, 年齢区分ごとの入場者数と売上金額を表示するプログラムである 入力データ作品名データ ( ファイル名 :movie.csv)

N/A
N/A
Protected

Academic year: 2021

シェア "7 プログラムの説明を読んで, プログラムの (1)(5) を答えなさい < プログラムの説明 > 処理内容 CSV ファイル ( 作品名データと入場者数データ ) を読み, 年齢区分ごとの入場者数と売上金額を表示するプログラムである 入力データ作品名データ ( ファイル名 :movie.csv)"

Copied!
9
0
0

読み込み中.... (全文を見る)

全文

(1)

2013 年 月 日 実施

平成 25 年度(新検定基準による言語選択問題 Java,マクロ言語 の出題例)

情 報 処 理 検 定 試 験

<プログラミング部門>

第1級 試 験 問 題

この問題は,平成 25 年2月時点の参考資料です。

1.監督者の指示があるまで,試験問題に手を触れないでください。

2.試験問題は,10 ページあります。

3.解答はすべて解答用紙に記入します。

4.

【1】【2】【3】【4】【5】【6】は共通問題です。

5.

【7】の問題は,Java・マクロ言語・COBOLのいずれか1つを選択し,

解答用紙の選択言語を で囲んでください。

6.電卓などの計算用具は使用できません。

7.筆記用具などの物品の貸借はできません。

8.問題用紙の回収については監督者の指示にしたがってください。

9.制限時間は,60 分です。

注 意 事 項

主催 公益財団法人 全国商業高等学校協会

(2)

【7】 プログラムの説明を読んで,プログラムの(1)~(5)を答えなさい。 <プログラムの説明> 処理内容 CSVファイル(作品名データと入場者数データ)を読み,年齢区分ごとの入場者数と売上金額を表示するプログラムで ある。 入力データ 作品名データ (ファイル名:movie.csv) 入場者数データ (ファイル名:visitor.csv) 作品名 ×~× 映画コード × 年齢区分 × 入場者数 ×× 実行結果 処理条件 1.第1図のようなある映画館の作品名データを読み,Movie クラスをインスタンス化したあと,ArrayList に格納する。上 映した作品は作品名データの件数分あり,映画コードは ArrayList へ格納した順番(0~)に対応している。 2.第2図のような入場者数データを読み,次の処理を行う。 ・ 次の料金表の年齢区分から鑑賞料金を求め,入場者数を掛けて売上金額を計算する。 ・ 下記の配列 ageNum に年齢区分ごとの人数を集計する。なお,添字は年齢区分と対応している。また,numTotal には, 合計人数を集計する。 3.データを読み終えたあと,売上金額の降順に並べ替える。 4.第3図のように作品名から売上金額までをディスプレイに表示する。 <Javaプログラム> //クラスMovie public class Movie {

private String name; private int sales; private int[] ageNum; private int numTotal; public Movie(String na) {

name = na;

ageNum = new int[4]; }

public int getSales() { return sales; }

public void calc(int age, int num, int charge) { (1) ;

numTotal += num; sales += num * charge; }

public void printMovie() {

System.out.printf(" " + "%-8s", name); for(int i = 0; i < ageNum.length; i++) {

System.out.printf(" " + "%3d" + "人 ", ageNum[i]); } System.out.printf(" " + "%3d" + "人 ", numTotal); System.out.printf("%,d" + "円" + "%n", sales); } } 料金表 (~中学生) (高校生) (大人) (シニア) 年齢区分 0 1 2 3 鑑賞料金 \1,000 \1,500 \1,800 \1,000 配列 (0) (1) (2) (3) ageNum (~中学生) (高校生) (大人) (シニア) (作品名) (~中学生) (高校生) (大 人) (シニア) (合計人数) (売上金額) ○ ~ ○ 16人 22人 60人 30人 128人 187,000円 ▲ ~ ▲ 6人 11人 70人 22人 109人 170,500円 ■ ~ ■ 15人 23人 52人 20人 110人 163,100円 ~ ~ ~ ~ ~ ~ ~ △ ~ △ 15人 21人 30人 11人 77人 111,500円 (第3図) (第1図) (第2図)

(3)

public class MovieTheater {

private static final int[] CHARGE = { 1000, 1500, 1800 }; public static void main(String[] args) {

ArrayList<Movie> list = new ArrayList<Movie>(); try {

BufferedReader br = new BufferedReader(new FileReader("movie.csv")); String line;

while((line = br.readLine()) != null) { Movie movie = new Movie(line); list.add(movie);

}

br.close();

BufferedReader br2 = new BufferedReader(new FileReader("visitor.csv")); String line2;

while((line2 = br2.readLine()) != null) { String[] str = line2.split(","); int code = Integer.parseInt(str[0]); int age = Integer.parseInt(str[1]); int num = Integer.parseInt(str[2]); int index; if(age < 3) { (2) ; } else { index = 0; }

list.get(code).calc(age, num, CHARGE[index]); } br2.close(); } catch(FileNotFoundException e) { System.out.println("ファイルが見つかりません"); } catch(IOException e) { System.out.println("入出力エラーが発生しました"); } Movie work; for(int m = list.size() - 1; m > 0; m--) { for(int n = 0; (3) ; n++) {

if(list.get(n).getSales() < list.get(n + 1).getSales()) { (4) ; list.set(n, list.get(n + 1)); list.set(n + 1, work); } } } for(int i = 0; (5) ; i++) { list.get(i).printMovie(); } } }

解答 (1) ageNum[age] += num (2) index = age (3) n < m (4) work = list.get(n) (5) i < list.size()

(4)

【7】 プログラムの説明を読んで,プログラムの(1)~(5)を答えなさい。 <プログラムの説明> 処理内容 データベースに記録された駐車場の利用番号から利用時間までを読み,曜日別に利用金額計と順位を表示するプログラム である。 入力データ(表名:利用表) 利用番号 ×× 年 ×××× 月 ×× 日 ×× 曜日コード × 区分コード × 車種コード × 利用時間 ×××× 実行結果 処理条件 1.一般会員の General クラスと特別会員の Special クラスをそれぞれインスタンス化する。なお,各クラスとも Customer クラスを継承している。 2.第1図の利用表から,2月のデータを利用番号の昇順に抽出し,次の処理を行う。 ・ 曜日コードは0~6,区分コードは1~2,車種コードは1~3である。なお,利用時間は,分単位で記憶されて いる。 ・ 区分コードをもとに次のように利用金額を求める。 区分コード:1(一般会員)・・・20 分ごとに 200 円。 2(特別会員)・・・720 分までは一律 1,000 円,以降 60 分ごとに 100 円を追加する。 ・ 曜日コードと車種コードをもとに配列 total に利用金額を集計する。なお,行方向は車種コード,列方向は曜日コ ードがそれぞれ添字に対応している。 配列 ・ 利用金額計の降順に順位をつける。なお,配列 rank は配列 total の列方向と添字で対応している。 3.第2図のように,区分コードごとに,各曜日の利用金額計と順位をディスプレイに表示する。 <Javaプログラム> //クラス Customer

public abstract class Customer {

protected int[][] total = new int[4][7];

protected int[] rank = new int[7]; public Customer() {

for(int m = 0; m < rank.length; m = m + 1) { (1) ;

} }

public void juni() {

for(int m = 0; m < 6; m = m + 1) { int (2) ;

for(int n = p; n < 7; n = n + 1) { if(total[0][m] < total[0][n]) { rank[m] = rank[m] + 1;

} else if(total[0][m] > total[0][n]) { rank[n] = rank[n] + 1;

} } } }

public void syukei(int syasyu, int week, int jikan) { int kin = calc(jikan);

total[syasyu][week] = (3) ; total[0][week] = total[0][week] + kin;

} total (0) (1) (2) (3) (4) (5) (6) (0) (利用金額計) (1) (小型車) (2) (普通車) (3) (大型車) (月) (火) (水) (木) (金) (土) (日) (0) (1) (2) (3) (4) (5) (6) rank (順位) (月) (火) (水) (木) (金) (土) (日) (一般会員) (月) 9,000円:6位 ~ (日)29,400円:4位 (特別会員) (月)32,000円:2位 ~ (日) 2,000円:7位 (第2図) (第1図)

(5)

}

public abstract int calc(int jikan); }

//クラス General

public class General extends Customer { public General() {

super(); }

public int calc(int jikan) {

int kin = (jikan / 20 + 1) * 200; return kin;

} }

//クラス Special

public class Special extends Customer { public Special() {

super(); }

public int calc(int jikan) { int kin; if(jikan <= 720) { kin = 1000; } else { kin = 1000 + ((jikan - 721) / 60 + 1) * 100; } return kin; } } //クラス Parking import java.sql.*; public class Parking {

public static void main(String[] args) { try {

Class.forName("ドライバ名");

Connection con = DriverManager.getConnection("データベースの場所", "ユーザ名", "パスワード"); Statement stmt = con.createStatement();

String sqlStr = "SELECT * FROM 利用表 WHERE 月 = 2 ORDER BY 利用番号 ASC"; ResultSet rs = stmt.executeQuery(sqlStr);

General gene = new General(); Special spec = new Special(); while(rs.next()) {

int week = rs.getInt("曜日コード"); int kubun = rs.getInt("区分コード"); int syasyu = rs.getInt("車種コード"); int jikan = rs.getInt("利用時間"); if( (5) ) {

gene.syukei(syasyu, week, jikan); } else {

spec.syukei(syasyu, week, jikan); } } gene.juni(); gene.printTotal(); spec.juni(); spec.printTotal(); rs.close(); stmt.close(); con.close(); } catch(ClassNotFoundException e) { System.out.println("クラスが見つかりません"); } catch(SQLException e) { System.out.println("エラーが発生しました"); } } }

(6)

【7】 プログラムの説明を読んで,プログラムの(1)~(5)を答えなさい。 <プログラムの説明> 処理内容 キーボードから入力された体育祭の結果を集計し,学年,組ごとに表示するプログラムである。 入力データ 実行結果 処理条件 1.アトラクション競技(種目コード100番台)を管理するAttractionContestクラスと,トラック競技(種目コード200番 台)を管理するTrackContestクラスを,それぞれインスタンス化し,種目コード順に配列contestに格納する。なお,種 目は全10種目である。 配列 (0) (1) ~ (8) (9) contest ~ 2.第2図のように,キーボードから第1図のデータを入力すると,次の処理を行う。 ・ 種目コードをもとに,配列contestを探索する。 ・ 学年,組を添字として利用し,配列scoreTotalに得点を集計する。なお,得点は,次の得点表のように求める。 得点表 順位 1位 2位 ~ 9位 10位 アトラクション競技の得点 10点 9点 ~ 2点 1点 トラック競技の得点 アトラクション競技の得点の2倍 配列 scoreTotal (0) (1) (2) (3) (4) (0) (1年) (1) (2年) (2) (3年) (1組) (2組) (3組) (4組) (5組) ・ 第2図のように,学年,組ごとに,各種目の得点と合計得点をディスプレイに表示する。 3.キーボードから 0 が入力されたら処理を終了する。 <Javaプログラム> //クラスContest

public abstract class Contest { private int code;

private String name;

protected int[][] scoreTotal;

public Contest(int code, String name, int nen, int kumi) { this.code = code;

this.name = name;

this.scoreTotal = new int[nen][kumi]; }

public int getCode() { return code; }

public int[][] getScoreTotal() { return scoreTotal;

}

public void printScoreTotal(int m, int n) { System.out.print(" " + name);

System.out.printf(":" + "%3d" + "点" + "%n", scoreTotal[m][n]); }

public abstract void scoreCalc(int nen, int kumi, int rank); } (種目コード) ××× 種目コード 学年 組 順位を入力してください。→202 1 1 2 1年1組 パンくい競争: 6点 障害物競走 : 10点 ~ 100m走 : 14点 400m走 : 2点 合計得点 79点 1年2組 ~ (学年) × (第1図) (第2図) (組) × (順位) ××

(7)

}

public void scoreCalc(int nen, int kumi, int rank) { int score = (1) ;

scoreTotal[nen - 1][kumi - 1] += score; }

}

//クラスTrackContest

public class TrackContest extends Contest {

public TrackContest(int code, String name, int nen, int kumi) { super(code, name, nen, kumi);

}

public void scoreCalc(int nen, int kumi, int rank) { int score = (1) ;

scoreTotal[nen - 1][kumi - 1] += score * 2; }

}

//クラスAthleticFestival import java.util.Scanner; public class AthleticFestival {

private static final int NEN = 3; private static final int KUMI = 5;

private static Contest[] contest = new Contest[10]; private static int[] contestCode = { 101, ~, 205 };

private static String[] contestName = { "パンくい競争", ~, "400m走 " }; public static void main(String[] args) {

for(int i = 0; i < contest.length; i++) { if(contestCode[i] < 200) {

contest[i] = new AttractionContest(contestCode[i], contestName[i], NEN, KUMI); } else {

contest[i] = new TrackContest(contestCode[i], contestName[i], NEN, KUMI); }

}

System.out.print("種目コード 学年 組 順位を入力してください。→"); Scanner sc = new Scanner(System.in);

int code = sc.nextInt(); while(code != 0) {

int nen = sc.nextInt(); int kumi = sc.nextInt(); int rank = sc.nextInt(); int (2) ;

int highIndex = contest.length - 1; int index = (lowIndex + highIndex) / 2; while(contest[index].getCode() != code) { if( (3) ) { lowIndex = index + 1; } else { highIndex = index - 1; }

index = (lowIndex + highIndex) / 2; } contest[index]. (4) ; for(int m = 0; m < NEN; m++) { for(int n = 0; n < KUMI; n++) { System.out.printf("%d" + "年" + "%d" + "組" + "%n", m + 1, n + 1); int gokei = 0; for(int p = 0; (5) ; p++) { contest[p].printScoreTotal(m, n); gokei += contest[p].getScoreTotal()[m][n]; } System.out.println(" 合計得点 " + gokei + "点"); } } System.out.print("種目コード 学年 組 順位を入力してください。→"); code = sc.nextInt(); } sc.close(); } }

解答 (1) 11 - rank (2) lowIndex = 0 (3) contest[index].getCode() < code (4) scoreCalc(nen, kumi, rank) (5) p < contest.length

(8)

【7】 プログラムの説明を読んで,プログラムの(1)~(5)を答えなさい。 <プログラムの説明> 処理内容 調査データを読み,店舗別平均評価点を表示するプログラムである。 入力データ 調査データ(ファイル名:tyosa.csv) ユーザーフォーム・実行結果 処理条件 1.第1図の調査データの店舗番号には1~30 が記録されている。また,味,接客,雰囲気,値段,場所には評価点(1~5) が記録されている。 配列 2.ユーザーフォーム初期化時に次の処理を行う。 ・ 配列 TenMei に店舗名を記憶する。なお,店舗は 30 店である。 ・ 第1図の店舗調査データを読み,店舗番号をもとに味から場所までの各評価点を配列 Syukei に集計する。なお,配列 TenMei,配列 Hyoka の添字と配列 Syukei の行方向の添字は対応している。また,Syukei の0列目には5項目の評価点の 合計を,6列目には件数を集計する。 配列 ・ データを読み終えたあと,配列 Syukei の0~5列目の各平均評価点を求める。また,評価基準にしたがって評価を求め, 配列 Hyoka に記憶する。 評 価 基 準 評価 5項目が 4.2 以上 A 5項目が 3.8 以上 B その他 C

・ 5項目の平均の降順に配列 TenMei,配列 Hyoka,配列 Syukei を並べ替える。また,店舗名から評価までを TextBox1 に 表示する。

3.TextBox2 に"A","B","C"いずれかを入力し,表示ボタンをクリックすると,入力された文字列と同じ評価のデータを TextBox1 に表示する。また,TextBox2 が空白の場合,表示ボタンをクリックするとすべてのデータを TextBox1 に表示する。

<マクロ言語プログラム> 調査員コード ×××× 店舗番号 ×× 味 × 接客 × 雰囲気 × 値段 × 場所 × (第1図) TenMei Hyoka (0) (0) ~ ~ ~ ~ (29) (29) (30) (30) (店舗名) (評価) Syukei (0) (1) (2) (3) (4) (5) (6) (0) ~ ~ ~ ~ ~ ~ ~ ~ (29) (30) (5項目) (味) (接客) (雰囲気) (値段) (場所) (件数) Option Explicit

Dim Syukei(30, 6) As Double

Dim TenMei(30) As String, Hyoka(30) As String

(第2図) 店舗別平均評価点 表  示 ×~× 4.26 4.25 4.29 4.18 4.43 4.14 A ○~○ 4.12 4.08 3.82 4.54 4.08 4.08 B   ~ ~ ~ ~ ~ ~ ~ ~ △~△ 3.55 3.51 3.58 3.64 3.45 3.59 C □~□ 3.54 4.48 4.48 3.91 2.37 2.46 C 店舗名 5項目  味   接客 雰囲気 値段 場所 評価 (TextBox1) ク リ ア 終  了 (TextBox2) 表示する店舗の評価を入力してください

(9)

解答 (1) Syukei(g, 0) = Syukei(g, 0) + Syukei(g, r) (2) TextBox2.Text = Hyoka(g) (3) Syukei(g, r) (4) Syukei(n, 0) < Syukei(n + 1, 0) (5) Syukei(n, p) = Syukei(n + 1, p)

For r = 0 To 6 Syukei(g, r) = 0 Next r

Next g

TenMei(1) = "○~○": TenMei(2) = "□~□": ~ TenMei(29) = "▲~▲": TenMei(30) = "◆~◆": Open "tyosa.csv" For Input As #1

Do While Not EOF(1)

Input #1, TyoCode, TenCode, Koumoku(1), Koumoku(2), Koumoku(3), Koumoku(4), Koumoku(5) For r = 1 To 5

Syukei(TenCode, r) = Syukei(TenCode, r) + Koumoku(r) Next r Syukei(TenCode, 6) = Syukei(TenCode, 6) + 1 Loop For g = 1 To 30 For r = 1 To 5 (1) Next r Next g For g = 1 To 30

Syukei(g, 0) = Syukei(g, 0) / (Syukei(g, 6) * 5) For r = 1 To 5

Syukei(g, r) = Syukei(g, r) / Syukei(g, 6) Next r If Syukei(g, 0) >= 4.2 Then Hyoka(g) = "A" Else If Syukei(g, 0) >= 3.8 Then Hyoka(g) = "B" Else Hyoka(g) = "C" End If End If Next g Call Seiretu Call 表示_Click End Sub

Private Sub 表示_Click()

Dim g As Integer, r As Integer TextBox1.Text = ""

For g = 1 To 30

If (2) Or TextBox2.Text = "" Then TextBox1.Text = TextBox1.Text & TenMei(g) & " " For r = 1 To 5

TextBox1.Text = TextBox1.Text & Format( (3) , "0.00") & " " Next r

TextBox1.Text = TextBox1.Text & Format(Syukei(g, 0), "0.00") & " " TextBox1.Text = TextBox1.Text & Hyoka(g) & Chr(13) & Chr(10) End If

Next g End Sub

Private Sub クリア_Click() TextBox2.Text = "" End Sub

Private Sub 終了_Click() End

End Sub

Private Sub Seiretu()

Dim m As Integer, ~, p As Integer For m = 2 To 30 For n = m - 1 To 1 Step -1 If (4) Then TenMei(0) = TenMei(n) TenMei(n) = TenMei(n + 1) TenMei(n + 1) = TenMei(0) Hyoka(0) = Hyoka(n) Hyoka(n) = Hyoka(n + 1) Hyoka(n + 1) = Hyoka(0) For p = 0 To 6 Syukei(0, p) = Syukei(n, p) (5) Syukei(n + 1, p) = Syukei(0, p) Next p Else Exit For End If Next n Next m End Sub

参照

関連したドキュメント

などに名を残す数学者であるが、「ガロア理論 (Galois theory)」の教科書を

Scival Topic Prominence

③  「ぽちゃん」の表記を、 「ぽっちゃん」と読んだ者が2 0名(「ぼちゃん」について何か記入 した者 7 4 名の内、 2 7

(2)「冠表示」の原材料名が生鮮食品である場合は当該生鮮食品の産地を、加工

“〇~□までの数字を表示する”というプログラムを組み、micro:bit

操作内容/項目説明 振込金額を入力します。 【留意点】 ・半角数字(最大10桁)

欄は、具体的な書類の名称を記載する。この場合、自己が開発したプログラ

Dual I/O リードコマンドは、SI/SIO0、SO/SIO1 のピン機能が入出力に切り替わり、アドレス入力 とデータ出力の両方を x2