┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  執筆&編集 斎藤末広 suehiro@he.mirai.ne.jp  ┃ ┃'&┃&''*┃*''%┃%'  発行    江口昌宏 ***  ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 広告募集:http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第7号 2001/11/xx  基本情報技術者試験午後 平成13年秋問12の解説 ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ------------------------------------------------------------------------ ▼ 問12に挑戦  しばらく,JavaScript に触れずに,Java を中心にやりたいと思います。  基本情報処理技術者試験に出題された Java の問題を解説しています。中級者 向けの内容になっています。  基本情報処理技術者試験の午後の言語問題は,2問出題され,一つは小さめ, もう一つは大きめの問題になります。前回の問8は,小さな目な問題です。今回 解説する問12は,大きめの問題になります。問8に比べて問12が難問という 訳ではなく,問題を解く時間が長くなるというものです。  ではさっそく問題を見てみましょう。 ------------------------------------------------------------------------ ▼ 基本情報技術者試験午後 平成13年秋問12 (一部,メール用に修正しています)  次の Java プログラムの説明及びプログラムを読んで,設問 1 〜 3 に答えよ。 〔プログラムの説明〕  ある会社の情報管理部門で導入するコンピュータの候補としてワークステー ションとパーソナルコンピュータが提案されている。これらのコンピュータの値 引き後の価格の計算を行い,コンピュータの仕様を価格の降順に整列して出力す るプログラムである。コンピュータの仕様は,次の四つからなる。   機種名,動作周波数,メモリ容量,価格  このプログラムは,次の四つのクラスと一つのインタフェースで構成される。 Computer  コンピュータに関するクラスであり,価格を返すメソッド getPrice,価格を格 納するメソッド setPrice,仕様を文字列で返すメソッド toString,値引き率を 返すメソッド getDiscountRate,及び整列する際に用いるデータの大小を比較す るメソッド compareWith を定義している。 Workstation  クラス Computer のサブクラスとして定義されたワークステーションに関する クラスであり,ワークステーションの値引き率を返すメソッド getDiscountRate を再定義している。 PersonalComputer  クラス Computer のサブクラスとして定義されたパーソナルコンピュータに関 するクラスであり,パーソナルコンピュータの値引き率を返すメソッド getDiscountRate を再定義している。 PriceUtility  値引き後の価格の計算と整列をするためのクラスであり,価格の計算を行うメ ソッド computeDiscountPrice,及び整列を行うメソッド sort を定義している。 IComp  大小比較の対象を表すインタフェースであり,比較を行うメソッド compareWith を宣言している。  プログラム 1 のメソッド main とプログラム 2 〜 6 の実行結果を図に示す。 このとき,メソッド main の処理は,次のとおりである。 (1) 四つのコンピュータの仕様を生成し,配列 computers に格納する。 (2) 各コンピュータの仕様を出力する。 (3) 値引き後の価格の計算を行う。 (4) 整列を行う。 (5) 整列結果を出力する。 ----------------------------------------------------  Ws1, frequency:800, memory:256, price:300000  Pc1, frequency:450, memory:128, price:180000  Ws2, frequency:800, memory:512, price:500000  Pc2, frequency:450, memory:256, price:200000    Ws2, frequency:800, memory:512, price:450000  Ws1, frequency:800, memory:256, price:270000  Pc2, frequency:450, memory:256, price:160000  Pc1, frequency:450, memory:128, price:144000 ----------------------------------------------------            図 実行結果 〔プログラム 1 〕 (行番号) 1 public class PriceSort { 2 public static void main(String[] args) { 3 Computer[] computers = { 4 new Workstation("Ws1", 800, 256, 300000), 5 new PersonalComputer("Pc1", 450, 128, 180000), 6 new Workstation("Ws2", 800, 512, 500000), 7 new PersonalComputer("Pc2", 450, 256, 200000), 8 }; 9 for (int i = 0; i < computers.length; i++) { 10 System.out.println(computers[i]); 11 } 12 System.out.println("\n"); 13 PriceUtility.computeDiscountPrice(computers); 14 PriceUtility.sort(computers); 15 for (int i = 0; i < computers.length; i++) { 16 System.out.println(computers[i]); 17 } 18 } 19 } 〔プログラム 2 〕 (行番号) 1 public interface IComp { 2 int compareWith(IComp a); 3 } 〔プログラム 3 〕 (行番号) 1 public class Computer implements【 a 】{ 2 String name; 3 int frequency; 4 int memory; 5 int price; 6 public Computer(String name, int frequency, 7 int memory, int price) { 8 this.name = name; 9 this.frequency = frequency; 10 this.memory = memory; 11 this.price = price; 12 } 13 public int getPrice() { 14 return price; 15 } 16 public void setPrice(int price) { 17 this.price = price; 18 } 19 public String toString() { 20 return name + ", frequency:" + frequency 21 + ", memory:" + memory + ", price:" + price; 22 } 23 public double getDiscountRate() { 24 return 0.0; 25 } 26 public int compareWith(IComp a) { 27 Computer computer = (【 b 】)a; 28 return computer.price - this.price; 29 } 30 } 〔プログラム 4 〕 (行番号) 1 public class Workstation extends Computer { 2 public Workstation(String name, int frequency, 3 int memory, int price) { 4 super(name, frequency, memory, price); 5 } 6 public double getDiscountRate() { 7 return 0.1; 8 } 9 } 〔プログラム 5 〕 (行番号) 1 public class PersonalComputer extends Computer { 2 public PersonalComputer(String name, int frequency, 3 int memory, int price) { 4 super(name, frequency, memory, price); 5 } 6 public double getDiscountRate() { 7 return 0.2; 8 } 9 } 〔プログラム 6 〕 (行番号) 1 public class PriceUtility { 2 public static void computeDiscountPrice(Computer[] a) { 3 int newPrice; 4 for (int i = 0; i < a.length; i++) { 5 newPrice = (int)(a[i].【 c 】() 6 * (1 - a[i].getDiscountRate())); 7 a[i].setPrice(newPrice); 8 } 9 } 10 public static void sort(IComp[] a) { 11 // 単純挿入法による整列 12 int j; 13 for (int i = 1; i < a.length; i++) { 14 IComp temp = a[i]; 15 for (j = i - 1; 16 j >= 0 && temp.【 d 】(a[j]) < 0; 17 j--) { 18 a[j + 1] = a[j]; 19 } 20 a[j + 1] = temp; 21 } 22 } 23 } 設問1 プログラム 3,6 中の【  】に入れる正しい答えを,解答群の中か選べ。 解答群  ア  compareWith     イ  computeDiscountPrice  ウ  Computer      エ  getDiscountRate  オ  getPrice      カ  IComp  キ  PriceUtility    ク  sort 設問2  プログラム 3 の行番号 28 を  return computer.frequency - this.frequency;  に変更したときのプログラム 1 の行番号 16 の出力として正しい答えを,解 答群の中から選べ。 解答群  ア Pc1, frequency:450, memory:128, price:144000    Pc2, frequency:450, memory:256, price:160000    Ws1, frequency:800, memory:256, price:270000    Ws2, frequency:800, memory:512, price:450000  イ Pc2, frequency:450, memory:256, price:160000    Pc1, frequency:450, memory:128, price:144000    Ws2, frequency:800, memory:512, price:450000    Ws1, frequency:800, memory:256, price:270000  ウ Ws1, frequency:800, memory:256, price:270000    Ws2, frequency:800, memory:512, price:450000    Pc1, frequency:450, memory:128, price:144000    Pc2, frequency:450, memory:256, price:160000  エ Ws2, frequency:800, memory:512, price:450000    Ws1, frequency:800, memory:256, price:270000    Pc2, frequency:450, memory:256, price:160000    Pc1, frequency:450, memory:128, price:144000 設問3  プログラム 5 の行番号 7 を    return 0.4;  に変更したとき,各コンピュータの値引き後の価格として正しい答えを,解答 群の中から選べ。 解答群     Ws1   Pc1   Ws2  Pc2 ------------------------------------  ア 180000 108000 300000 120000  イ 180000 144000 300000 160000  ウ 270000 108000 450000 120000  エ 270000 144000 450000 160000 ------------------------------------ ------------------------------------------------------------------------ ▼ 設問中心&一言で問題を説明  問題文を軽くみるだけにして,クラスの相互関係などは,分析せずに,設問 を中心に挑戦します。  もし,クラスの継承等分析に時間をかけると,問われている問題に関係のない ところに時間をかけてしまう心配があります。  設問に入る前に,全体を要約して,全体に対して理解を深めます。一言で, 説明すると  コンピュータの値引き後の値段を並び変えて出力する問題です。  一言で要約したら,設問にかかります。 ------------------------------------------------------------------------ ▼ 設問1 ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ 設問1 プログラム 3,6 中の【  】に入れる正しい答えを,解答群の中か選べ。 解答群  ア compareWith     イ computeDiscountPrice  ウ Computer      エ getDiscountRate  オ getPrice      カ IComp  キ PriceUtility    ク sort △△△ ----- 引用終了 -------------- △△△  問題文のプログラムを見ると,空欄は4つあります。設問には,「重複を してもよい」とありませんので,情報処理技術者試験の問題文の作り方から判断 すると,答えに入るものが同じ記号ということありまん。  Javaの一般的なコーディングルールから判断すると,大文字で始まるものは, クラス,小文字で始まるのは,変数もしくは関数(メソッド)です。  空欄を順に見ていきます。 ------------------------------------------------------------------------ ▼ 空欄 a ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ 〔プログラム 3 〕 (行番号) 1 public class Computer implements【 a 】{ △△△ ----- 引用終了 -------------- △△△  implements の後に入るのは,クラスの特殊な形態である「インタフェース」 です。  Java では,多重継承ができない変わりに,「インタフェース」という特殊な クラスを定義して,それを利用することで,多重継承と同等の仕事をします。  プログラムリスト全体を見るとみると,interface は,IComp だけです。 a:カ IComp ということが分かります。 ------------------------------------------------------------------------ ▼ 空欄 b  現在,空欄aが,カであることが分かりましたので,解答群は,  ア compareWith     イ computeDiscountPrice  ウ Computer      エ getDiscountRate  オ getPrice       キ PriceUtility    ク sort の中から探せばいいです。  空欄bを見ます。 ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ 26 public int compareWith(IComp a) { 27 Computer computer = (【 b 】)a; 28 return computer.price - this.price; △△△ ----- 引用終了 -------------- △△△  IComp 型の変数である,a を Compute 型の変数,computer に代入しています。 よって,これは,型変換をしていると分かります。単純にキャストであると判断 して, b: ウ Computer でいいことがわかります。 ------------------------------------------------------------------------ ▼ 空欄c  現在,解答群は,  ア compareWith     イ computeDiscountPrice              エ getDiscountRate  オ getPrice       キ PriceUtility    ク sort が候補です。空欄cをみます ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ 4 for (int i = 0; i < a.length; i++) { 5 newPrice = (int)(a[i].【 c 】() 6 * (1 - a[i].getDiscountRate())); 7 a[i].setPrice(newPrice); 8 } △△△ ----- 引用終了 -------------- △△△  この問題では,値引き後の計算をして並び替えています。newPrice という変数 は,値引き後の値段と想像がつきます。  newPrice = ○ * (1 - △)  という式の形から,  新値段=定価×(1-値引き率) であることがわかります。  6 行目の   a[i].getDiscountRate() の式の形から,  空欄cのところは,  getPrice ということが容易に想像ができます。 空欄cの解答 c:オ getPrice ------------------------------------------------------------------------ ▼ 空欄d  現在,解答群は,  ア compareWith     イ computeDiscountPrice              エ getDiscountRate                キ PriceUtility    ク sort が候補です。空欄dをみます ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ 10 public static void sort(IComp[] a) { 11 // 単純挿入法による整列 12 int j; 13 for (int i = 1; i < a.length; i++) { 14 IComp temp = a[i]; 15 for (j = i - 1; 16 j >= 0 && temp.【 d 】(a[j]) < 0; 17 j--) { 18 a[j + 1] = a[j]; 19 } 20 a[j + 1] = temp; 21 } 22 } △△△ ----- 引用終了 -------------- △△△  並び替えのロジックのところです。18 行目をみると a[j + 1] = a[j];  を見ると,まさに入れ替えをするとところですので,空欄dでは大小関係 の比較をしていると判断できます。解答群をみると,比較に関係するのは, d: ア compareWith であることが分かります。 ------------------------------------------------------------------------ ▼ 設問2  設問を見ますね。 ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ 設問2  プログラム 3 の行番号 28 を  return computer.frequency - this.frequency;  に変更したときのプログラム 1 の行番号 16 の出力として正しい答えを,解 答群の中から選べ。 解答群  ア Pc1, frequency:450, memory:128, price:144000    Pc2, frequency:450, memory:256, price:160000    Ws1, frequency:800, memory:256, price:270000    Ws2, frequency:800, memory:512, price:450000  イ Pc2, frequency:450, memory:256, price:160000    Pc1, frequency:450, memory:128, price:144000    Ws2, frequency:800, memory:512, price:450000    Ws1, frequency:800, memory:256, price:270000  ウ Ws1, frequency:800, memory:256, price:270000    Ws2, frequency:800, memory:512, price:450000    Pc1, frequency:450, memory:128, price:144000    Pc2, frequency:450, memory:256, price:160000  エ Ws2, frequency:800, memory:512, price:450000    Ws1, frequency:800, memory:256, price:270000    Pc2, frequency:450, memory:256, price:160000    Pc1, frequency:450, memory:128, price:144000 △△△ ----- 引用終了 -------------- △△△  この問題は,値引き後の金額の大きい順に並びかえて表示していました。 「return computer.frequency - this.frequency; 」と交換されるところは  return computer.price - this.price;  です。よって,新しい表示は,周波数(frequency)の大きい順に表示されると 分かります。よって,ウかエが解答であると判断できます。  ウとエをどちらを選ぶかですが,この問題の並び替えのロジックは,「単純 挿入法」は,同じ値の場合,事前にあった順を保存するロジックです。よって, ウが解答であるということが分かります。  面倒ですが,プログラム6のロジックを読みとってもそれが分かります。 設問2:ウ ------------------------------------------------------------------------ ▼ 設問3 ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ 設問3  プログラム 5 の行番号 7 を    return 0.4;  に変更したとき,各コンピュータの値引き後の価格として正しい答えを,解答 群の中から選べ。 解答群     Ws1   Pc1   Ws2  Pc2 ------------------------------------  ア 180000 108000 300000 120000  イ 180000 144000 300000 160000  ウ 270000 108000 450000 120000  エ 270000 144000 450000 160000 ------------------------------------ △△△ ----- 引用終了 -------------- △△△  プログラム 5 の行番号 7 の周りを見ます。 ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ 6 public double getDiscountRate() { 7 return 0.2; 8 } △△△ ----- 引用終了 -------------- △△△  値引き率を定義しているところです。プログラム 5 は,Personal クラスの ところですので,よって,Personalコンピュータのみが変化します。ここで, Warstation クラスをみると,return 0.1 と定義されており,PersonalComputer クラスの影響を受けるようなコーディングにはなっていません。 Ws1,Ws2 は,ワークステーションの名前,Pc1,Pc2は,パーソナルの名前でし ので,    Ws2, frequency:800, memory:512, price:450000  Ws1, frequency:800, memory:256, price:270000  Pc2, frequency:450, memory:256, price:160000  Pc1, frequency:450, memory:128, price:144000 で,Ws2 450000,Ws1 270000は,変わらないはずです。     Ws1   Pc1   Ws2  Pc2 ------------------------------------  ウ 270000 108000 450000 120000  エ 270000 144000 450000 160000 のどちらかが解答となるはずです。エだと,前のままの率で計算ですので,解答 は,ウであること分かります。 設問3:ウ ------------------------------------------------------------------------ ▼ 基本情報技術者試験午後 平成13年秋問12の解答  解答のみ整理しておきます。 設問1  a:カ  b:ウ  c:オ  d:ア 設問2 ウ 設問3 ウ ------------------------------------------------------------------------ ▼ 次号の予定  問12の問題文の文法事項解説  完全に動作可能のソースも掲載しますね。  感想は,斎藤まで,suehiro@he.mirai.ne.jp  広告等のお問い合わせ:*** ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ フが所有しますが,商用を含めて,再利用,改変,発表を制限しません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。 広告募集 http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ------------------------------------------------------------------------ ▼アンケート(以下を返信してください) この号のJマガは役だった。該当するものだけ残してください。 5: 大変に,YES 4: YES 3: 普通 2: NO 1: 大変に,NO その他