基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成15年 秋期 基本情報技術者 午後 問12
問12   Java

 次の Java プログラムの説明及びプログラムを読んで,設問に答えよ。

〔プログラムの説明〕

 クラス Matrix は,要素の値が実数である行列を表すクラスであり, 主な行列演算のためのメソッドを定義する。 クラス MatrixTest は,クラス Matrix のオブジェクトをテストするメソッド main を 定義するクラスである。 クラス Matrix の仕様は,次のとおりである。

(1) クラス Matrix のコンストラクタは,行列の要素の値を 含む double[][] 型の引数をもつ。 行及び列は null ではなく,各行の要素の個数は同一であるとする。 空行列は考えない。

(2) メソッド toString によって返される行列オブジェクトの文字列表現は, 次のとおりである。

[[1 行 1 列 1 行 2 列 … 1 行 N 列] … [M 行 1 列 M 行 2 列 … M 行 N 列]]

MatrixTest 例 1 行列 の文字列表現は,[[1.0 2.0][3.0 4.0]] となる。

(3) メソッド add に,行列オブジェクトの引数を渡すと, オブジェクト this と引数のオブジェクトとの和の行列を返す。 行列の和は,二つの行列の行数と列数がそれぞれ等しい場合にだけ定義される。

MatrixTest 例 2 行列 と行列 との和は, になる。 オブジェクト this との和が定義されない行列オブジェクトが引数に渡された場合には, 例外 MatrixArithmeticException を投げる。

(4) メソッド multiply に,実数の引数を渡すと,オブジェクト this の 要素ごとにその引数を乗算した結果の行列を返す。

MatrixTest 例 3 行列 と実数 2.0 との積は, になる。

(5) メソッド multiply に,行列オブジェクトの引数を渡すと, オブジェクト this と引数のオブジェクトとの積の行列を返す。 k l 列の行列 A と, m n 列の行列 B との積 A B は,行列 A の列数と 行列 B の行数が等しい,すなわち l m で あるときにだけ定義される。 A B C とするとき, 積の行列 C k 行 n 列になる。 このとき,行列 C の第 i 行第 j 列の要素の値は, 行列 A i x 列 (ここで, x = 1,…, l ) の値と行列 B x j 列の値とを掛けて得られる l 個の実数の和である。

MatrixTest 例4 行列 と行列 との積は, になる。 オブジェクト this との積が定義されない行列オブジェクトが引数に渡された場合には, 例外 MatrixArithmeticException を投げる。

〔プログラム〕

class MatrixArithmeticException extends Exception { }
public class Matrix {
   private double[][] values;
   public Matrix(double[][] initVal) {
      values = new double[initVal.length][initVal[0].length];
      // 配列 initVal の内容を配列 values にコピーする
      for (int i = 0; i < initVal.length; i++) {
         System.arraycopy(initVal[i], 0, values[i], 0,
                          initVal[i].length);
      }
   }
   public Matrix add(Matrix m) throws MatrixArithmeticException {
      if ()
         throw new MatrixArithmeticException();
      double[][] result =
         new double[values.length][values[0].length];
      for (int i = 0; i < values.length; i++) {
         for (int j = 0; j < values[0].length; j++) {
            result[i][j] = values[i][j] + m.values[i][j];
         }
      }
      ;
   }
   public Matrix multiply(Matrix m)
      throws MatrixArithmeticException {
      if ()
         throw new MatrixArithmeticException();
      double[][] result =
         new double[values.length][m.values[0].length];
      for (int i = 0; i < values.length; i++) {
         for (int j = 0; j < m.values[0].length; j++) {
            for (int k = 0; k < m.values.length; k++) {
               result[i][j] += values[i][k] * m.values[k][j];
            }
         }
      }
      ;
   }
   public Matrix multiply(double d) {
      double[][] result =
         new double[values.length][values[0].length];
      for (int i = 0; i < values.length; i++) {
         for (int j = 0; j < values[0].length; j++) {
            result[i][j] = values[i][j] * d;
         }
      }
      ;
   }
   public String toString() { 
      StringBuffer rep = new StringBuffer("[");
      for (int i = 0; i < values.length; i++) {
         rep.append("[");
         for (int j = 0; j < values[0].length; j++) {
            rep.append(((j > 0) ? " " : "") + values[i][j]);
         }
         rep.append("]");
      }
      rep.append("]");
      ;
   }
}
class MatrixTest {
   public static void main(String[] args)
    throws MatrixArithmeticException {
    // 例1
    Matrix matrix0 =
     new Matrix(new double[][]{{1.0, 2.0}, {3.0, 4.0}});
    System.out.println(matrix0);
    // 例2
    Matrix matrix1 = 
     new Matrix(new double[][]{{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}});
    Matrix matrix2 =
     new Matrix(new double[][]{{1.2, 1.3, 1.4}, {1.5, 1.6, 1.7}});
    System.out.println(matrix1.add(matrix2));
    // 例3
    double d = 2.0;
    System.out.println(matrix0.multiply(d));
    // 例4
    Matrix matrix3 =
     new Matrix(new double[][]{{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}});
    Matrix matrix4 =
     new Matrix(new double[][]{{1.0, 0.0}, {0.0, 1.0}, {1.0, 0.0}});
    System.out.println(matrix3.multiply(matrix4));
    }
}

基本情報技術者試験


設問 プログラム中の に 入れる正しい答えを,解答群の中から選べ。

a,c に関する解答群

ア values.length == m.values[0].length

イ values.length != m.values[0].length

ウ values[0].length == m.values.length

エ values[0].length != m.values.length

オ values.length == m.values.length &&
  values[0].length == m.values[0].length

カ values.length != m.values.length ||
  values[0].length != m.values[0].length

キ values[0].length == m.values.length &&
  values.length == m.values[0].length

ク values[0].length != m.values.length ||
  values.length != m.values[0].length

b,d に関する解答群

ア return (Matrix)null

イ return new Matrix()

ウ return new Matrix(result)

エ return new String(rep)

オ return rep

カ return rep.getBytes()

キ return result

ク System.out.println(rep)

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

解答 d ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]