質問と解答

  1. [Q] 上の問題 (課題 10.1 と 課題 10.2) では両方とも2つのプログラムを合わせて 出来上がっていますが、1つのプログラムで書けないのですか?

    [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 にしたかったら、別のファイルに書かなければ ならないみたいですが、この課題の場合はそうする必要はないみたいです。

    アクセスの指定は、「情報の隠蔽」と呼ばれるオブジェクト指向プログラミングの 一つのテーマに関わることです。

  2. [Q] 課題 9.2 の9行目 (つまり List 9-13 の 9 行目)「i < data.length - 1」とありますが、 なぜ「-1」がつくのでしょうか。「i < data.length」と入れてよいのではないでしょうか。 ちなみにそれで実行してみたところ、同じ結果でした。

    [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 番目に小さい要素を見つけて、
    2 番目に小さい要素を見つけて,
    ....
    data.length-1 番目に小さい要素を見つける。

    ここまでやれば、もう最後の1回はやらなくても、最後の場所に はいっているので、やらなくても良い。(やっても同じ。) 計算の効率を考えるのであれば、最後の一回はやらない方が速い。

    君の場合は、j=i としているけど、教科書のように, j=i+1 とやっても良い。どちらも同じ結果を得るのであるが、 効率という観点からは, j=i+1 とした方が良い。

  3. [Q] 小数点以下を四捨五入する方法がわかりません。

    [A] 小数点以下を四捨五入して整数にするということだったら、 例えば、x が整数型変数で、y が double 型変数のときには、

         x = (int)y;
         
    って書けば良い。

  4. [Q]識別子ってなんですか。

    [A] 識別子っていうのは、メソッド の名前や、変数の名前、クラスの名前などの「名前」のことです。 それならどうして、単に名前と呼ばないのかって聞かれてしまいそうです けど、学問ってそういうものです。 ちなみに英語では, identifier といいます。identifier のほうが よっぽど簡単に聞こえるのは私だけでしょうか?

  5. [Q] 先生、inportって何ですか?

    [A] import ね。自分が書いた Java のプログラム以外のファイルで 定義されているメソッドなんかを使えるようにするために、その メソッドが定義されているクラスを呼び出す命令文です。

  6. [Q] for文を使うとき、"i++"によって"i"に1ずつ加算していましたが、 2ずつ加算することは可能ですか?可能ならば、"i+++"と記入 するのでしょうか。

    [A] 2 づつ加算するときは、i = i+2 と書きます。例えば、

               for (int i=0; i< 100; i=i+2) {
                   System.out.println(i);
               }
             
    と書きます。
  7. [Q] 小数は切り捨てとかできないんですか?

    [A] 残念ながら、簡単にはできません。

    Java の最新 version の JDK 1.2 ですと、出力するときの小数点以下の 桁数の指定が結構簡単にやれるみたいなんですがです。ところが, mars群に入ってるのはちょっと古い JDK 1.1 です。(もっと古いのは 1.0。) がまんして下さい。

  8. [Q] if文の中にif文をさらに入れてみたら、エラーとなってしまいました。 if文の中にさらにif文を入れるのはできないのでしょうか。それとも、 何かが足りないなどの他の理由でエラーとなっているのでしょうか。
    [A] if 文の中に if 文を入れることも出来ます。エラーは、他の理由からです。
  9. [Q] ある質問をして、さらに、重ねて質問するにはどうすればよいのですか? 例えば、
         今日は何曜日ですか?
         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 文の終わり
             

    こんな感じです。このように、これまでに習った構文を複雑に 組合せることが出来ます。プログラムが複雑になると、 当然エラーも多くなります。エラーを少なくするためには、 「字下げ」と「コメント」を効果的に使って、プログラムを 読み易くすることが大事です。

  10. [Q]今回のオリジナルなんですが、 ある事象を終了させたあとに、前に戻らせることはできますか?? 私ので言えば、Original4.javaで、30行目の部分で、 もう一度初めの9行目に戻すことはできるのか?ということなんですが・・・。
    [A] 「事象」ではなくて「処理」とか「命令文」と言いましょう。

    それは出来ます! そのためには、来週 (第6章) と再来週 (第7章) で 勉強する「for 文」か「while 文」を使うので、ちゃんと聞いていて 下さい。来週にはその目的が達成できるようになるでしょう。

  11. [Q] 先生は今回のswitch/case文のほうが、前回のif文より使いやすい、 と言っていましたが、 私にはif文を用いた時の方が、短いプログラムが作れました。 switch/caseを使用する利点には、どんなことがあるのでしょうか。
    [A]「switch 文の方が if より使いやすい」 なんて言ったかなぁ(^^;

    「if 文を使うよりも switch 文を使った方がプログラムが 読みやすくなる場合もある」というのが 本当です。もう一つの利点は、教科書の p. 119 にも書いてあるように、 switch 文の方が if 文よりも高速に実行できるのだそうです。まあ、その スピードの差はたいした違いではないのでしょうけど。

    それよりも、switch 文は「整数か文字でしか分岐できない」という 短所がありますし、switch 文でできることは全て if 文でも出来るので、 switch 文を知らなくてもプログラムは書けるんですよ、実は。

  12. [Q] 入力行から小数を読み込みたいのですが、 どうしたら良いでしょうか。
    [A] 例えば、
                String line = reader.readLine();
                double weight = Double.valueOf(line).doubleValue();
             
    とすれば、良いでしょう。一応説明すると、最初の行で とりあえず、入力を文字列として line 変数に読み込んで、そのあとで line 変数に入っている文字列を double 型の小数に変換したあと、 double 型の変数 weight に代入します。

    もちろん、2番目の行の右辺はまだ理解できなくてもいいです。 「おまじない」と思っていましょう。

  13. [Q] Javaがどのようにしてどのようなソフトなどに用いられているかを知りたい。
    [A] 自分はアプレットの事くらいしかよく分からない。 アプレットというのは、Web ページの中に、画像を貼り付ける ようにして、貼り付けた Java の実行プログラムです。 これは、他の言語では出来ません。(授業では、アプレットについて 教えませんが、授業で習うことはアプレットを書くための基本である。) アプレットがどういうものかは、 uni-java [ざっかや うにじゃば]やメインページのリンクのコーナーを見て下さい。 (注: mars群に入っている netscape だとアプレットが正常に表示され ない場合があります。Windows NT の環境で見てください。)
    その他のJavaのソフトについては、 日経Javaレビューを見れば何か分かるかもしれません。 最新の Java 関連のニュースが 集められています。これを見ると、何だかすごいことになっているよう です。携帯電話という言葉が目立ちます。Java のプログラムが 動いている携帯も近々登場するのでしょう。
  14. [Q] ドイツは、どんなところでしたか?
    [A] 話したいことがいっぱいありすぎて、 短くは答えられないです。
  15. [Q] Java言語が最もよく使われている 言語ですか?また、ほかの言語も覚える必要があるのでしょうか。
    [A] 調べたわけではないですが、最初の質問の 答は No だと思います。
    Java は比較的最近登場した言語なので、長い歴史と実績がある 例えば C なんかに比べたら、popularity においてはかなわない でしょう。また、オブジェクト指向ということに抵抗がある人たち には、受け入れられないものです。しかしもちろん、このことは Java が C に劣るというわけではありません。
    また、 C, C++, Pascal, Perl, ... 等々のプログラミング言語はそれぞれ 特徴を持っていて、ある特定の目的に対してはある言語で書いた 方が適切なことがあります。例えば、OS やデバイス・ドライバなんかは、 C で書かれることが多いですし、CGI のプログラミングは Perl で 行なわれることが多いです。
    ですから、目的によっては他の言語を学ぶ必要があるかも知れません。 また、別の講義で別の言語を習うかもしれませんし、 卒研の指導教官や会社の上司に他の言語を強制されるということも あり得ます。
    しかし、この授業では Java という特定の言語について学ぶのと同時に、 「(一般的な)プログラミング」を学ぶのです。言い替えれば、 (一般的な)プログラミングを Java という特定の言語を通して学ぶわけ です。例えば、「変数」、「メソッド (=関数)」、「制御構造」といった 概念は Java だけのものではなく、他の言語においても用いられるもので す。こうした(一般的な)プログラミングに関する 概念が頭にあれば、他の言語を学ぶことは非常に容易になるでしょう。
    また、歴史的には C -> C++ -> Java という順番で発展してきて、 Java には, C 及び C++ の文法の多くが取り入れられています。 ですから、Java を知っていれば C や C++ を修得するのはさらに容易で あると思われます。(Java と C(++) の間には、決定的な違いもあるんで すが・・・。)
  16. [Q] javaを使ってホームページでアンケート をとったり問題を解けるようなことをしたいのですがそれもいつか授業で 教えてくれるのですか?
    [A] Web ページを使ってどのようなことをしたいのか良く分からないので、 答えに困るのですが、Java を使っても出来るし、Java をわざわざ使わなく ても出来るものかも知れません。
    そういうことをやる方法は、CGI かアプレットのどちらかでしょう。
    Web ページに埋めこまれる Java プログラム は、アプレットと呼ばれます。Java アプレットについては、この授業では 取りあげる予定はありません。たぶん、アプレットのプログラミングの 方がずっと楽しいでしょうけれど、それは僕らがこの授業で学ぶことの 応用です。
    CGI については、 Perl という言語を使って書かれるのが一般的です。 しかしたぶん、僕らがやっているJava のプログラムを使っても実現 可能であると思われます。それをどうやってやるかは、Java とは直接 関係ないので、この授業で教える予定はないです。
    授業で教えないことでも、時間が許す限りは個人的に教えてあげます。
  17. [Q] IOException e とかの "e" はどんな役割をしているんですか。
    [A]
             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 の次の { .... } が実行されます。
    ですから、e の役割は発生した例外の種類に応じて、適切な 処置を catch ブロックで行なうために必要なわけです。 分かりましたか? try and catch についてはまだ分からなくても、 気にしなくてもいいです。


安藤 和敏
Last modified: Thu Apr 13 19:19:27 JST 2000