計算機ネットワーク I・テスト問題用紙（ ’06 年 7 月 27 日・ 13:00 〜 14:30 ）解答上、その他の注意事項

I. 問題は、問 I〜V まである。
II. 解答用紙の右上の欄に学籍番号・名前を記入すること。
III. 解答欄を間違えないよう注意すること。
IV. 解答中の文字 (特に a と d) がはっきりと区別できるよう注意すること。
V. 持ち込みは不可である。
VI. 合格は 100 点満点中 60 点以上とする。
(配点 — 期末テスト 80 点, レポート各 10 点)

1

全ての問に対する補足:
プログラムの空欄を埋める問題では、解答が長くなる可能性があるので、下の省略形（を用いても良い。例えば this==null と書く代わりに , T == N と書いて良い。
A ActionListener

C class

D actionPerformed

implements
JAppletQ equals
R Runnable
S System.out.println
IJ

L addActionListener

G getSource
M MathT thisN null
W new

参考のために、BubbleSort1.java, BubbleSort2.java のソースを掲載する。
（ Point.java, ColorPoint.java のソースは問題文中に掲載する。）
BubbleSort1.java
import javax.swing.*;
import java.awt.*;
public class BubbleSort1 extends JApplet implements Runnable {int[] args = {10, 3, 46, 7, 23, 34, 8, 12, 4, 45, 44, 52};
Color[] cs ={Color.RED, Color.ORANGE, Color.GREEN, Color.BLUE};
Thread thread=null;@Override
public void start() {if (thread == null) {thread = new Thread(this);thread.start();}}@Override
public void stop() {thread = null;}@Override
public void paint(Graphics g) {int i;super.paint(g);for(i=0; i<args.length; i++) {g.setColor(cs[args[i]%cs.length]);g.fillRect(0, i*10, args[i]*5, 10);}}}

public void run() {Thread thisThread = Thread.currentThread();while(true) {int i, j;for (i=0; i<args.length-1; i++) {for (j=args.length-1; j>i && thread == thisThread; j--) {if (args[j-1]>args[j]) { // スワップする。
int tmp=args[j-1]; args[j-1]=args[j]; args[j]=tmp;}
repaint();
try { // repaint の後でしばらく止まる
Thread.sleep(500);} catch (InterruptedException e) {}}}}}2囲み文字）

P

publicX extends

BubbleSort2.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class BubbleSort2 extends JApplet implements Runnable, ActionListener {int[] args = { 10, 3, 46, 7, 23, 34, 8, 12, 4, 45, 44, 52};
Color[] cs ={Color.RED, Color.ORANGE, Color.GREEN, Color.BLUE};
Thread thread=null;
private boolean threadSuspended=true;@Override
public void init() {JButton step = new JButton("Step");
step.addActionListener(this);
setLayout(new FlowLayout());
add(step);}// start, stop, paint メソッドは BubbleSort1.java と同一なので省略する。
public synchronized void actionPerformed(ActionEvent e) {threadSuspended=false;
notify();}}public void run() {while(true) {int i, j;for (i=0; i<args.length-1; i++) {for (j=args.length-1; j>i; j--) {if (args[j-1]>args[j]) { // スワップする。
int tmp=args[j-1]; args[j-1]=args[j]; args[j]=tmp;}
repaint();
try { // repaint の後で止まる
synchronized(this) {while (threadSuspended) {wait();}
threadSuspended=true;}} catch (InterruptedException e) {}
}}
}
}

3

I. 次の各選択問題に答えよ。解答は各問の指示する選択肢から選べ。ただし 、特に指定しない限り、選ぶべき選択肢は必ずしも 1 つとは限らない。
(i) 次のうち、Java のソースファイルの名前としてふさわしくないのは、どれか？
(A). Foo1.java(B). Foo_1.java (C). Foo-1.java(D). 1_1.java(ii) 次のうち、 Bar.java という Java のソースファイルをコンパイルし 、実行するためのコマンド として、正しい組み合わせはどれか？選択肢の中から 1 つ選べ。
コンパイル実行(A)
javac Bar.java
java Bar.class(B)
javac Bar.java
java Bar
(C)
javac Bar
java Bar
(D)
javac Bar
java Bar.class(iii) 0 から 4 までの数とその 2 倍を次のように出力したい。
x が 0 のとき x の 2 倍は 0x が 1 のとき x の 2 倍は 2x が 2 のとき x の 2 倍は 4x が 3 のとき x の 2 倍は 6x が 4 のとき x の 2 倍は 8
次のプログラム:
int i;
for(i=0; i<5; i++) {;}の空欄にはいる式を下の選択肢の中から 1 つ選べ。
(A). System.out.println("x"が +i+のとき "x"の 2 倍は +(2*i)+)(B). System.out.println("x が "+"i"+"のとき x の 2 倍は "+"2*i")(C). System.out.println("x が "+i+"のとき x の 2 倍は "+(2*i))(D). System.out.println("x が "+i+"のとき x の 2 倍は "+(2*i)+)4

(iv) 下のプログラムは、右のような図形を描く。
import javax.swing.*;
import java.awt.*;
public class Pentagon extends JApplet {Color[] cs = {Color.red, Color.orange,Color.green, Color.blue};
public void paint(Graphics g) {int i, j, k=0;
for (i=0; i<5; i++) {double theta1 = 2.0*Math.PI*i/5;
int x1 = (int)(120-Math.sin(theta1)*100);
int y1 = (int)(120-Math.cos(theta1)*100);g.setColor(Color.black);g.drawString(" "+i, x1, y1);for (j=i+1; j<5; j++) {double theta2 = 2.0*Math.PI*j/5;
int x2 = (int)(120-Math.sin(theta2)*100);
int y2 = (int)(120-Math.cos(theta2)*100);g.setColor(cs[k%4]);
g.drawLine(x1, y1, x2, y2);
k++;
}
}
}
}

(1) 点 1–3 を結ぶ線は何色になるか？
(2) 点 2–4 を結ぶ線は何色になるか？
それぞれ下の選択肢から選べ。
(A) red (B) orange(C) green (D) blue(v) 次の文章は String クラスの charAt メソッドと length メソッドの説明の JavaTM 2 Platform
Standard Edition 5.0 API 仕様からの抜粋である。
public int charAt(int index)指定されたインデックス位置にある char 値を返します。インデックスは、0 から length() - 1 の範囲になります。配列のインデックス付けの場合と同じように、シーケンスの最初の char 値のインデックスは 0 、次の文字のインデックスは 1 と続きます。
（ 後略）パラメータ:
index – char 値のインデックス
戻り値:
文字列内の指定されたインデックス位置にある char 値。最初の char 値のインデックスが 0 になる
例外:
IndexOutOfBoundsException – index 引数が負の値、または文字列の長さ以上である場合

5public int length()
この文字列の長さを返します。
（ 後略）
戻り値:
このオブジェクトによって表される文字シーケンスの長さ
このメソッド を使用しテストするプログラムを次のように作成する。
ファイル名: CharAtTest.java
public class CharAtTest {public static void main(String[] args) {String str1 = args[0];String str2 = args[1];}}int i;for (i=0; i<str1.length(); i++) {char c =???
;
if (c==’?’) {System.out.print(str2);} else {System.out.print(c);}}System.out.println();

このプログラムは、コマンド ライン引数を 2 つ受け取り、第 1 引数の中の’?’ という文字を、第 2 引数の文字列に置換して表示する。
実行例は次のようになる。

prompt> java CharAtTest ?_?_?_John Hello
Hello_Hello_Hello_John
prompt> java CharAtTest ?_?_?_Mary BonJour
BonJour_BonJour_BonJour_Mary
上のプログラムの空欄を埋めよ。

???

6

II. 次の文章の空欄を埋めるのにもっとも適切な言葉を指示された選択肢から選べ。
IP は必ずしもネットワーク的に隣接していない機器の間で、通信を行なうためのプロトコルである。IP ではネットワーク機器に割り振られた用いる。現行の IPv4 では(i)は(i)という、全世界で一意の番号をの整数である。

(ii)

TCP は IP の上位層のプロトコルで、ポートという番号で、どのプロセスと通信するかを指定することができる。
Java で TCP を使って通信を行なう時は、クライアント側は Socket 、サーバ側は ServerSocketというクラスのオブジェクトを用いる。Socket クラスの String 型と int 型の 2 引数のコンストラクタの場合は第 2 引数 (int 型の引数) に(iii)を、ServerSocket クラスの int型の 1 引数のコンストラクタの場合は、引数に(iv)を指定する。

TCP は順序制御や誤り訂正を含むため、ある程度重いプロトコルである。TCP と同じ階層に属する、より軽量なプロトコルとして、(v)がある。 Java で通信するためには、DatagramSocket クラスのオブジェクトを用いる。

(i) の選択肢(A) MAC アドレス
(D) メールアドレス(B) IP アドレス (C) TCP アドレス(E) ポート(F) ド メイン名(ii) の選択肢(A) 4 バイト（ 32 ビット ） (B) 8 バイト（ 64 ビット ）(C) 16 バイト（ 128 ビット ） (D) 32 バイト（ 256 ビット ）(iii), (iv) の選択肢
(A) 自分のポート(B) 自分のファイルデ ィスクリプタ(C) 接続相手のポート(D) 接続相手のファイルデ ィスクリプタ(v) の選択肢(A) DCHP(B) ARP(C) HTTP(D) UDP7(v)を使ってIII. 円とユーロを両方向に変換するプログラムを Java Appletとして作成する。この Applet は , 2 つのテキストフィー
ルド があり、片方のテキストフィールド の値を変えると、もう片方のテキストフィールド の値が変わる。
ただし 、1 ユーロ = 145 円で計算し 、端数は切り捨てる。
次のプログラム中の空欄を埋めて、Applet を完成させよ。
ファイル : YenEuro.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class YenEuro
JTextField yen, euro;(i)public void init() {yen = new JTextField("0", 8);euro = new JTextField("0", 6);(ii)}

setLayout(new FlowLayout());
add(yen); add(new JLabel("円 ="));
add(euro); add(new JLabel("ユーロ"));public void actionPerformed(ActionEvent evt) {(iii)}}

8{

IV. 次の Point クラスを継承して、
public class Point {public int x, y;
public Point(int x0, int y0) {x = x0; y = y0;}
public void move(int dx, int dy) {x += dx; y += dy;}public void print() {System.out.printf("(%d, %d)", x, y);}}public void moveAndPrint(int dx, int dy) {print(); move(dx, dy); print();}

GridPoint クラスを定義する。GridPoint クラスは 、1 つの新しい int 型のフィールド gridを持つ。print メソッド は再定義されていて、x, y の正確な値の代わりに、それよりも小さいgrid の倍数のうち、正確な値にもっとも近いものを表示する。例えば grid が 4 で x が 9, かつy が 15 の時、(8, 12) と表示する。
（ x, y が負の数の場合は考慮する必要はない。）
ここで、参考のために ColorPoint クラスの定義を掲載する。
public class ColorPoint extends Point {public String[] cs = {"black", "red", "green", "yellow", ...};
public int color;// 0-黒 1-赤 2-緑 3-黄 4-青 5-紫 6-水 7-白public ColorPoint(int x, int y, String c) {super(x, y); setColor(c);}@Overridepublic void print() {System.out.printf("<font color=’%s’>", getColor());
super.print();
System.out.print("</font>");}public void setColor(String c) {int i;for (i=0; i<cs.length; i++) {if (c.equals(cs[i])) {color = i; return;
}
}
}

}

public String getColor() {return cs[color];}

9// 色の指定// 色を戻す

(1)〜(3) の空欄を埋めて GridPoint クラスの定義を完成させよ。
public class{(i)public(ii)public GridPoint(int x0, int y0, int g0) {super(x0, y0); grid = g0;}@Override
public void print() {(iii)}}

さらに以下の文章の (iv), (v) の空欄を埋めよ。
「もし次のようなテスト用プログラムがあるとすると、...
Point[] pts = new Point[2];pts[0] = new Point(2, 4);
pts[1] = new GridPoint(12, 17, 5);
int i;for (i=0; i<pts.length; i++) {pts[i].print();}...
この部分では “(iv)” と出力される。これは、 print メソッドが動的束縛されているためである。もし 、Java が C++のように静的束縛を採用していれば 、“出力されるはずである。」

10(v)”とV. 下のプログラムは、右のような出力をする。
import java.io.*;public class App5 {String str ="The quick brown fox jumps over the lazy dog.

";

public static void main(String[] args) {int i;
for(i=0; i<=str.length()-8; i++) {System.out.println(str.substring(i, i+8));}}}

TThTheThe
The q
The quThe qui
The quic
he quicke quick
quick bquick bruick bro
ick brow（ 以下略）

つまり、str という文字列から、8 文字の部分文字列を先頭から順番に取り出して標準出力に出力するプログラムである。
このプログラムを参考にして、いわゆる “電光掲示板” アプレット (Denko) を作成せよ。つまり、文字列の 8 文字の部分文字列を先頭から順番に取り出して次々に、drawString を用いて表示する。スレッド を用いて、100 ミリ秒間隔でアニメーションになるようにせよ。
'$&-

初め頃-

途中%

終り頃11

Denko.java
import javax.swing.*;
import java.awt.*;
public class Denko
Thread thread=null;
String str = "int i=0;{(i)

The quick brown fox jumps over the lazy dog.

@Override
public void start() {if (thread==null) {(ii)}}@Override
public void stop() {(iii)}@Override
public void paint(Graphics g) {(iv)}public void run() {Thread thisThread = Thread.currentThread();while (thread==thisThred) {(v)}}}12";

計算機ネットワーク I・テスト解答用紙 (’06 年 7 月 27 日)

学籍番号

氏名

（ 4, 3, 3, 3, 3, 3 ）

I.
(i).

(ii).

(iii).

(iv)-(1).

(iv)-(2).

(v).
（ 3, 3, 3, 3, 3 ）

II.
(i).

(ii).

(iii).

(iv).

(v).
（ 3, 3, 5 ）

III.
(i).

(ii).

(iii).
（ 3, 3, 4, 4, 4 ）

IV.
(i).
(ii).
(iii).
(iv).
(v).

1

（ 3, 3, 3, 3, 5 ）

V.
(i).

(ii).
(iii).
(iv).

(v).
授業・テストの感想.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................

2