全商情報処理検定プログラミング部門 サンプル問題1級解説

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

<4D F736F F D2091E F196E291E889F090E C4816A82CC838C E646F6378>

Microsoft PowerPoint ppt

GEC-Java

JAVA入門

Microsoft PowerPoint - prog03.ppt

PowerPoint プレゼンテーション

JAVA入門

Javaプログラムの実行手順

PowerPoint プレゼンテーション

GEC-Java

プログラミング基礎I(再)

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint - prog09.ppt

JavaプログラミングⅠ

Prog1_6th

Prog1_15th

JAVA入門

Java講座

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Prog1_10th

JavaプログラミングⅠ

Microsoft PowerPoint - chap10_OOP.ppt

プログラミング実習I

プログラミング入門1

Javaプログラマー早期育成ドリル ~コードリーディング編~ 解答

メソッドのまとめ

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

Make the Future Java FY13 PPT Template

Microsoft Word - VBA基礎(6).docx

基本情報STEP UP演習Java対策

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

プログラミング入門1

Microsoft PowerPoint - ruby_instruction.ppt

Microsoft PowerPoint - prog04.ppt

メソッドのまとめ

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

プログラミング入門1

プログラミング入門1

PowerPoint プレゼンテーション

オブジェクト指向プログラミング・同演習 5月21日演習課題

プログラミング入門1

PowerPoint プレゼンテーション

ガイダンス

JavaプログラミングⅠ

Microsoft Word - Android_SQLite講座_画面800×1280

プログラミング入門1

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

JavaプログラミングⅠ

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

文字列操作と正規表現

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

GEC-Java

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

DVIOUT-exer

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Prog2_10th

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

PowerPoint Presentation

2

Microsoft Word - no11.docx

JavaプログラミングⅠ

情報処理Ⅰ

JEB Plugin 開発チュートリアル 第4回

Microsoft PowerPoint - 計算機言語 第7回.ppt

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

デジタル表現論・第6回

IT プロジェクト

JavaプログラミングⅠ

ファイル入出力

Microsoft Word - 3new.doc

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

プログラム言語及び演習Ⅲ

Microsoft PowerPoint - prog13.ppt

デジタル表現論・第4回

Prog2_9th

Microsoft PowerPoint - prog13.ppt

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

6 関数 6-1 関数とは少し長いプログラムを作るようになると 同じ処理を何度も行う場面が出てくる そのたびに処 理を書いていたのでは明らかに無駄であるし プログラム全体の見通しも悪くなる そこで登場す るのが 関数 である 関数を使うことを 関数を呼び出す ともいう どのように使うのか 実際に見て

スライド 1

プログラムの基本構成

Microsoft Word - no202.docx

2016 年度 JAVA 講座第六週目 目次 パッケージ... 2 パッケージの作成... 2 パッケージの使用方法... 3 異なるパッケージ同名クラスの宣言... 4 パッケージの側面から見たアクセス修飾子... 4 ラッパークラス... 5 ラッパークラス利用法:キャスト... 5 ラッパーク


5 継承とは クラス図 98 7 参照の自動型変換 参照の自動型変換 クラス図の見方 クラス図の書き方 継承 継承してクラスを作る インスタンスの初期化 継承の効果を確認する

Microsoft Word - C言語研修 C++編 3.doc

PowerPoint Presentation

PowerPoint プレゼンテーション

Prog1_10th

PowerPoint Presentation

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

Microsoft PowerPoint - prog07.ppt

レコードとオブジェクト

Transcription:

全商情処プロ部門 Java 解説平成 25 年 2 月サンプル問題 1 級 7 ( 映画館の問題 ) 解答 (1)ageNum[age] += num (2)index = age (3)n < m (4)work = list.get(n) (5)i < list.size() 問題を解く前に クラスやメソッドを正確に把握する必要がある 具体的にはクラスやメソッドを四角で囲って視覚的に理解する メソッドを呼び出している個所をマーカーで線を引く 等である この問題は 映画 1 つ 1 つに Movie インスタンスを生成し それを ArrayList で管理している また Movie インスタンスは配列 agenum を持っている わかりやすく言うと 配列 agenum を持っている沢山の Movie インスタンスを ArrayList という配列のようなものの中で管理している ということである ArrayList は オブジェクトを配列として扱うことができる と考えればよい (1) は メソッド名 (calc) が表している通り 計算するためのインスタンスメソッドである Movie インスタンスが個々に持っている配列 agenum に入場者数を足す必要がある 呼び出し元を見てみると list.get(code).calc( ); となっている get(code) は ArrayList クラスのメソッドで code 番目の要素を返すものである list.get(code) により ArrayList の中にある code 番目の Movie インスタンスが呼び出されることになる (2) は 下の else やその下の CHARGE[index] から index を求める必要があることが分かる 処理条件 2に 添字は年齢区分と対応している とあることから解答を導くことができる (3) を含む for の二重ループは隣接交換法による並べ替えである 外側の for では m を減算しており また実際に交換している個所では n 番目と n+1 番目が使用されているので これらから隣接交換法だと判断できる その判断ができれば (3) には n < m となることがわかる (4) では ArrayList クラスの set(index, E) メソッドが使用されている これは E の内容を index 番目に置き換える というものである (4) で n 番目を work に避難させ 次の行で n+1 番目を n 番目に入れて 次の行で避難させたものを n+1 番目に入れる という 3 つのステップで入れ替えを実現している (4) の下 2 行からの流れを考えると n 番目を work に避難させるには list.set(work, list.get(n)) でもよさそうだが これではいけない 参照型変数 work は Movie work; で宣言されただけであり 参照は入っていない 参照が入っていない場所を使用することができないので list.set(work, list.get(n)) では何番目に避難させてよいのかわからず正確に動作しない Work = list.get(n) とすることにより リストの n 番目を指し示す参照を work に記憶させることにより 移動させたこととして考える (5) では映画の数だけ出力することとなる 映画の数というのは Movie インスタンスの数と同じ意 1

味である Movie インスタンスは ArrayList で管理されているので ArrayList の中にある参照の個数を調べればよい ArrayList のメソッドとして size() メソッドがあるということを知っておく必要がある ArrayList<Movie> list = new ArrayList<Movie>(); ArrayList クラスはサイズ変更可能な配列を作成できる <> で Movie を指定しているのは ArrayList で使用する型を指定するジェネリクスという機能である 変わった書き方となるが この ArrayList では Movie を配列として扱う とあらかじめ宣言した ということである もちろん <> の中には他のクラスを指定することが可能である while((line = br.readline())!= null) まず line = br.readline() を実行することにより ファイルから 1 行読み込み その内容を line に記憶している そしてそれが null と一致しなければ繰り返す ということとなる null と一致しない ということはデータがある ということである この while の中の書き方は データが存在する間は繰り返す という処理の書き方として標準的な記述方法である なお readline() は終端を \n や \r で認識する 読み込んだ movie.csv は作品名がカンマで区切られているのではなく 作品名 1 つが 1 レコードとして改行で区切られていることになる もし作品名がカンマで区切られているのであれば readline() は終端を認識できず全ての作品を 1 つのデータとして読み込んでしまうこととなる Movie movie = new Movie(line); list.add(movie); ファイルから読み込んだ作品名を line に記憶し それを引数として Movie クラスのインスタンスを生成している そして生成したインスタンスの参照を add() メソッドによりリストに加えている この 2 行をまとめると list.add(new Movie(line)); となる String[] str = line2.split(","); split() メソッドは指定された文字で分割するという String クラスのメソッド line2 で読み込んだ内容を "," で分割し それを配列 str に格納することとなる 例 ) line2 = "yamada,tanaka,katou"; String[] str = line2.split(","); str[0] には yamada str[1] には tanaka str[2] には katou が格納される Int code = Integer.parseInt(str[0]); 等 Integer クラスの parseint() メソッドを直接呼び出している これは parseint() メソッドが static なメソッドなので Integer クラスのインスタンスを生成しなくてもこうして呼び出せる parseint() メソッドは文字列を整数に変換する str[0] の参照が指し示す文字列を整数に変換して 参照ではなく実際の値 ( 基本データ型としての int 型 ) として code に 2

代入しているというものである try ~ catch( ) try で囲われたブロックで例外が発生した場合は catch の処理を行うというものである 問題を解く上では特に意識せず読み飛ばしても良い しかし実際は 例外がどこで発生してどこで例外を catch するかを十分考える必要がある 3

1 級 7 ( データベースの問題 ) 解答 (1)rank[m] = 1 (2)p = m + 1 (3)total[syasyu][week] + kin (4)total[0][n] (5)kubun == 1 クラスが 4 つあるのでそれぞれの役割を考える必要がある 最初の Customer クラスは抽象クラスであり 今回はスーパークラスとなる General クラスと Special クラスは Customer クラスを継承したサブクラスである この構造を踏まえた上で問題を解くと比較的理解し易い (1) は Customer クラスのコンストラクタ内部での処理である for の中には順位を表す配列 rank の要素数だけ繰り返すようになっている そのことから配列 rank に対する処理であることが推測できる 順位付けのアルゴリズムではまず最初に順位を 1 で初期化する ということがわかっていれば簡単に解ける (2) は juni() メソッドの二重ループで何をしているのか把握するのが重要となる その名の通り juni() メソッドでは順位付けをおこなっている それは二重ループの中で配列 rank に 1 ずつ加算していることからもわかる (2) の次の行に p が出ているが 初期化がされていないので (2) で行う必要がある 隣り合うもの同士を比較して順位を計算するので (2) は p = m + 1 となる (3) は二次元配列 total に集計するべきものが理解できれば簡単に解ける (3) の 1 行上にある calc(jikan) というのは General クラスか Special クラスの calc(int jikan) メソッドが呼び出されることとなる (4) の下 3 行にある Customer クラスの calc(int jikan) メソッドは abstract の付いた抽象メソッドなので呼び出されない この抽象メソッドをサブクラスがオーバーライドしたものが呼び出される 正確には General クラスか Special クラスのインスタンスから呼び出される (4) は "%,7d" の "d" に対応した変数を指定する "d" とは 10 進数の整数のことである また直後に " 円 " と表示していることから金額であることがわかる 処理条件 2の最後に 利用金額計と順位を 表示すると書いてあるので利用金額計を表す total[0][n] を表示すればよい なお実行結果の ( 月 ) や ( 火 ) は実際に出力されるわけではない 実行結果をわかり易くするために示していると思われる (5) は General クラスのインスタンスの集計を行うのか Special クラスのインスタンスの集計を行うのかを分岐している つまり一般会員か特別会員かの判断をする命令を書けばよい public abstract class Customer 抽象クラスを表す 抽象クラスの特徴は 1インスタンスが生成できない 2 抽象メソッドを指定することによりサブクラスでのオーバーライドを強制することができる というものである 抽象クラスがあるということは 必ずどこかのクラスが extends で継承しているということがわかる 4

protected 異なるパッケージのクラスからは利用できないが 異なるパッケージでもサブクラスからは利用できる というアクセス制御 今回はパッケージがどうなっているのかわからない問題なので影響はない public abstract int calc(int jikan); 抽象メソッド 抽象クラスに抽象メソッドを書くことによって 必ずこのメソッドをサブクラスではオーバーライドしなくてはいけない つまり このような抽象メソッドが出ているということは 問題のプログラムでどこかで必ずオーバーライドしているということである 抽象メソッドやオーバーライドを使うということは どこかでポリモーフィズムを実現していることが多いが この問題ではポリモーフィズムは実現されていない Class.forName(" ドライバ名 "); 紛らわしいが これは Class という名前のクラスである その Class クラスの static メソッドである forname() メソッドを呼び出して JDBC ドライバの名前を指定する JDBC とは Java とデータベースを接続するためのインタフェースであり Java でデータベースを扱う際必要となる データベースの種類ごとに指定するドライバ名が異なる 例 )MySQL の場合 Class.forName("com.mysql.jdbc.Driver") Connection con = Statement stmt = ResultSet rs = Connection で特定のデータベースと接続し Connection から SQL 文を送るための Statement インスタンスを生成し Statement で SQL 文を実行し ResultSet で結果を受け取る というものである データベースに接続し SQL 文を実行する際のお決まりの 3 つの命令なので覚えてしまうのが早い この 3 行が問題として問われることは少ないと思われる なお ResultSet インスタンスを生成する際に SQL 文とまとめると次のようになり String sqlstr が不要となる ResltSet rs = stmt.executequery("select * FROM 利用番号 ASC"); rs.getint(" 曜日コード "); rs には SQL 文を実行した表が丸ごと返される その表から getint() メソッドで指定した列名を抜き出す処理となる getint() メソッドは int 型を返す 他に getdouble() メソッドや getstring() メソッドがある 5

1 級 7 ( 体育祭の問題 ) 解答 (1)11 - rank (2)lowIndex = 0 (3)contest[index].getCode() < code (4)scoreCalc(nen, kumi, rank) (5)p < contest.length この問題も最初に abstract を使用した抽象クラス 抽象メソッドが存在する ということは必ず抽象クラスを継承 (extends) している個所があり また必ず抽象メソッドをオーバーライドしている個所があることがわかる 今回はさらにポリモーフィズムが実現されている少し難しい問題である main() メソッドは while の中に For が三重になっており四重のループ構造となっているので その点も注意が必要である 解く際に自分で解き易く線を引いたり色分けをしたりすること (1) は 2 箇所あり (1) を含む scorecalc() メソッドも 2 つあることから このメソッドはオーバーライドされていることがわかる また (1) で計算した score を二次元配列 scoretotal に足していることから score で得点を計算することがわかる 順位が 1 位なら得点は 10 点 2 位なら 9 点 となっており 順位 + 得点は必ず 11 となる 11- 順位で得点が計算でき 逆に 11- 得点で順位が計算できる (2) の下の 2 行をみると low や high が出てきており その足した結果を 2 で割っているので 変数名や処理から二分探索であることがわかる LowIndex に値が設定されていないので (2) で設定する必要がある この個所は二分探索の問題でもよく出題される 特に HighIndex に値を設定するとき length を使用しているので記述方法やスペルを間違わないよう注意すること (3) も二分探索でよく出題される問題である こういう場合は条件を満たした場合 lowindex = index + 1 になる場合はどういう場合か ということを考えるとよい この場合 下の方を表す lowindex が上の方に移動して探索範囲を狭めることとなる つまり今探した個所より さらに上の方を探すこととなる よって 探したい code が大きい場合であり contest[index].getcode() < code となる contest[index].getcode() は 配列 contest に格納されている AttractionContest か TrackContest のインスタンスの参照を呼び出して そのインスタンスの getcode() メソッドを呼び出している contest[] にはインスタンスの参照が記憶されている (4) は contest[index]. と書かれている時点で 配列 contest に記憶されているインスタンスのメソッドを呼び出していることがわかる また int a = contest[index]. という風に戻り値を返していない形となっているので 戻り値のない void 型のメソッドを呼び出していることがわかる つまり (4) には printscoretotal() メソッドか scorecalc() メソッドしか答えとしてあり得ない ここでは scorecalc() メソッドを呼び出し キーボードから入力された値を引数にして必要な計算を行っている ここはポリモーフィズムを実現している個所となる 6

(5) の for の中では 各競技の得点を出力し合計を計算している 各競技を全て出力するので p は配列 contest の要素数の間は繰り返すこととなる よって答えは p < contest.length である public int[][] getscoretotal(){ return scoretotal; } 二次元配列 scoretotal をそのまま戻り値として渡すメソッドである このメソッドでは scoretotal の参照を渡すので呼び出し元の main() メソッドに参照を教えることとなり main() メソッドから書き換えが可能になってしまう そうなるとアクセス制御の意味がなくなる 対策として 配列を戻すのではなく配列から取り出した値を戻す という方法が挙げられる getscoretotal() メソッドを以下のように変更して int 型の値を戻すようにする public int getscoretotal(int m, int n){ return scoretotal[m][n]; } また (5) の 2 行下の命令文は 配列をそのまま全部もらってその中から 1 つだけ取り出して処理している というあまり見かけない処理方法となっているので 以下のような処理に変更することが望ましい gokei += contest[p].getscoretotal(m, n); contest[i] = new AttractionContest( ); Contest 型の参照を格納する配列 contest には 当然 Contest 型の参照が記憶できるが それだけでなく Contest 型を継承した AttractionContest 型と TrackContest 型も記憶できる この命令では Contest 型配列の contest に AttractionContest インスタンスを生成して記憶している 左右のクラスの方が違うことが大きなポイントとなる 左辺がスーパークラスであり 右辺がサブクラスとなっている この型変換のことをアップキャストという こうすることにより AttractionContest 型と TrackContest 型という異なる型のインスタンスをまとめて 1 つの配列で管理することができるようになる また 同じ名称のメソッドがあるので contest[i].scorecalc( ) と呼び出すことにより 自動的に AttractionContest 型と TrackContest 型の scorecalc( ) を呼び出してくれる これらポリモーフィズムを実現するためには 今回の様なメソッドのオーバーライドとアップキャストが必要になる 7