オブジェクト指向言語・中間テスト問題用紙（2022年 06月 09日・ 08:50 ～ 09:35）
解答上、その他の注意事項
1. 問題は、問 Ⅰ～Ⅱ まである。
2. 解答用紙の右上の欄に学籍番号・名前を記入すること。
3. 解答欄を間違えないよう注意すること。
4. 解答中の文字 (特に a と d)がはっきりと区別できるよう注意すること。
5. 持ち込みは不可である。筆記用具・時計・学生証以外のものは、かばんの中などにしまうこと。
6. 中間テストの配点は 40 点である。

すべての問に対する補足
プログラムの空欄を埋める問題では、解答が長くなる可能性があるので、下の省略形（を用いても良い。（必ず囲み文字）で囲むこと。）

A ActionListener aA addActionListener AE ActionEvent K KeyListeneraK addKeyListener KE KeyEvent M MouseListener aM addMouseListener
ME MouseEvent pl System.out.println pf System.out.printf
また、参考のために問題用紙の末尾に授業配布プリントの LeftRightButton.java, LeftRightButton4.java, のソースを掲載する。（main メソッドは省略している。）

I. 次の (1)～(2) の Java に関する多肢選択問題に答えよ。解答は各問の指示する選択肢から選べ。ただし、特に指定しない限り、選ぶべき選択肢は必ずしも一つとは限らない。
(1) Foo.java という Java のソースファイルは main メソッドを含み、標準ライブラリー以外には依存しない。これをコンパイルし、実行するためのコマンドの組み合わせで正しいのはどれか？一つ選べ。
コンパイル

実行

(A).

javac Foo

Foo

(B).

javac Foo.java

Foo

(C).

javac Foo

java Foo(D).

javac Foo.java

java Foo(E).

javac Foo

java Foo.class(F).

javac Foo.java

java Foo.class(2) 次の文章のうち、正しいものはどれか?
(A). Java では実行中に使われなくなったメモリーは自動的に再利用可能になる。
(B). Java では Y1000 という名前はクラス名として使用できる。
(C). Java は家庭にコンピューターが普及しだした 1980 年代前半に発表された。
(D). Java は論理型言語に分類されるプログラミング言語の一つである。
II. 次の枠内の文章は javax.swing.JTextField クラスの setHorizontalAlignment メソッド、 java.lang.Math クラスの toDegrees, toRadians, cos, sin メソッド、
java.util.ArrayList クラスのコンストラクター、add メソッドの Java™ API 仕様からの抜粋である。（問題を解くのに関係ない部分は割愛している。）

javax.swing

クラス JTextField
メソッドの詳細
setHorizontalAlignment
public void setHorizontalAlignment(int alignment)
テキストの水平配置を設定します。 有効な alignment は次のとおりです。
JTextField.LEFT（左端）
JTextField.CENTER（中央）JTextField.RIGHT（右端）
JTextField.LEADING（先端）JTextField.TRAILING（後端）パラメータ:alignment - 配置方法

java.lang

クラス Mathメソッドの詳細
toDegrees
public static double toDegrees(double angrad)
ラジアンで計測した角度を、相当する度に変換します。
パラメータ:
angrad - ラジアンで表した角度
戻り値:度で表した、角度 angrad の値。
toRadians
public static double toRadians(double angdeg)
度で計測した角度を、相当するラジアンに変換します。
パラメータ:
angdeg - 度で計測した角度
戻り値:
ラジアンで表した、角度 angdeg の値。
cos
public static double cos(double a)
指定された角度の余弦 (コサイン) を返します。
パラメータ:
a - ラジアンで表した角度。
戻り値:
引数の余弦 (コサイン)。
sinpublic static double sin(double a)
指定された角度の正弦 (サイン) を返します。
パラメータ:
a - ラジアンで表した角度。
戻り値:
引数の正弦 (サイン)。

java.util

クラス ArrayList<E>
コンストラクターの詳細
ArrayList
public ArrayList()
空のリストを作成します。

メソッドの詳細
addpublic boolean add(E e)
リストの最後に、指定された要素を追加します。
パラメータ:e - このリストに追加される要素
戻り値:
true
次の ShowAngle クラスは、これらのメソッドを使って、2 つのテキストフィールドを用いて、角度の単位の度 (degree) とラジアン (radian) の変換を双方向に行なえる（片方のテキストフィールドの値を変えると、もう片方のテキストフィールドの値が変わる）、さらに入力された角度を保存してグラフィックスとして表示する、という GUI アプリケーションである。
次のスクリーンショットは、順に 36 度、5 ラジアン、137.05 度、3.333 ラジアンというデータを入力したときの画面である。

実行例 1

実行例 2

実行例 3

実行例 4ShowAngle クラスは JPanel クラスを継承している。以下の問に答えよ。
ファイル名 ShowAngle.java
1 import java.util.ArrayList;
2 import java.awt.*;
3 import java.awt.event.*;
4 import javax.swing.*;5
6 public class ShowAngle(1)7
private JTextField input1, input2;
8
private ArrayList<Double> angles;
910
public ShowAngle() {11
setPreferredSize(new Dimension(400, 250));
12
input1 = new JTextField("0", 8);13(2)14input1.addActionListener(this);
15input2 = new JTextField("0", 5);16(3)17input2.addActionListener(this);18
setLayout(new FlowLayout());
19
add(input1); add(new JLabel("度 = "));
20
add(input2); add(new JLabel("ラジアン"));21
angles =(4);
22}
23
24
public void actionPerformed(ActionEvent e) {25
Object source = e.getSource();26
if (source == input1) {{;
;

27
try {
28
double deg = Double.parseDouble(input1.getText());
29
double rad =(5);30
input2.setText(String.format("%.2f", rad));31(7);32repaint();
33} catch (NumberFormatException ex) {34
input1.setText("数値!");35}
36} else {
37
try {
38
double rad = Double.parseDouble(input2.getText());
39
double deg =(6);40input1.setText(String.format("%.2f", deg));
41
(8)
;
42
repaint();
43} catch (NumberFormatException ex) {44
input2.setText("数値!");
45}
46}
47}
48
49
@Override50
public void paintComponent(Graphics g) {51
super.paintComponent(g);52
int cx = 200, cy = 150; // 円の中心の座標
53
int r = 100;// 円の半径54g.drawOval(cx - r, cy - r, 2 * r, 2 * r);55
int len = angles.size();56
for (int i = 0; i < len; i++) {57
double t = angles.get(i);58g.drawLine(cx, cy,59
cx + (int)((9)),
60cy - (int)((10));
61}
62}
63
64
/* main は省略する */65 }(1) の空欄を埋めよ。
(2), (3) には、それぞれ input1, input2 のテキストの水平配置を右端にする式が入る。
これらの式を答えよ。
(4) には、フィールド angles を空の ArrayList に初期化する式が入る。この式を答えよ。

(5), (6) には、java.lang.Math のメソッドを使って、それぞれ、度をラジアンに、ラジアンを度に変換する式が入る。これらの式を答えよ。
(7), (8) には、どちらもフィールド angles の末尾に入力された角度を追加する式が入る。これらの式を答えよ。
(9), (10) には、それぞれ r cos(t), r sin(t) を表す式が入る。（Java のグラフィックスで使う座標系は、普通と y 軸の向きが逆なので、y 座標を - にしていることに注意する。）これらの式を答えよ。
さらに、この ShowAngle.java をラムダ式を用いて次のように同等のプログラム ShowAngle2.javaに書き換える。やはり ShowAngle2 クラスは JPanel クラスを継承している。ただし、空欄(2), (3), (4) は ShowAngle.java の該当する箇所と同じ式が入る。以下の問に答えよ。
ファイル名 ShowAngle2.java
1 import java.util.ArrayList;
2 import java.awt.*;
3 import java.awt.event.*;
4 import javax.swing.*;5
6 public class ShowAngle2(11)
7
private ArrayList<Double> angles;
89public ShowAngle2() {10setPreferredSize(new Dimension(400, 250));
11
JTextField input1 = new JTextField("0", 8);
12
JTextField input2 = new JTextField("0", 5);13(2)14input1.addActionListener((12)15(3)
16input2.addActionListener((13){;;););

17
setLayout(new FlowLayout());
18
add(input1); add(new JLabel("度 = "));
19
add(input2); add(new JLabel("ラジアン"));20
angles =(4);21}
22/* paintComponent, main は省略する */23 }(11) の空欄を埋めよ。
(12), (13) の空欄に入る式を、それぞれラムダ式を用いて書け。ただし、ShowAngle.java の27 行目から 35 行目と同じ部分は△と、 37 行目から 45 行目と同じ部分は▽と省略せよ。

以下に参考のために授業配布プリントの LeftRightButton.java, LeftRightButton4.java のソースを掲載する。
ファイル LeftRightButton.java
1 import javax.swing.*;
2 import java.awt.*;
3 import java.awt.event.*;
4
5 public class LeftRightButton extends JPanel implements ActionListener {6private int x = 20;
7private JButton lBtn, rBtn;
89public LeftRightButton() {10setPreferredSize(new Dimension(200, 70));
11lBtn = new JButton("Left");
12
rBtn = new JButton("Right");
13lBtn.addActionListener(this);
14
rBtn.addActionListener(this);
15
setLayout(new FlowLayout());
16add(lBtn); add(rBtn);
17}
18
19
@Override20
public void paintComponent(Graphics g) {21
super.paintComponent(g);22g.drawString("HELLO WORLD!", x, 55);
23}
24
25
public void actionPerformed(ActionEvent e) {26
Object source = e.getSource();
27if (source == lBtn) {// lBtnが押された
28
x -= 10;29}30
else if (source == rBtn) { // rBtnが押された
31
x += 10;32}
33
repaint();
34}
35
36
public static void main(String[] args) { /* 省略 */ }37 }ファイル LeftRightButton4.java
1 import javax.swing.*;
2 import java.awt.*;3
4 public class LeftRightButton4 extends JPanel {5private int x = 20;
67public LeftRightButton4() {8setPreferredSize(new Dimension(200, 70));
9JButton lBtn = new JButton("Left");
10JButton rBtn = new JButton("Right");
11lBtn.addActionListener(e -> {12x -= 10;
13repaint();14});
15
rBtn.addActionListener(e -> {16x += 10;17repaint();18});

19
20
21
22
23
24
25
26
27
28
2930 }

setLayout(new FlowLayout());
add(lBtn); add(rBtn);}@Override
public void paintComponent(Graphics g) {super.paintComponent(g);g.drawString("HELLO WORLD!", x, 55);}
public static void main(String[] args) { /* 省略 */ }

オブジェクト指向言語・中間テスト解答用紙（2022 年 06 月 09 日）
学籍番号

氏名

I.

(4 × 2)
(1)

(2)

II.

(4,2,2,4,2,2,2,2,2,2,4,2,2)
(1)
(2)
(3)
(4)
(5)

(6)

(7)

(8)

(9)

(10)

(11)

(12)

(13)

授業・テストの感想