平成25年 春期 基本情報技術者 午後 問11
問11 Java次の Java プログラムの説明及びプログラムを読んで,設問1〜3に答えよ。 〔プログラムの説明〕 あみだくじの作成と結果の表示を行うプログラムである。 あみだくじとは,複数の平行に並ぶ縦線と,2本の縦線だけに水平に接続する複数の 横線から成るくじである。横線は縦線の上端及び下端には接続せず,縦線の同一箇所に 複数の横線が接続されることもない。くじをたどる手順は次のとおりである。 (1) 1本の縦線を選択し,上端から下方向にたどり始める。 (2) 途中に,接続する横線があるときは必ず曲がり,もう一方の縦線までたどる。 (3) 縦線に到達したら,また下方向にたどる。 (4) 下端に到達するまで (2) と (3) を繰り返す。 (5) 下端に到達したときの縦線の位置が,くじを引いた結果である。 あみだくじの例を図1に示す。図中の太線は,左端の縦線を選択したときにたどった経路である。
図1 あみだくじの例 クラス GhostLeg は,あみだくじを作成し,作成したあみだくじをたどるプログラムである。 (1) 縦線を左からの順番で保持する。左端を0番目とする。 (2) 縦線の長さを 1.0 とし,上端の縦軸座標を 1.0 ,下端の縦軸座標を 0.0 とする。 (3) 横線の両端の縦軸座標は等しく, 0.0 よりも大きく 1.0 未満である。 (4) 縦線の本数を引数とするコンストラクタをもつ。 (5) 次のメソッドをもつ。 横線を追加するメソッドである。左から x1 番目の縦線と x2 番目の縦線を縦軸座標 y で 接続する横線を追加する。ただし, x1 と x2 が等しいか,2本の縦線のいずれか又は両方に, 既に縦軸座標 y で接続する横線があるときには追加しない。 あみだくじは,クラス GhostLeg のインスタンスを生成した後,このメソッドを 任意の回数だけ呼び出し,横線を追加することによって完成する。 A int trace(int x) くじを引いた結果を返すメソッドである。左から x 番目の縦線を選択し, あみだくじをたどった結果を返す。
図2 クラス GhostLegTester の実行結果 〔プログラム1〕 import java.util.ArrayList; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; public class GhostLeg { private List<VerticalLine> verticalLines; public (int n) { verticalLines = new ArrayList<VerticalLine>(n); for (int i = 0; i < n; i++) { verticalLines.add( ); } } public void addHorizontalLine(int x1, int x2, double y) { // 設問3(α) VerticalLine v1 = verticalLines.get(x1); // 設問3(β) VerticalLine v2 = verticalLines.get(x2); if (x1 != x2 && !v1.hasHorizontalLineAt(y) && !v2.hasHorizontalLineAt(y)) { // 設問3(γ) v1.putHorizontalLine(y, v2); v2.putHorizontalLine(y, v1); } // 設問3(δ) } public int trace(int x) { double y = 1.0; VerticalLine v = verticalLines.get(x); while ((y = v.getNextY(y)) > ) { v = ; } return verticalLines.indexOf(v); } private static class VerticalLine { SortedMap<Double, VerticalLine> horizontalLines = new TreeMap<Double, VerticalLine>(); VerticalLine() { horizontalLines.put(0.0, null); } boolean hasHorizontalLineAt(double y) { return horizontalLines.containsKey(y); } void putHorizontalLine(double y, VerticalLine opposite) { horizontalLines.put(y, opposite); } double getNextY(double y) { // マップ horizontalLines が保持するキーの中で, // 引数 y よりも小さいもののうち,最大のものを返す。 return horizontalLines.headMap(y).lastKey(); } VerticalLine getOpposite(double y) { return horizontalLines.get(y); } } } 〔プログラム2〕 public class GhostLegTester { public static void main(String[] args) { GhostLeg gh = new GhostLeg(4); gh.addHorizontalLine(0, 1, 0.8); gh.addHorizontalLine(0, 1, 0.2); gh.addHorizontalLine(1, 2, 0.4); gh.addHorizontalLine(2, 3, 0.6); gh.addHorizontalLine(2, 3, 0.2); for (int i = 0; i < 4; i++) { System.out.printf("%d -> %d%n", i, gh.trace(i)); } } } 設問1 次の記述中の に入れる正しい答えを, 解答群の中から選べ。 クラス GhostLeg の内部クラス VerticalLine は1本の縦線を表すクラスであり, インスタンスは,そのインスタンスが示す縦線に接続している横線を保持している。 この内部クラスでは,横線を, として表現している。 解答群 イ その横線が接続する縦軸座標とクラス HorizontalLine のインスタンスのマップ ウ その横線が接続する縦軸座標とその横線に接続するもう1本の縦線のマップ エ その横線に接続する2本の縦線のマップ 設問2 プログラム中の に入れる正しい答えを, 解答群の中から選べ。 a に関する解答群 ウ void ghostLeg エ void GhostLeg b に関する解答群 ウ new VerticalLine() エ null c に関する解答群 d に関する解答群 ウ v.getOpposite(y) エ verticalLines.get(x)
設問3 次の記述中の に入れる正しい答えを, 解答群の中から選べ。 メソッド addHorizontalLine の呼出しにおいて,引数 x1 又は x2 に相当する縦線が ないときには IndexOutOfBoundsException が投げられる。一方,引数 y には追加する横線の 縦軸座標を指定するので,その値は 0.0 よりも大きく 1.0 未満でなければならないが, それ以外の値を指定しても例外は投げない。 これを,引数 x1 及び x2 の値によらず,引数 y の値が横線の縦軸座標として 取り得る範囲から外れているときに IllegalArgumentException を投げるよう にするには,プログラム1中のコメント“// 設問3()”の 1行を次の if 文に置き換えればよい。
if ( ) { throw new IllegalArgumentException(); } e に関する解答群 f に関する解答群 ウ y > 0.0 && y < 1.0 エ y > 0.0 || y < 1.0
[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]
©2004-2024 情報処理試験.jp
|
プライバシーポリシー・著作権・リンク
|
お問合わせ
| |