オブジェクト指向言語・期末テスト問題用紙（2022年 07月 28日・ 08:50 ～ 10:20）
解答上、その他の注意事項
1. 問題は、問 Ⅰ～Ⅶ まである。うち、問 Ⅰ〜Ⅲ は中間テストの代替問題である。
◦ 中間テストの得点が 7 割に達しなかったものは、代替問題を解答すれば、7 割を上限として良いほうの点数を採用する。
◦ 正当な事情があって中間テストを欠席した者も代替問題を解答すること。（この場合は、上限は設けない。）
2. 解答用紙の右上の欄に学籍番号・名前を記入すること。
3. 解答欄を間違えないよう注意すること。
4. 解答中の文字 (特に a と d)がはっきりと区別できるよう注意すること。
5. 持ち込みは不可である。筆記用具・時計・学生証以外のものは、かばんの中などにしまうこと。
6. テストの配点は 70 点（うち中間テストの代替問題の問 Ⅰ〜Ⅲの配点は 30 点）である。合格は「オブジェクト指向言語演習」の課題の得点を加点して、100 点満点中 60 点以上とする。

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

囲み文字）

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,
LeftRightButton2.java, Guruguru.java, Point.java, ColorPoint.java, Quadratic.kt,
SequenceTest.kt のソースを掲載する。（GUI アプリケーションは main メソッドは省略している。）

I. 次の (ⅰ)～(ⅱ) の Java に関する多肢選択問題に答えよ。解答は各問の指示する選択肢から選べ。ただし、特に指定しない限り、選ぶべき選択肢は必ずしも一つとは限らない。
(ⅰ) Java のクラス名として文法上使用可能な識別子は次のうち、どれか? すべて選べ。
(A).
(D).

Covid19 (B). X_Y_Z_(C). ABC-MART
2X4(E). for_a_while (F). QQQQQ(ⅱ) 次の Java に関する文章のうち、正しいものはどれか? すべて選べ。
(A). Java は関数型言語に分類されるプログラミング言語の一つである。
(B). Java のクラスが実装 (implement) できるインタフェースは多くて 1 つである。
Java の public なクラスは、その名前に .java という拡張子をつけたファイルに定義する必要がある。
(D). Java は JavaScript に型宣言を仕様として追加したプログラミング言語である。
Java のクラスでは、他のクラスのコードからは参照できないメソッドを定義すること
(E).
ができる。
(F). Java の配列は範囲外をアクセスしても、C と同じでエラーや例外にはならない。
(C).

II. 次の枠内の文章は org.jsoup.Jsoup クラスの parse メソッド、
org.jsoup.nodes.Documents クラス、 org.jsoup.nodes.Element クラスの select,
after, before, firstElementChild, empty メソッド、
org.jsoup.select.Elementsクラスの jsoup API Reference からの抜粋である。（問題を解くのに関係ない部分は割愛している。）

Package org.jsoup

Class Jsoup
public class Jsoup extends Object

Method Detailsparsepublic static Document parse(File file) IOException
Parse the contents of a file as HTML. …
Parameters:
file - the file to load HTML from.
Returns:sane HTML
Throws:IOException - if the file could not be found or read.
sane — 健全な、まっとうな

Package org.jsoup.nodes

Class Document
public class Document extends Element
An HTML Document.

Package org.jsoup.nodes

Class Element
public class Element extends NodeAn HTML element consists of a tag name, attributes, and child nodes(including text nodes and other elements). From an Element, you can extract
data, traverse the node graph, and manipulate the HTML.

Method Details
selectpublic Elements select(String cssQuery)
Find elements that match the Selector CSS query, with this element as thestarting context. Matched elements may include this element, or any of its
children. …. Also known as querySelectorAll() in the Web DOM.
Parameters:
cssQuery - a Selector CSS-like query
Returns:
an Elements list containing elements that match the query (empty ifnone match)
after
public Element after(String html)
Insert the specified HTML into the DOM after this element (as a following
sibling).
Parameters:
html - HTML to add after this element
Returns:
this element, for chaining
firstElementChildpublic Element firstElementChild()
Gets the first child of this Element that is an Element, or null if there is
none.
Returns:
the first Element child node, or null.
beforepublic Element before(String html)
Insert the specified HTML into the DOM before this element (as a preceding
sibling).
Parameters:
html - HTML to add before this element
Returns:
this element, for chainingemptypublic Element empty()
Remove all of the element's child nodes. Any attributes are left as-is.
Returns:
this element
Package org.jsoup.selectClass Elements
public class Elements extends ArrayList<Element>
A list of Elements, with methods that act on every element in the list.

下に示す JsoupTest クラスは、これらのメソッドを使って、HTML ファイルを読み込み、<h1> タグの前に <hr> を挿入し、 <ul> タグの最初の子要素の後に <li>????</li> という要素を挿入し、 <address> タグの子ノードをすべて除去した HTML を別のファイルに保存するプログラムである。つまり、次のような HTML ファイルを
1 <!doctype html>
2 <html>
3 <head>4<title>Test Document</title>
5 </head>
6 <body>7<h1>Componies</h1>8<ul>9<li>Oracle</li>10<li>JetBrains</li>11<li>Mozilla</li></ul>12<address>Taro Yamada</address>
13
14 </body>
15 </html>
次のような HTML ファイルに書き換える。（変わっているのは、7, 11, 15 行目、ただし空白や改行を適宜挿入／削除して整形している。）
1 <!doctype html>
2 <html>
3 <head>4<title>Test Document</title>
5 </head>
6 <body>7<hr>
8<h1>Componies</h1>
9
<ul>
10
<li>Oracle</li>11<li>????</li>12<li>JetBrains</li>13<li>Mozilla</li>
14
</ul>
15
<address></address>
16 </body>17 </html>
ファイル名 JsoupTest.java

1 import org.jsoup.Jsoup;
2 import org.jsoup.nodes.*;
3 import org.jsoup.select.*;
4
5 import java.io.*;6
7 public class JsoupTest {8
public static void main(String[] args) throws IOException {9File f = new File(args[0]);10Document doc =(ⅰ)
11for (Element elem: doc.select("h1")) {
(ⅱ)
;
12
}
13
for (Element elem: doc.select("ul")) {
14
15
(ⅲ)
;
16
}
17
for (Element elem: doc.select("address")) {
18
(ⅳ)
;
19
}
20
21
String tmpdir = System.getProperty("java.io.tmpdir");
22
String outf
= "tmp.html";
23// 変換したものをファイルに保存
24
File g = new File(new File(tmpdir), outf);
25
try (FileWriter out = new FileWriter(g)) {26
out.write(doc.outerHtml());
27
System.err.printf("output written to %s.%n",28
g.getCanonicalPath());
29} catch (IOException e) {30
e.printStackTrace();
31
}
32
}
33 }

;

以下の問に答えよ。
(ⅰ) には、ファイル f の内容を構文解析して Document を返す式が入る。この式を答えよ。
(ⅱ) には、要素 elem の前に <hr> という HTML を挿入する式が入る。この式を答えよ。
(ⅲ) には、要素 elem の最初の子要素の後に <li>????</li> という HTML を挿入する式が入る。この式を答えよ。
(ⅳ) には、要素 elem の子ノードをすべて除去する式が入る。この式を答えよ。
III. 次の ThreePoles クラスは 要素数 3 の配列 data のグラフを表示し、以下のように動作す
る GUI アプリケーションである。
◦ 「0 -> 1」ボタンをクリックすれば、 data[0] が正の数ならばデクリメントして、
data[1] をインクリメントする。
◦ 「1 -> 2」ボタンをクリックすれば、 data[1] が正の数ならばデクリメントして、
data[2] をインクリメントする。
◦ 「2 -> 0」ボタンをクリックすれば、 data[2] が正の数ならばデクリメントして、
data[0] をインクリメントする。
ファイル名 ThreePoles.java
1 import javax.swing.*;
2 import java.awt.*;
3 import java.awt.event.*;
4
5 public class ThreePoles extends JPanel implements ActionListener {6
private final int wid = 78, hei = 40, gap = 2;

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 }

private final int max = 8, pad = 50;
private int data[] = { max, 0, 0 };private JButton button1, button2, button3;
public ThreePoles() {setPreferredSize(new Dimension(gap + 3 * (wid + gap),
pad + max * hei));button1 = new JButton("0 -> 1");(ⅰ);
button2 = new JButton("1 -> 2");(ⅱ);
button3 = new JButton("2 -> 0");(ⅲ);
add(button1); add(button2); add(button3);}
public void actionPerformed(ActionEvent e) {Object target = e.getSource();
int src, dst;
if (target == button1) {src = 0; dst = 1;
} else if (target == button2) {src = 1; dst = 2;
} else {src = 2; dst = 0;}
if (data[src] > 0) {data[src]--; data[dst]++;}repaint();}@Override
protected void paintComponent(Graphics g) {super.paintComponent(g);for (int i = 0; i < 3; i++) {int d = data[i];g.setColor(Color.BLUE);
g.fillRect(gap + i * (gap + wid),
pad + (max - d) * hei, wid, d * hei);}}/* main は省略する */実行例:⇒
0 -> 1
5 回⇒
1 -> 2
4 回⇒
2 -> 02 回

上の (ⅰ), (ⅱ), (ⅲ) の空欄を埋めよ。
このプログラムを内部クラスを用いて次のように書き換えるとき、(ⅳ) ～ (ⅷ) の空欄を埋めよ。
1 /* import は変わらないので省略する
2 public class ThreePoles2

*/
(ⅳ)

{

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 }

private final int wid = 78, hei = 40, gap = 2;
private final int max = 8, pad = 50;
private int data[] = { max, 0, 0 };class ButtonListener implements ActionListener {private int src, dst;
ButtonListener(int s, int d) {(ⅴ)}
public void actionPerformed(ActionEvent e) {if (data[src] > 0) {data[src]--; data[dst]++;}repaint();}}
public ThreePoles2() {setPreferredSize(new Dimension(gap + 3 * (wid + gap),
pad + max * hei));
JButton button1 = new JButton("0 -> 1");(ⅵ)
JButton button2 = new JButton("1 -> 2");(ⅶ)
JButton button3 = new JButton("2 -> 0");(ⅷ)
add(button1); add(button2); add(button3);
}

;
;
;

/* paintComponent は変わらないので省略する *//* main は省略する */IV. 次の (ⅰ)～(ⅱ) の Kotlin プログラムはどのように出力するか？答えよ。なお、take(n) メ
ソッドは先頭の n 個の要素からなる有限列を取り出し、 toList() メソッドは、出力するためにシーケンスをリストに変換する。
(ⅰ)
1 fun foo(n: Int): Pair<Int, Int> {2
if (n <= 3) return Pair(n, 2);3val (m, k) = foo(n - 3)
4
return Pair(m * k, k + 1)
5 }6
7 fun main() {8val (a, b) = foo(11)9println(a)10 }(ⅱ)
1 fun bar(m: Int) = sequence {2
var n = m3
while (true) {4yield(n)5val k = n % 3
6
if (k == 0) {7
n /= 38} else if (k == 1) {n = 2 * n + 1
9} else {10n *= 2
11

12
}
13
}
14 }
15
16 fun main() {17println(bar(11).take(6).toList())
18 }V. 次の (ⅰ)～(ⅱ) の多肢選択問題に答えよ。
(ⅰ) 次の選択肢の中で論理型に分類される言語はどれか？もっともふさわしいものを一つ選
べ。
(A).

C

(B).

Fortran(C).

Smalltalk(D).

Prolog(E).

Haskell(ⅱ) 次の選択肢の中でスクリプト言語と呼ぶのに、もっともふさわしくない言語はどれか？一
つ選べ。
(A).

PHP

(B).

Python

(C).

C++

(D).

Perl

(E).

Ruby

VI. グラフィックスライブラリー用のクラス階層を設計するために、テスト用のいくつかのクラスを作成する。次に定義されるクラス Turtle を継承して、ファイル名 Turtle.java
1 public class Turtle {2protected double direction;
3
protected double x, y;
4
5public Turtle() {6direction = 0;7x = y = 0;8}910public void show() {11// %.2f は小数点の後の桁数が 2 という意味
12
System.out.printf(
13"position: (%.2f, %.2f), direction: %.2f%n",
14x, y, direction);
15
}
16
17
public void move(double distance) {18x += distance * Math.cos(Math.toRadians(direction));19
y += distance * Math.sin(Math.toRadians(direction));20
show();
21}
22
23
public void turn(double deg) {24
direction += deg;
25
}
26 }
2 つのサブクラス LimitedTurtle, PerverseTurtle を定義する。
ファイル名 LimitedTurtle.java
1 public class LimitedTurtle extends Turtle {2protected int limit;
3
public LimitedTurtle(int life) {4
super();
5
limit = life;
6
}
7

8
9
10
11
12
13
14
15
16
17 }

@Override
public void move(double distance) {if (limit > 0) {limit--;
super.move(distance);} else {super.move(0);}}ファイル名 PerverseTurtle.java
1 // perverse - へそ曲がりな
2 public class PerverseTurtle extends Turtle {3
public PerverseTurtle() {4super();
5}
6
7@Override8
public void turn(double deg) {9
direction -= deg;
10
}
11 }
ファイル名 TurtleTest.java
1 public class TurtleTest {2
public static void main(String[] args) {3
Turtle[] turtles = new Turtle[] {4
new Turtle(),5
new LimitedTurtle(2),6
new PerverseTurtle()
7};89
for (Turtle t: turtles) {10t.move(10);11t.turn(90);12t.move(20);13t.turn(-90);
14
t.move(10);
15
}
16
}
17 }
(ⅰ). Turtle の 3 つのフィールド direction, x, y と LimitedTurtle のフィールド
limit は protected と宣言されているが、これを private に変更しても（ここに掲載された 4 つのクラスをコンパイル・実行するとき）エラーにならないものを次からすべて選べ。
(A).

direction

(B).

x

(C).

y

(D).

limit

(ⅱ). TurtleTest クラスの main メソッドを実行するとき、出力はどうなるか？
なお、解答用紙に記入するとき、空白の有無や数は気にしなくて良い。
(ア) Math.cos(Math.toRadians(d))、(イ) Math.cos(Math.toRadians(d)) は次の表の値を使用せよ。（N は任意の整数とする。）
式╲d
(ア)
(イ)

0 + 360N
1.00
0.00

90 + 360N
0.00
1.00

180 + 360N 270 + 360N
-1.00
0.00
0.00
-1.00

VII. 次の RainbowAnimation はグラデーションの色相のアニメーションを表示する GUI アプリ
ケーションである。“Stop” ボタンをクリックするとアニメーションを停止し、“Start” ボタンをクリックするとアニメーションを再開する。
ファイル名 RainbowAnimation.java
1 import javax.swing.*;
2 import java.awt.*;3
4 public class RainbowAnimation extends JPanel implements Runnable {5private final int width = 360, height = 280;
6
private Shape shape;
7
private volatile int init = 30;
8private volatile Thread thread = null;
910
public RainbowAnimation() {11
setBackground(Color.WHITE);
setPreferredSize(new Dimension(width, height));
1213
14
int[] xpoints = { 0,0, 60, 60, 180, 300, 300,
15360, 360, 300, 180, 60,
0};16int[] ypoints = { 0, 280, 280, 110, 280, 110, 280,
17
280,
0,
0, 170,0,0};18
shape = new Polygon(xpoints, ypoints, xpoints.length);
19
20
JButton startButton = new JButton("Start");21
startButton.addActionListener(ev -> startThread());
22
JButton stopButton = new JButton("Stop");23
stopButton.addActionListener(ev -> stopThread());
24
add(startButton); add(stopButton);
25
26
startThread();
27
}
28
29
private void startThread() {30
if (thread == null) {31
thread = new Thread(this);32
thread.start();
33
}
34
}
35
36
private void stopThread() {
37
(ⅰ)
;
38
}
39
40
@Override
41
protected void paintComponent(Graphics g) {42
super.paintComponent(g);43g.setClip(shape);44
for (int deg = 0; deg < 360; deg += 10) {45
int t = (init + deg) % 360;46
Color c = Color.getHSBColor(t / 360f, 1f, 0.8f);
47
g.setColor(c);48g.fillRect(deg, 0, 10, height);
49}
50
g.setClip(null);
51
}
52
53
public void run() {54
Thread current = Thread.currentThread();55
while ((ⅱ)
) {56
init += 15;
57
(ⅲ)
;
58
try {
59
Thread.sleep(100);

60
61
62
63
64 }

} catch (InterruptedException ex) {}}}/* main は省略する */

実行例:

⇒

⇒

空欄 (ⅰ) ～ (ⅲ) を埋めてプログラムを完成せよ。（空欄はすべて文法上、式である。）念のため参考に setClip メソッドと Polygon クラスの API Documentation を以下に示す。

Package java.awt

Class Graphics
Method Details
setClip
public abstract void setClip(Shape clip)
Sets the current clipping area to an arbitrary clip shape.
Parameters:
clip - the Shape to use to set the clip. Passing null clears thecurrent clip.
Package java.awt

Class Polygon
public class Polygon extends Object
implements Shape, Serializable

Constructor Details
Polygonpublic Polygon(int[] xpoints,
int[] ypoints,
int npoints)
Constructs and initializes a Polygon from the specified parameters.
Parameters:
xpoints - an array of X coordinates
ypoints - an array of Y coordinates
npoints - the total number of points in the Polygon

以下に参考のために授業配布プリントの LeftRightButton.java, LeftRightButton2.java,
Guruguru.java, Point.java, ColorPoint.java, Quadratic.kt, SequeceTest.kt のソースを掲載する。
ファイル LeftRightButton.java
1 import javax.swing.*;
2 import java.awt.*;
3 import java.awt.event.*;
4
5 public class LeftRightButton extends JPanel implements ActionListener {6
private int x = 20;
7
private JButton lBtn, rBtn;
89public LeftRightButton() {10
setPreferredSize(new Dimension(200, 70));
11lBtn = new JButton("Left");
12
rBtn = new JButton("Right");
13lBtn.addActionListener(this);
14
rBtn.addActionListener(this);
15
setLayout(new FlowLayout());
16
add(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();27
if (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 }ファイル LeftRightButton2.java
1 import javax.swing.*;
2 import java.awt.*;
3 import java.awt.event.*;
4
5 public class LeftRightButton2 extends JPanel {6private int x = 20;
78public LeftRightButton2() {9
setPreferredSize(new Dimension(200, 70));
10JButton lBtn = new JButton("Left");
11
JButton rBtn = new JButton("Right");
12lBtn.addActionListener(new LeftListener());
13
rBtn.addActionListener(new RightListener());
14
setLayout(new FlowLayout());
15
add(lBtn); add(rBtn);
16
}
17
18
private class LeftListener implements ActionListener {19public void actionPerformed(ActionEvent e) {20
x -= 10;21
repaint();
22
}
23
}
24
25
private class RightListener implements ActionListener {26
public void actionPerformed(ActionEvent e) {27
x += 10;

28
29
30
31
32
33
34
35
36
37
38
39 }

}

}

repaint();@Override
public void paintComponent(Graphics g) {super.paintComponent(g);g.drawString("HELLO WORLD!", x, 55);}
public static void main(String[] args) { /* 省略 */ }ファイル Guruguru.java
1 import java.awt.*;
2 import javax.swing.*;3
4 public class Guruguru extends JPanel implements Runnable {5private int r = 50;
6private volatile int x = 110, y = 70 ;7
private double theta = 0; // 角度
8
private volatile Thread thread = null;
910
public Guruguru() {11
setPreferredSize(new Dimension(200, 180));
12JButton startBtn = new JButton("start");13
startBtn.addActionListener(e -> startThread());
14
JButton stopBtn = new JButton("stop");15
stopBtn.addActionListener(e -> stopThread());
16
setLayout(new FlowLayout());
17
add(startBtn); add(stopBtn);
18
startThread();
19
}
20
21
private void startThread() {22
if (thread == null) {23
thread = new Thread(this);24
thread.start();
25
}
26
}
27
28
private void stopThread() {29thread = null;
30
}
31
32
@Override33
public void paintComponent(Graphics g) {34
super.paintComponent(g); // スーパークラスの paintComponent を呼び出す
35// 全体を背景色で塗りつぶす。
36
g.drawString("Hello, World!", x, y);
37
}
38
39
public void run() {40
Thread thisThread = Thread.currentThread();41
for (; thread == thisThread; theta += 0.02) {42
x = 60 + (int)(r * Math.cos(theta));43
y = 100 - (int)(r * Math.sin(theta));44
repaint(); // paintComponent を間接的に呼出す
45
try {
46
Thread.sleep(30); // 30 ミリ秒お休み
47} catch (InterruptedException e) {}
48
}
49
}
50
51
public static void main(String[] args) { /* 省略 */ }52 }ファイル Point.java
1 public class Point {2// フィールド(メンバー変数）3
public int x;

4public int y;
56// メソッド（メンバー関数）
7public void move(int dx, int dy) {8x += dx;9y += dy;10}
1112
public double distance() {13
return Math.sqrt(x * x + y * y);
14
}
15
16
public void print() {17
System.out.printf("(%d, %d)", x, y);
18
}
19
20
public void moveAndPrint(int dx, int dy) {21
print(); move(dx, dy); print();
22
}
23
24
// コンストラクター
25
public Point(int x0, int y0) {26
x = x0; y = y0;
27
}
28 }

ファイル ColorPoint.java
1 public class ColorPoint extends Point {2
public String[] cs = {3"black", "red", "green", "yellow",4"blue", "magenta", "cyan", "white" };5public String color;
67@Override8
public void print() {9System.out.printf("<font color='%s'>", getColor()); // 色の指定
10
System.out.printf("(%d, %d)", x, y); // super.print(); でも可11System.out.print("</font>");// 色を戻す
12}
13
14
public void setColor(String c) {15
int i;
16
for (i = 0; i < cs.length; i++) {17
if (c.equals(cs[i])) {18
color = c; return;
19
}
20
}
21
// 対応する色がなかったら何もしない。
22
}
23
24
public ColorPoint(int x, int y, String c) {25
super(x, y);26
setColor(c);27
if (color == null) color = "black";
28
}
29
30
public String getColor() {31
return color;
32
}
33 }

ファイル Quadratic.kt
1 import kotlin.math.*2
3 fun quadratic(a: Double, b: Double, c: Double): Pair<Double, Double> {4val d = b * b - 4 * a * c
5val sq = sqrt(d)6return Pair((-b + sq) / (2 * a), (-b - sq) / (2 * a))7 }8
9 fun main() {

10
11
12
13
14 }

val a = 1.0; val b = -1.0; val c = -1.0
val (x1, x2) = quadratic(a, b, c)
println("方程式の解は、$x1、$x2 です。")// 出力 ⇒ 方程式の解は、1.618033988749895、-0.6180339887498949 です。

ファイル SequenceTest.kt
1 fun main() {2
val nums = generateSequence(1) { x -> x + 3 }3println(nums.take(10).toList())
4// 出力 ⇒ [1, 4, 7, 10, 13, 16, 19, 22, 25, 28]
5val fibs = sequence {6
var a = 1; var b = 1
7while (true) {8yield(a)9val c = a10a = b; b += c
11
}
12
}
13
println(fibs.take(10).toList())
14// 出力 ⇒ [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
15 }（計算用紙）オブジェクト指向言語・期末テスト解答用紙（2022 年 07 月 28 日）
学籍番号

氏名

I.

(3 × 2)
(ⅰ)

(ⅱ)

II.

(3 × 4)
(ⅰ)
(ⅱ)
(ⅲ)
(ⅳ)

III.

(1, 1, 1, 3, 3, 1, 1, 1)
(ⅰ)
(ⅱ)
(ⅲ)
(ⅳ)
(ⅴ)
(ⅵ)
(ⅶ)
(ⅷ)

IV.

(4 × 2)
(ⅰ)
(ⅱ)

V.

(4 × 2)
(ⅰ)

(ⅱ)

VI.

(4, 8)(ⅰ)

position:(,), direction:

〃

,

),

:(

〃

:

(ⅱ)

VII.

(4 × 3)
(ⅰ)
(ⅱ)
(ⅲ)

授業・テストの感想