[A] やってみると分かると思いますが、「そのまま」では一つのプログラムに 書くことは出来ませんね。でも、課題 10.1 では public class Kamoku の "public" を取ってしまって,
class Kamoku {
String namae;
int tensuu;
...
のようにして、List 10-4 の KamokuHeikin.java の中に書いて、一つの
ファイルにすることが出来ます。授業ではちゃんとやらなかったのですけど、
class とか メソッドには, public か private のどちらかにすることができます。
これらは、アクセス指定子 (access specifier) と呼ばれるものです。
上の Kamoku クラスのようにアクセス指定子を省略すると、デフォルトの
private が指定されます。public にしたかったら、別のファイルに書かなければ
ならないみたいですが、この課題の場合はそうする必要はないみたいです。
アクセスの指定は、「情報の隠蔽」と呼ばれるオブジェクト指向プログラミングの 一つのテーマに関わることです。
[A]
for (int i=0; i<data.length ; i++) {
for (int j=i; j<data.length ; j++) {
if (data[i] > data[j]) {
ここの、i を動かす for ループでは、「i 番目に小さい要素を見付ける」 ということをやっている。
1 番目に小さい要素を見つけて、ここまでやれば、もう最後の1回はやらなくても、最後の場所に はいっているので、やらなくても良い。(やっても同じ。) 計算の効率を考えるのであれば、最後の一回はやらない方が速い。
君の場合は、j=i としているけど、教科書のように, j=i+1 とやっても良い。どちらも同じ結果を得るのであるが、 効率という観点からは, j=i+1 とした方が良い。
[A] 小数点以下を四捨五入して整数にするということだったら、 例えば、x が整数型変数で、y が double 型変数のときには、
x = (int)y;
って書けば良い。
[A] 識別子っていうのは、メソッド の名前や、変数の名前、クラスの名前などの「名前」のことです。 それならどうして、単に名前と呼ばないのかって聞かれてしまいそうです けど、学問ってそういうものです。 ちなみに英語では, identifier といいます。identifier のほうが よっぽど簡単に聞こえるのは私だけでしょうか?
[A] import ね。自分が書いた Java のプログラム以外のファイルで 定義されているメソッドなんかを使えるようにするために、その メソッドが定義されているクラスを呼び出す命令文です。
[A] 2 づつ加算するときは、i = i+2 と書きます。例えば、
for (int i=0; i< 100; i=i+2) {
System.out.println(i);
}
と書きます。
[A] 残念ながら、簡単にはできません。
Java の最新 version の JDK 1.2 ですと、出力するときの小数点以下の 桁数の指定が結構簡単にやれるみたいなんですがです。ところが, mars群に入ってるのはちょっと古い JDK 1.1 です。(もっと古いのは 1.0。) がまんして下さい。
今日は何曜日ですか?
1、月
2、火
3、水
そこで、「2」と答えて、javaが、どんな天気ですか?と言ってきて、
A、晴れ
B,曇り
C,雨
D,嵐
のうち、Cを選択すると、傘は持ってますかと聞いてくるような文・・・
[A]
2重の入れ子になった、switch 文を使えば良い。つまり、この場合は
最初の swith 文 の case 2 の中にもうひとつの switch 文があるような文。
switch (c) { //外側の switch 文
case 1:
...
...
break;
case 2: //場合 2
System.out.println("どんな天気ですか?");
System.out.println("A: 晴れ");
System.out.println("B: 曇り");
System.out.println("C: 雨");
System.out.println("D: 嵐");
line = reader.readLine();
char d = line.charAt(0);
switch (d) { //内側の switch 文
case 'A':
...
break;
case 'B':
...
break;
case 'C':
System.out.println("傘は持ってますか?");
break;
case 'D':
...
break;
default:
...
break;
} //内側の switch 文の終わり
break; // 場合 2 の終わり
case 3:
...
break;
default:
...
break;
} //外側の switch 文の終わり
こんな感じです。このように、これまでに習った構文を複雑に 組合せることが出来ます。プログラムが複雑になると、 当然エラーも多くなります。エラーを少なくするためには、 「字下げ」と「コメント」を効果的に使って、プログラムを 読み易くすることが大事です。
それは出来ます! そのためには、来週 (第6章) と再来週 (第7章) で 勉強する「for 文」か「while 文」を使うので、ちゃんと聞いていて 下さい。来週にはその目的が達成できるようになるでしょう。
「if 文を使うよりも switch 文を使った方がプログラムが 読みやすくなる場合もある」というのが 本当です。もう一つの利点は、教科書の p. 119 にも書いてあるように、 switch 文の方が if 文よりも高速に実行できるのだそうです。まあ、その スピードの差はたいした違いではないのでしょうけど。
それよりも、switch 文は「整数か文字でしか分岐できない」という 短所がありますし、switch 文でできることは全て if 文でも出来るので、 switch 文を知らなくてもプログラムは書けるんですよ、実は。
String line = reader.readLine();
double weight = Double.valueOf(line).doubleValue();
とすれば、良いでしょう。一応説明すると、最初の行で
とりあえず、入力を文字列として line 変数に読み込んで、そのあとで
line 変数に入っている文字列を double 型の小数に変換したあと、
double 型の変数 weight に代入します。
もちろん、2番目の行の右辺はまだ理解できなくてもいいです。 「おまじない」と思っていましょう。
try {
String line = reader.readLine();
int n = Integer.parseInt(line);
} catch (IOException e) {
System.out.println(e);
} catch (NumberFormatException e) {
System.out.println("数字の形式が正しくありません。");
}
というようなプログラムがあったとしましょう。
try { ... } において例外 (excetion、エラー) が発生するとします。
とその例外は, try { ... } の外に放り出さ
れます。その例外は e という名前の変数と考えて良いです。その変数の
型が、 IOException であったならば最初の catch で
捕まえられて、最初の
catch のすぐ後の { .... } が実行され
ますし、その例外の型が、NumberFormatException
だったら、2番目の catch で捕まえられて、2番目の catch の次の
{ .... } が実行されます。